@tikomni/skills 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.skill-package-allowlist.txt +1 -3
- package/README.md +41 -49
- package/README.zh-CN.md +43 -51
- package/bin/tikomni-skills.js +2 -2
- package/env.example +37 -56
- package/package.json +7 -3
- package/skills/social-media-crawl/SKILL.md +53 -0
- package/skills/social-media-crawl/agents/openai.yaml +5 -0
- package/skills/social-media-crawl/references/contracts/output-envelope.md +22 -0
- package/skills/social-media-crawl/references/contracts/work-fact-card-fields.md +48 -0
- package/skills/social-media-crawl/references/guides/generic-mcp-objects.md +30 -0
- package/skills/social-media-crawl/references/mcp-usage-contract.md +30 -0
- package/skills/social-media-crawl/references/pipelines/douyin-creator-home.md +7 -0
- package/skills/social-media-crawl/references/pipelines/douyin-single-work.md +7 -0
- package/skills/social-media-crawl/references/pipelines/xiaohongshu-creator-home.md +7 -0
- package/skills/social-media-crawl/references/pipelines/xiaohongshu-single-work.md +7 -0
- package/skills/social-media-crawl/references/schemas/creator-profile.schema.json +33 -0
- package/skills/social-media-crawl/references/schemas/output-envelope.schema.json +41 -0
- package/skills/social-media-crawl/references/schemas/work-collection.schema.json +29 -0
- package/skills/social-media-crawl/references/schemas/work-fact-card.schema.json +67 -0
- package/skills/social-media-crawl/references/service-guides/u2-u3-mandatory-fallback.md +21 -0
- package/skills/social-media-crawl/scripts/__init__.py +2 -0
- package/skills/social-media-crawl/scripts/core/__init__.py +2 -0
- package/skills/{creator-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/asr_pipeline.py +252 -9
- package/skills/social-media-crawl/scripts/core/completeness.py +83 -0
- package/skills/{single-work-analysis → social-media-crawl}/scripts/core/config_loader.py +108 -167
- package/skills/social-media-crawl/scripts/core/mcp_dispatch.py +145 -0
- package/skills/social-media-crawl/scripts/core/object_detection.py +63 -0
- package/skills/{creator-analysis/scripts/pipeline/asr → social-media-crawl/scripts/core}/poll_u2_task.py +6 -2
- package/skills/{single-work-analysis → social-media-crawl}/scripts/core/progress_report.py +32 -0
- package/skills/social-media-crawl/scripts/core/storage_router.py +160 -0
- package/skills/{creator-analysis → social-media-crawl}/scripts/core/tikomni_common.py +13 -3
- package/skills/social-media-crawl/scripts/core/u3_fallback.py +328 -0
- package/skills/social-media-crawl/scripts/pipelines/__init__.py +2 -0
- package/skills/social-media-crawl/scripts/pipelines/douyin_creator_home_helpers.py +35 -0
- package/skills/social-media-crawl/scripts/pipelines/douyin_platform_adapter.py +7 -0
- package/skills/{creator-analysis/scripts/author_home/asr → social-media-crawl/scripts/pipelines}/home_asr.py +1 -1
- package/skills/{creator-analysis/scripts/author_home/adapters → social-media-crawl/scripts/pipelines}/platform_adapters.py +8 -2
- package/skills/social-media-crawl/scripts/pipelines/run_douyin_creator_home.py +237 -0
- package/skills/{single-work-analysis/scripts/platform/douyin/run_douyin_single_video.py → social-media-crawl/scripts/pipelines/run_douyin_single_work.py} +282 -174
- package/skills/social-media-crawl/scripts/pipelines/run_xiaohongshu_creator_home.py +237 -0
- package/skills/{single-work-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py → social-media-crawl/scripts/pipelines/run_xiaohongshu_single_work.py} +290 -141
- package/skills/{creator-analysis/scripts/author_home → social-media-crawl/scripts/pipelines}/schema.py +1 -1
- package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_creator_home_helpers.py +35 -0
- package/skills/social-media-crawl/scripts/pipelines/xiaohongshu_platform_adapter.py +7 -0
- package/skills/social-media-crawl/scripts/writers/__init__.py +1 -0
- package/skills/social-media-crawl/scripts/writers/write_work_fact_card.py +391 -0
- package/skills/creator-analysis/SKILL.md +0 -95
- package/skills/creator-analysis/agents/openai.yaml +0 -4
- package/skills/creator-analysis/env.example +0 -36
- package/skills/creator-analysis/references/api-capability-index.md +0 -92
- package/skills/creator-analysis/references/api-contracts/asr-api.md +0 -130
- package/skills/creator-analysis/references/api-contracts/bilibili-app-api.md +0 -776
- package/skills/creator-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
- package/skills/creator-analysis/references/api-contracts/demo-api.md +0 -717
- package/skills/creator-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
- package/skills/creator-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
- package/skills/creator-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
- package/skills/creator-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
- package/skills/creator-analysis/references/api-contracts/douyin-search-api.md +0 -4118
- package/skills/creator-analysis/references/api-contracts/douyin-web-api.md +0 -5544
- package/skills/creator-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
- package/skills/creator-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
- package/skills/creator-analysis/references/api-contracts/health-check.md +0 -69
- package/skills/creator-analysis/references/api-contracts/hybrid-parsing.md +0 -78
- package/skills/creator-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
- package/skills/creator-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
- package/skills/creator-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
- package/skills/creator-analysis/references/api-contracts/ios-shortcut.md +0 -44
- package/skills/creator-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
- package/skills/creator-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
- package/skills/creator-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
- package/skills/creator-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
- package/skills/creator-analysis/references/api-contracts/media-ingest-api.md +0 -126
- package/skills/creator-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
- package/skills/creator-analysis/references/api-contracts/reddit-app-api.md +0 -2025
- package/skills/creator-analysis/references/api-contracts/sora2-api.md +0 -2266
- package/skills/creator-analysis/references/api-contracts/temp-mail-api.md +0 -208
- package/skills/creator-analysis/references/api-contracts/threads-web-api.md +0 -897
- package/skills/creator-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
- package/skills/creator-analysis/references/api-contracts/tikhub-user-api.md +0 -494
- package/skills/creator-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
- package/skills/creator-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
- package/skills/creator-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
- package/skills/creator-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
- package/skills/creator-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
- package/skills/creator-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
- package/skills/creator-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
- package/skills/creator-analysis/references/api-contracts/toutiao-app-api.md +0 -342
- package/skills/creator-analysis/references/api-contracts/toutiao-web-api.md +0 -143
- package/skills/creator-analysis/references/api-contracts/twitter-web-api.md +0 -989
- package/skills/creator-analysis/references/api-contracts/wechat-channels-api.md +0 -809
- package/skills/creator-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
- package/skills/creator-analysis/references/api-contracts/weibo-app-api.md +0 -1547
- package/skills/creator-analysis/references/api-contracts/weibo-web-api.md +0 -798
- package/skills/creator-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
- package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
- package/skills/creator-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
- package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
- package/skills/creator-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
- package/skills/creator-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
- package/skills/creator-analysis/references/api-contracts/youtube-web-api.md +0 -2636
- package/skills/creator-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
- package/skills/creator-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
- package/skills/creator-analysis/references/api-tags/asr-api.md +0 -100
- package/skills/creator-analysis/references/api-tags/bilibili-app-api.md +0 -482
- package/skills/creator-analysis/references/api-tags/bilibili-web-api.md +0 -1267
- package/skills/creator-analysis/references/api-tags/demo-api.md +0 -365
- package/skills/creator-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
- package/skills/creator-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
- package/skills/creator-analysis/references/api-tags/douyin-creator-api.md +0 -694
- package/skills/creator-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
- package/skills/creator-analysis/references/api-tags/douyin-search-api.md +0 -1059
- package/skills/creator-analysis/references/api-tags/douyin-web-api.md +0 -3314
- package/skills/creator-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
- package/skills/creator-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
- package/skills/creator-analysis/references/api-tags/health-check.md +0 -40
- package/skills/creator-analysis/references/api-tags/hybrid-parsing.md +0 -57
- package/skills/creator-analysis/references/api-tags/instagram-v1-api.md +0 -1224
- package/skills/creator-analysis/references/api-tags/instagram-v2-api.md +0 -1147
- package/skills/creator-analysis/references/api-tags/instagram-v3-api.md +0 -1123
- package/skills/creator-analysis/references/api-tags/ios-shortcut.md +0 -45
- package/skills/creator-analysis/references/api-tags/kuaishou-app-api.md +0 -846
- package/skills/creator-analysis/references/api-tags/kuaishou-web-api.md +0 -551
- package/skills/creator-analysis/references/api-tags/lemon8-app-api.md +0 -687
- package/skills/creator-analysis/references/api-tags/linkedin-web-api.md +0 -1105
- package/skills/creator-analysis/references/api-tags/media-ingest-api.md +0 -112
- package/skills/creator-analysis/references/api-tags/pipixia-app-api.md +0 -721
- package/skills/creator-analysis/references/api-tags/reddit-app-api.md +0 -1057
- package/skills/creator-analysis/references/api-tags/sora2-api.md +0 -737
- package/skills/creator-analysis/references/api-tags/temp-mail-api.md +0 -136
- package/skills/creator-analysis/references/api-tags/threads-web-api.md +0 -472
- package/skills/creator-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
- package/skills/creator-analysis/references/api-tags/tikhub-user-api.md +0 -253
- package/skills/creator-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
- package/skills/creator-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
- package/skills/creator-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
- package/skills/creator-analysis/references/api-tags/tiktok-creator-api.md +0 -709
- package/skills/creator-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
- package/skills/creator-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
- package/skills/creator-analysis/references/api-tags/tiktok-web-api.md +0 -2516
- package/skills/creator-analysis/references/api-tags/toutiao-app-api.md +0 -220
- package/skills/creator-analysis/references/api-tags/toutiao-web-api.md +0 -96
- package/skills/creator-analysis/references/api-tags/twitter-web-api.md +0 -562
- package/skills/creator-analysis/references/api-tags/wechat-channels-api.md +0 -405
- package/skills/creator-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
- package/skills/creator-analysis/references/api-tags/weibo-app-api.md +0 -851
- package/skills/creator-analysis/references/api-tags/weibo-web-api.md +0 -470
- package/skills/creator-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
- package/skills/creator-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
- package/skills/creator-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
- package/skills/creator-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
- package/skills/creator-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
- package/skills/creator-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
- package/skills/creator-analysis/references/api-tags/youtube-web-api.md +0 -934
- package/skills/creator-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
- package/skills/creator-analysis/references/api-tags/zhihu-web-api.md +0 -1384
- package/skills/creator-analysis/references/asr-orchestration.md +0 -33
- package/skills/creator-analysis/references/config-templates/defaults.yaml +0 -60
- package/skills/creator-analysis/references/contracts/creator-card-fields.md +0 -25
- package/skills/creator-analysis/references/contracts/work-card-fields.md +0 -68
- package/skills/creator-analysis/references/platform-guides/douyin.md +0 -54
- package/skills/creator-analysis/references/platform-guides/generic.md +0 -50
- package/skills/creator-analysis/references/platform-guides/xiaohongshu.md +0 -69
- package/skills/creator-analysis/references/prompt-contracts/asr-clean.md +0 -28
- package/skills/creator-analysis/references/prompt-contracts/author-analysis-v2.md +0 -46
- package/skills/creator-analysis/references/prompt-contracts/author-analysis.md +0 -49
- package/skills/creator-analysis/references/prompt-contracts/cta.md +0 -24
- package/skills/creator-analysis/references/prompt-contracts/hook.md +0 -25
- package/skills/creator-analysis/references/prompt-contracts/insight.md +0 -47
- package/skills/creator-analysis/references/prompt-contracts/sampled-work-batch-explanations.md +0 -30
- package/skills/creator-analysis/references/prompt-contracts/structure.md +0 -25
- package/skills/creator-analysis/references/prompt-contracts/style.md +0 -27
- package/skills/creator-analysis/references/prompt-contracts/summary.md +0 -29
- package/skills/creator-analysis/references/prompt-contracts/topic.md +0 -29
- package/skills/creator-analysis/references/schemas/author-analysis-input-v1.schema.json +0 -325
- package/skills/creator-analysis/references/schemas/author-analysis-v2.schema.json +0 -287
- package/skills/creator-analysis/references/schemas/sampled-work-batch-explanations.schema.json +0 -41
- package/skills/creator-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
- package/skills/creator-analysis/references/workflow.md +0 -23
- package/skills/creator-analysis/scripts/__init__.py +0 -0
- package/skills/creator-analysis/scripts/author_home/__init__.py +0 -0
- package/skills/creator-analysis/scripts/author_home/adapters/__init__.py +0 -0
- package/skills/creator-analysis/scripts/author_home/analyzers/__init__.py +0 -0
- package/skills/creator-analysis/scripts/author_home/analyzers/author_analysis_v2_support.py +0 -1165
- package/skills/creator-analysis/scripts/author_home/analyzers/prompt_first_analyzers.py +0 -447
- package/skills/creator-analysis/scripts/author_home/analyzers/sampled_work_batch_explainer.py +0 -331
- package/skills/creator-analysis/scripts/author_home/asr/__init__.py +0 -5
- package/skills/creator-analysis/scripts/author_home/builders/__init__.py +0 -0
- package/skills/creator-analysis/scripts/author_home/builders/home_builders.py +0 -213
- package/skills/creator-analysis/scripts/author_home/collectors/__init__.py +0 -0
- package/skills/creator-analysis/scripts/author_home/orchestrator/__init__.py +0 -0
- package/skills/creator-analysis/scripts/author_home/orchestrator/run_author_analysis.py +0 -834
- package/skills/creator-analysis/scripts/author_home/orchestrator/work_analysis_artifacts.py +0 -609
- package/skills/creator-analysis/scripts/core/__init__.py +0 -0
- package/skills/creator-analysis/scripts/core/analysis_pipeline.py +0 -133
- package/skills/creator-analysis/scripts/core/config_loader.py +0 -418
- package/skills/creator-analysis/scripts/core/progress_report.py +0 -111
- package/skills/creator-analysis/scripts/core/storage_router.py +0 -256
- package/skills/creator-analysis/scripts/pipeline/__init__.py +0 -0
- package/skills/creator-analysis/scripts/pipeline/asr/__init__.py +0 -0
- package/skills/creator-analysis/scripts/platform/__init__.py +0 -0
- package/skills/creator-analysis/scripts/platform/douyin/__init__.py +0 -0
- package/skills/creator-analysis/scripts/platform/douyin/run_douyin_single_video.py +0 -1208
- package/skills/creator-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
- package/skills/creator-analysis/scripts/platform/xiaohongshu/run_xiaohongshu_extract.py +0 -2128
- package/skills/creator-analysis/scripts/writers/__init__.py +0 -0
- package/skills/creator-analysis/scripts/writers/write_author_homepage_samples.py +0 -107
- package/skills/creator-analysis/scripts/writers/write_benchmark_card.py +0 -1579
- package/skills/meta-capability/SKILL.md +0 -69
- package/skills/meta-capability/agents/openai.yaml +0 -4
- package/skills/meta-capability/env.example +0 -42
- package/skills/meta-capability/references/api-capability-index.md +0 -92
- package/skills/meta-capability/references/api-contracts/asr-api.md +0 -130
- package/skills/meta-capability/references/api-contracts/bilibili-app-api.md +0 -776
- package/skills/meta-capability/references/api-contracts/bilibili-web-api.md +0 -2017
- package/skills/meta-capability/references/api-contracts/demo-api.md +0 -717
- package/skills/meta-capability/references/api-contracts/douyin-app-v3-api.md +0 -3594
- package/skills/meta-capability/references/api-contracts/douyin-billboard-api.md +0 -2274
- package/skills/meta-capability/references/api-contracts/douyin-creator-api.md +0 -1575
- package/skills/meta-capability/references/api-contracts/douyin-creator-v2-api.md +0 -3254
- package/skills/meta-capability/references/api-contracts/douyin-search-api.md +0 -4118
- package/skills/meta-capability/references/api-contracts/douyin-web-api.md +0 -5544
- package/skills/meta-capability/references/api-contracts/douyin-xingtu-api.md +0 -1916
- package/skills/meta-capability/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
- package/skills/meta-capability/references/api-contracts/health-check.md +0 -69
- package/skills/meta-capability/references/api-contracts/hybrid-parsing.md +0 -78
- package/skills/meta-capability/references/api-contracts/instagram-v1-api.md +0 -2256
- package/skills/meta-capability/references/api-contracts/instagram-v2-api.md +0 -2011
- package/skills/meta-capability/references/api-contracts/instagram-v3-api.md +0 -2630
- package/skills/meta-capability/references/api-contracts/ios-shortcut.md +0 -44
- package/skills/meta-capability/references/api-contracts/kuaishou-app-api.md +0 -1518
- package/skills/meta-capability/references/api-contracts/kuaishou-web-api.md +0 -1242
- package/skills/meta-capability/references/api-contracts/lemon8-app-api.md +0 -1088
- package/skills/meta-capability/references/api-contracts/linkedin-web-api.md +0 -1949
- package/skills/meta-capability/references/api-contracts/media-ingest-api.md +0 -126
- package/skills/meta-capability/references/api-contracts/pipixia-app-api.md +0 -1142
- package/skills/meta-capability/references/api-contracts/reddit-app-api.md +0 -2025
- package/skills/meta-capability/references/api-contracts/sora2-api.md +0 -2266
- package/skills/meta-capability/references/api-contracts/temp-mail-api.md +0 -208
- package/skills/meta-capability/references/api-contracts/threads-web-api.md +0 -897
- package/skills/meta-capability/references/api-contracts/tikhub-downloader-api.md +0 -134
- package/skills/meta-capability/references/api-contracts/tikhub-user-api.md +0 -494
- package/skills/meta-capability/references/api-contracts/tiktok-ads-api.md +0 -5947
- package/skills/meta-capability/references/api-contracts/tiktok-analytics-api.md +0 -968
- package/skills/meta-capability/references/api-contracts/tiktok-app-v3-api.md +0 -5735
- package/skills/meta-capability/references/api-contracts/tiktok-creator-api.md +0 -1951
- package/skills/meta-capability/references/api-contracts/tiktok-interaction-api.md +0 -742
- package/skills/meta-capability/references/api-contracts/tiktok-shop-web-api.md +0 -1890
- package/skills/meta-capability/references/api-contracts/tiktok-web-api.md +0 -4448
- package/skills/meta-capability/references/api-contracts/toutiao-app-api.md +0 -342
- package/skills/meta-capability/references/api-contracts/toutiao-web-api.md +0 -143
- package/skills/meta-capability/references/api-contracts/twitter-web-api.md +0 -989
- package/skills/meta-capability/references/api-contracts/wechat-channels-api.md +0 -809
- package/skills/meta-capability/references/api-contracts/wechat-media-platform-web-api.md +0 -677
- package/skills/meta-capability/references/api-contracts/weibo-app-api.md +0 -1547
- package/skills/meta-capability/references/api-contracts/weibo-web-api.md +0 -798
- package/skills/meta-capability/references/api-contracts/weibo-web-v2-api.md +0 -2459
- package/skills/meta-capability/references/api-contracts/xiaohongshu-app-api.md +0 -1291
- package/skills/meta-capability/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
- package/skills/meta-capability/references/api-contracts/xiaohongshu-web-api.md +0 -1324
- package/skills/meta-capability/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
- package/skills/meta-capability/references/api-contracts/xigua-app-v2-api.md +0 -489
- package/skills/meta-capability/references/api-contracts/youtube-web-api.md +0 -2636
- package/skills/meta-capability/references/api-contracts/youtube-web-v2-api.md +0 -2660
- package/skills/meta-capability/references/api-contracts/zhihu-web-api.md +0 -2315
- package/skills/meta-capability/references/api-tags/asr-api.md +0 -100
- package/skills/meta-capability/references/api-tags/bilibili-app-api.md +0 -482
- package/skills/meta-capability/references/api-tags/bilibili-web-api.md +0 -1267
- package/skills/meta-capability/references/api-tags/demo-api.md +0 -365
- package/skills/meta-capability/references/api-tags/douyin-app-v3-api.md +0 -2012
- package/skills/meta-capability/references/api-tags/douyin-billboard-api.md +0 -1428
- package/skills/meta-capability/references/api-tags/douyin-creator-api.md +0 -694
- package/skills/meta-capability/references/api-tags/douyin-creator-v2-api.md +0 -694
- package/skills/meta-capability/references/api-tags/douyin-search-api.md +0 -1059
- package/skills/meta-capability/references/api-tags/douyin-web-api.md +0 -3314
- package/skills/meta-capability/references/api-tags/douyin-xingtu-api.md +0 -935
- package/skills/meta-capability/references/api-tags/douyin-xingtu-v2-api.md +0 -925
- package/skills/meta-capability/references/api-tags/health-check.md +0 -40
- package/skills/meta-capability/references/api-tags/hybrid-parsing.md +0 -57
- package/skills/meta-capability/references/api-tags/instagram-v1-api.md +0 -1224
- package/skills/meta-capability/references/api-tags/instagram-v2-api.md +0 -1147
- package/skills/meta-capability/references/api-tags/instagram-v3-api.md +0 -1123
- package/skills/meta-capability/references/api-tags/ios-shortcut.md +0 -45
- package/skills/meta-capability/references/api-tags/kuaishou-app-api.md +0 -846
- package/skills/meta-capability/references/api-tags/kuaishou-web-api.md +0 -551
- package/skills/meta-capability/references/api-tags/lemon8-app-api.md +0 -687
- package/skills/meta-capability/references/api-tags/linkedin-web-api.md +0 -1105
- package/skills/meta-capability/references/api-tags/media-ingest-api.md +0 -112
- package/skills/meta-capability/references/api-tags/pipixia-app-api.md +0 -721
- package/skills/meta-capability/references/api-tags/reddit-app-api.md +0 -1057
- package/skills/meta-capability/references/api-tags/sora2-api.md +0 -737
- package/skills/meta-capability/references/api-tags/temp-mail-api.md +0 -136
- package/skills/meta-capability/references/api-tags/threads-web-api.md +0 -472
- package/skills/meta-capability/references/api-tags/tikhub-downloader-api.md +0 -65
- package/skills/meta-capability/references/api-tags/tikhub-user-api.md +0 -253
- package/skills/meta-capability/references/api-tags/tiktok-ads-api.md +0 -1393
- package/skills/meta-capability/references/api-tags/tiktok-analytics-api.md +0 -179
- package/skills/meta-capability/references/api-tags/tiktok-app-v3-api.md +0 -3264
- package/skills/meta-capability/references/api-tags/tiktok-creator-api.md +0 -709
- package/skills/meta-capability/references/api-tags/tiktok-interaction-api.md +0 -366
- package/skills/meta-capability/references/api-tags/tiktok-shop-web-api.md +0 -663
- package/skills/meta-capability/references/api-tags/tiktok-web-api.md +0 -2516
- package/skills/meta-capability/references/api-tags/toutiao-app-api.md +0 -220
- package/skills/meta-capability/references/api-tags/toutiao-web-api.md +0 -96
- package/skills/meta-capability/references/api-tags/twitter-web-api.md +0 -562
- package/skills/meta-capability/references/api-tags/wechat-channels-api.md +0 -405
- package/skills/meta-capability/references/api-tags/wechat-media-platform-web-api.md +0 -431
- package/skills/meta-capability/references/api-tags/weibo-app-api.md +0 -851
- package/skills/meta-capability/references/api-tags/weibo-web-api.md +0 -470
- package/skills/meta-capability/references/api-tags/weibo-web-v2-api.md +0 -1405
- package/skills/meta-capability/references/api-tags/xiaohongshu-app-api.md +0 -534
- package/skills/meta-capability/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
- package/skills/meta-capability/references/api-tags/xiaohongshu-web-api.md +0 -757
- package/skills/meta-capability/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
- package/skills/meta-capability/references/api-tags/xigua-app-v2-api.md +0 -308
- package/skills/meta-capability/references/api-tags/youtube-web-api.md +0 -934
- package/skills/meta-capability/references/api-tags/youtube-web-v2-api.md +0 -717
- package/skills/meta-capability/references/api-tags/zhihu-web-api.md +0 -1384
- package/skills/meta-capability/references/config-templates/defaults.yaml +0 -18
- package/skills/meta-capability/references/dispatch.md +0 -27
- package/skills/meta-capability/references/execution-guidelines.md +0 -25
- package/skills/meta-capability/references/implemented-route-map.md +0 -177
- package/skills/meta-capability/references/service-guides/asr-u2-u3-fallback.md +0 -75
- package/skills/meta-capability/scripts/__init__.py +0 -1
- package/skills/meta-capability/scripts/call_route.py +0 -141
- package/skills/meta-capability/scripts/core/__init__.py +0 -1
- package/skills/meta-capability/scripts/core/bootstrap_env.py +0 -32
- package/skills/meta-capability/scripts/core/config_loader.py +0 -204
- package/skills/meta-capability/scripts/core/tikomni_common.py +0 -443
- package/skills/meta-capability/scripts/test_auth.py +0 -98
- package/skills/single-work-analysis/SKILL.md +0 -62
- package/skills/single-work-analysis/agents/openai.yaml +0 -4
- package/skills/single-work-analysis/env.example +0 -36
- package/skills/single-work-analysis/references/api-capability-index.md +0 -92
- package/skills/single-work-analysis/references/api-contracts/asr-api.md +0 -130
- package/skills/single-work-analysis/references/api-contracts/bilibili-app-api.md +0 -776
- package/skills/single-work-analysis/references/api-contracts/bilibili-web-api.md +0 -2017
- package/skills/single-work-analysis/references/api-contracts/demo-api.md +0 -717
- package/skills/single-work-analysis/references/api-contracts/douyin-app-v3-api.md +0 -3594
- package/skills/single-work-analysis/references/api-contracts/douyin-billboard-api.md +0 -2274
- package/skills/single-work-analysis/references/api-contracts/douyin-creator-api.md +0 -1575
- package/skills/single-work-analysis/references/api-contracts/douyin-creator-v2-api.md +0 -3254
- package/skills/single-work-analysis/references/api-contracts/douyin-search-api.md +0 -4118
- package/skills/single-work-analysis/references/api-contracts/douyin-web-api.md +0 -5544
- package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-api.md +0 -1916
- package/skills/single-work-analysis/references/api-contracts/douyin-xingtu-v2-api.md +0 -1540
- package/skills/single-work-analysis/references/api-contracts/health-check.md +0 -69
- package/skills/single-work-analysis/references/api-contracts/hybrid-parsing.md +0 -78
- package/skills/single-work-analysis/references/api-contracts/instagram-v1-api.md +0 -2256
- package/skills/single-work-analysis/references/api-contracts/instagram-v2-api.md +0 -2011
- package/skills/single-work-analysis/references/api-contracts/instagram-v3-api.md +0 -2630
- package/skills/single-work-analysis/references/api-contracts/ios-shortcut.md +0 -44
- package/skills/single-work-analysis/references/api-contracts/kuaishou-app-api.md +0 -1518
- package/skills/single-work-analysis/references/api-contracts/kuaishou-web-api.md +0 -1242
- package/skills/single-work-analysis/references/api-contracts/lemon8-app-api.md +0 -1088
- package/skills/single-work-analysis/references/api-contracts/linkedin-web-api.md +0 -1949
- package/skills/single-work-analysis/references/api-contracts/media-ingest-api.md +0 -126
- package/skills/single-work-analysis/references/api-contracts/pipixia-app-api.md +0 -1142
- package/skills/single-work-analysis/references/api-contracts/reddit-app-api.md +0 -2025
- package/skills/single-work-analysis/references/api-contracts/sora2-api.md +0 -2266
- package/skills/single-work-analysis/references/api-contracts/temp-mail-api.md +0 -208
- package/skills/single-work-analysis/references/api-contracts/threads-web-api.md +0 -897
- package/skills/single-work-analysis/references/api-contracts/tikhub-downloader-api.md +0 -134
- package/skills/single-work-analysis/references/api-contracts/tikhub-user-api.md +0 -494
- package/skills/single-work-analysis/references/api-contracts/tiktok-ads-api.md +0 -5947
- package/skills/single-work-analysis/references/api-contracts/tiktok-analytics-api.md +0 -968
- package/skills/single-work-analysis/references/api-contracts/tiktok-app-v3-api.md +0 -5735
- package/skills/single-work-analysis/references/api-contracts/tiktok-creator-api.md +0 -1951
- package/skills/single-work-analysis/references/api-contracts/tiktok-interaction-api.md +0 -742
- package/skills/single-work-analysis/references/api-contracts/tiktok-shop-web-api.md +0 -1890
- package/skills/single-work-analysis/references/api-contracts/tiktok-web-api.md +0 -4448
- package/skills/single-work-analysis/references/api-contracts/toutiao-app-api.md +0 -342
- package/skills/single-work-analysis/references/api-contracts/toutiao-web-api.md +0 -143
- package/skills/single-work-analysis/references/api-contracts/twitter-web-api.md +0 -989
- package/skills/single-work-analysis/references/api-contracts/wechat-channels-api.md +0 -809
- package/skills/single-work-analysis/references/api-contracts/wechat-media-platform-web-api.md +0 -677
- package/skills/single-work-analysis/references/api-contracts/weibo-app-api.md +0 -1547
- package/skills/single-work-analysis/references/api-contracts/weibo-web-api.md +0 -798
- package/skills/single-work-analysis/references/api-contracts/weibo-web-v2-api.md +0 -2459
- package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-api.md +0 -1291
- package/skills/single-work-analysis/references/api-contracts/xiaohongshu-app-v2-api.md +0 -1683
- package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-api.md +0 -1324
- package/skills/single-work-analysis/references/api-contracts/xiaohongshu-web-v2-api.md +0 -1209
- package/skills/single-work-analysis/references/api-contracts/xigua-app-v2-api.md +0 -489
- package/skills/single-work-analysis/references/api-contracts/youtube-web-api.md +0 -2636
- package/skills/single-work-analysis/references/api-contracts/youtube-web-v2-api.md +0 -2660
- package/skills/single-work-analysis/references/api-contracts/zhihu-web-api.md +0 -2315
- package/skills/single-work-analysis/references/api-tags/asr-api.md +0 -100
- package/skills/single-work-analysis/references/api-tags/bilibili-app-api.md +0 -482
- package/skills/single-work-analysis/references/api-tags/bilibili-web-api.md +0 -1267
- package/skills/single-work-analysis/references/api-tags/demo-api.md +0 -365
- package/skills/single-work-analysis/references/api-tags/douyin-app-v3-api.md +0 -2012
- package/skills/single-work-analysis/references/api-tags/douyin-billboard-api.md +0 -1428
- package/skills/single-work-analysis/references/api-tags/douyin-creator-api.md +0 -694
- package/skills/single-work-analysis/references/api-tags/douyin-creator-v2-api.md +0 -694
- package/skills/single-work-analysis/references/api-tags/douyin-search-api.md +0 -1059
- package/skills/single-work-analysis/references/api-tags/douyin-web-api.md +0 -3314
- package/skills/single-work-analysis/references/api-tags/douyin-xingtu-api.md +0 -935
- package/skills/single-work-analysis/references/api-tags/douyin-xingtu-v2-api.md +0 -925
- package/skills/single-work-analysis/references/api-tags/health-check.md +0 -40
- package/skills/single-work-analysis/references/api-tags/hybrid-parsing.md +0 -57
- package/skills/single-work-analysis/references/api-tags/instagram-v1-api.md +0 -1224
- package/skills/single-work-analysis/references/api-tags/instagram-v2-api.md +0 -1147
- package/skills/single-work-analysis/references/api-tags/instagram-v3-api.md +0 -1123
- package/skills/single-work-analysis/references/api-tags/ios-shortcut.md +0 -45
- package/skills/single-work-analysis/references/api-tags/kuaishou-app-api.md +0 -846
- package/skills/single-work-analysis/references/api-tags/kuaishou-web-api.md +0 -551
- package/skills/single-work-analysis/references/api-tags/lemon8-app-api.md +0 -687
- package/skills/single-work-analysis/references/api-tags/linkedin-web-api.md +0 -1105
- package/skills/single-work-analysis/references/api-tags/media-ingest-api.md +0 -112
- package/skills/single-work-analysis/references/api-tags/pipixia-app-api.md +0 -721
- package/skills/single-work-analysis/references/api-tags/reddit-app-api.md +0 -1057
- package/skills/single-work-analysis/references/api-tags/sora2-api.md +0 -737
- package/skills/single-work-analysis/references/api-tags/temp-mail-api.md +0 -136
- package/skills/single-work-analysis/references/api-tags/threads-web-api.md +0 -472
- package/skills/single-work-analysis/references/api-tags/tikhub-downloader-api.md +0 -65
- package/skills/single-work-analysis/references/api-tags/tikhub-user-api.md +0 -253
- package/skills/single-work-analysis/references/api-tags/tiktok-ads-api.md +0 -1393
- package/skills/single-work-analysis/references/api-tags/tiktok-analytics-api.md +0 -179
- package/skills/single-work-analysis/references/api-tags/tiktok-app-v3-api.md +0 -3264
- package/skills/single-work-analysis/references/api-tags/tiktok-creator-api.md +0 -709
- package/skills/single-work-analysis/references/api-tags/tiktok-interaction-api.md +0 -366
- package/skills/single-work-analysis/references/api-tags/tiktok-shop-web-api.md +0 -663
- package/skills/single-work-analysis/references/api-tags/tiktok-web-api.md +0 -2516
- package/skills/single-work-analysis/references/api-tags/toutiao-app-api.md +0 -220
- package/skills/single-work-analysis/references/api-tags/toutiao-web-api.md +0 -96
- package/skills/single-work-analysis/references/api-tags/twitter-web-api.md +0 -562
- package/skills/single-work-analysis/references/api-tags/wechat-channels-api.md +0 -405
- package/skills/single-work-analysis/references/api-tags/wechat-media-platform-web-api.md +0 -431
- package/skills/single-work-analysis/references/api-tags/weibo-app-api.md +0 -851
- package/skills/single-work-analysis/references/api-tags/weibo-web-api.md +0 -470
- package/skills/single-work-analysis/references/api-tags/weibo-web-v2-api.md +0 -1405
- package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-api.md +0 -534
- package/skills/single-work-analysis/references/api-tags/xiaohongshu-app-v2-api.md +0 -934
- package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-api.md +0 -757
- package/skills/single-work-analysis/references/api-tags/xiaohongshu-web-v2-api.md +0 -762
- package/skills/single-work-analysis/references/api-tags/xigua-app-v2-api.md +0 -308
- package/skills/single-work-analysis/references/api-tags/youtube-web-api.md +0 -934
- package/skills/single-work-analysis/references/api-tags/youtube-web-v2-api.md +0 -717
- package/skills/single-work-analysis/references/api-tags/zhihu-web-api.md +0 -1384
- package/skills/single-work-analysis/references/asr-and-fallback.md +0 -20
- package/skills/single-work-analysis/references/config-templates/defaults.yaml +0 -58
- package/skills/single-work-analysis/references/contracts/work-card-fields.md +0 -41
- package/skills/single-work-analysis/references/platform-guides/douyin.md +0 -47
- package/skills/single-work-analysis/references/platform-guides/generic.md +0 -43
- package/skills/single-work-analysis/references/platform-guides/xiaohongshu.md +0 -54
- package/skills/single-work-analysis/references/prompt-contracts/asr-clean.md +0 -28
- package/skills/single-work-analysis/references/prompt-contracts/cta.md +0 -24
- package/skills/single-work-analysis/references/prompt-contracts/hook.md +0 -25
- package/skills/single-work-analysis/references/prompt-contracts/insight.md +0 -47
- package/skills/single-work-analysis/references/prompt-contracts/structure.md +0 -25
- package/skills/single-work-analysis/references/prompt-contracts/style.md +0 -27
- package/skills/single-work-analysis/references/prompt-contracts/summary.md +0 -29
- package/skills/single-work-analysis/references/prompt-contracts/topic.md +0 -29
- package/skills/single-work-analysis/references/schemas/work-card.schema.json +0 -39
- package/skills/single-work-analysis/references/service-guides/asr-u2-u3-fallback.md +0 -75
- package/skills/single-work-analysis/scripts/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/core/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/core/analysis_pipeline.py +0 -133
- package/skills/single-work-analysis/scripts/core/bootstrap_env.py +0 -35
- package/skills/single-work-analysis/scripts/core/extract_pipeline.py +0 -173
- package/skills/single-work-analysis/scripts/core/storage_router.py +0 -253
- package/skills/single-work-analysis/scripts/core/tikomni_common.py +0 -588
- package/skills/single-work-analysis/scripts/pipeline/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/pipeline/asr/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/pipeline/asr/asr_pipeline.py +0 -1189
- package/skills/single-work-analysis/scripts/pipeline/asr/poll_u2_task.py +0 -95
- package/skills/single-work-analysis/scripts/platform/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/platform/douyin/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/platform/douyin/douyin_video_type_matrix.py +0 -224
- package/skills/single-work-analysis/scripts/platform/douyin/select_low_quality_video_url.py +0 -200
- package/skills/single-work-analysis/scripts/platform/xiaohongshu/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/writers/__init__.py +0 -0
- package/skills/single-work-analysis/scripts/writers/write_benchmark_card.py +0 -1402
- /package/skills/{creator-analysis → social-media-crawl}/scripts/core/bootstrap_env.py +0 -0
- /package/skills/{creator-analysis → social-media-crawl}/scripts/core/extract_pipeline.py +0 -0
- /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/douyin_video_type_matrix.py +0 -0
- /package/skills/{creator-analysis/scripts/author_home/collectors → social-media-crawl/scripts/pipelines}/homepage_collectors.py +0 -0
- /package/skills/{creator-analysis/scripts/platform/douyin → social-media-crawl/scripts/pipelines}/select_low_quality_video_url.py +0 -0
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
|
-
if __package__ in {None, ""}:
|
|
4
|
-
import sys
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
|
|
7
|
-
_self = Path(__file__).resolve()
|
|
8
|
-
for _parent in _self.parents:
|
|
9
|
-
if (_parent / "scripts" / "core" / "bootstrap_env.py").is_file():
|
|
10
|
-
sys.path.insert(0, str(_parent))
|
|
11
|
-
break
|
|
12
|
-
|
|
13
|
-
"""Poll Tikomni U2 task until terminal state."""
|
|
14
|
-
|
|
15
|
-
from scripts.core.bootstrap_env import bootstrap_for_direct_run
|
|
16
|
-
|
|
17
|
-
bootstrap_for_direct_run(__file__, __package__)
|
|
18
|
-
|
|
19
|
-
import argparse
|
|
20
|
-
from typing import Any, Dict
|
|
21
|
-
|
|
22
|
-
from scripts.pipeline.asr.asr_pipeline import poll_u2_task_core
|
|
23
|
-
from scripts.core.tikomni_common import extract_error_reason, resolve_runtime, write_json_stdout
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def poll_u2_task(
|
|
27
|
-
*,
|
|
28
|
-
base_url: str,
|
|
29
|
-
token: str,
|
|
30
|
-
timeout_ms: int,
|
|
31
|
-
task_id: str,
|
|
32
|
-
poll_interval_sec: float,
|
|
33
|
-
max_polls: int,
|
|
34
|
-
) -> Dict[str, Any]:
|
|
35
|
-
return poll_u2_task_core(
|
|
36
|
-
base_url=base_url,
|
|
37
|
-
token=token,
|
|
38
|
-
timeout_ms=timeout_ms,
|
|
39
|
-
task_id=task_id,
|
|
40
|
-
poll_interval_sec=poll_interval_sec,
|
|
41
|
-
max_polls=max_polls,
|
|
42
|
-
)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
def main() -> None:
|
|
46
|
-
parser = argparse.ArgumentParser(description="Poll Tikomni U2 task until SUCCEEDED/FAILED")
|
|
47
|
-
parser.add_argument("task_id", help="U2 task id")
|
|
48
|
-
parser.add_argument("--env-file", default=None, help="Optional env file path (e.g. <skill_root>/.env.local)")
|
|
49
|
-
parser.add_argument("--api-key-env", default="TIKOMNI_API_KEY", help="API key env variable name")
|
|
50
|
-
parser.add_argument("--allow-process-env", action="store_true", help="Allow process env to override .env/.env.local")
|
|
51
|
-
parser.add_argument("--base-url", default=None, help="Tikomni API base url")
|
|
52
|
-
parser.add_argument("--timeout-ms", type=int, default=None, help="Request timeout in milliseconds")
|
|
53
|
-
parser.add_argument("--poll-interval-sec", type=float, default=3.0, help="Polling interval in seconds")
|
|
54
|
-
parser.add_argument("--max-polls", type=int, default=30, help="Max polling attempts")
|
|
55
|
-
args = parser.parse_args()
|
|
56
|
-
|
|
57
|
-
try:
|
|
58
|
-
runtime = resolve_runtime(
|
|
59
|
-
env_file=args.env_file,
|
|
60
|
-
api_key_env=args.api_key_env,
|
|
61
|
-
base_url=args.base_url,
|
|
62
|
-
timeout_ms=args.timeout_ms,
|
|
63
|
-
allow_process_env=args.allow_process_env,
|
|
64
|
-
)
|
|
65
|
-
except ValueError as error:
|
|
66
|
-
write_json_stdout(
|
|
67
|
-
{
|
|
68
|
-
"ok": False,
|
|
69
|
-
"task_id": args.task_id,
|
|
70
|
-
"task_status": "UNKNOWN",
|
|
71
|
-
"error_reason": str(error),
|
|
72
|
-
"request_id": None,
|
|
73
|
-
"trace": [],
|
|
74
|
-
}
|
|
75
|
-
)
|
|
76
|
-
raise SystemExit(2) from error
|
|
77
|
-
|
|
78
|
-
result = poll_u2_task(
|
|
79
|
-
base_url=runtime["base_url"],
|
|
80
|
-
token=runtime["token"],
|
|
81
|
-
timeout_ms=runtime["timeout_ms"],
|
|
82
|
-
task_id=args.task_id,
|
|
83
|
-
poll_interval_sec=args.poll_interval_sec,
|
|
84
|
-
max_polls=args.max_polls,
|
|
85
|
-
)
|
|
86
|
-
|
|
87
|
-
if not result["ok"] and not result.get("error_reason"):
|
|
88
|
-
result["error_reason"] = extract_error_reason(result.get("raw_task", {}))
|
|
89
|
-
|
|
90
|
-
write_json_stdout(result)
|
|
91
|
-
raise SystemExit(0 if result["ok"] else 1)
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if __name__ == "__main__":
|
|
95
|
-
main()
|
|
File without changes
|
|
File without changes
|
|
@@ -1,224 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Normalize Douyin item type into a stable video gate decision."""
|
|
3
|
-
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
from typing import Any, Dict, Optional, Tuple
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
VIDEO_MODEL_VIDEO_TOKENS = {
|
|
10
|
-
"video",
|
|
11
|
-
"long_video",
|
|
12
|
-
"mix_video",
|
|
13
|
-
"playlet_video",
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
VIDEO_MODEL_NON_VIDEO_TOKENS = {
|
|
17
|
-
"image",
|
|
18
|
-
"images",
|
|
19
|
-
"photo",
|
|
20
|
-
"atlas",
|
|
21
|
-
"text",
|
|
22
|
-
"live_photo",
|
|
23
|
-
"slideshow",
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
ITEM_TYPE_VIDEO_TOKENS = {
|
|
27
|
-
"video",
|
|
28
|
-
"long_video",
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
ITEM_TYPE_NON_VIDEO_TOKENS = {
|
|
32
|
-
"image",
|
|
33
|
-
"images",
|
|
34
|
-
"photo",
|
|
35
|
-
"atlas",
|
|
36
|
-
"text",
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
# Known common values; unknown values will fall back to structural inspection.
|
|
40
|
-
AWEME_TYPE_VIDEO_VALUES = {
|
|
41
|
-
0,
|
|
42
|
-
4,
|
|
43
|
-
51,
|
|
44
|
-
55,
|
|
45
|
-
58,
|
|
46
|
-
61,
|
|
47
|
-
109,
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
AWEME_TYPE_NON_VIDEO_VALUES = {
|
|
51
|
-
2,
|
|
52
|
-
68,
|
|
53
|
-
150,
|
|
54
|
-
151,
|
|
55
|
-
152,
|
|
56
|
-
153,
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
def _to_bool(value: Any) -> Optional[bool]:
|
|
61
|
-
if isinstance(value, bool):
|
|
62
|
-
return value
|
|
63
|
-
if isinstance(value, int):
|
|
64
|
-
if value in (0, 1):
|
|
65
|
-
return bool(value)
|
|
66
|
-
return None
|
|
67
|
-
if isinstance(value, str):
|
|
68
|
-
token = value.strip().lower()
|
|
69
|
-
if token in {"1", "true", "yes", "y"}:
|
|
70
|
-
return True
|
|
71
|
-
if token in {"0", "false", "no", "n"}:
|
|
72
|
-
return False
|
|
73
|
-
return None
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def _to_int(value: Any) -> Optional[int]:
|
|
77
|
-
if isinstance(value, bool):
|
|
78
|
-
return 1 if value else 0
|
|
79
|
-
if isinstance(value, int):
|
|
80
|
-
return value
|
|
81
|
-
if isinstance(value, str):
|
|
82
|
-
text = value.strip()
|
|
83
|
-
if text.startswith("-"):
|
|
84
|
-
sign = -1
|
|
85
|
-
text = text[1:]
|
|
86
|
-
else:
|
|
87
|
-
sign = 1
|
|
88
|
-
if text.isdigit():
|
|
89
|
-
return sign * int(text)
|
|
90
|
-
return None
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
def _pick_field(item: Dict[str, Any], key: str) -> Any:
|
|
94
|
-
if key in item:
|
|
95
|
-
return item.get(key)
|
|
96
|
-
video = item.get("video")
|
|
97
|
-
if isinstance(video, dict) and key in video:
|
|
98
|
-
return video.get(key)
|
|
99
|
-
return None
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
def _match_token(value: Any, allow: set[str], deny: set[str]) -> Optional[Tuple[bool, str]]:
|
|
103
|
-
if not isinstance(value, str):
|
|
104
|
-
return None
|
|
105
|
-
token = value.strip().lower()
|
|
106
|
-
if not token:
|
|
107
|
-
return None
|
|
108
|
-
|
|
109
|
-
# Some responses return serialized JSON in `video_model`; ignore those blobs.
|
|
110
|
-
if token.startswith("{") or token.startswith("["):
|
|
111
|
-
return None
|
|
112
|
-
|
|
113
|
-
if token in allow:
|
|
114
|
-
return True, token
|
|
115
|
-
if token in deny:
|
|
116
|
-
return False, token
|
|
117
|
-
|
|
118
|
-
# tolerant contains-match for compact variants like "video_model_video"
|
|
119
|
-
if len(token) <= 64:
|
|
120
|
-
for candidate in allow:
|
|
121
|
-
if candidate and candidate in token:
|
|
122
|
-
return True, token
|
|
123
|
-
for candidate in deny:
|
|
124
|
-
if candidate and candidate in token:
|
|
125
|
-
return False, token
|
|
126
|
-
|
|
127
|
-
return None
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
def _has_video_structure(item: Dict[str, Any]) -> bool:
|
|
131
|
-
video = item.get("video")
|
|
132
|
-
if not isinstance(video, dict):
|
|
133
|
-
return False
|
|
134
|
-
|
|
135
|
-
if isinstance(video.get("download_addr"), dict):
|
|
136
|
-
addr = video.get("download_addr")
|
|
137
|
-
if isinstance(addr.get("url_list"), list) and len(addr.get("url_list")) > 0:
|
|
138
|
-
return True
|
|
139
|
-
if isinstance(video.get("play_addr"), dict):
|
|
140
|
-
addr = video.get("play_addr")
|
|
141
|
-
if isinstance(addr.get("url_list"), list) and len(addr.get("url_list")) > 0:
|
|
142
|
-
return True
|
|
143
|
-
if isinstance(video.get("bit_rate"), list) and len(video.get("bit_rate")) > 0:
|
|
144
|
-
return True
|
|
145
|
-
if isinstance(video.get("duration"), (int, float)) and float(video.get("duration")) > 0:
|
|
146
|
-
return True
|
|
147
|
-
|
|
148
|
-
return False
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def normalize_douyin_video_type(item: Dict[str, Any]) -> Dict[str, Any]:
|
|
152
|
-
"""Return normalized `is_video` + reason from mixed Douyin schemas.
|
|
153
|
-
|
|
154
|
-
Compatible fields include:
|
|
155
|
-
- is_video
|
|
156
|
-
- video_model (item-level and video.video_model)
|
|
157
|
-
- item_type
|
|
158
|
-
- aweme_type
|
|
159
|
-
- structural fallback via item.video.*
|
|
160
|
-
"""
|
|
161
|
-
|
|
162
|
-
explicit_is_video = _to_bool(_pick_field(item, "is_video"))
|
|
163
|
-
if explicit_is_video is not None:
|
|
164
|
-
return {
|
|
165
|
-
"is_video": explicit_is_video,
|
|
166
|
-
"video_type_reason": f"is_video={explicit_is_video}",
|
|
167
|
-
"matched_field": "is_video",
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
video_model_value = _pick_field(item, "video_model")
|
|
171
|
-
video_model_match = _match_token(video_model_value, VIDEO_MODEL_VIDEO_TOKENS, VIDEO_MODEL_NON_VIDEO_TOKENS)
|
|
172
|
-
if video_model_match is not None:
|
|
173
|
-
is_video, token = video_model_match
|
|
174
|
-
return {
|
|
175
|
-
"is_video": is_video,
|
|
176
|
-
"video_type_reason": f"video_model={token}",
|
|
177
|
-
"matched_field": "video_model",
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
item_type_value = _pick_field(item, "item_type")
|
|
181
|
-
item_type_match = _match_token(item_type_value, ITEM_TYPE_VIDEO_TOKENS, ITEM_TYPE_NON_VIDEO_TOKENS)
|
|
182
|
-
if item_type_match is not None:
|
|
183
|
-
is_video, token = item_type_match
|
|
184
|
-
return {
|
|
185
|
-
"is_video": is_video,
|
|
186
|
-
"video_type_reason": f"item_type={token}",
|
|
187
|
-
"matched_field": "item_type",
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
aweme_type_value = _to_int(_pick_field(item, "aweme_type"))
|
|
191
|
-
if aweme_type_value is not None:
|
|
192
|
-
if aweme_type_value in AWEME_TYPE_VIDEO_VALUES:
|
|
193
|
-
return {
|
|
194
|
-
"is_video": True,
|
|
195
|
-
"video_type_reason": f"aweme_type={aweme_type_value}:video",
|
|
196
|
-
"matched_field": "aweme_type",
|
|
197
|
-
}
|
|
198
|
-
if aweme_type_value in AWEME_TYPE_NON_VIDEO_VALUES:
|
|
199
|
-
return {
|
|
200
|
-
"is_video": False,
|
|
201
|
-
"video_type_reason": f"aweme_type={aweme_type_value}:non_video",
|
|
202
|
-
"matched_field": "aweme_type",
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
if _has_video_structure(item):
|
|
206
|
-
return {
|
|
207
|
-
"is_video": True,
|
|
208
|
-
"video_type_reason": "video_struct_present",
|
|
209
|
-
"matched_field": "video_struct",
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
image_infos = item.get("image_infos")
|
|
213
|
-
if isinstance(image_infos, list) and len(image_infos) > 0:
|
|
214
|
-
return {
|
|
215
|
-
"is_video": False,
|
|
216
|
-
"video_type_reason": "image_infos_present",
|
|
217
|
-
"matched_field": "image_infos",
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
return {
|
|
221
|
-
"is_video": False,
|
|
222
|
-
"video_type_reason": "unknown_non_video_default",
|
|
223
|
-
"matched_field": "default",
|
|
224
|
-
}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""Low-quality-first video URL selector for Douyin single video flow."""
|
|
3
|
-
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
import re
|
|
7
|
-
from typing import Any, Dict, List, Optional, Tuple
|
|
8
|
-
from urllib.parse import parse_qs, urlparse
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def _dedupe_urls(values: List[str]) -> List[str]:
|
|
12
|
-
seen = set()
|
|
13
|
-
ordered: List[str] = []
|
|
14
|
-
for value in values:
|
|
15
|
-
if not isinstance(value, str):
|
|
16
|
-
continue
|
|
17
|
-
url = value.strip()
|
|
18
|
-
if not (url.startswith("http://") or url.startswith("https://")):
|
|
19
|
-
continue
|
|
20
|
-
if url in seen:
|
|
21
|
-
continue
|
|
22
|
-
seen.add(url)
|
|
23
|
-
ordered.append(url)
|
|
24
|
-
return ordered
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def _extract_urls_from_addr(addr: Any) -> List[str]:
|
|
28
|
-
if not isinstance(addr, dict):
|
|
29
|
-
return []
|
|
30
|
-
urls = addr.get("url_list")
|
|
31
|
-
if not isinstance(urls, list):
|
|
32
|
-
return []
|
|
33
|
-
return _dedupe_urls([str(item) for item in urls if isinstance(item, str)])
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def _quality_hint_score(url: str) -> Optional[int]:
|
|
37
|
-
parsed = urlparse(url)
|
|
38
|
-
query = parse_qs(parsed.query)
|
|
39
|
-
|
|
40
|
-
# Highest confidence: explicit quality-like query params.
|
|
41
|
-
for key in ("ratio", "resolution", "quality", "qn"):
|
|
42
|
-
values = query.get(key)
|
|
43
|
-
if not values:
|
|
44
|
-
continue
|
|
45
|
-
text = str(values[0]).lower()
|
|
46
|
-
match = re.search(r"(\d{3,4})p", text)
|
|
47
|
-
if match:
|
|
48
|
-
return int(match.group(1))
|
|
49
|
-
if text.isdigit():
|
|
50
|
-
return int(text)
|
|
51
|
-
|
|
52
|
-
lower_url = url.lower()
|
|
53
|
-
for token, score in (
|
|
54
|
-
("240p", 240),
|
|
55
|
-
("360p", 360),
|
|
56
|
-
("480p", 480),
|
|
57
|
-
("540p", 540),
|
|
58
|
-
("576p", 576),
|
|
59
|
-
("720p", 720),
|
|
60
|
-
("1080p", 1080),
|
|
61
|
-
("2k", 2000),
|
|
62
|
-
("4k", 4000),
|
|
63
|
-
):
|
|
64
|
-
if token in lower_url:
|
|
65
|
-
return score
|
|
66
|
-
|
|
67
|
-
# Fallback quality-style tags in path/query fragments.
|
|
68
|
-
path_match = re.search(r"(\d{3,4})p", parsed.path.lower())
|
|
69
|
-
if path_match:
|
|
70
|
-
return int(path_match.group(1))
|
|
71
|
-
|
|
72
|
-
return None
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
def _choose_lowest_from_download(download_urls: List[str]) -> Tuple[Optional[str], str]:
|
|
76
|
-
if not download_urls:
|
|
77
|
-
return None, "download_addr_missing"
|
|
78
|
-
|
|
79
|
-
scored: List[Tuple[int, int, str]] = []
|
|
80
|
-
for index, url in enumerate(download_urls):
|
|
81
|
-
score = _quality_hint_score(url)
|
|
82
|
-
if score is not None:
|
|
83
|
-
scored.append((score, index, url))
|
|
84
|
-
|
|
85
|
-
if scored:
|
|
86
|
-
scored.sort(key=lambda row: (row[0], row[1]))
|
|
87
|
-
winner = scored[0]
|
|
88
|
-
return winner[2], f"download_addr_lowest_quality_hint(score={winner[0]})"
|
|
89
|
-
|
|
90
|
-
# Explicit fallback rule (required): no quality hints => pick first download URL.
|
|
91
|
-
return download_urls[0], "download_addr_first_url_fallback(no_quality_hint)"
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def _parse_video_id(url: str) -> Optional[str]:
|
|
95
|
-
try:
|
|
96
|
-
parsed = urlparse(url)
|
|
97
|
-
query = parse_qs(parsed.query)
|
|
98
|
-
values = query.get("video_id")
|
|
99
|
-
if values and values[0]:
|
|
100
|
-
return values[0]
|
|
101
|
-
except Exception:
|
|
102
|
-
return None
|
|
103
|
-
return None
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def select_low_quality_video_url(video: Dict[str, Any]) -> Dict[str, Any]:
|
|
107
|
-
"""Select lowest-quality candidate with strict download_addr priority.
|
|
108
|
-
|
|
109
|
-
Rules:
|
|
110
|
-
1) Base candidate set from `video.download_addr.url_list`.
|
|
111
|
-
2) If `video.bit_rate` exists, find the minimum `bit_rate` entry and try to map it
|
|
112
|
-
back to download_addr by URL equality / shared `uri` / shared `video_id`.
|
|
113
|
-
3) If mapping fails, choose the lowest-quality candidate from download_addr using:
|
|
114
|
-
- smallest quality hint in URL (`ratio/quality/...`), else
|
|
115
|
-
- first URL in download list.
|
|
116
|
-
"""
|
|
117
|
-
|
|
118
|
-
download_addr = video.get("download_addr") if isinstance(video.get("download_addr"), dict) else {}
|
|
119
|
-
download_urls = _extract_urls_from_addr(download_addr)
|
|
120
|
-
download_uri = download_addr.get("uri") if isinstance(download_addr.get("uri"), str) else None
|
|
121
|
-
|
|
122
|
-
bit_rate_list = video.get("bit_rate") if isinstance(video.get("bit_rate"), list) else []
|
|
123
|
-
|
|
124
|
-
min_entry: Optional[Dict[str, Any]] = None
|
|
125
|
-
min_rate: Optional[int] = None
|
|
126
|
-
for index, entry in enumerate(bit_rate_list):
|
|
127
|
-
if not isinstance(entry, dict):
|
|
128
|
-
continue
|
|
129
|
-
raw_rate = entry.get("bit_rate")
|
|
130
|
-
try:
|
|
131
|
-
rate = int(raw_rate)
|
|
132
|
-
except Exception:
|
|
133
|
-
continue
|
|
134
|
-
if min_rate is None or rate < min_rate:
|
|
135
|
-
min_rate = rate
|
|
136
|
-
min_entry = {"index": index, "entry": entry}
|
|
137
|
-
|
|
138
|
-
if min_entry and min_rate is not None:
|
|
139
|
-
candidate_entry = min_entry["entry"]
|
|
140
|
-
candidate_urls = _dedupe_urls(
|
|
141
|
-
_extract_urls_from_addr(candidate_entry.get("download_addr"))
|
|
142
|
-
+ _extract_urls_from_addr(candidate_entry.get("play_addr"))
|
|
143
|
-
)
|
|
144
|
-
candidate_download_addr = candidate_entry.get("download_addr")
|
|
145
|
-
candidate_play_addr = candidate_entry.get("play_addr")
|
|
146
|
-
|
|
147
|
-
# mapping strategy A: direct URL equality
|
|
148
|
-
if candidate_urls and download_urls:
|
|
149
|
-
download_set = set(download_urls)
|
|
150
|
-
for candidate_url in candidate_urls:
|
|
151
|
-
if candidate_url in download_set:
|
|
152
|
-
return {
|
|
153
|
-
"video_down_url": candidate_url,
|
|
154
|
-
"selection_reason": f"bit_rate_min_mapped_url(bit_rate={min_rate})",
|
|
155
|
-
"selected_from": "bit_rate_mapped",
|
|
156
|
-
"min_bit_rate": min_rate,
|
|
157
|
-
"download_url_count": len(download_urls),
|
|
158
|
-
"bit_rate_count": len(bit_rate_list),
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
# mapping strategy B: shared URI
|
|
162
|
-
candidate_uri = None
|
|
163
|
-
if isinstance(candidate_download_addr, dict) and isinstance(candidate_download_addr.get("uri"), str):
|
|
164
|
-
candidate_uri = candidate_download_addr.get("uri")
|
|
165
|
-
if not candidate_uri and isinstance(candidate_play_addr, dict) and isinstance(candidate_play_addr.get("uri"), str):
|
|
166
|
-
candidate_uri = candidate_play_addr.get("uri")
|
|
167
|
-
if candidate_uri and download_uri and candidate_uri == download_uri and download_urls:
|
|
168
|
-
return {
|
|
169
|
-
"video_down_url": download_urls[0],
|
|
170
|
-
"selection_reason": f"bit_rate_min_mapped_uri(bit_rate={min_rate})",
|
|
171
|
-
"selected_from": "bit_rate_mapped",
|
|
172
|
-
"min_bit_rate": min_rate,
|
|
173
|
-
"download_url_count": len(download_urls),
|
|
174
|
-
"bit_rate_count": len(bit_rate_list),
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
# mapping strategy C: shared video_id in URL query
|
|
178
|
-
candidate_video_ids = {v for v in (_parse_video_id(url) for url in candidate_urls) if v}
|
|
179
|
-
if candidate_video_ids and download_urls:
|
|
180
|
-
for url in download_urls:
|
|
181
|
-
video_id = _parse_video_id(url)
|
|
182
|
-
if video_id and video_id in candidate_video_ids:
|
|
183
|
-
return {
|
|
184
|
-
"video_down_url": url,
|
|
185
|
-
"selection_reason": f"bit_rate_min_mapped_video_id(bit_rate={min_rate})",
|
|
186
|
-
"selected_from": "bit_rate_mapped",
|
|
187
|
-
"min_bit_rate": min_rate,
|
|
188
|
-
"download_url_count": len(download_urls),
|
|
189
|
-
"bit_rate_count": len(bit_rate_list),
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
selected_url, fallback_reason = _choose_lowest_from_download(download_urls)
|
|
193
|
-
return {
|
|
194
|
-
"video_down_url": selected_url,
|
|
195
|
-
"selection_reason": fallback_reason,
|
|
196
|
-
"selected_from": "download_addr",
|
|
197
|
-
"min_bit_rate": min_rate,
|
|
198
|
-
"download_url_count": len(download_urls),
|
|
199
|
-
"bit_rate_count": len(bit_rate_list),
|
|
200
|
-
}
|
|
File without changes
|
|
File without changes
|