跳转到内容

03-homepage-inventory-and-discovery-method

状态:基于 iOS TestFlight 0.7.0 (99) 首页盘点。 事实来源:线上 beta /v2/featured 响应、公开 playlist API、Admin playlist 视频状态接口、iOS 0.7.0 标签对应的首页契约、服务端与 Admin 仓库检查。 最后检查:2026-05-21,Asia/Shanghai。

这份文档记录当前 Yomiya iOS 首页到底有哪些内容,以及这些信息是如何探寻出来的。它不是一次性的聊天总结,而是后续沉淀「首页规划 skill」时可以复用的事实底稿。

核心原则:

  • 不只依赖记忆、截图或手写产品列表做首页规划。
  • 先确认 iOS 实际读取的接口契约,再拉取真实首页 API,再把每个栏目和内容项映射回 Admin 或服务端能管理的对象。
  • 首页规划的结论必须能回到 /v2/featured 和 iOS 渲染结果中验证。

iOS 0.7.0 首页是服务端驱动的结构:

  • UI 入口:FeaturedViewController -> FeaturedView
  • 数据入口:FeaturedRepository.featuredV2(language:)
  • API 路径:/v2/featured?language=...
  • 缓存场景:featured_home_v2
  • 网络模型:FeaturedV2Response
  • 渲染适配:FeaturedHomeSectionV2Adapter

首页顶部的 chips 不是 /v2/featured 返回的 section,而是 iOS 本地根据首页数据组织出的 tab:

  • 推荐
  • 播客:只有当首页内容中能还原出 podcast shows 时才展示。

其中 推荐 tab 渲染 /v2/featured.home_sections

本次探寻使用的请求:

Terminal window
curl -sS \
-H 'x-client-platform: ios' \
-H 'x-client-version: 0.7.0' \
-H 'x-client-build: 99' \
'https://beta-api.yomiya.app/v2/featured?language=zh-CN'

当时返回:

  • HTTP:200
  • schema_version2
  • home_sections11
  • 响应大小:53524 bytes
顺序栏目kinditem 类型展示/候选当前内容
1顶部频道 railcollection_railchannel6/6,limit 61. NHK NEWS WEB EASY(NHK)
2. Yahoo! 娱乐新闻(YahooNewsEntertainment)
3. 简单日语(Watanoc)
4. 多读训练场(Yomujp)
5. 福娘童话(Hukumusume)
6. Yahoo! News IT & Science(YahooNewsITScience)
2精选推荐vertical_content_listyoutube_playlist5/5,limit 51. 日本民间故事 N5-N4 低速
2. 日语情景小剧场
3. 日本旋律:边听边学
4. JLPT 临考必看!全级别考点神总结
5. 高阶挑战 · 东大学霸神仙打架 · 原生语速
3日语初学入门collection_railyoutube_playlist5/5,limit 51. 从零开始练读写(平假名&片假名)
2. 日语口语短语:从初级到中级
3. N5|N4 日语语法
4. 平假名读读写写
5. 影子跟读慢速练习
4日语播客随身听vertical_content_listpodcast_episode4/4,limit 41. 第3回:新しい自分を見つける近道+私は私(中村Radio|日本外教纯正日语(中高级))
2. Fight Argue/喧嘩 - JapanesePodcast#12(Everyday Japanese Podcast)
3. 【N5-N4】Ep263 Freedom / Japanese Podcast for Beginners(Japanese with Shun)
4. Vol.452 コスタリカ旅行の話 (Japanese Radio for Listening practice)(YUYUの日本語Podcast【Japanese Podcast】)
5日语场景练习collection_railyoutube_playlist3/3,limit 31. 日语情景小剧场
2. 边走边看:全注音日常日语
3. さくらニュース2022
6听歌学日语vertical_content_listyoutube_playlist_video4/4,limit 41. HANA - Blue Jeans / THE FIRST TAKE(听歌学日语)
2. 中島美嘉 - 僕が死のうと思ったのは / THE FIRST TAKE(听歌学日语)
3. 中島美嘉 - 雪の華 / THE FIRST TAKE(听歌学日语)
4. DISH// (北村匠海) - 猫 / THE FIRST TAKE(听歌学日语)
7日语磨耳朵collection_railyoutube_playlist
channel
3/3,limit 31. 日语口语短语:从初级到中级
2. 多读训练场(Yomujp)
3. N5|N4 日语语法
8日语时事新闻vertical_content_listnews5/5,limit 51. 習近平国家主席とプーチン大統領が会って話をした(NHK NEWS WEB EASY)
2. 鹿児島県の奄美地方で強い地震があった(NHK NEWS WEB EASY)
3. 「綾瀬はるかが2人おる」「やっぱり似てる」26歳女優TV共演にSNS沸く「顔のタイプが似てる2人が共演してる」綾瀬に憧れ芸能界に(Yahoo! 娱乐新闻)
4. 新しい学校のリーダーズSUZUKA、制服脱いだ姿にネット衝撃「超ハンパない」「控えめに言っても最強」「笑顔素敵すぎな」(Yahoo! 娱乐新闻)
5. 手のひらに“溶けて”眠るハムスター⇨安心して懐く様子に「お餅より伸びてる」「骨どこにいった!?」の声(Yahoo! News IT & Science)
9高阶全速日语collection_railyoutube_playlist3/3,limit 31. 高阶挑战 · 东大学霸神仙打架 · 原生语速
2. TEDx 日本演讲精选
3. 日本职人志:探秘顶级手工料理刀
10福娘经典童话vertical_content_listnews5/5,limit 51. 死んだ人たちの集会(福娘童话)
2. トルーデおばさん(福娘童话)
3. おばあさんの頼み(福娘童话)
4. あまいアメの雨(福娘童话)
5. つぐみのひげの王様(福娘童话)
11儿童学日语collection_railchannel
youtube_playlist
3/3,limit 31. 福娘童话(Hukumusume)
2. 平假名读读写写
3. 日本民间故事 N5-N4 低速

首页第一排保留了老版本遗留频道,主要是照顾已有用户的使用习惯,让旧内容入口仍然可见。

objectid展示标题Source key
channel1NHK NEWS WEB EASYNHK
channel3Yahoo! 娱乐新闻YahooNewsEntertainment
channel4简单日语Watanoc
channel5多读训练场Yomujp
channel2福娘童话Hukumusume
channel56Yahoo! News IT & ScienceYahooNewsITScience

5.2 作为首页合集使用的 YouTube playlists

Section titled “5.2 作为首页合集使用的 YouTube playlists”

这些 playlist 是当前首页学习内容组织的核心,它们承担了分层学习、场景练习、听歌、磨耳朵和高阶输入等任务。

id标题YouTube playlist id当前出现位置
1日本民间故事 N5-N4 低速PLgnsmqQq_8mmtKgexbjDuN3YKVkoX4EBg精选推荐、儿童学日语
18日语情景小剧场PLWbbTej6f09ihlJqP5_VhKB-WuYUalZrb精选推荐、日语场景练习
20日本旋律:边听边学PLINFE8v4DOhtzhoO8UEni4CMdkO3wMqpu精选推荐
27JLPT 临考必看!全级别考点神总结PLINFE8v4DOht0FpOfdw6R8XcbBMEpShKg精选推荐
16高阶挑战 · 东大学霸神仙打架 · 原生语速PLWPrDZ_jwb2RNeHYBghFVHod9OnaIsxvv精选推荐、高阶全速日语
26从零开始练读写(平假名&片假名)PLVGw_A21plC4pxEbXC3Sv_9N6NizqxM3M日语初学入门
6日语口语短语:从初级到中级PL41R2vH_CL40PRnrrD1CMTGVXLiSNQbdo日语初学入门、日语磨耳朵
10N5|N4 日语语法PLP6jQzrtQ718MfJthddI8Gv74SDb5Na64日语初学入门、日语磨耳朵
5平假名读读写写PLs_Rh96nh6ulFeClYRoHVaEOBuMLC_Nvq日语初学入门、儿童学日语
21影子跟读慢速练习PLDLW62yOhLg4jAPebYqTaXADD7LoTTeOn日语初学入门
19边走边看:全注音日常日语PLFGs3d9SobfjFHWguksKU91CC5cyEFeWi日语场景练习
3さくらニュース2022PLKeSkVQhqoOpUwHUqyqfvce4Wtxny7RQG日语场景练习
4TEDx 日本演讲精选PLsRNoUx8w3rOHjXIU5EE4KOiIagv9yQaG高阶全速日语
17日本职人志:探秘顶级手工料理刀PLlMHo2E1ine74IpWFIAgRv18dt0g14hHO高阶全速日语

当前竖向栏目主要暴露三类对象:

  • podcast_episode:用于 日语播客随身听
  • youtube_playlist_video:用于 听歌学日语,每个 item 同时带有生成的 news id 和 youtube_video_id
  • news:用于 日语时事新闻福娘经典童话

这些类型不是单纯的展示标签,而是决定了 Admin、服务端和 iOS 跳转链路的归属。

item type用户点击目标当前 Admin 归属对首页规划的影响
channel频道页Channels封面、可见性、命名会直接影响首页 rail
youtube_playlistplaylist 详情页YouTube Playlists 列表页 + playlist 详情视频状态页playlist 的发现、筛选、转录状态、可见性和栏目归属需要沉淀成 skill/Admin 工作流
youtube_playlist_videonews detail / YouTube 模式导入和转录后的 Articles排查卡住或缺失时必须保留 playlist 上下文
podcast_episode生成后的 news detailPodcastShows episode drawer + Articlesepisode 能否出现在首页,取决于转录任务和生成 news 的可见性
newsnews detailArticlesvisibility、频道、图片、风险和新鲜度会影响首页展示

5.4 首页 playlist 准备度与隐藏已入库内容

Section titled “5.4 首页 playlist 准备度与隐藏已入库内容”

本节回答一个更运营化的问题:有些 playlist 已经有节目转录完成并入库,但因为生成的 news.visibility 仍是 INVISIBLE,用户在首页或 playlist 详情页看不到这些节目。

统计口径:

  • 首页 playlist 来源:/v2/featured?language=zh-CN 中的 youtube_playlistyoutube_playlist_video item。
  • 用户可见数:公开 /v1/youtube-playlists?page=1&page_size=100&language=zh-CN 返回的 video_count
  • 已入库数:Admin GET /admin/v1/youtube-playlists/:id/videos?page=...status = RECORDED 且有 news_id 的行。
  • 已入库但未外露:status = RECORDED,有 news_id,但 visibility NOT IN ('VISIBLE','MEMBERSHIP_VISIBLE','TIME_LIMIT_VISIBLE')
  • NEW_ON_YOUTUBE 表示 playlist 里发现了视频,但还没有转录生成 newsTRANSCRIPTION_FAILED 表示转录链路失败,不应算作“已准备好”。

截至 2026-05-21 16:05,本次复查覆盖首页涉及的 15 个 YouTube playlist:

  • 用户可见节目合计:94 条。
  • 已入库节目合计:94 条。
  • 已入库但未外露节目合计:0 条。
  • #21 影子跟读慢速练习#27 JLPT 临考必看!全级别考点神总结 已从用户侧空详情恢复为各 3 条可见节目。
  • #27 的 Admin 详情入口:https://admin.yomiya.app/YoutubePlaylists/27
playlist首页栏目用户可见已入库已入库但未外露判断
#1 日本民间故事 N5-N4 低速精选推荐、儿童学日语34340内容充足,可作为稳定样板。
#3 さくらニュース2022日语场景练习550已补齐到 5 条,可作为场景栏目稳定内容。
#4 TEDx 日本演讲精选高阶全速日语550已补齐到 5 条,高阶栏目可用。
#5 平假名读读写写日语初学入门、儿童学日语440能填首页,但详情内容仍偏薄。
#6 日语口语短语:从初级到中级日语初学入门、日语磨耳朵440能填首页,但详情内容仍偏薄。
#10 N5|N4 日语语法日语初学入门、日语磨耳朵220明显偏少,需要继续导入/转录候选内容。
#16 高阶挑战 · 东大学霸神仙打架 · 原生语速精选推荐、高阶全速日语550已补齐到 5 条,高阶栏目可用。
#17 日本职人志:探秘顶级手工料理刀高阶全速日语330可见内容偏少,需要继续导入/转录候选内容。
#18 日语情景小剧场精选推荐、日语场景练习770首页与详情都有一定厚度,可继续作为场景练习主力。
#19 边走边看:全注音日常日语日语场景练习440能填首页,但详情内容仍偏薄。
#20 日本旋律:边听边学精选推荐660已补齐,听歌学习方向可用。
#21 影子跟读慢速练习日语初学入门330空详情已修复;仍需继续扩容到 5 条以上。
#24 听歌学日语听歌学日语440当前竖向栏目能填满,后续仍需补更多歌。
#26 从零开始练读写(平假名&片假名)日语初学入门550已补齐到 5 条,入门读写栏目可用。
#27 JLPT 临考必看!全级别考点神总结精选推荐330空详情已修复;仍需补 N4/N5 或更多考前冲刺内容。Admin 入口:https://admin.yomiya.app/YoutubePlaylists/27

本轮复查时,首页相关 playlist 中已经没有 RECORDED + INVISIBLE 的节目。此前 #3/#4/#16/#18/#20/#21/#26/#27 的 19 条隐藏已入库节目,已经全部变成用户可见状态。

因此当前不是“已有内容未外露”的问题,而是“部分 playlist 详情深度仍偏薄”的问题。

按用户体验优先级看,当前首页已经从“有空详情入口”恢复为“所有首页 playlist 都至少有可见内容”,但内容厚度仍不均衡:

  1. 已经可作为稳定样板:#1#3#4#16#18#20#26。这些 playlist 至少有 5 条可见内容,用户点进去不再显得空。
  2. 能填首页但详情偏薄:#5#6#19#21#24。这些目前 3-4 条可见内容,建议继续补到 5-8 条。
  3. 明显需要扩容:#10#17#27。其中 #10 只有 2 条,#17/#27 只有 3 条;#27 虽然空详情已修复,但作为 JLPT 考前内容,应补齐 N4/N5 或按等级做更完整分层。

后续首页规划 skill 应把建议从“发布隐藏内容”转为“扩容薄弱 playlist”:

  • 每次改可见性后,先复查公开 video_count 是否等于 Admin RECORDED 数。
  • 对少于 5 条的 playlist,优先寻找同主题、同难度、同学习场景的候选视频。
  • TRANSCRIPTION_FAILED 的行,单独判断是重试、换 provider,还是不适合导入。
  • NEW_ON_YOUTUBE 很多但 RECORDED 很少的 playlist,重点不是前台配置,而是导入/转录队列和质量筛选。

这一节是后续首页规划 skill 最应该固化的流程。

先读服务端和 Admin 仓库说明:

  • /Users/cc/Documents/yomiya-service/AGENTS.md
  • /Users/cc/Documents/yomiya-service/CLAUDE.md
  • /Users/cc/Documents/yomiya-service/services/admin/CLAUDE.md

目的:

  • 确认服务端和 Admin 的目录形态。
  • 避免凭空假设 Admin 已经有某个管理能力。
  • 把代码事实、规划文档和产品判断分开。

6.2 再确认 iOS 当前版本的首页契约

Section titled “6.2 再确认 iOS 当前版本的首页契约”

确认首页时要用匹配 TestFlight 版本的 tag 或干净 worktree,而不是脏工作区里的未提交代码。

0.7.0 来说,可用:

Terminal window
git -C /Users/cc/Documents/EveryDayJapanese-iOS/.worktrees/yomiya-project-reconcile-main \
grep -n "v2/featured\\|FeaturedV2Response\\|FeaturedHomeSectionV2Adapter" \
0.7.0 -- EveryDayJapanese Modules

能证明当前首页契约的关键文件:

  • Modules/Sources/Core/Repository/FeaturedRepository.swift
    • endpoint 是 v2/featured
    • query param 是 language
    • cache scene 是 featured_home_v2
  • Modules/Sources/Core/Model/Featured/FeaturedV2Response.swift
    • response 包含 schema_versionhome_sections
    • 支持的 section kind 是 collection_railvertical_content_list
    • 支持的 item type 是 channelnewspodcast_episodeyoutube_playlistyoutube_playlist_video
  • EveryDayJapanese/Controller/Featured/FeaturedHomeSectionV2Adapter.swift
    • 把服务端 response 映射为 iOS 可渲染的 section;
    • 丢弃未知 section kind 或未知 item type;
    • 在安全时派生 fallback target。
  • EveryDayJapanese/Controller/Featured/FeaturedViewModel.swift
    • recommendSections 来自 /v2/featured
    • podcastShows 从首页 items 中还原;
    • 播客 tab 只有在 podcast shows 存在时才出现。

使用和 iOS 相同语义的 client hints:

Terminal window
curl -sS \
-H 'x-client-platform: ios' \
-H 'x-client-version: 0.7.0' \
-H 'x-client-build: 99' \
'https://beta-api.yomiya.app/v2/featured?language=zh-CN'

解析时至少要记录:

  • data.schema_version
  • data.home_sections[].id
  • data.home_sections[].kind
  • data.home_sections[].title
  • data.home_sections[].eligible_total_count
  • data.home_sections[].home_exposed_limit
  • data.home_sections[].items[].type
  • 每种 item type 对应的 typed content:
    • channel_content.channel
    • youtube_playlist_content.playlist
    • youtube_playlist_video_content.playlist/news/youtube_video_id
    • podcast_episode_content.show/episode
    • news_content.news/channel

不能只读 section title。一个真正可用的首页规划 skill 必须保留 item type、target type、后端 id、外部 YouTube playlist id、视频数量、来源频道或来源 show。

6.4 回到服务端和 Admin 检查可管理能力

Section titled “6.4 回到服务端和 Admin 检查可管理能力”

/Users/cc/Documents/yomiya-service 中搜索:

Terminal window
rg -n "v2/featured|home_sections|FeaturedHomeLayout|collection_rail|vertical_content_list|youtube_playlist|podcast_episode" \
internal cmd services/admin docs/plans docs/audits

本次看到的仓库事实:

  • Admin 已有 Articles、Channels、YouTube channel、PodcastShows、AI Explanations 等相关页面。
  • 最新服务端已经有 YouTube playlist 管理页面:
    • Admin 页面:services/admin/pages/YoutubePlaylists/index.vue
    • playlist 详情页:services/admin/pages/YoutubePlaylists/[id].vue
    • #27 线上入口:https://admin.yomiya.app/YoutubePlaylists/27
    • Admin API:GET /admin/v1/youtube-playlistsGET /admin/v1/youtube-playlists/:id/videos
  • playlist 详情视频状态页会透出 statusnews_idvisibility,因此可以判断“已入库但未外露”的节目。
  • 首页 section 管理仍应回到 FeaturedHomeLayout / /v2/featured 的真实契约确认,不要只凭 Admin 页面存在就假设 iOS 已经渲染。
  • 已有文档已经指出:首页工作不能从自由发挥的视觉原型开始,而应该从真实 /v2/featured 对象模型开始。

6.5 深入 playlist 统计隐藏已入库内容

Section titled “6.5 深入 playlist 统计隐藏已入库内容”

公开 API 只能证明用户能看到多少节目,不能证明 playlist 里是否已经有隐藏的已入库节目。比如:

Terminal window
curl -sS \
-H 'x-client-platform: ios' \
-H 'x-client-version: 0.7.0' \
-H 'x-client-build: 99' \
'https://beta-api.yomiya.app/v1/youtube-playlists/27/videos?page=1&page_size=100&language=zh-CN'

#27 返回 total = 0 只能说明用户侧不可见,不代表后台没有准备好的内容。真正要看 Admin 详情视频状态:

  • 页面入口:https://admin.yomiya.app/YoutubePlaylists/27
  • 对应 API:
Terminal window
curl -sS \
-H 'Authorization: Bearer <admin-token>' \
'https://beta-api.yomiya.app/admin/v1/youtube-playlists/27/videos?page=1&page_size=100&sort=added_desc'

判定逻辑:

已入库 = status == RECORDED && news_id 非空
用户可见 = visibility in (VISIBLE, MEMBERSHIP_VISIBLE, TIME_LIMIT_VISIBLE)
已入库但未外露 = 已入库 && !用户可见

如果没有 Admin API 权限,也可以用线上库执行同等 SQL。注意要排除已从 playlist 移除的成员:

SELECT
yp.id AS playlist_id,
yp.name AS playlist_name,
pv.video_id,
n.id AS news_id,
n.title,
n.visibility,
t.status
FROM youtube_playlists yp
JOIN youtube_playlist_videos pv
ON pv.youtube_playlist_id = yp.id
JOIN transcription_tasks t
ON t.unique_id = CONCAT('YouTube_', pv.video_id)
JOIN news n
ON n.id = t.news_id
WHERE yp.deleted_at IS NULL
AND pv.removed_at IS NULL
AND pv.uploader_channel_id IS NOT NULL
AND n.deleted_at IS NULL
AND yp.id IN (1, 3, 4, 5, 6, 10, 16, 17, 18, 19, 20, 21, 24, 26, 27)
AND n.visibility NOT IN ('VISIBLE', 'MEMBERSHIP_VISIBLE', 'TIME_LIMIT_VISIBLE')
ORDER BY yp.id, pv.position, pv.added_to_playlist_at DESC;

浏览器当时打开的是 ZeroPointRepo/youtube-skills。已检查该仓库元信息和 skill 目录:

  • GitHub:ZeroPointRepo/youtube-skills
  • 定位:给 AI agents 使用的 YouTube transcript/search/channel browsing skills
  • 当时 stars:213
  • License:MIT
  • skill 目录包括:
    • skills/youtube-search
    • skills/youtube-channels
    • skills/youtube-playlist
    • skills/youtube-full

这里值得借鉴的是 workflow 形态,而不是直接复制它的依赖:

  1. 搜索或解析 YouTube channel / playlist;
  2. 拉取候选元数据;
  3. 必要时收集 transcript 或 item detail;
  4. 输出结构化候选,交给人审核。

对 Yomiya 来说,未来首页规划 skill 应该把这个形态适配到 Yomiya 的真实对象:

  • 候选 YouTube channel / playlist;
  • 适合放入的首页栏目;
  • 语言阶段、学习场景、用户价值判断;
  • 导入前的准备程度;
  • 缩略图、字幕、转录状态等缺口;
  • 建议的 Admin 或人工操作;
  • 操作后的 /v2/featured 验证命令。

当前首页已经覆盖了日语学习用户的多个典型需求:

  • 旧频道入口保留了老用户熟悉的内容路径。
  • playlist 栏目覆盖入门、场景、听力、听歌、高阶输入等学习模式。
  • podcast episode 给用户提供随身听材料,并能进入生成后的文章详情。
  • 新闻和经典童话同时提供新鲜内容与常青内容。

后续首页规划 skill 不应该只回答“能不能搜索 YouTube 频道”。它应该回答这些更贴近产品的问题:

  1. 这个候选内容能增强首页哪个栏目?
  2. 它应该被建模为 channelyoutube_playlistyoutube_playlist_videopodcast_episode 还是 news
  3. 它适合 beginner、scenario、listening、music、news、advanced、children 中的哪类学习任务?
  4. 这个栏目是否有足够内容填满 home_exposed_limit
  5. 它出现在 /v2/featured 前,Admin 或服务端必须先具备哪个对象?
  6. 操作完成后,/v2/featured 是否真的返回了它,iOS 是否能渲染它的类型?

未来可以沉淀一个 yomiya-homepage-planner,默认执行以下清单:

  1. 从当前 tag 或 TestFlight 匹配源码读取 iOS 首页契约。
  2. 带上 x-client-platformx-client-versionx-client-build 拉取线上 /v2/featured
  3. 把 sections 解析成标准化 inventory JSON。
  4. 按用户任务重新分类栏目:
    • 旧频道和内容连续性;
    • 初学入门;
    • 听力和 podcast;
    • 场景练习;
    • 听歌学日语;
    • 磨耳朵;
    • 时事新闻;
    • 高阶全速日语;
    • 经典童话;
    • 儿童学习。
  5. 只有在当前 inventory 已经明确后,再去搜索候选 YouTube channel / playlist。
  6. 每个候选都要输出:
    • 建议放入的栏目;
    • 放入理由;
    • source URL / id;
    • 预期 item type;
    • 缺失 metadata;
    • 导入或转录准备程度;
    • 需要的 Admin / service 人工动作;
    • 验证命令。
  7. /v2/featured 返回该 item 且 iOS 能渲染该类型之前,不声明它已经影响首页。