From d0d426faa80b4dcdc15ff03068385798dc1afd16 Mon Sep 17 00:00:00 2001 From: zhaogd Date: Wed, 29 Jul 2026 12:16:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=B5=E8=A7=86=E5=89=A7?= =?UTF-8?q?=E5=88=86=E9=9B=86=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=B9=B6?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=AC=AC=E4=B8=89=E6=96=B9=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 /openapi/partner/media/episodes 接口,通过父级 contentcode 查询电视剧分集列表,分集 contentcode 可作为 programCode 传入 SDK 获取播放地址 - JetsenMediaClient 新增 getEpisodes 方法,调橘视厅 getcontentlist.do 传 contentcode 参数获取分集 - API_DOC.md 补充 /list 多栏目查询、/list-all 全量聚合、/episodes 分集查询三个接口的详细文档 --- API_DOC.md | 111 ++++++++++++++++++ .../media/client/JetsenMediaClient.java | 16 +++ .../controller/OpenApiMediaController.java | 33 ++++++ 3 files changed, 160 insertions(+) diff --git a/API_DOC.md b/API_DOC.md index 56baf69..514eecd 100644 --- a/API_DOC.md +++ b/API_DOC.md @@ -281,8 +281,119 @@ | `/openapi/partner/media/package` | GET | 无 | 查看授权范围 | | `/openapi/partner/media/catalog-tree` | GET | 无 | 栏目树(按授权过滤) | | `/openapi/partner/media/list` | GET | catalogid,pageindex,pagesize | 内容列表(按授权过滤) | +| `/openapi/partner/media/list-all` | GET | parentCatalogid | 全量内容列表(按一级栏目聚合,不分页) | +| `/openapi/partner/media/episodes` | GET | contentcode,pageindex,pagesize | 分集列表(通过父级contentcode) | | `/openapi/partner/media/search` | GET | keyword,pageindex,pagesize | 搜索(按授权过滤) | +#### 3.1.1 内容列表 `/list` + +``` +GET /openapi/partner/media/list?catalogid=472&pageindex=1&pagesize=20 +``` + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| catalogid | String | 是 | 栏目id,支持逗号分隔传多个(如 `472,492,494`) | +| pageindex | int | 否 | 页码,默认1 | +| pagesize | int | 否 | 每页条数,默认20 | + +**查询方式**: +- 单栏目(`catalogid=472`):走橘视厅原生分页,响应快 +- 多栏目(`catalogid=472,492,494`):聚合各栏目全量内容后本地分页 + +**返回**: +```json +{ + "code": 0, + "data": { + "list": [{"contentcode":"...", "name":"...", "posterimg":"...", "isFree":0, "episodecount":1}], + "totalCount": 3227, + "currPage": 1, + "pageSize": 20, + "totalPage": 162 + } +} +``` + +#### 3.1.2 全量内容列表 `/list-all` + +``` +GET /openapi/partner/media/list-all?parentCatalogid=471 +``` + +一次请求返回某一级栏目(如471电影)下所有二级栏目合并后的全部内容,不分页。适合按天低频全量同步。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| parentCatalogid | String | 否 | 一级栏目id,默认471(电影) | + +**返回**: +```json +{ + "code": 0, + "data": { + "list": [{"contentcode":"...", "name":"...", "posterimg":"...", "isFree":0}], + "totalCount": 3425, + "parentCatalogid": "471" + } +} +``` + +> 注:各二级栏目内容可能有跨栏目重复(一条内容可属多个栏目),第三方自行按 contentcode 去重。 + +#### 3.1.3 分集列表 `/episodes` + +``` +GET /openapi/partner/media/episodes?contentcode=23010012026061709581101832&pageindex=1&pagesize=20 +``` + +传入电视剧的父级 contentcode,返回其下各分集列表。分集的 contentcode 可作为 programCode 传入 SDK 获取播放地址。 + +**参数**: + +| 参数 | 类型 | 必填 | 说明 | +|------|------|------|------| +| contentcode | String | 是 | 父级内容编码(电视剧的 contentcode) | +| pageindex | int | 否 | 页码,默认1 | +| pagesize | int | 否 | 每页条数,默认20 | + +**返回**: +```json +{ + "code": 0, + "data": { + "list": [ + { + "contentcode": "23010022026061709581131330", + "name": "家有儿女第四部 1", + "episodeindex": 1, + "duration": 1531, + "isFree": 0, + "parentContentType": 1 + } + ], + "totalCount": 67, + "currPage": 1, + "pageSize": 20, + "totalPage": 4 + } +} +``` + +**关键字段**: + +| 字段 | 说明 | +|------|------| +| contentcode | 分集编码,作为 programCode 传入 SDK 获取播放地址 | +| episodeindex | 集数索引,排序用 | +| name | 集名 | +| duration | 时长(秒) | +| isFree | 是否免费(0=付费,1=免费) | + ### 3.2 天卡代销 `/openapi/partner/card` | 路径 | 方法 | 参数 | 说明 | diff --git a/src/main/java/io/as/modules/media/client/JetsenMediaClient.java b/src/main/java/io/as/modules/media/client/JetsenMediaClient.java index b56ad19..b13e1ff 100644 --- a/src/main/java/io/as/modules/media/client/JetsenMediaClient.java +++ b/src/main/java/io/as/modules/media/client/JetsenMediaClient.java @@ -98,6 +98,22 @@ public class JetsenMediaClient { return post("content/getcontentlist.do", biz); } + /** + * 分集列表(通过父级 contentcode) + *

橘视厅 getcontentlist.do 传 contentcode 参数时返回该内容的分集列表(电视剧各集)。

+ * @param contentcode 父级内容编码(电视剧的 contentcode) + * @param pageindex 页码,从 1 开始 + * @param pagesize 每页条数 + */ + public JSONObject getEpisodes(String contentcode, int pageindex, int pagesize) { + Map biz = new HashMap<>(); + biz.put("contentcode", contentcode); + biz.put("orderinfo", "1"); + biz.put("pageindex", String.valueOf(pageindex)); + biz.put("pagesize", String.valueOf(pagesize)); + return post("content/getcontentlist.do", biz); + } + /** * 搜索 * @param searchvalue 关键字 diff --git a/src/main/java/io/as/modules/openapi/controller/OpenApiMediaController.java b/src/main/java/io/as/modules/openapi/controller/OpenApiMediaController.java index 50c52eb..7d6bb61 100644 --- a/src/main/java/io/as/modules/openapi/controller/OpenApiMediaController.java +++ b/src/main/java/io/as/modules/openapi/controller/OpenApiMediaController.java @@ -293,6 +293,39 @@ public class OpenApiMediaController { return ids; } + /** + * 分集列表(通过父级 contentcode) + *

传入电视剧的 contentcode,返回其下各分集列表,分集的 contentcode 可作为 programCode 传入 SDK 获取播放地址。

+ *

三级授权:CONTENT(校验contentcode在授权范围内) > CATALOG/FULL(直接返回)

+ */ + @ApiOperation("分集列表(通过父级contentcode)") + @GetMapping("/episodes") + public R episodes(@RequestParam String contentcode, + @RequestParam(defaultValue = "1") int pageindex, + @RequestParam(defaultValue = "20") int pagesize, + HttpServletRequest req) { + long start = System.currentTimeMillis(); + String partnerId = partnerIdFrom(req); + ContentPackageEntity pkg = contentPackageService.getByPartnerId(partnerId); + Set contentCodes = parseContentCodes(pkg); + + // CONTENT级别:校验 contentcode 在授权范围内 + if (contentCodes != null && !contentCodes.contains(contentcode)) { + logCall(req, "/episodes", "GET", 400, start); + return R.error("contentcode不在授权范围内"); + } + + JSONObject resp = jetsenMediaClient.getEpisodes(contentcode, pageindex, pagesize); + Map data = new HashMap<>(); + data.put("list", extractList(resp)); + data.put("totalCount", resp.getIntValue("sizetotal")); + data.put("currPage", pageindex); + data.put("pageSize", pagesize); + data.put("totalPage", resp.getIntValue("pagetotal")); + logCall(req, "/episodes", "GET", 0, start); + return R.dataSuccess(data); + } + /** 搜索(按授权过滤) */ @ApiOperation("搜索") @GetMapping("/search")