技术宅打造全能美剧播放器

标签: 其他 极客 权力的游戏 迅雷云播 for Android | 发表时间:2014-04-12 12:06 | 作者:Yaseng
出处:http://www.freebuf.com

1:前言

看到有同仁发《权力的游戏》 自动追剧脚本,老衲也来凑个热闹…

移动端最好的播放器非云播君莫属了,极速而方便,高清而无码,可惜最近资源被和谐,每次有美剧更新需要用浏览器手工添加播放源或者pc端添加,很是麻烦的说。于是就简单diy了下云播1.9 for Android ,使其支持自定义搜索引擎(比如人人影视,xxx资源站等),并且修复了原来搜索结果列表页标题的bug,为了迎接Game of Thrones Season 4 的回归,特记录下修改过程。

2:添加yyets.com搜索引擎

反编译搜索引擎代码
com\xunlei\cloud\action\search\AdviseEngine.java  89 行

try
    {
      str = SearchAdviceEngineListResp.getDomainName(paramString);
      if (str.equalsIgnoreCase("btdigg.org"))
      {
        localAdviseEngine.url_pattern = "http://btdigg.org/search?q={searchTerms}&p={page}";
        localAdviseEngine.multi_page = true;
        localAdviseEngine.page_start_point = 0;
        return localAdviseEngine;
      }
      if (str.equalsIgnoreCase("so.com"))
      {
        localAdviseEngine.url_pattern = "http://www.so.com/s?q={searchTerms}+site%3Abtdigg.org&pn={page}";
        localAdviseEngine.multi_page = true;
        localAdviseEngine.page_start_point = 1;
        return localAdviseEngine;
      }
    }
    catch (URISyntaxException localURISyntaxException)
    {
      localURISyntaxException.printStackTrace();
      return localAdviseEngine;
    }
    if (str.equalsIgnoreCase("torrentkitty.com"))
    {
      localAdviseEngine.url_pattern = "http://www.torrentkitty.com/search/{searchTerms}/{page}";
      localAdviseEngine.multi_page = true;
      localAdviseEngine.page_start_point = 1;
      return localAdviseEngine;
    }
    if (str.equalsIgnoreCase("kuaichuanmirror.com"))
    {
      localAdviseEngine.url_pattern = "http://www.kuaichuanmirror.com/search/{searchTerms}/";
      localAdviseEngine.multi_page = false;
      localAdviseEngine.page_start_point = 1;
    }

挖槽  竟然内置四大毛片搜索引擎 !!!
随便改掉一个即可
由于内置引擎只识别磁力链接 需要一个脚本文件来做中转(代码见最后链接)
输出格式为

magnet:?xt=urn:btih:hash1&title1</br>
magnet:?xt=urn:btih:hash2&title2</br>

修改 smali\com\xunlei\cloud\action\search\AdviseEngine.smali   239 行

.line 127 
:cond_1 
const-string v2, "yyets.com" 
invoke-virtual {v0, v2}, Ljava/lang/String;->equalsIgnoreCase(Ljava/lang/String;)Z 
move-result v2 
if-eqz v2, :cond_2 
.line 128 
const-string v0, "http://www.ttst.com/y2c.php?keyword={searchTerms}&page={page}" 
iput-object v0, v1, Lcom/xunlei/cloud/action/search/AdviseEngine;->url_pattern:Ljava/lang/String;
.line 129 
const/4 v0, 0x1

3:修正标题bug

云播在使用第三方搜索引擎时,发现结果列表页面的标题全部是随机的字符串

查看对应的dalvik代码
smali\com\xunlei\cloud\action\search\AdviseEngine.smali   990行

const-string v0, "magnet:\\?xt=urn:btih:([A-Za-z\\d]{32,})&?"      //批量正则   遍历结果数组
  .....
 invoke-static {v0, v1}, Ljava/util/regex/Pattern;->compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;
 .....
 invoke-virtual {v5}, Ljava/util/regex/Matcher;->find()Z
move-result-object v0
 .line 88
 invoke-virtual {v0}, Ljava/lang/String;->length()I
move-result v1
add-int/lit8 v1, v1, -0x1
 invoke-virtual {v0, v1}, Ljava/lang/String;->charAt(I)C 
move-result v1
.line 89
const/16 v6, 0x26
if-ne v1, v6, :cond_4
.line 90
invoke-virtual {v0}, Ljava/lang/String;->length()I
move-result v1
add-int/lit8 v1, v1, -0x1
invoke-virtual {v0, v3, v1}, Ljava/lang/String;->substring(II)Ljava/lang/String;
 move-result-object v0
    move-object v1, v0
    .line 92
    :goto_1
    const/16 v0, 0x14
    invoke-virtual {v1}, Ljava/lang/String;->length()I
    move-result v6
    invoke-virtual {v1, v0, v6}, Ljava/lang/String;->substring(II)Ljava/lang/String;
    move-result-object v0
    .line 93
    invoke-static
 {v0, v2}, 
Lcom/xunlei/cloud/action/search/g;->a(Ljava/lang/String;I)Ljava/lang/String;
 // str2.substring(20, str2.length())
    move-result-object v6
 ......
.line 105 
iput-object v6, v0, Lcom/xunlei/cloud/action/search/SnifferData;->title:Ljava/lang/String;
.line 106 
 iput-object v1, v0, Lcom/xunlei/cloud/action/search/SnifferData;->url:Ljava/lang/String;
.line 107 
 iput-object v6, v0, Lcom/xunlei/cloud/action/search/SnifferData;->hash:Ljava/lang/String;

可以看到,标题被直接赋值给  magnet 的 hash 了  …..
修改为

ArrayList localArrayList = new ArrayList();
  Matcher localMatcher = Pattern.compile(".*?</br>", 2).matcher(   //中转脚本每行用</br> 分割
    paramString);
  if (!localMatcher.find()) {
   return;
  }
  String str1;
  str1 = localMatcher.group();
  for (String str2 = str1.substring(0, 60);; str2 = str1) {
   String str3 = str2.substring(20, 60);
   String str4 = str1.substring(61, str1.length() - 5);
   SnifferData localSnifferData = new SnifferData();
   localSnifferData.title = str4;
   localSnifferData.url = str2;
   localSnifferData.hash = str3;
   localArrayList.add(localSnifferData);
   break;
  }

对应的dalvik 代码(具体见后面链接)

locals 15 //15个寄存器
const-string v0, ".*?</br>"
const/4 v10, 0x0
const/16 v11, 0x3c // 60
const/16 v12, 0x3d //61
const/4 v1, 0x2
invoke-static {v0, v1}, Ljava/util/regex/Pattern;->compile(Ljava/lang/String;I)Ljava/util/regex/Pattern;
move-result-object v0
invoke-virtual {v0, v10, v11}, Ljava/lang/String;->substring(II)Ljava/lang/String;
                                                                                                              
move-result-object v8
move-object v1, v8
                                                                                                              
.line 92
:goto_1
move-object v9, v0     // copy 一份v0   magnet:?xt=urn:btih:hash&title
const/16 v0, 0x14
                                                                                                              
invoke-virtual {v1}, Ljava/lang/String;->length()I
                                                                                                              
........
new-instance v0, Lcom/xunlei/cloud/action/search/SnifferData;
invoke-direct {v0}, Lcom/xunlei/cloud/action/search/SnifferData;-><init>()V
invoke-virtual {v9}, Ljava/lang/String;->length()I
move-result v13
add-int/lit8 v13, v13, -0x5
invoke-virtual {v9, v12, v13}, Ljava/lang/String;->substring(II)Ljava/lang/String;
move-result-object v14
.line 105
iput-object v14, v0, Lcom/xunlei/cloud/action/search/SnifferData;->title:Ljava/lang/String;
                                                                                                              
.line 106
iput-object v1, v0, Lcom/xunlei/cloud/action/search/SnifferData;->url:Ljava/lang/String;
                                                                                                              
.line 107
iput-object v6, v0, Lcom/xunlei/cloud/action/search/SnifferData;->hash:Ljava/lang/String;

4:回编译错误处理

java -jar apktool.jar b CloudPlay_ybappgw c1.apk
libpng error: Not a PNG file
ERROR: Failure processing PNG image F:\Pentest\Ya 
Tools\pendroid\apktool1.5.2\CloudPlay_ybappgw\res\drawable-hdpi\local_list_view_item_color.png

不是真正的png文件  看了下文件头  bmp…  改过来 继续

ERROR: 9-patch image F:\Pentest\Ya 
Tools\pendroid\apktool1.5.2\CloudPlay_ybappgw\res\drawable-hdpi\progressbar_local_item.9.png
malformed.

把三个文件全部改成普通 png格式 progressbar_local_item.9.png => progressbar_local_item.png

apktool b CloudPlay_ybappgw c1.apk
I: Checking whether sources has changed...
I: Smaling...
I: Checking whether resources has changed...
I: Building apk file...

成功编译成apk 文件

5:测试结果

签名  安装到手机

java -jar signapk.jar testkey.x509.pem testkey.pk8 c1.apk c1_s.apk
adb install -r c1_s.apk

截图

6:链接

中转脚本:    https://github.com/yaseng/pentest/blob/master/project/diy_cloudplay/y2c.php
g.smali    : https://github.com/yaseng/pentest/blob/master/project/diy_cloudplay/g.smali
smali 语法 : https://code.google.com/p/smali/w/list
Av Top 10:   http://movie.douban.com/doulist/3822549

相关 [技术 全能 播放器] 推荐:

技术宅打造全能美剧播放器

- - FreeBuf.COM
看到有同仁发《权力的游戏》 自动追剧脚本,老衲也来凑个热闹…. 移动端最好的播放器非云播君莫属了,极速而方便,高清而无码,可惜最近资源被和谐,每次有美剧更新需要用浏览器手工添加播放源或者pc端添加,很是麻烦的说. 于是就简单diy了下云播1.9 for Android ,使其支持自定义搜索引擎(比如人人影视,xxx资源站等),并且修复了原来搜索结果列表页标题的bug,为了迎接Game of Thrones Season 4 的回归,特记录下修改过程.

利用视频解码器K-Lite Codec Pack打造全能播放器

- - 软矿
如今快播、百度影音和迅雷快播已经成为众多的播放视频的首选工具,但小编依然喜欢先将电影或者电视下载回来再使用播放器慢慢观赏. 至于播放器,选择可以是 GOM Media Player, PotPlayer, SPlayer,KMPlayer等. 但实际上我们也可以直接使用Windows自带的视频播放器玩转所有视频格式,只要你安装K-Lite Codec Pack 10.3,万能的视频解码器.

优秀的Android Podcast播放器

- Yao - Solidot
John Ryan 写道 "Podcast是通过互联网传播、分成多集播放的节目. 它包括了音频和视频文件,大多数Podcas文件可供下载. 术语podcasting最早是在2004年发明的,某些人可能会错误以为这种媒体需要苹果的iPod才能收听. Android Market 中有大量独立和集成的Podcast播放器,部分功能有限,部分开发还没完成.

优秀的Android音频播放器

- SUN - Solidot
Simon Jessop 写道 "我们常常看到人们把Android设备当成音乐播放器使用,但Android自带的播放器有许多不足,例如缺乏无缝播放. 不过好在Android平台上有许多免费和功能丰富的音乐播放器替代. 这里收集了八款优秀的Android音乐播放器,包括了Winamp,MixZing,Songbird,开源播放器Cubed Music Player,DeaDBeeF Player,等等.

【首次限免】影音播放器:GPlayer

- Mr.aa - 爱Apps - www.iapps.im
精选限时免费应用,由 AppPusher 为您送达. 无限精彩,尽在 爱Apps - www.iapps.im. 本站原创内容,转载时请务必注明出处,谢谢. 大小: 11.8 MB 系统: 3.2+. 原价$2.99,除去完全免费的播放器,播放器软件的超值限免,今天还是首次的说,希望大家能喜欢.

我最喜欢的《音乐播放器》

- - 小众软件 - Appinn
经小众读者 提名的我最喜爱的《音乐播放器》已经有了结果, foobar2000 轻松夺冠. 我最喜爱的《音乐播放器》总共提名 1896 个,有效提名 1838 个. foobar2000 的排名比较没有悬念,深得众多音乐爱好者的喜爱,并且多年来 foobar2000 的质量也不曾下降. airplay 让人惊喜,目前的 airplay 除了传统的音乐播放程序外,还提供网络电台版本以及定制的 Channel[v] 版本,每个版本又提供不同平台支持,包括 Windows、Mac 以及 iOS、Android、Windows Phone 平台.

HTML5视频播放器总结

- - mo-Android
目前HTML5的各种应用在如火如荼的进行着,大家都在不断的尝试,尽管目前还没有优秀的产品出现,但是目前各方面的应用产品在层出不穷. 而我一直关注的HTML5视频播放这一块,应该说在国外是很火的,很多公司或者个人都在这推出自己的HTML5 视频播放器,详细的说明大家看下面这张图片:. 以上HTML5视频播放器,我也是使用了其中的2-3个,感觉比较好的还是Video JS,对我们开发人员来说很方便,网站有详细的文档说明,以及扩展说明等,播放器制作的很不错,很具有商业价值,下面给大家看一个我们使用的样例:.

Popcorn Time – 开源电影播放器

- - 小众软件
Popcorn Time 是一个很火爆的开源电影播放器,无需完全下载就可以直接播放 yts 里的高清电影,并且能够加载外挂字幕文件. 由于有版权争论, Popcorn Time 以开源的方式让其不会被版权机构干掉,不过…不知道老外是否想到了天朝早已有类似服务的商业公司. Popcorn Time 已经提供了 Windows、OS X、Linux 三个平台的客户端,无广告,有搜索、分类.

开源的Android视频播放器

- - CSDN博客推荐文章
之前尝试自己解码视频,然后播放显示,虽然音视频都可以播放,但是实现不了音视频的同步,所以使用第三方的视频库Vitamio来实现视频播放器功能,这样自己只需要实现播放解码的制作不不要关心底层解码和显示问题. 是使用Vitamio 4.0,制作的视频播放器,后续会继续添加直播,网络播放功能. 2.使用ListView显示本地视频的缩略图,文件名称,播放时间.

自己的HTML5 播放器 - __constructor

- - 博客园_首页
不知道写什么,主要也是自己水平实在是有限,想想自己会的东西都太基本,网上一搜往后不知道能数多少页,自己表达的也没有别人好. 我希望自己写的东西要么是网上没有(可能性就是零……),要么是带着自己的见解. 所以没有素材,还是自己踏踏实实学习比较靠谱,看的书越多,发现自己不会的也越多,但是太长时间不发东西出来又害怕自己丢失了写文章的习惯,所以凑数也要凑一篇.