afv-library/skills/build_cms_search_input.py
2026-03-18 01:36:05 +05:30

180 lines
5.1 KiB
Python

#!/usr/bin/env python3
"""
Build CMS Search Input JSON
Generates properly formatted input JSON for search_media_cms_channels MCP tool.
Usage:
python3 build_cms_search_input.py --keywords "car,automobile,vehicle" --taxonomies "Modern,Luxury" --locale "en_US"
# With empty keywords
python3 build_cms_search_input.py --keywords "" --taxonomies "Bright,Spacious" --locale "en_US"
# With empty taxonomies
python3 build_cms_search_input.py --keywords "logo,brand" --taxonomies "" --locale "en_US"
# With page parameters
python3 build_cms_search_input.py --keywords "car" --taxonomies "Luxury" --locale "en_US" --limit 10 --offset 0
"""
import argparse
import json
import sys
def build_search_keyword(keywords):
"""
Convert comma-separated keywords to OR-separated format.
Args:
keywords: Comma-separated string of keywords, or empty string
Returns:
OR-separated keyword string, or empty string
Examples:
"car,automobile,vehicle" -> "car OR automobile OR vehicle"
"" -> ""
"logo" -> "logo"
"""
if not keywords or keywords.strip() == "":
return ""
# Split by comma, strip whitespace, filter empty
keyword_list = [k.strip() for k in keywords.split(',') if k.strip()]
if not keyword_list:
return ""
# Join with OR
return " OR ".join(keyword_list)
def build_taxonomy_expression(taxonomies):
"""
Convert comma-separated taxonomies to JSON string format.
Args:
taxonomies: Comma-separated string of taxonomy labels, or empty string
Returns:
JSON string in format: {"OR": ["Label1", "Label2", "Label3"]}, or "{}"
Examples:
"Modern,Luxury,Premium" -> "{\"OR\": [\"Modern\", \"Luxury\", \"Premium\"]}"
"" -> "{}"
"Bright" -> "{\"OR\": [\"Bright\"]}"
"""
if not taxonomies or taxonomies.strip() == "":
return "{}"
# Split by comma, strip whitespace, filter empty
taxonomy_list = [t.strip() for t in taxonomies.split(',') if t.strip()]
if not taxonomy_list:
return "{}"
# Build JSON object and convert to string
taxonomy_obj = {"OR": taxonomy_list}
return json.dumps(taxonomy_obj)
def build_cms_search_input(keywords, taxonomies, locale="en_US", page_offset=0, page_limit=5):
"""
Build the complete input JSON for search_media_cms_channels.
Args:
keywords: Comma-separated string of keywords
taxonomies: Comma-separated string of taxonomy labels
locale: Language locale (e.g., "en_US", "es_MX", "fr_CA")
page_offset: Starting offset for pagination (default: 0)
page_limit: Number of results to return (default: 5)
Returns:
Dictionary with properly formatted input
"""
return {
"inputs": [{
"searchKeyword": build_search_keyword(keywords),
"taxonomyExpression": build_taxonomy_expression(taxonomies),
"searchLanguage": locale,
"channelIds": "",
"channelType": "PublicUnauthenticated",
"contentTypeFqns": "sfdc_cms__image",
"pageOffset": page_offset,
"pageLimit": page_limit
}]
}
def main():
parser = argparse.ArgumentParser(
description='Build properly formatted input JSON for CMS image search',
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog="""
Examples:
# Basic search
python3 build_cms_search_input.py --keywords "car,automobile,vehicle" --taxonomies "Modern,Luxury" --locale "en_US"
# Search with only taxonomies (no keywords)
python3 build_cms_search_input.py --keywords "" --taxonomies "Bright,Spacious,Airy" --locale "en_US"
# Search with only keywords (no taxonomies)
python3 build_cms_search_input.py --keywords "logo,brand,corporate" --taxonomies "" --locale "en_US"
# With custom page limit
python3 build_cms_search_input.py --keywords "apartment" --taxonomies "Luxury" --locale "en_US" --limit 20
"""
)
parser.add_argument(
'--keywords',
required=True,
help='Comma-separated keywords (e.g., "car,automobile,vehicle"). Use empty string "" for no keywords.'
)
parser.add_argument(
'--taxonomies',
required=True,
help='Comma-separated taxonomy labels (e.g., "Modern,Luxury,Premium"). Use empty string "" for no taxonomies.'
)
parser.add_argument(
'--locale',
default='en_US',
help='Language locale (e.g., "en_US", "es_MX", "fr_CA"). Default: "en_US"'
)
parser.add_argument(
'--offset',
type=int,
default=0,
help='Page offset for pagination. Default: 0'
)
parser.add_argument(
'--limit',
type=int,
default=5,
help='Number of results to return. Default: 5'
)
args = parser.parse_args()
# Build the input
input_json = build_cms_search_input(
keywords=args.keywords,
taxonomies=args.taxonomies,
locale=args.locale,
page_offset=args.offset,
page_limit=args.limit
)
# Output JSON
print(json.dumps(input_json, indent=2))
return 0
if __name__ == "__main__":
sys.exit(main())