From 86e6816f9707a925cf2662d5f669f4d2fe05eedc Mon Sep 17 00:00:00 2001 From: kjy00302 Date: Sun, 8 Nov 2015 11:03:01 +0900 Subject: [PATCH] fixed tvple downloader, add cloud to subtitle converter, cleaned code now cloud can convert to ass subtitle! --- docs/supportedsites.md | 2 + youtube_dl/extractor/tvple.py | 121 ++++++++++++++++++---------------- 2 files changed, 68 insertions(+), 55 deletions(-) diff --git a/docs/supportedsites.md b/docs/supportedsites.md index 03561b87d..84bed301a 100644 --- a/docs/supportedsites.md +++ b/docs/supportedsites.md @@ -93,6 +93,7 @@ - **Clipsyndicate** - **Cloudy** - **Clubic** + - **Clyp** - **cmt.com** - **CNET** - **CNN** @@ -582,6 +583,7 @@ - **tvp.pl** - **tvp.pl:Series** - **TVPlay**: TV3Play and related services + - **tvple** - **Tweakers** - **twitch:bookmarks** - **twitch:chapter** diff --git a/youtube_dl/extractor/tvple.py b/youtube_dl/extractor/tvple.py index dbe2f31ed..92b4c78db 100644 --- a/youtube_dl/extractor/tvple.py +++ b/youtube_dl/extractor/tvple.py @@ -4,11 +4,9 @@ from __future__ import unicode_literals from .common import InfoExtractor from hashlib import sha1 -import re,zlib +import re +from zlib import decompress -from ..compat import ( - compat_urllib_request -) class tvpleIE(InfoExtractor): _VALID_URL = r'https?://(?P(?:www\.)?tvple\.com/(?P[0-9]+))' @@ -19,7 +17,7 @@ class tvpleIE(InfoExtractor): 'id': '311090', 'ext': 'mp4', 'uploader': '[디지털 드럭] 나비붙이', - 'uploader_id': 'jack1609', + 'uploader_id': 'jack1609', 'title': '팜플렛으로 yee를 연주하는 김병만', 'description': '자작입니다. 첫 조교..인가..? 조교라긴 애매하지만, 어쨋든 노래로 만드는 건 이번이 처음입니다.\n원본 영상 출처: https://www.youtube.com/watch?v=E4BPHBL35dE\nyee는 유튜브에 치면 원본 영상이 나오는데 다들 아시죠??? 저작권 문제가 될 경우는 지우겠습니다...\n\n병만로이드라고 불러야 하나??' # TODO more properties, either as: @@ -30,69 +28,82 @@ class tvpleIE(InfoExtractor): } } - def decodetvple(self,key): - """based on decompiled tvple player v2.50401""" - #1st key checker - #if((key[:4] != "feff") | (key[20:21] != "_")): - # print("error:wrong key") - - #descramble key - deckey = list(key[69:85]) - code = key[125:][::-1] - - #descrambling - hexed = code.replace(deckey[5], "g").replace(deckey[4], "h").replace(deckey[3], "i").replace(deckey[2], "j").replace(deckey[1], "k").replace(deckey[6], deckey[5]).replace(deckey[7], deckey[4]).replace(deckey[8], deckey[3]).replace(deckey[9], deckey[2]).replace(deckey[10], deckey[1]).replace("g", deckey[6]).replace("h", deckey[7]).replace("i", deckey[8]).replace("j", deckey[9]).replace("k", deckey[10]) - decoded = hexed.decode("hex") - - #2nd key checker - #if( sha1(decoded).hexdigest() != key[85:125]): - # print("error:key checksum failed") - return decoded - - #def downloadgurum(misc): - - + def _decode_tvple(self, key): + """based on decompiled tvple player v2.50401""" + # 1st key checker + if((key[:4] != "feff") | (key[20:21] != "_")): + self.report_warning("error:wrong key") + + # descramble key + deckey = list(key[69:85]) + code = key[125:][::-1] + + # descrambling + hexed = code.replace(deckey[5], "g").replace(deckey[4], "h").replace(deckey[3], "i").replace(deckey[2], "j").replace(deckey[1], "k").replace(deckey[6], deckey[5]).replace(deckey[7], deckey[4]).replace(deckey[8], deckey[3]).replace(deckey[9], deckey[2]).replace(deckey[10], deckey[1]).replace("g", deckey[6]).replace("h", deckey[7]).replace("i", deckey[8]).replace("j", deckey[9]).replace("k", deckey[10]) + decoded = hexed.decode("hex") + + # 2nd key checker + if(sha1(decoded).hexdigest() != key[85:125]): + self.report_warning("error:key checksum failed") + return decoded + + def _convert_sub(self, misc, title, width, height): + clouds = self._decode_tvple(misc).decode('utf-8') + lines = re.findall(r'', clouds) + + asstemp1 = "[Script Info]\nTitle: %s\nScriptType: v4.00+\nWrapStyle: 0\nPlayResX: %d\nPlayResY: %d\nScaledBorderAndShadow: yes\n\n[V4+ Styles]\nFormat: Name, Fontname, Fontsize, PrimaryColour, SecondaryColour, OutlineColour, BackColour, Bold, Italic, Underline, StrikeOut, ScaleX, ScaleY, Spacing, Angle, BorderStyle, Outline, Shadow, Alignment, MarginL, MarginR, MarginV, Encoding\nStyle:Default,Arial,14,&H00FFFFFF,&H000000FF,&H00000000,&H00000000,0,0,0,0,100,100,0,0,1,2,2,2,10,10,10,1\n\n" % (title, width, height) + + asstemp2 = "[Events]\nFormat: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n" + for line in lines: + reg = re.search(r'id="(.*)" x="(.*)" y="(.*)" pos="(.*)">(.*)<', line) + sec = int(reg.group(4)) + starttime = "%02d:%02d:%02d.00" % (divmod(divmod(sec, 60)[0], 60)[0], divmod(divmod(sec, 60)[0], 60)[1], divmod(sec, 60)[1]) + endtime = "%02d:%02d:%02d.00" % (divmod(divmod(sec + 2, 60)[0], 60)[0], divmod(divmod(sec + 2, 60)[0], 60)[1], divmod(sec + 2, 60)[1]) + asstemp2 += "Dialogue: 0,%s,%s,Default,,0,0,0,,{\\an4\pos(%d,%d)}%s\n" % (starttime, endtime, int(reg.group(2)), int(reg.group(3)), reg.group(5)) + + return(asstemp1 + asstemp2) + def _real_extract(self, url): video_id = self._match_id(url) webpage = self._download_webpage(url, video_id) - playurl = self._html_search_regex(r'http://tvple.com/crossdomain.xml\n(.*)\n1', self.decodetvple(re.search(r'data-key="(.*)"', webpage).group(1)), "playurl") + playurl = self._html_search_regex(r'http://api.tvple.com/crossdomain.xml\n(.*)\n1', self._decode_tvple(re.search(r'data-key="(.*)"', webpage).group(1)), "playurl") playpage = self._download_webpage(playurl, "playurl_%d" % int(video_id)) - videourl = re.search("