Dramivio项目文档下载文档包 ↗
2026.10.02 · PRD v3.3方案阶段 · 实现待验证Markdown

Dramivio AI短剧聚合 PRD

本页目录0. 决策摘要与确认项确认的需求本稿的具体建议1. 品牌命名边界2. 产品目标、范围与指标3. 功能与交互需求3.1 首页与查询3.2 追剧、我的3.3 双语3.4 播放器3.5 逐集播放记录与续播4. 选型、复用范围与修改路径4.1 登录:首选Better Auth自托管4.2 邀请:不能把小插件当成熟反作弊系统4.3 播放:RN与Web分别复用成熟引擎4.4 缓存:成熟平台能力,需要原生桥接4.5 AI检索5. 能力授权矩阵与接口管控6. 额度、并发和记账语义6.1 不变量6.2 在线授权6.3 缓存记账6.4 游客与刷每日额度7. 注册、邀请与风险控制7.1 注册边界7.2 邀请资格与发奖8. 去重、渠道与内容能力边界9. 开源部署与扩展10. 开发路径、交付物与闸门11. 测试覆盖范围与发布标准11.1 单元/属性测试11.2 集成、合同与安全回归11.3 RN真机与Web端到端11.4 负载、成本与灰度12. 简洁文案与视觉阶段13. 对抗复审记录14. 扩展页面与状态14.1 页面清单14.2 广告位置与样式14.3 激励广告流程14.4 付费页面与订单14.5 共同权益规则14.6 邀请、通知与后台扩展14.7 最小中英文文案14.8 扩展验收15. 工程增补与逐项开发16. 管理后台复用

版本:v3.3 已确认产品需求·后台复用增补稿|2026-10-02|仅开源选型、不限地区|React Native App + Web

PRD v3.1已经确认并完成双语高保真设计。本版补充原生播放器、Web适配与分阶段开发路线;尚未建设真实系统。旧名称Reelio废弃。

0. 决策摘要与确认项

确认的需求

  1. 首页搜索框,下方10个后台配置的横向滑动热门标签,右侧固定筛选按钮;第二内容区域推荐;底部主页、追剧、缓存、我的。
  2. 推荐和查询列表2列,每页10部;二级页有可编辑搜索框和筛选;首页“查看更多”复用查询页,封面右下角快速追剧。
  3. 多渠道汇聚,同剧去重,用户界面不显示渠道营销名字。
  4. 邮箱验证登录,无手机验证码;追剧需要登录,缓存需要已登录App。
  5. Web每日10集、App每日50集;同一集当天重播不重复扣;同账号跨端共享观看消耗。
  6. 免费版本先上线,预留收费和广告;邀请所需观看集数/时长与发奖参数由后台控制。
  7. 记录用户逐集播放历史和位置,支持跨端续播;产品页面尽量简洁。
  8. 不限定国内外,仅考虑开源第三方组件;PRD先完成并对抗复审,确认后出高保真图。

本稿的具体建议

决策 建议 状态
英文品牌 Dramivio,中文候选“映寻” 仅工作名,需核验
登录 自托管Better Auth + 官方Email OTP插件;RN用官方Expo集成 推荐,兼容性PoC后锁版本
邀请 独立ReferralService;开源better-auth-referral作为待审计的归因候选,奖励自己记账 推荐边界,插件不作为已成熟承诺
RN播放 react-native-video稳定非预发布版本优先;先评估v6与项目RN兼容 推荐,不追Beta
Web播放 HTML video + hls.js;Safari优先原生HLS 推荐
离线 Android Media3、iOS AVFoundation官方能力 + 自有薄RN桥接 推荐;不是现成零开发方案
基础后台 单体TypeScript业务服务、PostgreSQL、Valkey、异步任务/Outbox 推荐,不先拆微服务
游客App 先提供10集体验;登录后升级到50集,合并游客已用额度 新建议,待确认
邀请奖励 有效好友+10集,仅App,7天有效,日3/月20有效邀请 新建议,待确认
缓存有效期 最长7天,以内容/权益期限为准;有效许可内离线重播不限次数 新建议,待确认内容授权

需确认:A工作名是否采用;B接受邀请插件候选、OTP兼容不通过则用独立小模块;C是否接受原生离线桥接投入,缓存不能悄悄删出首发;D游客App10集/登录50集;E后台邀请参数初始值与7天许可。品牌检索、内容授权、离线PoC与邮件投递测试是上线前置,不要求用户现在提供全部资料。

1. 品牌命名边界

Dramivio 由Drama与Video的读音联想组成,定位“AI帮你找到下一部短剧”。中文候选“映寻”,不使用品牌标语。

2026-10-02做了英文精确词的普通网页初筛,未据此建立品牌可用结论。搜索引擎覆盖不完整,也不能判断近似商标。正式使用需查目标地区商标、应用商店、中文近似名、域名和社交账号;中文名同样待核验。域名不宣称空闲,不做注册或购买。未通过时改工作名,产品模块使用中性内部代号,不让品牌变更影响接口/库名。

2. 产品目标、范围与指标

目标:一处找剧、减少重复结果、少操作进入播放,通过Web体验引导App,保持免费额度规则透明。

v1必须具备:目录导入与授权标识、去重和版本映射、关键词与AI情节搜索、双列推荐/筛选、邮箱登录、追剧、竖屏播放器、跨端额度账本、邀请审核、App按集缓存、账号安全/注销、基础运营后台。

v1不做:社交评论、创作者投稿、直播、多币种充值、广告正式投放、收费正式售卖、无法验证的全网抓取、无授权媒体代理。AI用于理解查询/候选排序,不能生成并假称不存在的短剧可播放。

衡量:搜索成功找到可播放剧的比例、去重误合并率、选剧到有效开播耗时、Web下载点击/真实安装转化、邮箱到达/验证成功率、次日App回访、奖励支出与误判申诉率。转化目标待小流量建立基线,不能凭空承诺固定增长。

3. 功能与交互需求

3.1 首页与查询

首页仅保留品牌/额度、搜索框、热门标签与筛选、推荐。去掉宣传标语、AI介绍卡、去重解释和重复下载介绍。标签行布局:左侧横向滚动热门标签,右侧固定44pt筛选按钮;“筛选”不随标签滚走。标签可左右滑动,恰好10个有效标签由后台管理;不额外生成第11个“全部”标签。点击已选标签再次取消,标签选择不应自动登录。

每个标签保存id、双语名称、稳定查询条件、排序、启用状态、配置版本;标签可以是题材或热门情节,不能让后台直接配置SQL/脚本。发布前验证恰好10个、id唯一、文案与双语完整;草稿可不足10个,线上不可发布不足/超出10个的配置。首访接口失败用App内置的10个默认标签,之后使用最近有效版本;离线标签不标实时热榜,不放不可兑现宣传;标签暂时无授权结果时可显示空结果,不解除源权限;服务端权限/内容状态仍优先于缓存标签。后台支持拖动排序、预览、发布、回滚。默认10个:甜宠/Romance、逆袭/Comeback、悬疑/Mystery、古装/Period、都市/Urban、重生/Rebirth、穿越/Time travel、家庭/Family、职场/Workplace、奇幻/Fantasy,最终内容由后台改。长标签不截断核心意思,允许横向滑动,右侧筛选保持可触达。

推荐标题右侧查看更多,2列、每批10部。封面右下角独立44pt追剧按钮;已追剧勾选,取消可撤销。

统一查询页:第一行返回箭头+标题;第二行可编辑搜索输入框+搜索按钮;第三行综合筛选栏;下方双列内容。首页关键词、标签、结构化筛选完整带入,并显示当前条件,用户能直接改词、删词、清除条件、重新搜索。输入草稿与已提交查询分开:输入不立即请求,搜索按钮/键盘提交后重置cursor;保留筛选,取消标签条件不清空关键词。清除全部同时清关键词/标签/筛选,回默认推荐。修改查询后请求取消/版本校验,旧响应不能覆盖新结果。

每批10部去重后的剧,cursor分页;下拉刷新、上滑触底加载。广告不占剧数量。加载失败保留当前列表;空结果仅给“暂无结果”和“清除筛选”。后退恢复已提交查询、筛选、滚动和页数;输入未提交时返回按原页状态,不暗中把草稿当结果。

关键词/自然语言搜索、单个非默认条件游客可用。两个及以上非默认结构化条件需主动登录,标签映射多个内部字段时整体只算一个标签条件;用户新增独立筛选再计数。排序非默认算一个;默认值和搜索词不算。登录后恢复全部待提交条件,取消登录回原结果,后端执行相同计数规则。

AI最多200字符,建议游客5次/日、已登录30次/日,后台可调且不扣观看额度;超时约3秒降级关键词检索。AI结果只来自授权可用目录,不能编造剧名/调用发奖或管理动作。用户界面不放技术解释,只在降级影响结果时简短提示。

3.2 追剧、我的

追剧Web/App都可用,均需登录。统一drama_id保存,不按渠道收藏。登录后恢复一次原追剧操作;服务端幂等,失败不显示永久成功。支持最近更新、继续观看、下架占位与删除。

我的包括基础/邀请额度、每日重置时区、邀请记录、历史、语言、缓存管理、登录设备、邮箱更换、退出、注销、反馈与内容投诉。邮箱无密码则不出现忘记密码。首次账号创建需明确条款同意,营销同意独立且不默认勾选。

3.3 双语

简体中文默认,可手动切English并记住。所有页面、错误码、邮件、分享内容、无障碍标签具备i18n key。英文使用复数与本地数字格式。界面语言、内容音轨/字幕、搜索语言分开;没有英文剧名则保留原名,不虚构已有配音。中文/英文切换不能清登录态或播放进度。

3.4 播放器

9:16优先;选集弹层、0.75/1/1.25/1.5/2倍速、进度拖动、暂停/继续、同剧下一集、追剧、缓存、分享、自动画质及源实际支持的清晰度。参考红果的选集、倍速、一键追剧习惯,采用自有布局。首页不自动播,Web点击启动以兼容自动播放策略。

默认仅同剧自动连播,每集授权后才启动;最后一集停在完结页,不偷偷跨剧。App滑动切集只作用于画面,不能抢进度条/选集手势。App画面空白区长按约350ms临时2倍速,松手或取消恢复基础倍速;控制区、暂停和广告期间不触发。Web用选集与倍速菜单,不启用长按倍速或App滑动切集手势。离开页面/后台默认暂停,系统来电/音频焦点正确处理。首版不承诺后台播、投屏、小窗、全浏览器DRM,能力由实际平台返回。

错误恢复:网络失败保留集数/进度;同版源自动换线不重复记账;不同剪辑版不能按相同序号换线。重试默认同一授权。下架/地域/版权/源不可用显示具体可读状态,不能全部变成“请登录”。

3.5 逐集播放记录与续播

必须记录“用户看过哪些集”和“每集停在哪里”,不只记录最后一次点开的剧。

数据 必须字段/用途
每集记录episode_progress user_id/guest_id、drama_id、edition_id、canonical_episode_id、position_ms、duration_ms、actual_watch_ms、completed、last_watched_at、revision
观看会话playback_session session_id、device/install_id、episode_id、server_started_at、last_sequence、授权id、端类型;用于同步和去重
最近续播drama_resume user_id+drama_id、最新有效episode_id、position_ms、last_watched_at;首页/追剧续播入口
有效观看事件watch_event session_id、sequence、实际观看区间、前台状态、服务端接收时间、媒体交付关联;邀请资格用,不能拿进度位置代替
解锁记录episode_unlock user/guest+episode_id+服务端日期、扣减来源、授权状态;历史不是解锁凭证

开始播放后约每10秒上报一次,暂停、切集、退出、后台前立即尝试保存;断网/强杀无法保证最后一次发送,允许最多约10秒普通误差,离线先本地持久保存、联网重试。游客只本地/签名身份记录,登录按已授权身份迁移,合并不能刷新额度。提交必须验证播放会话和用户,客户端不能指定他人user_id。

位置从播放器读取,校验0≤position≤可信duration;duration取媒体目录/服务端确认,不能信任客户端任意时长。拖动允许位置变小,因此不能用max(position)合并。actual_watch_ms为实际前台观看时间,重复片段不人为增加完成覆盖;完成状态按内容结束事件与去重观看比例判定,默认≥90%覆盖且到结束附近,后台可调。seek到最后不等于看完整,也不能据此完成邀请。

每个会话事件有递增sequence,重复/乱序事件不重复累计。跨设备同一集采用服务端revision/CAS:新设备续播先读最新revision;并发设备提交冲突,保留各自会话位置,但共享续播只接纳当前有效播放会话的新revision,不能让延迟上传的旧设备回退另一端进度。切入新播放会话时可明确取代活动写入会话;旧会话收到冲突停止覆盖,不单凭client timestamp判新旧。离线旧进度回网默认保留本地分支,若已有更新共享进度不覆盖,可让用户选择“从本机位置继续”。

播放完成当前集后,续播优先下一未完成集0秒;如果下一集不可授权/下架,则停留当前集完成状态,不自动扣下一集额度。同一剧存在不同剪辑版只在可验证时间映射时迁移位置,否则显示“当前为不同版本,从本集开始”,不强行套用秒数。

UI只显示“继续看 · 第{n}集”和必要小进度条;观看历史按剧聚合,进入可看逐集记录。用户可清除历史/指定剧记录,清除操作递增账号/剧history_epoch,同步事件携带epoch,旧设备队列/备份的过期epoch不得恢复已删历史;其他设备重连先同步删除状态再上传。epoch/最小墓碑用于拒绝旧事件,不保留完整被删历史。清除进度不删除已用额度和最小风控审计,不允许通过清历史刷额度。注销进入terminal状态并撤销会话/许可/待处理奖励,回调不能重建账号;新注册是独立身份,不从删除队列恢复profile。必要账本按披露期限保存。灾备恢复先重放独立保存的删除/撤销日志再开放流量,旧备份最长保留建议30天,恢复后再次执行擦除;失去删除日志的备份不可直接上线。

4. 选型、复用范围与修改路径

以下为官方资料可确认的能力与本产品建议的分界;本轮未安装依赖、未审计插件源代码、未执行真实媒体PoC。仅接受可核验开源许可证的第三方依赖与自有代码;OS内置API单列,不把它们误称第三方开源库。

4.1 登录:首选Better Auth自托管

Better Auth官方仓库声明MIT;官方Email OTP支持邮箱代码登录及新用户注册;Expo集成提供RN会话集成。适合自行部署、控制邮件、数据与风控入口。

复用:OTP校验、账号/会话、会话撤销、邮箱验证;保留框架的安全路径。修改:中文/英文表单、邮件模板、业务协议记录、挂起动作恢复、可替换SMTP、分功能限流及风控钩子、业务profile/权限。

建议显式配置而非照搬默认:6位、10分钟、5次错误、60秒重发、重发轮换旧码;OTP摘要存储,实际字段按锁定版本核验。更换邮箱需要近期原邮箱验证+新邮箱验证,不能只信任已有长期会话。有效账号才创建业务权益,框架提前创建的未验证记录不算已注册奖励用户。

分布式限流使用Valkey/框架可支持的共享存储;框架rate-limit能力需配置。不默认启用需要闭源第三方服务的Captcha集成;开源挑战可在统一入口挂自托管适配,先验证RN可用性。所有OTP路由都应用同一策略,挑战只能提高自动化成本,不能证明一人一号。候选采用ALTCHA开源核心与自托管校验库,排除其Cloud/Sentinel商业产品。Web用开源widget,RN需验证WebView或原生挑战adapter、超时/低端机耗电;challenge绑定用途/nonce/过期时间,解答服务端校验且一次性消费。

官方Expo示例适用Expo模块;裸RN若现工程不带Expo,先验证引入expo-modules/SecureStore的兼容成本,不假设可直接复制。可用平台安全存储适配会话,禁止把生产会话写普通AsyncStorage。Web采用安全Cookie与CSRF防护;RN按官方集成传递会话,服务端每次敏感动作核验会话与撤销状态。

不用:魔改OTP随机数/加密核心、自写密码系统、客户端校验OTP、默认启用无关密码/OAuth/组织功能、把CORS当防刷。所有框架公开路由和内部别名都要经过限流/策略,管理服务不暴露原端口。用户通过API直接调用也必须得到同样结果。

开源备选为自托管Supabase Auth;当前不引入第二套身份系统。仅在Better Auth兼容PoC失败时重新选型。托管商业版不纳入本稿。

4.2 邀请:不能把小插件当成熟反作弊系统

候选@marinedotsh/better-auth-referral为MIT社区插件,提供邀请码、归因和步骤完成能力;Better Auth社区插件页明确社区插件非官方认证。

**关键缺口:**已读README重点描述密码邮箱/OAuth注册归因,未据此确认Email OTP自动注册路径兼容。不能因为“同是Better Auth”就认为无密码流程一定被插件拦截。PoC必须验证OTP新建用户、已有邮箱不绑定、并发验证、无效邀请码不能阻止正常邮箱登录。

接入方式:ReferralService适配层把插件能力限制在邀请码和关系;业务邀请关系以自己的数据库约束为准,插件事件可重复但不能直接发钱/额度。PoC兼容且源代码审计通过才采用;若不通过,用自有小型归因模块实现随机邀请码、一次绑定、必要列表,复用认证后的user_created事件。这个替代模块是新增开发,不宣称有“成熟开源框架”背书。

只有服务端可以记录email_verified、qualified_watch、risk_approved三个业务步骤,最终自己的credit_ledger记奖。禁止把插件“注册成功即完成”默认值直接上线;回调仅写Outbox,不能直接加余额。邀请人不可获得被邀请人的邮箱/实名,返回计数和脱敏状态。

不使用GrowSurf等商业邀请框架。未通过OTP适配与源代码审核的社区插件不进入生产,不能以“开源”代替质量验收。

4.3 播放:RN与Web分别复用成熟引擎

react-native-video v6提供原生视频组件。首选项目兼容的稳定正式版本,工程调研后记录RN、iOS、Android、播放器版本组合;v7文档当前标注Beta且DRM为独立插件,因此不把v7默认列为稳定首发基线。

修改的是业务控制层:选集、倍速、追剧、UI、进度同步、授权会话、错误换线、缓存入口。播放器核心先不fork;必须改native时用可追踪小补丁或独立adapter,并写回归用例。重放、seek、画质和源切换都保留canonical_episode_id和授权。

Web采用原生HTML video配合hls.js:MSE环境用hls.js,Safari测试原生HLS路径;不能承诺hls.js支持所有编解码器/DRM。默认HLS+H.264/AAC主兼容路径,不给首版强制HEVC。

4.4 缓存:成熟平台能力,需要原生桥接

react-native-video缓存文档描述播放缓存,平台格式限制不同,不能替代选集离线队列、权限或许可证。Offline Video SDK是商业附加组件,本轮不采用。

Android复用Media3 DownloadService / DownloadManager,iOS复用AVAssetDownloadURLSession。Android Media3为开源组件;iOS AVFoundation是系统内置API,不是采购的闭源第三方SDK;Apple系统本身不开源。仅开源原则适用于项目引入的第三方库,不虚称iOS原生API开源。RN桥接需要自己补下载状态、读离线asset、账号绑定、存储和许可证;不等于装一个JS包就完成。

PoC必须实际证明:锁定react-native-video Android底层与Media3版本是否一致,下载CacheDataSource能被播放adapter读取;iOS下载的asset定位能正确传给AVPlayer;后台受系统调度、kill与重启状态恢复可行。不能将Media3下载的分片目录误当普通mp4路径传给JS播放器。若引擎版本冲突无法以薄adapter处理,再评估统一开源native底层,需重新评估成本,不默默fork整个播放器。

缓存格式v1优先已授权HLS,画质720p、可选实际有的1080p,首版只下载默认音轨+所选字幕。MP4可作为在线兼容,不自动承诺其离线授权能力。DRM持久许可仍需要内容方/许可服务,不因SDK开源而免版权或DRM服务成本。

无DRM内容可按内容方许可使用App私有目录+本地访问策略,7天是普通客户端策略,无法保证抵抗root/越狱/修改时间后提取和播放。仅当内容合同接受这个保护等级才启用;要求强制不可越期的内容,必须持久DRM验证通过才允许缓存。没有下载许可或无法落实保护要求的内容只可在线,UI明确说明。

4.5 AI检索

v1建议自托管Qwen3-Embedding-0.6B,模型卡标Apache-2.0,用于中英文剧情语义检索,不接闭源模型API。关键词命中+向量召回+授权筛选+排序即可,不先做生成式聊天。推理运行库、向量索引依赖逐个核验开源许可并锁版本,训练数据全量是否公开不作承诺。目录有更新/下架时更新索引与实时权限过滤;模型失败降级普通搜索,PoC报告查询相关性和实际算力延迟。

5. 能力授权矩阵与接口管控

能力 游客Web 登录Web 游客App 登录App 服务端管控
搜索/单筛 是 是 是 是 查询限流/目录权限
多条件筛选 引导登录 是 引导登录 是 条件计数与权限
新集体验 10 10 建议10 50 跨端账本+设备资格
当天已解锁重播 是 是 是 是 验证已授权记录
追剧同步 否 是 否 是 按user_id授权
创建邀请链接 否 是 否 是 已验证账户/活动资格
奖励使用 否 否 否 是 奖励账本/到期
缓存 下载引导 下载引导 登录引导 支持获许可内容 端资格+版权+空间+额度
发奖/改额度 否 否 否 否 后端事务,仅内部服务

App权益不能只看客户端platform=app、User-Agent、包名或自报版本号。服务端建立与账户/安装密钥绑定的App会话:支持平台的完整性证明、挑战、重放防护、应用签名与分发渠道策略。iOS用系统能力评估App Attest,Google Play分发可评估Play Integrity;无Google服务设备不能一律依赖Play Integrity,否则误伤合法设备。非Google渠道需定义可验证包签名与设备密钥等替代证据、供应商可用性和风险阈值。

合法登录App维持每日50集。仅platform字段/自报包签名不能直接授予App会话;普通安装密钥只证明同一安装持有密钥,不证明正版。P1按分发渠道记录信任根、可验证证据、覆盖率;无法做强证明的平台走安装会话+服务端风险审批、限流和共享预算,低风险仍给50,异常单独审核,不因无Google服务默认降到10。完整模拟安装握手仍可能获得50,是明确残余风险,不能宣称硬防App仿真。允许使用OS内置证明服务,不采购闭源第三方反作弊SDK。硬防仿真与所有平台通用50不能同时无条件保证;本稿优先合法用户50与成本控制。

账号默认仅1个活跃在线播放会话,新设备开始时提示并替换旧会话;下载队列独立,不占在线会话槽。段授权/会话续期在约30秒内收敛旧会话,已经缓冲的片段不能瞬间收回。跨设备同时观看不用于快速累积邀请时长;服务端累计真实墙钟时间且去重。此规则为可配置提案,必须明示给用户。

服务端返回allowed/reason/retry_at/requirements/policy_version,前端据此显示按钮;拒绝码区分LOGIN_REQUIRED、APP_REQUIRED、QUOTA_EXHAUSTED、RIGHTS_UNAVAILABLE、RISK_REVIEW、RATE_LIMITED、CONTENT_REMOVED。远程配置只控制表现和允许能力,不能覆盖内容版权或账本不变量。敏感路由不可因“旧客户端不识别错误”默认放行。

6. 额度、并发和记账语义

6.1 不变量

  • 同用户+canonical_episode_id+北京时间日期仅一个当日解锁;不是URL、渠道集号、点击次数。
  • Web/App不叠加60。例:Web10后App基础40;App20后Web不可解锁新集,但当日已解锁可重播。
  • 基础与奖励分账。基础先用,App基础50用尽才用到期最近的奖励。奖励只增App可解锁数,Web仍不能新增超过其基础门槛。
  • 已有效离线许可可在7天内离线重播,包括跨天,不重复扣;这是明确的缓存权益,不把离线播放强行算成当日在线消费。
  • 禁止负额度、超额预留、同集多源双扣;管理员补偿也是独立审计事件。

6.2 在线授权

请求→校验内容/账号/设备/端→数据库事务预留→源预检→在发出可播放媒体授权前事务提交解锁→下发短期媒体会话。会话绑定用户、端、剧集、版本、到期;未提交不能发清晰媒体或密钥。核心记账点是首次取得有效播放授权(不是用户点下按钮就必然扣次);点击后源预检失败不扣。用户已经收到媒体授权,即使退出也不能靠无心跳自动退额度。

若提交成功但响应丢失,重试凭幂等键取得相同解锁。服务端确证“零可播放分片且零可用密钥/许可交付”的基础设施故障可走审计补偿,撤销旧会话再退款;单凭客户端说失败不自动退款。旧方案“先免费播5秒,再靠客户端报告扣次”废弃,避免不断重试白看。

媒体首请求应换取/验证授权,源短期地址不能跳过业务服务永远复用。自有授权CDN/代理能检查每段签名;只有不可控上游长效裸链时无法硬执行播放限制,必须标为不上线该资源的能力缺口,而不是仅UI显示10/50。

数据库唯一解锁键+按账号/日期锁保护不同集并发。Valkey仅用于限流/缓存,不作为最终额度真相。Valkey故障不能导致放行发奖,数据库故障禁止新解锁;已有有效短期会话继续到期。

午夜按服务端预留日归属,预留只用于短时在线请求约120秒;超时作废,次日重新申请。客户端改日期无效。回滚重试只能确认已有提交,不可换日多扣。自动预取下一集不得取未解锁媒体,最多取公开metadata/不含密钥的必要信息。

6.3 缓存记账

确认多选后预留额度,显示数量/空间;不是下载完成才第一次检查权益。已有有效离线许可或当天已解锁的同集不再重复扣。长期排队不长期占用昨日预留:实际启动前重校验当日额度,剩余额度不足停该任务并提示。

DRM路径:先下载不可播放的加密资产,完成校验后先在DB事务提交解锁,进入committed_pending_license,再用稳定业务订单幂等发证;成功进入active。外部许可证服务与DB不是原子事务,Outbox只负责可靠重试,不保证端到端恰好一次。响应丢失先按订单查结果,pending重试不再扣次;确证未签发、无可用许可且旧订单已关闭时进入failed_compensated并补偿。签发结果未知保持pending/对账,不能直接退款后重开许可。发证路径必须支持订单幂等、结果查询和必要撤销,否则该内容不开放DRM离线;15分钟未恢复告警并显示“准备中”,24小时内对账/人工处理,不把有结果不明任务当失败自动放行。

非DRM路径:明文媒体可用时已经交付观看能力,必须在交付前提交,不得等全部下载完后再扣。删除文件、取消到一半不会自动恢复已解锁次数;首次交付完全失败的补偿与在线同规则。UI在确认前说明此差别。

episode_unlock是当日在线权,offline_license是另行审批的App离线权;在线权不自动延长7天。当天在线解锁转缓存可免再次扣,但必须再次通过App/版权/存储检查。离线到期=min(首次签发+7天,内容方允许的离线到期,适用权益允许的许可上限),签发时固定,下载确认读取服务端permit preview,缓存详情显示许可实际到期时间,不靠客户端推算,不能统一写成必定7天;未来普通配置不追溯缩短已签发许可。删除、换画质、重下载、换设备不延长。有效许可期间App本地播放及同集重新获取不再扣;Web不能借此获取跨日免费新解锁。到期续期需要联网并按当日解锁规则重新获得一次授权,当天已经解锁则不重复扣。许可绑定账号+设备,换设备重新验证并签发受原到期约束的设备许可,不复制私钥;有效账户许可迁移不占新增设备当日“新集”预算;每账号同时可持有效离线许可最多2台设备,新增设备需解除或等待旧许可到期,后台可配但不得无限增加。离线旧设备不能即时撤权,停止续签不等于已离线许可立刻消失,迁移必须告知该期限边界。重下载仍占带宽限流。空间上限建议100集或2GB先到者,下载并发2个、单次最多20集;可配置,不把这些当平台强制值。首次免费和重下载都受带宽预算/频率限制。

下载状态跨重启持久保存,不依赖JS后台定时器。系统拒绝后台任务/强退不能承诺一直下载;恢复App后重建任务。退出锁定下载,换账号不能复用许可,注销清本地文件/钥匙。离线无法实时撤权,强保护以持久DRM自身期限为准;无DRM只保证普通客户端行为。

6.4 游客与刷每日额度

游客用签名访客标识+安装/设备证据+IP风险信号;登录把游客已解锁集合并入当天账号,不重送10集。匿名身份易重置,不能保证访客身份一人唯一。

只限制邀请奖励不够:多邮箱账号还可能不断获得每日50集。新增可配置“新账号/可疑设备共享免费解锁预算”:同一可信安装/风险设备当日新增免费剧集基础上限50,Web10;换账号仍共享。一次授权事务同时检查账号基础账本与适用设备预算,按固定锁顺序(设备预算键→账号预算键,各自排序)处理;设备预算按episode_id集合去重,不因不同账号重看同集重复增加。以上10/50和共享设备预算只适用于免费权益。授权统一读取当前端entitlement的基础上限L,检查账号全端当日基础消耗<L;免费来源同时占用适用设备免费预算。已验证付费来源使用订单权益及付费风控/带宽限流,不占免费设备预算、不被免费50门槛截断;不得将付费消耗改写为免费来源。升级保留已用基础数,按新L计算余额。已验证长期用户与共享设备可审核放宽,不能仅用IP做总预算。该规则必须公开到额度说明,以免同设备多用户被无提示降额。奖励消耗不计入免费设备50上限,只在账号当前计划基础上限L耗尽后可用,且须已批准的奖励、App会话与账号风控;免费设备预算先耗尽但免费账号未满当前L时不能自动跳到奖励,提示免费资格受限/审核。游客迁移按原解锁事实做union,不复制余额,不回滚设备消耗来源。合并合法基础解锁数超过当前L时保留全部既有当日授权,新基础余额=max(0,L-合并基础消耗),不裁剪/退款;基础/奖励来源和原设备预算保留,不能把奖励记录误转成基础。无法可靠关联的新设备、重装和真机农场仍有残余风险;配合总成本预算和异常检测,不承诺一人一号。

7. 注册、邀请与风险控制

7.1 注册边界

登录首屏从上到下仅Logo、剧库名、“欢迎登录”、邮箱输入、发送验证码、协议勾选与必要错误提示;验证页只显示邮箱、验证码、确认、重发和修改邮箱。新老用户共用入口,必要小提示为“未注册邮箱验证后将创建账号”。没有AI/聚合介绍、品牌英文口号、装饰说明卡。

无密码流程:输入邮箱→明确同意→发送码→验证→首次创建/已有登录→建立业务用户→恢复动作。邮件/页面统一提示,状态码与响应时序也避免区分账号是否存在;挑战绑定规范化邮箱、用途、挑战版本,不跨用途复用。缺邀请码、无效/过期邀请不阻止正常登录,只提示邀请未绑定。Email OTP机制与Referral适配分开测试。

建议限流:邮箱5封/小时、10封/日,设备10次发送/小时、IP30次发送/小时,验证错误5次/挑战,同时按邮箱/设备/窗口累加错误防止重发重置计数;收紧或共享网络例外通过策略管理。重发旧码失效,滥用总发送量达到预算暂停新挑战并给稍后提示,不能停已有用户正常会话。新用户等待验证不授予邀请资格、下载许可和50集。

邮箱仅规范空白和域名等安全部分,不把所有域名的点/+规则强行合并;供应商别名和临时邮箱只作为风险信号。验证码/邮箱/令牌不进日志,记录脱敏ID与错误码。登录设备列表、撤销所有会话、换邮箱、注销要覆盖客户端缓存和服务端会话。换邮箱用唯一约束与事务处理并发占用;原邮箱丢失走人工核验,不以客户端声明免验证。

同IP注册初始规则:≤3新验证账号/24h正常观察;4–10提高验证/审查新奖励资格;>10暂停该来源新奖励发放并复核。已有用户不因共享IP被集体踢出,IP不是身份证。家庭/学校/运营商NAT、IPv6、VPN都是风险分析边界,拒绝有申诉入口。

注销后清个人资料/片单/历史,保留最小必要、事先披露的安全和权益审计记录有保留期限;不能永久保存完整个人数据来防刷。合法删除流程不承诺能做到永久防重注册,记录到期后存在复领残余风险。规则/标签发布、发奖/撤奖、内容合并分别设后台权限和审计,公开客户端不可访问编辑接口。目标地区的合规及短剧分发资格由正式上线专项核验,本稿不自行认定某具体资质一定满足。

7.2 邀请资格与发奖

邀请链接为签名随机token,不含邮箱。v1采用确定性归因:安装并登录后输入/确认邀请码;若系统深链已带token则确认一次。不把安装后参数必然恢复作为首发承诺,首次启动可手输码。登录/注册后24小时内且完成有效观看前可绑定一次,已有历史合格用户不算新人;禁止后换邀请人。

有效好友:合格新用户、App邮箱验证、在后台设定窗口内有效观看指定数量不同集、通过风险审批。邀请规则兼容倍速:设后台允许的最高资格倍速max_qualification_speed(建议2),可信集长为D秒。若D/max_qualification_speed小于min_watch_seconds,则归为短集:唯一内容覆盖≥short_episode_ratio,实际前台时长≥ceil(D/max_qualification_speed×short_episode_ratio);其余集实际前台时长≥min_watch_seconds。允许资格倍速范围内的完整观看均可达,不要求靠重播补墙钟。每集资格计时只累计未重复的内容区间,重复片段不刷时长;seek不算,超过最高资格倍速不计资格且规则详情提示。参数按活动快照,旧邀请不改。媒体网关交付证据与签名会话心跳联合判断;按invitee+canonical_episode_id+campaign聚合去重,一集最多贡献一次,新人也不能跨campaign反复算首次资格。只接纳当前前台资格会话在租约内的墙钟时长,旧会话收敛期间不继续累加,跨设备/重建session不能将重叠墙钟时间相加。遥测不能证明眼睛在观看,自动播放真机农场仍需成本预算/审核。离线下载不算有效邀请观看,批量后台下载不能触发奖。没有媒体交付日志控制的源不支持以观看发奖。

后台控制所有邀请参数:所需不同集数required_distinct_episodes、每集有效前台时长min_watch_seconds、短集最低完整比例short_episode_ratio、最高资格倍速max_qualification_speed、完成窗口qualification_window_hours、奖励集数reward_episodes、奖励有效期reward_ttl_days、日/月有效邀请上限、奖励余额上限、风险审批模式(自动低风险通过/人工复核)。核心自邀/幂等/额度不变量不能通过后台开关关闭。起始建议为3集/30秒/90%/24小时/+10集/7天/日3人/月20人/持有100集,不作为硬编码规则。后台发布采用类型/范围校验:所需集数1–50、最低秒数1–300、短集比例0.5–1、最高资格倍速限播放器支持的1/1.25/1.5/2、窗口1–168小时、奖励1–50集、有效期1–30天;范围为初始保护配置,扩大需评审,不接受负数/任意脚本。检查观看窗口与基础可观看数是否可达。参数只服务端读写,UI从活动配置显示“好友有效看满{n}集,得{bonus}次”,不写死3和10。

绑定时在同一事务预留奖励名额与金额,持有上限按“未到期余额+待审预留金额”检查;日/月名额按北京时间绑定日/月归属,不能到发奖日才抢前三。无法预留时仍允许正常注册,但必须在绑定前提示本次无奖励资格。预留覆盖观看窗口,按时达标延长至审核完结;到期先进入待核对,允许5分钟遥测上传宽限,但有效观看必须发生在窗口内且有可信服务端会话/交付时间;宽限不增加观看窗口。后台任务延迟按事件实际服务端记录时间核对,不能只凭worker执行时间判迟到。确定未达标/拒绝后才释放名额,达标与释放竞态用事务锁处理。发奖把预留转实账,不能再受后来新规则截断;审核超过72小时告警,不无故释放按时达标的承诺。条件与活动policy_version绑定,在首次绑定邀请时冻结规则快照,达标/审批/发奖与有效期都用该快照。后台新规则只影响新绑定;冻结活动可暂停新绑定,但既有承诺不能无提示改成更高观看门槛。奖励有效期从实际入账起算,按时达标的资格不能因审批延迟过了窗口失效。

禁止自邀、同设备关联小号、循环关系和重复领;同IP独立设备家庭好友可复核通过。风险状态是observed→qualified_pending→risk_review→approved→rewarded或rejected,拒绝有原因/申诉。不能在客户端调用mark step、改邀请人、改奖励数或申请人工通过。

事务唯一键(inviter,invitee,campaign)+invitee唯一归属,奖励写Outbox与credit_ledger。回调丢失可重放,先完成条件后注册事件乱序也可对账;只达成步骤不等于成功到账,审批和账本不同状态。插件回调没有可靠幂等也不能穿透自有约束。

支持管理员审批、撤奖、补偿、封停活动,RBAC最小权限和审计;批量/大额操作二次审核。已消费的欺诈奖励保留审计、限制后续奖励,不产生负额度要求补款。管理员也不可直接改余额数据库字段。

8. 去重、渠道与内容能力边界

实体Drama→Edition→Episode→SourceEpisode。相同版权/发行ID优先;标题、演员、年份、简介、集数、指纹形成候选,低置信不自动合并。相同名字不代表同剧;60/80集不同剪辑不能同序号替换。人工合并必须可回滚,历史/片单引用迁移有审计。保存稳定episode别名/身份映射,历史账本不改写;当日合并后的解锁解析到统一身份,不能再次收费。拆分只对能证明原内容相同的目标保留权限,歧义转人工处理,不把一条权限复制到所有同名版本。

查询分页基于去重实体和稳定游标;导入期间版本快照避免跨页漏项,已失效项过滤后补足10部,末页不足允许。去重记录变化会导致旧游标需要重建时明确返回可恢复状态,不重复展示也不静默吞页。

用户返回字段不含渠道营销名、管理链接和源凭据,播放器自动择优。不隐藏必须的版权署名、水印或来源许可说明;聚合展示未必具有代理/缓存授权。要求完全自有域名意味着内容授权+代理/CDN成本,不能仅替换UI保证网络中看不到上游。

source capability包含 online_allowed / download_allowed / region / expiry / edition_mapping_verified / signed_delivery / drm_type / offline_protection / max_quality / attribution_required。授权到期主动停止新会话和许可,历史可保留下架占位。AI、推荐和管理员普通运营角色都不能把禁用源重新开成可播放。

9. 开源部署与扩展

首选自托管Node服务+PostgreSQL+Valkey(BSD-3-Clause);数据库与客户端协议兼容通过PoC锁版本,异步任务先用PostgreSQL Outbox worker,避免额外引入一整套消息平台。前端静态资产、媒体存储/CDN按目标运营商测试。SMTP使用标准SMTP及可替换邮件服务,SPF/DKIM/DMARC配置、退信/投诉监控;代码开源不等于邮件、带宽、AI和内容授权免费。依赖许可证清单与锁文件记录,不使用latest自动升级。

发邮件、邀请结算和许可证重试走后台任务;Outbox与业务事务一致,死信报警/重放有操作手册。日志按req_id关联,隐私字段脱敏。备份和恢复演练包含用户、权限、账本、邀请关系与策略版本,不能仅备份目录内容。

免费权益以plan与策略配置,UI不硬写50。付费未来需新增购买/续费/退款/恢复购买/服务端凭证和账户绑定,具体投放平台与商店规则在启用时再核验;不能只开价格按钮就上线。收费、广告开关默认关闭。

广告预留:列表第6部后整行1条/页(不占10部剧)、我的功能区后、App额度不足自愿激励广告+2集每日最多5次;集间每5集一次仅候选,v1关闭;不投开屏。奖励看广告需广告方可验证完成事件+自己的幂等账本,客户端关闭/失败/无填充不发奖。只允许开源组件和自有广告服务;供应商要求闭源SDK或传递依赖时不接入。广告位置、配置、购买与异常状态见第14节。

10. 开发路径、交付物与闸门

估算假设:1名RN、1名后端/全栈、1名可处理Swift/Kotlin的开发者(可兼职)、共享QA;已有可用授权测试源,不能由纯JS人员无验证承诺全部离线。预计8–12周是规划量级,不是已承诺排期;缺版权/媒体控制/原生能力会延期。阶段可部分并行但不得绕过前置闸门。

阶段 预计 开发与可评审交付 通过标准
P0需求/供应验证 3–5天 品牌核验计划、源权限表、部署/SMTP网络报告、版本矩阵 至少1个可控签名测试源,有缓存授权路径
P1技术PoC 1–2周 RN双平台OTP、Web登录;邀请OTP归因;在线HLS;双平台下载→断网播 真机跨端/生命周期可复现;失败成本与替代明确
P2后端闭环 2周 标准目录、权限gate、额度事务、Outbox、邀请审核、小型运营后台 并发不超扣,直接API不能越权
P3产品核心 2–3周 双语搜索/筛选、推荐/列表、播放器、追剧、我的与登录恢复 主流程与异常行为符合本稿
P4离线完整化 2–3周,可与P3并行 下载桥接、持久任务、空间/网络规则、许可与账户隔离 不使用播放器缓存假装离线;真机掉网/重启可用
P5集成/灰度 1–2周 全覆盖报告、成本监控、备份恢复、回滚/撤权演练 见测试闸门,未通过不能全量

正式排期在P1验证后锁定,媒体网关/原生能力不是最后阶段才补。P1必须输出四个明确结论:Email OTP与邀请插件是否兼容;react-native-video与Media3是否可共用离线asset;iOS后台下载/许可是否按授权可用;各分发渠道端资格证明是否存在可行不误伤方案。失败时修改方案再确认,不等P4才承认不支持缓存。

版本升级:先固定兼容基线,再在分支更新依赖,运行合同/媒体/生命周期回归。数据库迁移走扩展→兼容运行→收缩,rollback不能回到会重复发奖或丢解锁的旧逻辑。接口至少兼容当前及上一客户端版本,最老端缺必需安全能力可提示升级、仍可浏览公开目录。

11. 测试覆盖范围与发布标准

这是测试计划,本轮没有真实系统,不宣称这些测试已执行。测试报告必须关联需求ID、用例ID、版本、真机/网络与证据。

11.1 单元/属性测试

  • QUO:Web10/App50/跨端共享;按不同drama同集号隔离;同集换源重播不扣;基础/奖励顺序与到期;午夜;负值禁止;随机请求序列始终满足账本不变量。
  • AUTH:邮箱规范化/别名不误合并、协议状态、挂起动作白名单、错误映射;无效/缺邀请不阻断邮箱。
  • REF:新人资格、绑定时窗、唯一归属、自邀/循环、短集/倍速/seek/离线排除、上限、规则版本。
  • CAT:同剧不同名、同名不同剧、Edition差异、合并回滚、跨页去重/过滤补足。
  • DL:网络/空间/许可/账号状态机,授权耗尽和部分成功;无DRM保护等级不得被标成强DRM。
  • PROGRESS:逐集/逐剧隔离、向后seek、暂停保存、10秒周期、乱序重放、强杀、跨设备revision冲突、离线旧进度、清历史不退额度。
  • TAG:恰好10个、双语齐全、横滑/右固定筛选、版本回滚/接口失败、二级搜索改词与保留筛选。
  • CONFIG:邀请观看集数从3改为5、时长从30改为60;既有邀请固定旧policy_version,新绑定用新规则,页面与服务端一致。

11.2 集成、合同与安全回归

ID 必测场景 验收断言
I01 100个同集并发授权 唯一解锁、扣1,重试同会话语义
I02 剩1次,100个不同集并发 只有1个新集成功,其余明确额度不足
I03 播放与缓存同集并发 共用解锁约束,不双扣、不发无账本许可
I04 DB已提交但客户端响应丢失 重试可恢复授权;不能扣2
I05 午夜/预留过期/乱序完成 归属明确;没有跨天白领或重复扣
I06 伪造App字段、过期/重放端证明 裸platform/自报签名被拒;完整模拟弱证明路径的残余风险与预算受控
I07 直接访问OTP/邀请内部路由 同样限流;客户端无法标资格、审批或写余额
I08 同码并发/重发旧码/过期/爆破 仅有效挑战成功;框架额外路由不漏策略
I09 已存在邮箱OTP、首次OTP与邀请码 老用户不重新绑,首次只绑一次,无邀请码仍可登录
I10 奖励事件重复100次、乱序/丢失重放 唯一奖励;有对账可恢复
I11 user_id/episode_id/下载task_id替换 不读写他人片单、许可、邀请、会话
I12 Valkey/邮件/AI/源/worker部分故障 受控降级,不将故障解释成授权通过
I13 变更邮箱/撤会话/注销/重注册 撤销生效、没有新客奖励绕过、隐私清理可核验
I14 私有媒体路径/长效裸链/源签名到期 不能绕过服务端额度;无控制源从上线范围排除
I15 数据库备份恢复、账本/Outbox重放 记录完整、奖励不重复、活跃签名按恢复策略失效
I16 两设备并播,旧设备断网后迟到上传 共享续播不回退;旧数据不重复累计邀请观看
I17 清历史、拖到结尾、同一心跳重发100次 不重置额度、不误判完成、不重复发奖
I18 改搜索词/条件时旧响应晚到 只展示最新提交结果,分页从首批重新开始
I19 后台发布9/11个标签或邀请参数非法值 发布被拒;线上保留最近有效版本
I20 同设备不同账号并发、游客登录并发迁移 同一事务保护账号与设备预算,不重送资格
I21 多个邀请并发绑定/审批、跨月/余额满、预留到期 名额金额不超、已承诺奖不丢、快照规则不变
I22 许可已发响应丢失、许可状态未知 查询恢复;不重复扣/重发,不盲目退款
I23 清历史后旧设备上传、注销中回调、旧备份恢复 墓碑/epoch拒绝复活,terminal账号不重建
I24 在线转离线、改画质、移设备、到期续期 不重复扣、不延长旧许可、重新签发有边界

11.3 RN真机与Web端到端

RN:至少最低支持与最新可用的iOS各1台;Android低端/中端与较新设备,至少覆盖无Google服务设备;华为/小米等目标渠道按首发清单加入。最低系统版本按P1可兼容的框架与媒体能力确定,不能沿用商业SDK要求推导本方案。

Web:当前及前一主版本Chrome/Edge、Android Chrome、Safari/macOS+iOS、首发支持的微信内置浏览器;明确不能播放/不能全屏的环境给系统浏览器引导,不能空白。Web无缓存功能验证到接口,不仅看按钮。

流程:查剧→多筛登录→恢复全部条件→追剧→播放→选集/seek/倍速→额度满→App引导;App邮箱注册→邀请绑定→满足后台观看条件→审核发奖→缓存多集→断网→退出/重登/换号→许可到期。

生命周期:前后台、锁屏、电话/音频中断、强杀、重启、低电量、空间不足、Wi-Fi/蜂窝切换、下载签名中途过期、系统回收下载文件、断网启动。拒绝通知/后台权限不应阻止正常在线。

媒体样本:HLS主路径、字幕、横竖屏、不同码率、断点/seek、失效分片、授权地区、相同剧不同剪辑、持久DRM(如支持),以及被允许的非DRM弱保护路径;模拟器不能代替真机DRM验证。

体验:中英文长标题、200%字号、横屏安全区、44pt按钮、VoiceOver/TalkBack、Android返回与手势;列表分页重入/空态/失败状态。剧集内容与版权说明不因语言切换缺失。

11.4 负载、成本与灰度

初始实验负载建议100并发业务请求、连续60分钟混合搜索/授权/重播/邀请;媒体吞吐和CDN带宽独立测量,不拿API测试当播放器吞吐。目标p95非媒体授权≤800ms、首屏可交互≤2秒、受控4G首帧p95≤3秒为验收提案,P1根据源与设备校准并记录条件;不是官方库性能保证。

账本不变量必须全通过,关键用户主流程100%覆盖;核心领域分支覆盖目标≥85%作为辅助,不能替代并发/真机证据。无未解决P0/P1;P2须有负责人、影响与缓解。安全路由、端资格、无授权媒体、重复发奖问题不得带缺口全量上线。

灰度内部→1%→5%→20%→全量,每阶段观察至少一个完整日重置与奖励周期关键事件,按用户数不足时延长。Crash-free sessions目标≥99.5%,误扣/重复发奖已确认事件为0;异常预算、邮件投诉、下载失败/风险误判超过阈值可独立关闭邀请/AI/下载,保留合法已解锁使用。服务关闭不能让客户端自动忽略校验。

12. 简洁文案与视觉阶段

页面只保留操作必需文案:搜索、筛选、为你推荐、查看更多、追剧、缓存、选集、倍速、今日剩余、邀请好友、邮箱登录。去掉“多源合一”“让AI帮你找”等重复介绍卡/大段产品说明;规则详情放可点击入口,不常驻占满屏幕。不要删除影响决定的额度消耗、缓存权限、错误原因或协议同意。

邀请主文案模板:“好友有效看满{n}集,得{bonus}次”,奖励有效期和资格用一行摘要,其他进详情。播放器可用提示“剩余{n}次”,不堆功能说明。Web下载条只写“App每日50次 · 下载”,次数使用服务端参数,不硬编码。

确认本稿后再出高保真图:新Logo;中文/英文首页(10个滑动标签+右固定筛选)、二级搜索(可改词)、推荐列表、播放器/选集/倍速、邮箱验证、追剧续播、缓存多选/任务、我的额度、动态邀请规则、Web下载引导。先不生成图片。

13. 对抗复审记录

上一版两轮独立文档复审结论为条件通过;本轮另外由业务边界与扩展两名子agent复审,最终结果见本节末尾。首轮7项P1、6项P2及二轮3项细节已补入本稿;条件是开发前完成选型PoC,发布前完成真实测试。没有真实系统,不宣称修复了已发生漏洞或完成安全测试。

复审项 修订 对应测试
R01跨账号设备额度竞态 账号/设备同事务、固定锁序、奖励分账、游客来源合并 I01–03/I20
R02奖励承诺与上限冲突 绑定时预留名额/金额,绑定日月归属,按时达标保留 I10/I21
R03跨服务发证“原子”误述 committed_pending_license状态、订单幂等/查询/对账 I04/I22
R04清历史/注销被同步或备份复活 history_epoch、terminal、恢复前重放删除日志 I13/I15/I23
R05跨会话刷观看 活跃资格租约、按活动/集聚合、墙钟重叠不相加 I16/I17
R06端证明信任缺口 自报签名不可信;合法App50优先,弱证明风险显式 I06/P1渠道矩阵
R07在线权与离线权混淆 分开权限、首次签发到期不延长、迁移/续期明确 I03/I24
R08–13其余细节 OTP跨重发限流、奖励到账起算、零交付补偿、集身份别名、标签降级、PoC后锁排期 I05/I08/I18/I19及阶段闸门
二次复审3项P2 资格到期待核对/短宽限、2台离线设备、游客超额union保留旧权 I20/I21/I24

仍需真实开发验证:Email OTP+邀请插件兼容;RN播放/原生离线asset桥接;媒体授权网关;各种渠道端资格;持久DRM幂等签发。仍需用户确认:工作名、游客App10/登录50、邀请默认参数、非DRM弱保护是否允许、离线桥接投入。开源不是零维护,邮箱/遥测不能证明真人;真机农场、重装访客、无DRM提取、离线即时撤权属于已列出的残余风险。

本轮最终结论:业务边界与扩展两名子agent独立复审、修订后定向复核均通过;本轮审阅范围内无未关闭P0/P1/P2。免费固定50拦住高额度会员、短集倍速资格、广告未知结果对账等已修订。此为文档条件通过,不代表实现、安全测试或上线通过;框架/媒体/离线/支付/广告证明仍需PoC与真实验收。详见《Dramivio PRD 对抗复审记录》。

14. 扩展页面与状态

本节是设计范围,广告、收费、通知扩展默认关闭。表中建议数值均需后台配置与发布校验;价格尚未确定,不做虚假标价。扩展关闭时对应入口、占位和请求一起关闭,免费页面不出现空会员按钮。

14.1 页面清单

页面/弹层 主要内容 必须设计的状态
登录 Logo、剧库名、欢迎登录、邮箱、发送验证码、协议 发送中、失败、限流、必要安全验证、取消返回
邮箱验证 邮箱、验证码、确认、重发、修改邮箱 错码、过期、重发倒计时、验证中、网络失败
首页 搜索、10个横滑标签、右固定筛选、推荐、查看更多 加载、标签缓存、推荐为空、继续观看、可选广告
查询页 返回+标题、可编辑搜索框、筛选、双列剧卡 改词/取消条件、空结果、刷新/分页失败、无更多、广告关闭
播放器 剧名/集数、进度、追剧、选集、倍速、缓存 加载、播放/暂停、换线、无权限、下架、完成、跨设备接管
选集/倍速 集数状态、速度 已解锁/未解锁/已缓存/当前集,不支持的速度不出现
追剧/历史 剧卡、继续看、进度 未登录、空、更新、下架、剪辑不同、清除历史、冲突续播
缓存选集/队列 多选、画质、所需额度/空间、Wi-Fi开关、任务 Web下载引导、登录恢复、额度不足、无许可、低空间、等待/下载/暂停/失败/完成/到期/文件丢失
我的/额度明细 基础余额、奖励来源和到期、账号与设置 游客、免费、会员状态、奖励到期、审核、读取失败
邀请/记录/规则 邀请码、复制、达标进度、短规则 无名额、待观看、审核、到账、失败/申诉、资格到期、活动关闭
额度用完 重置时间、邀请、Web下载、可选计划/激励入口 旧集可重播;无广告供给不留灰色广告按钮
广告详情/激励 广告标识、播放/跳过或关闭、承诺摘要 加载、无填充、完成待确认、到账、未完成、确认失败/申诉
计划/购买 价格、周期、具体权益、购买、恢复、取消说明 开关关闭、商品失效、价变重确认、已有计划、支付取消/失败/待处理
订单详情/恢复 订单状态、平台入口、刷新、反馈 成功待验证、权益生效、恢复无记录/成功/另账号、退款申请/通过/拒绝、撤销
消息/通知设置 剧更新、下载完成、奖励/权益变化、各类开关 权限未询问/允许/拒绝、已读、空、通知过期、深链失效
账号/设备/帮助 改邮箱、撤会话、注销、申诉 重验、邮箱冲突、丢失邮箱、注销处理中、反馈提交/失败

每页都做中英文。技术说明不放用户界面,规则详情可展开。邮箱输入/验证、账号安全和付款处理页不插广告。

14.2 广告位置与样式

只显示自有服务审核通过的图片/视频素材与目标地址,不执行广告方脚本,不加载闭源SDK。直投图片广告可以用现有RN/Web组件;广告素材权利、投放时段和链接安全单独审核。未锁定开源且可验证完成事件的激励供给前,激励开关不能上线。

slot_id 位置 样式及关闭 默认限制
home_feed 首页推荐第6部后,整行 1张横卡,“广告”+关闭;关闭后折叠 每10部最多1条
query_feed 查询第6部后,整行 同上,独立于剧卡,不带追剧按钮 每10部最多1条
me_card 我的功能列表下方 小横卡,可关闭;不遮注销/反馈 页面最多1条
episode_gap 同剧集结束后、下一集开始前 全屏视频,始终可关闭,不盖字幕 建议每5个首次有效观看集一次;默认关闭
quota_reward App额度用完弹层的可选次入口 “看广告得{n}次”,主动点后进入 日5次、每次建议+2;默认关闭

禁区:开屏、登录/验证码、选集/倍速弹层、缓存队列、通知权限弹窗、支付/恢复、正片播放中。Web仅可开启列表/我的直投位,不开启集间或激励。已下载的离线内容不插广告。广告播放时间不计正片位置、邀请观看或每日剧集额度。

直投展示频控由服务端按账户跨设备共享,游客按签名访客+设备风险预算:建议全局60秒冷却,所有直投位合计最多20次/日,集间最多3次/日。同一页快照的同一slot关闭后,返回/刷新不立即换一条再弹;跨端同素材10分钟内不重复曝光。可见面积≥50%且前台连续≥1秒记曝光,重复事件幂等;客户端可见性用于分析,不能当广告奖励或结算唯一证据。

广告请求失败/无填充/素材失败直接折叠,保持滚动锚点,不能改变10部剧分页、挡住下一集或扣额度。慢请求过期后丢弃,避免突然插卡把用户正在点的封面移位。集间先保存正片进度;关闭、失败或无填充后继续原流程,下一集仍要正常查额度。已解锁重播、seek、暂停/重试不增加“已看5集”计数。

广告素材仅允许HTTPS目标地址和后台白名单协议;外链通过系统浏览器打开,返回保留原页。不给广告系统邮箱、原始观看历史、媒体凭证或可播放私有地址。对已知未成年账户不投激励/行为定向;拒绝个性化时只能上下文直投或无广告,不强制同意才能看免费剧。未选用户年龄时不默认生成年龄画像。

14.3 激励广告流程

首期不接入。启用条件:符合开源依赖限制的供给与后端完成证明通过验证,广告方回调鉴权/查询协议明确;自有直投视频只有播放器ended事件不满足发奖要求。没有完成证明就只展示直投,不自动加次数。

已登录App主动点入口→读取reward_offer快照(广告、奖量、到期、完成条件)→服务端预留日名额/奖励金额→创建opportunity_id→展示→完成证据审核→奖励账本提交。每账号只允许1个未完结机会,多个设备不能同时预留。曝光、点击不发奖;重复/迟到事件用opportunity_id+供应事件ID去重。

机会15分钟有效,完成必须发生在该窗口内;服务端收到的可信完成事件可在24小时对账宽限内处理。超过窗口不是自动发奖;结果未知显示“确认中”,不能诱导用户重新看。24小时后仍未知转review_required并告警,保留预留和机会锁,暂停该账号新的激励机会;人工核对后才提交或释放,不能为解除锁而丢弃已完成承诺。人工队列可反馈进度;迟到证据仍走同一机会幂等核对,不创建第二份奖励。供给具备更严格时限则以已接受的offer为准。奖励建议入账后24小时有效,仅App,单列广告奖励来源。广告奖励与邀请奖励共用总奖励余额保护上限,基础先用,奖励按最早到期消耗。

取消/未完成/确定失败释放预留;完成待核对不释放;伪造证据拒绝并留最少审计信息。已达条件但关闭页面的迟到有效结果仍到账,不因离开页面丢承诺。异常风控允许审核/申诉,不默认重复加奖。活动停用或用户此时升级会员,已合法完成的旧offer仍按快照结算;用户注销则按终态规则取消未结算机会,不重建账户。

页面提示限三种:“确认中”“已到账”“未完成”。失败提供一次重试查询/反馈,不能把广告加载失败写成“播放次数不足”。

14.4 付费页面与订单

首期免费,计划页面隐藏。后续计划包含名称、App/Web每日新解锁上限、去广告范围、缓存集数/设备数/有效期,所有权益用明确数值,不写“无限”。价格/币种/周期从平台商品获取,展示自动续费、取消路径;未配置可售商品不开购买按钮。先不设一次性次数包,避免把新收费类型混入首版。

开源接入候选为OpenIAP维护的react-native-iap,必须审查锁定版本、LICENSE和native传递依赖;官方旧仓库已迁移,不使用已归档入口作为维护依据。只包装StoreKit/Play Billing等平台API,不接闭源第三方支付SDK。不同分发渠道如果没有合规可用的开源接入路径,就不在该渠道开购买,不默认外跳Web结账。平台商品/验签/购买规则按启用时的Apple规则与Android订阅状态核验。

购买前先登录并确认当前账号;订单绑定user_id、平台交易ID、商品版本、价格币种和周期快照。状态:created→pending_payment→paid_pending_verification→verified;取消/失败独立状态。权益active/grace/paused/expired/refunded/revoked与订单分开,前端“支付成功”不直接授予权益;只有服务端可信交易验证/通知可推进。

支付取消回计划页不弹失败惩罚;已扣款但未验证显示“处理中”,可以刷新/恢复,不再创建同笔购买。重复通知幂等,乱序通知按可信平台当前状态与有效期核对;退款先到时旧购买通知不能把会员复活。跨设备恢复不重复赠送额度;交易已绑定另一个产品账号时提示切回原账号/联系支持,不直接转移。

会员详情显示到期日、续费开关真实状态、管理订阅、恢复购买、订单和反馈。关闭自动续费不立即失去已付周期;grace只根据可信平台状态提供,paused/expired不自设续费宽限。退款申请入口指向实际平台流程,不承诺必定批准;成功退款撤未来权益,不制造负余额。注销页面明确“注销账号不会自动取消平台订阅”,给管理入口,不能强迫保留账号;待退/续费回调只进审计,不重建已注销资料。

14.5 共同权益规则

客户端每次动作使用同一服务端entitlement结果:当前计划、基础上限与已用、各类奖励余额、免广告、缓存能力、到期及policy_version。请求失败不凭本地开关升级计划;展示可保留最近可信状态,新的购买授予/新集解锁必须取得服务端确认。

情况 新集与奖励 广告 缓存/已有内容
免费 Web10/App50;基础先用,App奖励到期先用 仅开启且符合频控的广告 按内容/App许可,已有有效许可可播
有效会员/平台确认宽限 计划上限;已用基础不归零;邀请奖励保留 建议全部广告免除,包括不请求激励 上限按计划,新许可仍受版权/期限限制
关闭续费但周期有效 维持原计划到真实到期 保持免广告 不提前撤许可
到期/暂停/退款/撤销 回免费;剩余=max(0,免费上限−当日基础已用);不倒扣已正常消费 仅在下一次查询/集结束边界恢复,不能中断正片塞广告 公共免费内容已授许可遵守原到期;会员专属资源停止新授权
会员中合法旧激励回调迟到 按旧offer结奖,仍仅App 不为到账重新播放广告 与缓存无关
风控审核/系统故障 可疑奖冻结,合法基础权限按已有策略;不得默认放行 失败不挡合法观看 不签发未知版权/未确认许可

升级当天采用更高计划上限减已用基础,不重送已用额度;降级当天不退款或抹掉账本。已消费奖励不重新改成基础,奖励过期与消耗并发由事务保证不能超扣。

正在播放的公共免费内容保留本次有效会话,到下集再按新权益查;会员专属内容在短期授权到期停止(预案≤60秒收敛,已缓冲部分不能瞬间撤回)。付费专属内容不开放无DRM弱保护下载;其离线许可到期必须≤内容许可上限及已付有效期/较短撤销窗口,不承诺离线即时退款撤权。免费内容的旧合法缓存不因退会员就被误删。

14.6 邀请、通知与后台扩展

邀请页不放宣传段落。显示“邀请好友”、邀请码、复制、以及“好友有效看满{n}集,得{bonus}次”;详情说明当前规则、短集/倍速、时窗、审核、名额和奖励到期。奖励明细显示来源、到账、到期、已用/剩余;到期只扣未用余额,不回收已正常观看的剧集,也不负债。邀请关闭时隐藏新增入口,已绑定者仍能查看进度/结算。

通知默认关闭,设置页由用户主动开启后再请求系统权限。类别:剧更新、下载完成、奖励到账/到期、计划变化;营销独立关闭。用户已拒绝系统权限则给“前往设置”,不反复弹。推送只带事件ID/安全页面定位,打开后重新查账号与权限;深链过期回原列表,不能含媒体私钥/长期授权链接。账号退出撤销该账户设备绑定,避免把前一账户消息推给新账户。公开锁屏文案不显示邮箱或敏感奖励审核原因。

首期消息中心即可;推送第三方仅选开源库,APNs/平台通知等系统服务单列,禁止经开源wrapper悄悄带入闭源推送SDK。每账户同类别默认最多1次/小时、5次/日,安全和付费状态通知按必要事务事件单独规则,不用营销通知频控隐藏购买结果。

后台菜单:标签、推荐/内容、邀请、额度、广告、计划/商品、订单/权益、通知、反馈/申诉、角色/审计。标签仍恰好10个;邀请码/短剧源不能由自由脚本生成。

广告配置:slot、端、位置、素材/有效期、关闭、全局/独立频控、奖励offer;计划配置:商品映射、权益、可售端与生效版本;邀请配置:观看与奖励参数;通知配置:双语模板/类别/频率。草稿→预览→校验→审核→灰度发布→回滚。素材/套餐运营无权写用户余额、平台订单状态或内容授权。

紧急停投不撤销已验证完成的旧offer;回滚仅影响未来展示/新绑定/新订单,不抹掉既有奖励与订单快照。收费关闭时仍保留订单/恢复/取消管理入口给已有购买者,不能让用户无处恢复或取消。广告、付费、邀请、下载可以分别停用,不改账本和已确认承诺。

14.7 最小中英文文案

场景 中文 English
登录标题 欢迎登录 Welcome
登录字段/按钮 邮箱 / 发送验证码 Email / Send code
新账号提示 未注册邮箱验证后将创建账号 New emails create an account after verification.
验证 验证码 / 确认 / 重新发送 Code / Confirm / Resend
找剧 搜索短剧 / 筛选 Search dramas / Filters
续播 继续看 · 第{n}集 Continue · Episode {n}
额度 今日剩余{n}次 {n} left today
邀请 好友有效看满{n}集,得{bonus}次 Get {bonus} credits when a friend qualifies after {n} episodes.
广告 广告 / 关闭 Ad / Close
激励 看广告得{n}次 Watch an ad for {n} credits
确认/到账 确认中 / 已到账 Confirming / Credits added
权益 查看计划 / 恢复购买 View plans / Restore purchases
支付待确认 处理中 / 刷新状态 Processing / Refresh status
缓存无许可 此剧不支持缓存 Downloads unavailable for this title

14.8 扩展验收

ID 场景 断言
E01 广告关闭/无填充/超时/素材失败 折叠、不影响10部剧和播放,滚动位置不跳
E02 翻页/刷新/往返/两设备并发曝光 共用频控,关闭不马上重弹,重复事件不多算
E03 正片切广告与返回 正片进度保存;广告不进入邀请或逐集计时
E04 激励回调伪造/重复/乱序/晚到/断网/超过24小时未知 仅可信完成结一次奖,等待期不诱导重看;超时转人工保留预留/机会锁
E05 日名额/余额满、奖励过期并发 offer预留一致,无负数/超发;已完成承诺保留
E06 会员升级/到期时广告正在加载 重新查权益,免广告不展示;正片不被中插
E07 购买取消/价变/断网/支付成但响应丢失 不擅自开权益、不重复支付,可恢复状态
E08 通知乱序/重复、退款先于成功 撤销状态不复活,交易唯一归属
E09 恢复购买到另一账号/换设备 不转移他人订单、不重复发额度
E10 升/降级当天、退款、宽限/暂停 基础已用不清零,奖励分账,许可按来源处理
E11 账号注销但平台续费仍开 可管理取消;后续回调不重建账号
E12 后台紧急停用/旧配置回滚 不撤销旧承诺,保留已有订单管理
E13 拒绝通知/外链回退/深链失效 不阻核心操作,无凭证泄露、页面恢复正确
E14 短集20/40/60秒、2倍速/seek/重复 完整观看正常可达,拖动/重复不刷资格
E15 注销后系统备份恢复/重装/重注册 不恢复旧账户钥匙/删除历史,不重建奖励
E16 新依赖为开源wrapper但native库闭源 许可证闸门拒绝,功能保持关闭

高保真阶段按14.1逐页覆盖免费、扩展启用、关键异常;同页弹层/状态不必另造主页面。图片待用户确认后制作。

补充验收E17:会员计划100集时第51集可正常解锁;升级前已用40集则剩余60;同设备不同账号混合免费/付费不挤占彼此付费权益,免费来源仍受共享免费预算;账本来源在升级、降级、恢复中保持不变。

15. 工程增补与逐项开发

正式App通过react-native-video调用AVPlayer/ExoPlayer;Web用浏览器video与按需hls.js。认证复用Better Auth邮箱OTP及官方Expo集成。具体兼容版本、缓冲策略、生命周期、长按取消、性能统计与测试关口见工程路线;按开发任务卡一次执行一项。高保真预览不是已实现的原生播放器,性能目标必须实测验证。

16. 管理后台复用

采用Payload开源核心,不自建后台CRUD/管理员认证/草稿版本。保留Better Auth用户登录与Hono业务API;专属额度、邀请、续播与离线规则由业务命令实现。详见后端复用方案及B00关口。新增选型仍需兼容PoC,之前文档复审结论不替代本次接入测试。