|
本帖最后由 op351 于 2023-12-20 12:50 编辑
经过前三篇的学习实践
江苏电信IPTV回看地址探究 (技术分析)
江苏电信IPTV回看源在tvbox上进行播放 (技术分析)
江苏电信IPTV直播源(RTSP认证源)在tvbox上播放(技术分析)
我们已经基本摸透了江苏电信IPTV直播和回看部分的所有技术
那么在本篇中我们将对江苏电信IPTV的另一个模块 电影 电视剧 点播 进行研究
首先照例
我们先看看最后成果图
电影界面
电影筛选
电影详情页面
电视剧页面
电视剧筛选
电视剧详情
下面我们开始写代码
打开之前的爬虫项目
重写init方法 导入筛选配置
- <font size="3">/**
- * 筛选配置
- */
- private JSONObject filterConfig;
- @Override
- public void init(Context context) {
- super.init(context);
- try {
- 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"}]}]}");
- } catch (JSONException e) {
- SpiderDebug.log(e);
- }
- }</font>
复制代码 在homecontent方法中增加两个分类
- <font size="3">JSONObject result = new JSONObject();
- JSONObject jsonObject1 = new JSONObject();
- jsonObject1.put("type_id", "movie");
- jsonObject1.put("type_name", "电影");
- JSONObject jsonObject2 = new JSONObject();
- jsonObject2.put("type_id", "drama");
- jsonObject2.put("type_name", "电视剧");
- JSONArray videos = new JSONArray();
- videos.put(jsonObject1);
- videos.put(jsonObject2);
- result.put("class", videos);</font>
复制代码 开启筛选配置
- <font size="3">if (filter) {
- result.put("filters", filterConfig);
- }</font>
复制代码 重写categoryContent方法(用于tab页显示,比如电影和电视剧的首页)
1.读取筛选值,未筛选时默认为new
- <font size="3">String tags = "";
- if (extend != null && extend.size() > 0) {
- for (Iterator<String> it = extend.keySet().iterator(); it.hasNext(); ) {
- String key = it.next();
- String value = extend.get(key);
- tags = tags + value + ",";
- }
- }
- if (StringUtils.isEmpty(tags)) {
- tags = "new";
- } else {
- tags = tags.substring(0, tags.length()-1);
- }</font>
复制代码 2.根据传入值tid分类对电影和电视剧的url进行拼接
- <font size="3">Long timestamp = System.currentTimeMillis();
- String getFilterDataurl = "";
- String getFilterDataRefer = "";
- if (tid.equals("movie")) {
- 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";
- 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;
- } else {
- 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";
- 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;
- }</font>
复制代码 此处的apikey和secretkey请在setepg方法中进行获取,并全局设值,不再赘述。
3.获取列表数据
- <font size="3">OkHttpClient client = new OkHttpClient().newBuilder()
- .build();
- Request request = new Request.Builder()
- .url(getFilterDataurl)
- .get()
- .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
- .addHeader("Accept", "*/*")
- .addHeader("Referer", getFilterDataRefer)
- .addHeader("Cookie", "JSESSIONID="+JSESSIONID)
- .build();
- Response response = client.newCall(request).execute();
- String pgString = response.body().string();</font>
复制代码 4.数据重组,返回
- <font size="3">JSONArray videos = new JSONArray();
- JSONObject datas = new JSONObject(pgString);
- JSONArray pgJson = datas.getJSONArray("datas");
- String TotalPage = datas.get("total").toString();
- Integer pageCount = Integer.parseInt(TotalPage) / 45;
- for(int i = 0;i < pgJson.length(); i++) {
- String vodId = pgJson.getJSONObject(i).get("contentId").toString();
- String vodName = pgJson.getJSONObject(i).get("name").toString();
- String picUrl = this.getPicUrl(vodId);
- JSONObject jsonObject = new JSONObject();
- if (tid.equals("movie")) {
- jsonObject.put("vod_id", vodId + "|movie");
- } else if (tid.equals("drama")) {
- jsonObject.put("vod_id", vodId + "|drama");
- }
- jsonObject.put("vod_name", vodName);
- jsonObject.put("vod_pic", picUrl);
- jsonObject.put("vod_remarks", "");
- videos.put(jsonObject);
- }
- JSONObject result = new JSONObject();
- result.put("page", pg);
- result.put("pagecount", pageCount);
- result.put("limit", 45);
- result.put("total", pageCount <= 1 ? videos.length() : 1 * 45);
- result.put("list", videos);
- return result.toString();</font>
复制代码 getPicUrl方法通过请求url /iptvepg/frame805/epg30/iptv/jsp/externalCode_Content.jsp获取,自行实现,不再赘述。
至此我们完成了电影和视频的首页列表数据获取,即以下画面
下面我们开始详情页面的编码
在之前的帖子中,我们已经写过回放节目的详情,所以此次对之前的方法detailContent稍加改造即可
增加movie分支
- <font size="3">else if (currentTab.equals("movie")) {
- String code = idsa[0];
- OkHttpClient client = new OkHttpClient().newBuilder()
- .build();
- Request request = new Request.Builder()
- .url("http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/externalCode_Content.jsp?code=" + code)
- .get()
- .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
- .addHeader("Accept", "*/*")
- .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")
- .addHeader("Cookie", "JSESSIONID=" + JSESSIONID)
- .build();
- Response response = client.newCall(request).execute();
- String exresult = response.body().string();
- JSONArray detail = new JSONArray(exresult);
- JSONObject detailobj = detail.getJSONObject(0);
- vodList.put("vod_id", detailobj.get("programcode").toString());
- vodList.put("vod_name", detailobj.get("programname").toString());
- vodList.put("vod_pic", detailobj.get("poster3").toString().replace("..","http://imagecache.itv.jsinfo.net:8080"));
- vodList.put("type_name", "");
- vodList.put("vod_year", detailobj.get("releasedate").toString());
- vodList.put("vod_area", detailobj.get("countryname").toString());
- vodList.put("vod_remarks", "");
- vodList.put("vod_actor", detailobj.get("actor").toString().replace(";",","));
- vodList.put("vod_director", "");
- vodList.put("vod_content", detailobj.get("description").toString());
- List<String> vodItems = new ArrayList<>();
- String playList = "";
- vodItems.add("正片" + "$" + "movie"+ "|" + detailobj.get("programcode").toString() + "|" +
- detailobj.get("contentcode").toString());
- playList = String.join("#", vodItems);
- vod_play.put("江苏电信", playList);</font>
复制代码 电视剧的drama分支和movie分支大致相同,但需要多请求一个接口来获取所有剧集,接口为/iptvepg/frame805/epg30/iptv/jsp/vod_detail.jsp
请自行实现,不再赘述
以上改造完成后,可以实现以下画面
下面我们进入最后一步,播放链接的获取,还是如之前的帖子,我们改造playerContent方法
- else if (idas[0].equals("movie")) {
- String programcode = idas[1];
- String programcoderefer = idas[2];
- OkHttpClient client = new OkHttpClient().newBuilder()
- .build();
- Request request = new Request.Builder()
- .url("http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/jsp/getPlayURL.jsp?programcode="+programcode+"&breakpoint=9&standardflag=1&playmediaservice=1")
- .get()
- .addHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64; SkyworthBrowser) AppleWebKit/534.24 (KHTML, like Gecko) Safari/534.24 SkWebKit-JS-CTC")
- .addHeader("Accept", "*/*")
- .addHeader("Referer", "http://180.100.93.38:33200/iptvepg/frame805/epg30/iptv/html/movieDetail.html?programcode="+programcoderefer)
- .addHeader("Cookie", "JSESSIONID="+JSESSIONID)
- .build();
- Response response = client.newCall(request).execute();
- String data = response.body().string();
- JSONObject dataj = new JSONObject(data);
- String rtspurl = dataj.get("playurl").toString().trim();
- result.put("parse", "");
- result.put("playUrl", "");
- result.put("url",rtspurl);
- result.put("header", "");
- return result.toString();
- }
复制代码 增加movie分支,获取rtsp播放链接。
电视剧的drama分支类似,请自行实现,不再赘述。
在完成本步后,即可实现电影和电视剧的播放。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
评分
-
查看全部评分
|