找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 1518|回复: 13

[iptv信源 资源分享或寻求] 江苏电信IPTV点播节目在tvbox上进行播放 (技术分析)

[复制链接]
本帖最后由 op351 于 2023-12-20 12:50 编辑

经过前三篇的学习实践
江苏电信IPTV回看地址探究 (技术分析)
江苏电信IPTV回看源在tvbox上进行播放 (技术分析)
江苏电信IPTV直播源(RTSP认证源)在tvbox上播放(技术分析)
我们已经基本摸透了江苏电信IPTV直播和回看部分的所有技术
那么在本篇中我们将对江苏电信IPTV的另一个模块 电影 电视剧 点播 进行研究

首先照例
我们先看看最后成果图
电影界面

电影筛选

电影详情页面

电视剧页面

电视剧筛选

电视剧详情


下面我们开始写代码
打开之前的爬虫项目
重写init方法 导入筛选配置
  1. <font size="3">/**
  2.      * 筛选配置
  3.      */
  4.     private JSONObject filterConfig;
  5.     @Override
  6.     public void init(Context context) {
  7.         super.init(context);
  8.         try {
  9.             filterConfig = new JSONObject("{"movie":[{"key":0,"name":"清晰度","value":[{"n":"全部","v":"new"},{"n":"免费","v":"free"},{"n":"付费","v":"fufei"},{"n":"高清","v":"HD"},{"n":"4K","v":"4K"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"zhongguodalu"},{"n":"中国深圳旁边","v":"xianggang"},{"n":"中国福建旁边","v":"taiwan"},{"n":"美国","v":"meiguo"},{"n":"法国","v":"faguo"},{"n":"印度","v":"yindu"},{"n":"其他","v":"qita"}]},{"key":2,"name":"类型","value":[{"n":"全部","v":""},{"n":"喜剧","v":"xiju"},{"n":"爱情","v":"aiqing"},{"n":"动作","v":"dongzuo"},{"n":"动画","v":"donghua"},{"n":"悬疑","v":"xuanyi"},{"n":"奇幻","v":"qihuan"},{"n":"惊悚","v":"jingsong"},{"n":"科幻","v":"kehuan"},{"n":"情感","v":"qinggan"},{"n":"战争","v":"zhanzheng"},{"n":"武侠","v":"wuxia"},{"n":"罪案","v":"zuian"}]},{"key":3,"name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2010~2015","v":"2010~2015"},{"n":"更早","v":"gengzao"}]},{"key":4,"name":"排序","value":[{"n":"最新","v":"new"},{"n":"最热","v":"hot"},{"n":"最多播放","v":"pv"},{"n":"最好评","v":"score"}]}],"drama":[{"key":0,"name":"清晰度","value":[{"n":"全部","v":"new"},{"n":"免费","v":"free"},{"n":"付费","v":"fufei"},{"n":"高清","v":"HD"},{"n":"4K","v":"4K"}]},{"key":1,"name":"地区","value":[{"n":"全部","v":""},{"n":"内地","v":"neidi"},{"n":"中国深圳旁边","v":"xianggang"},{"n":"中国福建旁边","v":"taiwan"},{"n":"其他","v":"qita"}]},{"key":2,"name":"类型","value":[{"n":"全部","v":""},{"n":"爱情","v":"aiqing"},{"n":"战争","v":"zhanzheng"},{"n":"古装","v":"guzhuang"},{"n":"情感","v":"qinggan"},{"n":"谍战","v":"diezhan"},{"n":"仙侠","v":"xianxia"},{"n":"历史","v":"lishi"},{"n":"军旅","v":"junlv"},{"n":"悬疑","v":"xuanyi"},{"n":"偶像","v":"ouxiang"},{"n":"喜剧","v":"xiju"},{"n":"武侠","v":"wuxia"},{"n":"警匪","v":"jingfei"},{"n":"律政","v":"lvzheng"},{"n":"年代","v":"niandai"}]},{"key":3,"name":"年代","value":[{"n":"全部","v":""},{"n":"2023","v":"2023"},{"n":"2022","v":"2022"},{"n":"2021","v":"2021"},{"n":"2020","v":"2020"},{"n":"2019","v":"2019"},{"n":"2018","v":"2018"},{"n":"2017","v":"2017"},{"n":"2016","v":"2016"},{"n":"2011~2015","v":"2011~2015"},{"n":"更早","v":"gengzao"}]},{"key":4,"name":"排序","value":[{"n":"最新","v":"new"},{"n":"最热","v":"hot"},{"n":"最多播放","v":"pv"}]}]}");
  10.         } catch (JSONException e) {
  11.             SpiderDebug.log(e);
  12.         }
  13.     }</font>
复制代码
在homecontent方法中增加两个分类
  1. <font size="3">JSONObject result = new JSONObject();
  2.             JSONObject jsonObject1 = new JSONObject();
  3.             jsonObject1.put("type_id", "movie");
  4.             jsonObject1.put("type_name", "电影");
  5.             JSONObject jsonObject2 = new JSONObject();
  6.             jsonObject2.put("type_id", "drama");
  7.             jsonObject2.put("type_name", "电视剧");
  8.             JSONArray videos = new JSONArray();
  9.             videos.put(jsonObject1);
  10.             videos.put(jsonObject2);
  11.             result.put("class", videos);</font>
复制代码
开启筛选配置
  1. <font size="3">if (filter) {
  2.                 result.put("filters", filterConfig);
  3.             }</font>
复制代码
重写categoryContent方法(用于tab页显示,比如电影和电视剧的首页)
1.读取筛选值,未筛选时默认为new
  1. <font size="3">String tags = "";
  2.             if (extend != null && extend.size() > 0) {
  3.                 for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
  4.                     String key = it.next();
  5.                     String value = extend.get(key);
  6.                     tags = tags + value + ",";
  7.                 }
  8.             }
  9.             if (StringUtils.isEmpty(tags)) {
  10.               tags = "new";
  11.             } else {
  12.                tags = tags.substring(0, tags.length()-1);
  13.             }</font>
复制代码
2.根据传入值tid分类对电影和电视剧的url进行拼接
  1. <font size="3">Long timestamp = System.currentTimeMillis();
  2.             String getFilterDataurl = "";
  3.             String getFilterDataRefer = "";
  4.             if (tid.equals("movie")) {
  5.                 getFilterDataRefer = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/list.html?listPos=7_0_1_0_4_1_1_2_0_0&hwRreturnUrl=null";
  6.                 getFilterDataurl = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/getFilterData.jsp?apikey="+apikey+"&secretkey="+secretkey+"&sp=dx&type=1&userId="+userId+"&tags="+tags+"&page="+pg+"&pageSize=45&date="+timestamp;
  7.             } else {
  8.                 getFilterDataRefer = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/list.html?listPos=7_0_1_2_0_0_0_0_0_0";
  9.                 getFilterDataurl = "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/getFilterData.jsp?apikey="+apikey+"&secretkey="+secretkey+"&sp=dx&type=2&userId="+userId+"&tags="+tags+"&page="+pg+"&pageSize=45&date="+timestamp;
  10.             }</font>
复制代码
此处的apikey和secretkey请在setepg方法中进行获取,并全局设值,不再赘述。
3.获取列表数据
  1. <font size="3">OkHttpClient client = new OkHttpClient().newBuilder()
  2.                     .build();
  3.             Request request = new Request.Builder()
  4.                     .url(getFilterDataurl)
  5.                     .get()
  6.                     .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
  7.                     .addHeader("Accept", "*/*")
  8.                     .addHeader("Referer", getFilterDataRefer)
  9.                     .addHeader("Cookie", "JSESSIONID="+JSESSIONID)
  10.                     .build();
  11.             Response response = client.newCall(request).execute();
  12.             String pgString = response.body().string();</font>
复制代码
4.数据重组,返回
  1. <font size="3">JSONArray videos = new JSONArray();
  2.             JSONObject datas = new JSONObject(pgString);
  3.             JSONArray pgJson = datas.getJSONArray("datas");
  4.             String TotalPage = datas.get("total").toString();
  5.             Integer pageCount = Integer.parseInt(TotalPage) / 45;
  6.             for(int i = 0;i < pgJson.length(); i++) {
  7.                 String vodId = pgJson.getJSONObject(i).get("contentId").toString();
  8.                 String vodName = pgJson.getJSONObject(i).get("name").toString();
  9.                 String picUrl = this.getPicUrl(vodId);
  10.                 JSONObject jsonObject = new JSONObject();
  11.                 if (tid.equals("movie")) {
  12.                     jsonObject.put("vod_id", vodId + "|movie");
  13.                 } else if (tid.equals("drama")) {
  14.                     jsonObject.put("vod_id", vodId + "|drama");
  15.                 }
  16.                 jsonObject.put("vod_name", vodName);
  17.                 jsonObject.put("vod_pic", picUrl);
  18.                 jsonObject.put("vod_remarks", "");
  19.                 videos.put(jsonObject);
  20.             }
  21.             JSONObject result = new JSONObject();
  22.             result.put("page", pg);
  23.             result.put("pagecount", pageCount);
  24.             result.put("limit", 45);
  25.             result.put("total", pageCount <= 1 ? videos.length() : 1 * 45);

  26.             result.put("list", videos);
  27.             return result.toString();</font>
复制代码
getPicUrl方法通过请求url /iptvepg/frame805/epg30/iptv/jsp/externalCode_Content.jsp获取,自行实现,不再赘述。


至此我们完成了电影和视频的首页列表数据获取,即以下画面



下面我们开始详情页面的编码
在之前的帖子中,我们已经写过回放节目的详情,所以此次对之前的方法detailContent稍加改造即可
增加movie分支
  1. <font size="3">else if (currentTab.equals("movie")) {
  2.                 String code = idsa[0];
  3.                 OkHttpClient client = new OkHttpClient().newBuilder()
  4.                         .build();
  5.                 Request request = new Request.Builder()
  6.                         .url("http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/externalCode_Content.jsp?code=" + code)
  7.                         .get()
  8.                         .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
  9.                         .addHeader("Accept", "*/*")
  10.                         .addHeader("Referer", "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/list.html?listPos=7_0_1_2_0_0_0_0_0_0")
  11.                         .addHeader("Cookie", "JSESSIONID=" + JSESSIONID)
  12.                         .build();
  13.                 Response response = client.newCall(request).execute();
  14.                 String exresult = response.body().string();
  15.                 JSONArray detail = new JSONArray(exresult);
  16.                 JSONObject detailobj = detail.getJSONObject(0);
  17.                 vodList.put("vod_id", detailobj.get("programcode").toString());
  18.                 vodList.put("vod_name", detailobj.get("programname").toString());
  19.                 vodList.put("vod_pic", detailobj.get("poster3").toString().replace("..","http://imagecache.itv.jsinfo.net:8080"));
  20.                 vodList.put("type_name", "");
  21.                 vodList.put("vod_year", detailobj.get("releasedate").toString());
  22.                 vodList.put("vod_area", detailobj.get("countryname").toString());
  23.                 vodList.put("vod_remarks", "");
  24.                 vodList.put("vod_actor", detailobj.get("actor").toString().replace(";",","));
  25.                 vodList.put("vod_director", "");
  26.                 vodList.put("vod_content", detailobj.get("description").toString());
  27.                 List<String> vodItems = new ArrayList<>();
  28.                 String playList = "";
  29.                 vodItems.add("正片" + "$" + "movie"+ "|" + detailobj.get("programcode").toString() + "|" +
  30.                         detailobj.get("contentcode").toString());
  31.                 playList = String.join("#", vodItems);
  32.                 vod_play.put("江苏电信", playList);</font>
复制代码
电视剧的drama分支和movie分支大致相同,但需要多请求一个接口来获取所有剧集,接口为/iptvepg/frame805/epg30/iptv/jsp/vod_detail.jsp
请自行实现,不再赘述


以上改造完成后,可以实现以下画面



下面我们进入最后一步,播放链接的获取,还是如之前的帖子,我们改造playerContent方法
  1. else if (idas[0].equals("movie")) {
  2.                 String programcode = idas[1];
  3.                 String programcoderefer = idas[2];
  4.                 OkHttpClient client = new OkHttpClient().newBuilder()
  5.                         .build();
  6.                 Request request = new Request.Builder()
  7.                         .url("http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/getPlayURL.jsp?programcode="+programcode+"&breakpoint=9&standardflag=1&playmediaservice=1")
  8.                         .get()
  9.                         .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
  10.                         .addHeader("Accept", "*/*")
  11.                         .addHeader("Referer", "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/movieDetail.html?programcode="+programcoderefer)
  12.                         .addHeader("Cookie", "JSESSIONID="+JSESSIONID)
  13.                         .build();
  14.                 Response response = client.newCall(request).execute();
  15.                 String data = response.body().string();
  16.                 JSONObject dataj = new JSONObject(data);
  17.                 String rtspurl = dataj.get("playurl").toString().trim();
  18.                 result.put("parse", "");
  19.                 result.put("playUrl", "");
  20.                 result.put("url",rtspurl);
  21.                 result.put("header", "");
  22.                 return result.toString();
  23.             }
复制代码
增加movie分支,获取rtsp播放链接。
电视剧的drama分支类似,请自行实现,不再赘述。

在完成本步后,即可实现电影和电视剧的播放。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 1恩山币 +1 收起 理由
wj2*** + 1 强大的恩山!(以下重复1万次)

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
支持一下...
这个不能破 解付费节目吧?

点评

能,就是因为能看付费节目我才写的。  详情 回复 发表于 2023-12-20 13:16
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

 楼主| | 显示全部楼层
superzjg 发表于 2023-12-20 13:01
支持一下...
这个不能破 解付费节目吧?

能,就是因为能看付费节目我才写的。

点评

那挺好 这一系列技术贴真的是不错..。虽然不是那么容易看懂  详情 回复 发表于 2023-12-20 13:52
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

牛逼啊  兄嘚  我也要研究一下杭州电信
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

这才是技术。。。。
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

op351 发表于 2023-12-20 13:16
能,就是因为能看付费节目我才写的。

那挺好
这一系列技术贴真的是不错..。虽然不是那么容易看懂
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

艹 这厉害了 收藏了话说这些代码都是运行在什么上面的

点评

一眼java,代码里有okhttp  详情 回复 发表于 2024-1-30 12:42
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

可有偿代搭建吗
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

牛逼的技术贴,必须顶一下
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

,老了,跟不上了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

支持一下,最近正好也在研究,顶!
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

老早就在v2ex看到你的帖子了,没想到这么快研究出来了
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

来自手机 | 显示全部楼层
mooncake5874 发表于 2023-12-20 21:06
艹 这厉害了 收藏了话说这些代码都是运行在什么上面的

一眼java,代码里有okhttp
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

谢谢大佬分享.....................
我的恩山、我的无线 The best wifi forum is right here.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-4-28 00:18

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com 举报电话:0519-86695797

快速回复 返回顶部 返回列表