X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;ds=sidebyside;f=youtube_dl%2Fextractor%2Fdaum.py;h=86024a745661dda2da9d3fb883ccf4db017a722c;hb=115c65793af4c56c8f1986d2640105fc7e760c13;hp=cf158c42d6a04be6fb3c060a2d3f6187aa06f85a;hpb=33cc74eeebe9355f38145d0d6ddc84e5a2dc1af8;p=youtube-dl diff --git a/youtube_dl/extractor/daum.py b/youtube_dl/extractor/daum.py index cf158c42d..86024a745 100644 --- a/youtube_dl/extractor/daum.py +++ b/youtube_dl/extractor/daum.py @@ -7,8 +7,10 @@ import itertools from .common import InfoExtractor from ..compat import ( - compat_urllib_parse, + compat_parse_qs, compat_urllib_parse_unquote, + compat_urllib_parse_urlencode, + compat_urlparse, ) from ..utils import ( int_or_none, @@ -40,7 +42,7 @@ class DaumIE(InfoExtractor): 'info_dict': { 'id': '65139429', 'ext': 'mp4', - 'title': 'md5:a100d65d09cec246d8aa9bde7de45aed', + 'title': '1297회, \'아빠 아들로 태어나길 잘 했어\' 민수, 감동의 눈물[아빠 어디가] 20150118', 'description': 'md5:79794514261164ff27e36a21ad229fc5', 'upload_date': '20150604', 'thumbnail': 're:^https?://.*\.(?:jpg|png)', @@ -68,7 +70,7 @@ class DaumIE(InfoExtractor): def _real_extract(self, url): video_id = compat_urllib_parse_unquote(self._match_id(url)) - query = compat_urllib_parse.urlencode({'vid': video_id}) + query = compat_urllib_parse_urlencode({'vid': video_id}) movie_data = self._download_json( 'http://videofarm.daum.net/controller/api/closed/v1_2/IntegratedMovieData.json?' + query, video_id, 'Downloading video formats info') @@ -84,7 +86,7 @@ class DaumIE(InfoExtractor): formats = [] for format_el in movie_data['output_list']['output_list']: profile = format_el['profile'] - format_query = compat_urllib_parse.urlencode({ + format_query = compat_urllib_parse_urlencode({ 'vid': video_id, 'profile': profile, }) @@ -117,6 +119,7 @@ class DaumIE(InfoExtractor): class DaumClipIE(InfoExtractor): _VALID_URL = r'https?://(?:m\.)?tvpot\.daum\.net/(?:clip/ClipView.(?:do|tv)|mypot/View.do)\?.*?clipid=(?P\d+)' IE_NAME = 'daum.net:clip' + _URL_TEMPLATE = 'http://tvpot.daum.net/clip/ClipView.do?clipid=%s' _TESTS = [{ 'url': 'http://tvpot.daum.net/clip/ClipView.do?clipid=52554690', @@ -135,6 +138,10 @@ class DaumClipIE(InfoExtractor): 'only_matching': True, }] + @classmethod + def suitable(cls, url): + return False if DaumPlaylistIE.suitable(url) or DaumUserIE.suitable(url) else super(DaumClipIE, cls).suitable(url) + def _real_extract(self, url): video_id = self._match_id(url) clip_info = self._download_json( @@ -162,8 +169,8 @@ class DaumListIE(InfoExtractor): for pagenum in itertools.count(1): list_info = self._download_json( 'http://tvpot.daum.net/mypot/json/GetClipInfo.do?size=48&init=true&order=date&page=%d&%s=%s' % ( - pagenum, list_id_type, list_id), list_id,'Downloading list info - %s' % pagenum) - + pagenum, list_id_type, list_id), list_id, 'Downloading list info - %s' % pagenum) + entries.extend([ self.url_result( 'http://tvpot.daum.net/v/%s' % clip['vid']) @@ -179,10 +186,21 @@ class DaumListIE(InfoExtractor): return name, entries + def _check_clip(self, url, list_id): + query_dict = compat_parse_qs(compat_urlparse.urlparse(url).query) + if 'clipid' in query_dict: + clip_id = query_dict['clipid'][0] + if self._downloader.params.get('noplaylist'): + self.to_screen('Downloading just video %s because of --no-playlist' % clip_id) + return self.url_result(DaumClipIE._URL_TEMPLATE % clip_id, 'DaumClip') + else: + self.to_screen('Downloading playlist %s - add --no-playlist to just download video' % list_id) + class DaumPlaylistIE(DaumListIE): _VALID_URL = r'https?://(?:m\.)?tvpot\.daum\.net/mypot/(?:View\.do|Top\.tv)\?.*?playlistid=(?P[0-9]+)' IE_NAME = 'daum.net:playlist' + _URL_TEMPLATE = 'http://tvpot.daum.net/mypot/View.do?playlistid=%s' _TESTS = [{ 'note': 'Playlist url with clipid', @@ -207,12 +225,16 @@ class DaumPlaylistIE(DaumListIE): } }] - def _real_extract(self, url): - if DaumClipIE.suitable(url) and self._downloader.params.get('noplaylist'): - return self.url_result(url, 'DaumClip') + @classmethod + def suitable(cls, url): + return False if DaumUserIE.suitable(url) else super(DaumPlaylistIE, cls).suitable(url) + def _real_extract(self, url): list_id = self._match_id(url) - self.to_screen('Downloading playlist %s - add --no-playlist to just download video' % list_id) + + clip_result = self._check_clip(url, list_id) + if clip_result: + return clip_result name, entries = self._get_entries(list_id, 'playlistid') @@ -220,7 +242,7 @@ class DaumPlaylistIE(DaumListIE): class DaumUserIE(DaumListIE): - _VALID_URL = r'https?://(?:m\.)?tvpot\.daum\.net/mypot/(?:View|Top)\.do\?.*?ownerid=(?P[0-9a-zA-Z]+)' + _VALID_URL = r'https?://(?:m\.)?tvpot\.daum\.net/mypot/(?:View|Top)\.(?:do|tv)\?.*?ownerid=(?P[0-9a-zA-Z]+)' IE_NAME = 'daum.net:user' _TESTS = [{ @@ -254,17 +276,23 @@ class DaumUserIE(DaumListIE): }, { 'url': 'http://tvpot.daum.net/mypot/Top.do?ownerid=o2scDLIVbHc0', 'only_matching': True, + }, { + 'url': 'http://m.tvpot.daum.net/mypot/Top.tv?ownerid=45x1okb1If50&playlistid=3569733', + 'only_matching': True, }] def _real_extract(self, url): - if DaumClipIE.suitable(url) and self._downloader.params.get('noplaylist'): - return self.url_result(url, 'DaumClip') + list_id = self._match_id(url) - if DaumPlaylistIE.suitable(url): - return self.url_result(url, 'DaumPlaylist') + clip_result = self._check_clip(url, list_id) + if clip_result: + return clip_result + + query_dict = compat_parse_qs(compat_urlparse.urlparse(url).query) + if 'playlistid' in query_dict: + playlist_id = query_dict['playlistid'][0] + return self.url_result(DaumPlaylistIE._URL_TEMPLATE % playlist_id, 'DaumPlaylist') - list_id = self._match_id(url) - self.to_screen('Downloading playlist %s - add --no-playlist to just download video' % list_id) name, entries = self._get_entries(list_id, 'ownerid') return self.playlist_result(entries, list_id, name)