Merge remote-tracking branch 'gabeos/crunchyroll-show-playlist'
authorPhilipp Hagemeister <phihag@phihag.de>
Sun, 26 Oct 2014 16:06:35 +0000 (17:06 +0100)
committerPhilipp Hagemeister <phihag@phihag.de>
Sun, 26 Oct 2014 16:06:35 +0000 (17:06 +0100)
1  2 
youtube_dl/extractor/__init__.py
youtube_dl/extractor/crunchyroll.py

index 5ec9b4745e43ed93f0af4edc450a66b2ef2ea043,0dd763006b9fcffdfa3812f8885794f48da60c0c..8e31de93dd5a8e0a7a51bc9ac65d3fc15dbf7a76
@@@ -20,14 -20,12 +20,14 @@@ from .arte import 
      ArteTVDDCIE,
      ArteTVEmbedIE,
  )
 +from .audiomack import AudiomackIE
  from .auengine import AUEngineIE
  from .bambuser import BambuserIE, BambuserChannelIE
  from .bandcamp import BandcampIE, BandcampAlbumIE
  from .bbccouk import BBCCoUkIE
  from .beeg import BeegIE
  from .behindkink import BehindKinkIE
 +from .bild import BildIE
  from .bilibili import BiliBiliIE
  from .blinkx import BlinkxIE
  from .bliptv import BlipTVIE, BlipTVUserIE
@@@ -62,7 -60,10 +62,10 @@@ from .comedycentral import ComedyCentra
  from .condenast import CondeNastIE
  from .cracked import CrackedIE
  from .criterion import CriterionIE
- from .crunchyroll import CrunchyrollIE
+ from .crunchyroll import (
+     CrunchyrollIE,
+     CrunchyrollShowPlaylistIE
+ )
  from .cspan import CSpanIE
  from .d8 import D8IE
  from .dailymotion import (
@@@ -136,7 -137,6 +139,7 @@@ from .gamestar import GameStarI
  from .gametrailers import GametrailersIE
  from .gdcvault import GDCVaultIE
  from .generic import GenericIE
 +from .glide import GlideIE
  from .globo import GloboIE
  from .godtube import GodTubeIE
  from .golem import GolemIE
@@@ -370,7 -370,6 +373,7 @@@ from .teachingchannel import TeachingCh
  from .teamcoco import TeamcocoIE
  from .techtalks import TechTalksIE
  from .ted import TEDIE
 +from .telecinco import TelecincoIE
  from .telemb import TeleMBIE
  from .tenplay import TenPlayIE
  from .testurl import TestURLIE
@@@ -425,7 -424,6 +428,7 @@@ from .videopremium import VideoPremiumI
  from .videott import VideoTtIE
  from .videoweed import VideoWeedIE
  from .vidme import VidmeIE
 +from .vidzi import VidziIE
  from .vimeo import (
      VimeoIE,
      VimeoAlbumIE,
@@@ -445,7 -443,6 +448,7 @@@ from .viki import VikiI
  from .vk import VKIE
  from .vodlocker import VodlockerIE
  from .vporn import VpornIE
 +from .vrt import VRTIE
  from .vube import VubeIE
  from .vuclip import VuClipIE
  from .vulture import VultureIE
@@@ -495,8 -492,10 +498,8 @@@ from .youtube import 
      YoutubeUserIE,
      YoutubeWatchLaterIE,
  )
 -
  from .zdf import ZDFIE
  
 -
  _ALL_CLASSES = [
      klass
      for name, klass in globals().items()
index e3057d90036575b8ef4dad2f8605ee44e0c9c558,9ac86c2be786cddc6e655a6178ba2346fc0b822d..2dca5266000db8ed558f149142e3b235e267a910
@@@ -24,6 -24,7 +24,7 @@@ from ..aes import 
      aes_cbc_decrypt,
      inc,
  )
+ from .common import InfoExtractor
  
  
  class CrunchyrollIE(SubtitlesInfoExtractor):
@@@ -39,7 -40,6 +40,7 @@@
              'thumbnail': 'http://img1.ak.crunchyroll.com/i/spire1-tmb/20c6b5e10f1a47b10516877d3c039cae1380951166_full.jpg',
              'uploader': 'Yomiuri Telecasting Corporation (YTV)',
              'upload_date': '20131013',
 +            'url': 're:(?!.*&amp)',
          },
          'params': {
              # rtmp
@@@ -238,14 -238,12 +239,14 @@@ Format: Layer, Start, End, Style, Name
              streamdata_req.data = 'req=RpcApiVideoEncode%5FGetStreamInfo&video%5Fencode%5Fquality='+stream_quality+'&media%5Fid='+stream_id+'&video%5Fformat='+stream_format
              streamdata_req.add_header('Content-Type', 'application/x-www-form-urlencoded')
              streamdata_req.add_header('Content-Length', str(len(streamdata_req.data)))
 -            streamdata = self._download_webpage(streamdata_req, video_id, note='Downloading media info for '+video_format)
 -            video_url = self._search_regex(r'<host>([^<]+)', streamdata, 'video_url')
 -            video_play_path = self._search_regex(r'<file>([^<]+)', streamdata, 'video_play_path')
 +            streamdata = self._download_xml(
 +                streamdata_req, video_id,
 +                note='Downloading media info for %s' % video_format)
 +            video_url = streamdata.find('.//host').text
 +            video_play_path = streamdata.find('.//file').text
              formats.append({
                  'url': video_url,
 -                'play_path':   video_play_path,
 +                'play_path': video_play_path,
                  'ext': 'flv',
                  'format': video_format,
                  'format_id': video_format,
              'subtitles':   subtitles,
              'formats':     formats,
          }
+ class CrunchyrollShowPlaylistIE(InfoExtractor):
+     IE_NAME = "crunchyroll:playlist"
+     _VALID_URL = r'https?://(?:(?P<prefix>www|m)\.)?(?P<url>crunchyroll\.com/(?!(?:news|anime-news|library|forum|launchcalendar|lineup|store|comics|freetrial|login))(?P<show>[\w\-]+))/?$'
+     _TITLE_EXTR = r'<span\s+itemprop="name">\s*(?P<showtitle>[\w\s]+)'
+     _TESTS = [{
+         'url' : 'http://www.crunchyroll.com/attack-on-titan',
+         'info_dict' : {
+             'title' : 'Attack on Titan'
+         },
+         'playlist_count' : 15
+     }]
+     def _extract_title_entries(self,id,webpage):
+         _EPISODE_ID_EXTR = r'id="showview_videos_media_(?P<vidid>\d+)".*?href="/{0}/(?P<vidurl>[\w\-]+-(?P=vidid))"'.format(id)
+         title = self._html_search_regex(self._TITLE_EXTR,webpage,"title",flags=re.UNICODE|re.MULTILINE)
+         episode_urls = [self.url_result('http://www.crunchyroll.com/{0}/{1}'.format(id, showmatch[1])) for
+                     showmatch in re.findall(_EPISODE_ID_EXTR, webpage,re.UNICODE|re.MULTILINE|re.DOTALL)]
+         episode_urls.reverse()
+         return title, episode_urls
+     def _real_extract(self, url):
+         url_match = re.match(self._VALID_URL,url)
+         show_id = url_match.group('show')
+         webpage = self._download_webpage(url,show_id)
+         (title,entries) = self._extract_title_entries(show_id,webpage)
+         return {
+             '_type' : 'playlist',
+             'id' : show_id,
+             'title' : title,
+             'entries' : entries
+         }