Merge branch 'dcn' of github.com:remitamine/youtube-dl into remitamine-dcn
authorremitamine <remitamine@gmail.com>
Mon, 28 Dec 2015 09:38:31 +0000 (10:38 +0100)
committerremitamine <remitamine@gmail.com>
Mon, 28 Dec 2015 09:38:31 +0000 (10:38 +0100)
1  2 
youtube_dl/extractor/__init__.py
youtube_dl/extractor/dcn.py

index c1dbf9f2102f69bdeccf7919021984c34a07c449,abf36caf3f8dd67b5bb9dc112a7589b238ac69ef..971047ad4d27bdbde1c7f92cace36339da3c4177
@@@ -3,18 -3,13 +3,18 @@@ from __future__ import unicode_literal
  from .abc import ABCIE
  from .abc7news import Abc7NewsIE
  from .academicearth import AcademicEarthCourseIE
 +from .acast import (
 +    ACastIE,
 +    ACastChannelIE,
 +)
  from .addanime import AddAnimeIE
  from .adobetv import (
      AdobeTVIE,
 +    AdobeTVShowIE,
 +    AdobeTVChannelIE,
      AdobeTVVideoIE,
  )
  from .adultswim import AdultSwimIE
 -from .aftenposten import AftenpostenIE
  from .aftonbladet import AftonbladetIE
  from .airmozilla import AirMozillaIE
  from .aljazeera import AlJazeeraIE
@@@ -25,10 -20,7 +25,10 @@@ from .aol import AolI
  from .allocine import AllocineIE
  from .aparat import AparatIE
  from .appleconnect import AppleConnectIE
 -from .appletrailers import AppleTrailersIE
 +from .appletrailers import (
 +    AppleTrailersIE,
 +    AppleTrailersSectionIE,
 +)
  from .archiveorg import ArchiveOrgIE
  from .ard import (
      ARDIE,
@@@ -46,7 -38,6 +46,7 @@@ from .arte import 
  )
  from .atresplayer import AtresPlayerIE
  from .atttechchannel import ATTTechChannelIE
 +from .audimedia import AudiMediaIE
  from .audiomack import AudiomackIE, AudiomackAlbumIE
  from .azubu import AzubuIE
  from .baidu import BaiduVideoIE
@@@ -54,7 -45,6 +54,7 @@@ from .bambuser import BambuserIE, Bambu
  from .bandcamp import BandcampIE, BandcampAlbumIE
  from .bbc import (
      BBCCoUkIE,
 +    BBCCoUkArticleIE,
      BBCIE,
  )
  from .beeg import BeegIE
@@@ -63,19 -53,13 +63,19 @@@ from .beatportpro import BeatportProI
  from .bet import BetIE
  from .bild import BildIE
  from .bilibili import BiliBiliIE
 +from .bleacherreport import (
 +    BleacherReportIE,
 +    BleacherReportCMSIE,
 +)
  from .blinkx import BlinkxIE
 -from .bliptv import BlipTVIE, BlipTVUserIE
  from .bloomberg import BloombergIE
  from .bpb import BpbIE
  from .br import BRIE
  from .breakcom import BreakIE
 -from .brightcove import BrightcoveIE
 +from .brightcove import (
 +    BrightcoveLegacyIE,
 +    BrightcoveNewIE,
 +)
  from .buzzfeed import BuzzFeedIE
  from .byutv import BYUtvIE
  from .c56 import C56IE
@@@ -83,6 -67,7 +83,6 @@@ from .camdemy import 
      CamdemyIE,
      CamdemyFolderIE
  )
 -from .canal13cl import Canal13clIE
  from .canalplus import CanalplusIE
  from .canalc2 import Canalc2IE
  from .cbs import CBSIE
@@@ -91,7 -76,6 +91,7 @@@ from .cbssports import CBSSportsI
  from .ccc import CCCIE
  from .ceskatelevize import CeskaTelevizeIE
  from .channel9 import Channel9IE
 +from .chaturbate import ChaturbateIE
  from .chilloutzone import ChilloutzoneIE
  from .chirbit import (
      ChirbitIE,
@@@ -104,7 -88,6 +104,7 @@@ from .cliphunter import CliphunterI
  from .clipsyndicate import ClipsyndicateIE
  from .cloudy import CloudyIE
  from .clubic import ClubicIE
 +from .clyp import ClypIE
  from .cmt import CMTIE
  from .cnet import CNETIE
  from .cnn import (
@@@ -135,15 -118,18 +135,20 @@@ from .dailymotion import 
  )
  from .daum import DaumIE
  from .dbtv import DBTVIE
- from .dcn import DCNIE
+ from .dcn import (
+     DCNIE,
+     DCNVideoIE,
+     DCNLiveIE,
+     DCNSeasonIE,
+ )
  from .dctp import DctpTvIE
  from .deezer import DeezerPlaylistIE
 +from .democracynow import DemocracynowIE
  from .dfb import DFBIE
  from .dhm import DHMIE
  from .dotsub import DotsubIE
  from .douyutv import DouyuTVIE
 +from .dplay import DPlayIE
  from .dramafever import (
      DramaFeverIE,
      DramaFeverSeriesIE,
@@@ -157,6 -143,7 +162,6 @@@ from .dump import DumpI
  from .dumpert import DumpertIE
  from .defense import DefenseGouvFrIE
  from .discovery import DiscoveryIE
 -from .divxstage import DivxStageIE
  from .dropbox import DropboxIE
  from .eagleplatform import EaglePlatformIE
  from .ebaumsworld import EbaumsWorldIE
@@@ -177,7 -164,6 +182,7 @@@ from .eroprofile import EroProfileI
  from .escapist import EscapistIE
  from .espn import ESPNIE
  from .esri import EsriVideoIE
 +from .europa import EuropaIE
  from .everyonesmixtape import EveryonesMixtapeIE
  from .exfm import ExfmIE
  from .expotv import ExpoTVIE
@@@ -185,12 -171,14 +190,12 @@@ from .extremetube import ExtremeTubeI
  from .facebook import FacebookIE
  from .faz import FazIE
  from .fc2 import FC2IE
 +from .fczenit import FczenitIE
  from .firstpost import FirstpostIE
  from .firsttv import FirstTVIE
  from .fivemin import FiveMinIE
  from .fivetv import FiveTVIE
 -from .fktv import (
 -    FKTVIE,
 -    FKTVPosteckeIE,
 -)
 +from .fktv import FKTVIE
  from .flickr import FlickrIE
  from .folketinget import FolketingetIE
  from .footyroom import FootyRoomIE
@@@ -210,9 -198,7 +215,9 @@@ from .francetv import 
  from .freesound import FreesoundIE
  from .freespeech import FreespeechIE
  from .freevideo import FreeVideoIE
 +from .funimation import FunimationIE
  from .funnyordie import FunnyOrDieIE
 +from .gameinformer import GameInformerIE
  from .gamekings import GamekingsIE
  from .gameone import (
      GameOneIE,
@@@ -229,18 -215,14 +234,18 @@@ from .gfycat import GfycatI
  from .giantbomb import GiantBombIE
  from .giga import GigaIE
  from .glide import GlideIE
 -from .globo import GloboIE
 +from .globo import (
 +    GloboIE,
 +    GloboArticleIE,
 +)
  from .godtube import GodTubeIE
  from .goldenmoustache import GoldenMoustacheIE
  from .golem import GolemIE
 +from .googledrive import GoogleDriveIE
  from .googleplus import GooglePlusIE
  from .googlesearch import GoogleSearchIE
 -from .gorillavid import GorillaVidIE
  from .goshgay import GoshgayIE
 +from .gputechconf import GPUTechConfIE
  from .groupon import GrouponIE
  from .hark import HarkIE
  from .hearthisat import HearThisAtIE
@@@ -252,18 -234,14 +257,18 @@@ from .historicfilms import HistoricFilm
  from .history import HistoryIE
  from .hitbox import HitboxIE, HitboxLiveIE
  from .hornbunny import HornBunnyIE
 -from .hostingbulk import HostingBulkIE
  from .hotnewhiphop import HotNewHipHopIE
 +from .hotstar import HotStarIE
  from .howcast import HowcastIE
  from .howstuffworks import HowStuffWorksIE
  from .huffpost import HuffPostIE
  from .hypem import HypemIE
  from .iconosquare import IconosquareIE
 -from .ign import IGNIE, OneUPIE
 +from .ign import (
 +    IGNIE,
 +    OneUPIE,
 +    PCMagIE,
 +)
  from .imdb import (
      ImdbIE,
      ImdbListIE
@@@ -292,7 -270,6 +297,7 @@@ from .jadorecettepub import JadoreCette
  from .jeuxvideo import JeuxVideoIE
  from .jove import JoveIE
  from .jukebox import JukeboxIE
 +from .jwplatform import JWPlatformIE
  from .jpopsukitv import JpopsukiIE
  from .kaltura import KalturaIE
  from .kanalplay import KanalPlayIE
@@@ -327,11 -304,6 +332,11 @@@ from .lifenews import 
      LifeNewsIE,
      LifeEmbedIE,
  )
 +from .limelight import (
 +    LimelightMediaIE,
 +    LimelightChannelIE,
 +    LimelightChannelListIE,
 +)
  from .liveleak import LiveLeakIE
  from .livestream import (
      LivestreamIE,
@@@ -347,9 -319,9 +352,9 @@@ from .lynda import 
  from .m6 import M6IE
  from .macgamestore import MacGameStoreIE
  from .mailru import MailRuIE
 +from .makertv import MakerTVIE
  from .malemotion import MalemotionIE
  from .mdr import MDRIE
 -from .megavideoz import MegaVideozIE
  from .metacafe import MetacafeIE
  from .metacritic import MetacriticIE
  from .mgoon import MgoonIE
@@@ -371,6 -343,7 +376,6 @@@ from .motherless import MotherlessI
  from .motorsport import MotorsportIE
  from .movieclips import MovieClipsIE
  from .moviezine import MoviezineIE
 -from .movshare import MovShareIE
  from .mtv import (
      MTVIE,
      MTVServicesEmbeddedIE,
  )
  from .muenchentv import MuenchenTVIE
  from .musicplayon import MusicPlayOnIE
 -from .musicvault import MusicVaultIE
  from .muzu import MuzuTVIE
  from .mwave import MwaveIE
  from .myspace import MySpaceIE, MySpaceAlbumIE
@@@ -399,9 -373,6 +404,9 @@@ from .nbc import 
  from .ndr import (
      NDRIE,
      NJoyIE,
 +    NDREmbedBaseIE,
 +    NDREmbedIE,
 +    NJoyEmbedIE,
  )
  from .ndtv import NDTVIE
  from .netzkino import NetzkinoIE
@@@ -436,22 -407,10 +441,22 @@@ from .noco import NocoI
  from .normalboots import NormalbootsIE
  from .nosvideo import NosVideoIE
  from .nova import NovaIE
 -from .novamov import NovaMovIE
 -from .nowness import NownessIE
 -from .nowtv import NowTVIE
 -from .nowvideo import NowVideoIE
 +from .novamov import (
 +    NovaMovIE,
 +    WholeCloudIE,
 +    NowVideoIE,
 +    VideoWeedIE,
 +    CloudTimeIE,
 +)
 +from .nowness import (
 +    NownessIE,
 +    NownessPlaylistIE,
 +    NownessSeriesIE,
 +)
 +from .nowtv import (
 +    NowTVIE,
 +    NowTVListIE,
 +)
  from .npo import (
      NPOIE,
      NPOLiveIE,
@@@ -479,6 -438,7 +484,6 @@@ from .ooyala import 
      OoyalaIE,
      OoyalaExternalIE,
  )
 -from .openfilm import OpenFilmIE
  from .orf import (
      ORFTVthekIE,
      ORFOE1IE,
  from .parliamentliveuk import ParliamentLiveUKIE
  from .patreon import PatreonIE
  from .pbs import PBSIE
 -from .periscope import (
 -    PeriscopeIE,
 -    QuickscopeIE,
 -)
 +from .periscope import PeriscopeIE
  from .philharmoniedeparis import PhilharmonieDeParisIE
  from .phoenix import PhoenixIE
  from .photobucket import PhotobucketIE
@@@ -532,10 -495,7 +537,10 @@@ from .radiode import RadioDeI
  from .radiojavan import RadioJavanIE
  from .radiobremen import RadioBremenIE
  from .radiofrance import RadioFranceIE
 -from .rai import RaiIE
 +from .rai import (
 +    RaiTVIE,
 +    RaiIE,
 +)
  from .rbmaradio import RBMARadioIE
  from .rds import RDSIE
  from .redtube import RedTubeIE
@@@ -583,10 -543,6 +588,10 @@@ from .shahid import ShahidI
  from .shared import SharedIE
  from .sharesix import ShareSixIE
  from .sina import SinaIE
 +from .skynewsarabia import (
 +    SkyNewsArabiaIE,
 +    SkyNewsArabiaArticleIE,
 +)
  from .slideshare import SlideshareIE
  from .slutload import SlutloadIE
  from .smotri import (
@@@ -601,12 -557,15 +606,12 @@@ from .snagfilms import 
  )
  from .snotr import SnotrIE
  from .sohu import SohuIE
 -from .soompi import (
 -    SoompiIE,
 -    SoompiShowIE,
 -)
  from .soundcloud import (
      SoundcloudIE,
      SoundcloudSetIE,
      SoundcloudUserIE,
 -    SoundcloudPlaylistIE
 +    SoundcloudPlaylistIE,
 +    SoundcloudSearchIE
  )
  from .soundgasm import (
      SoundgasmIE,
@@@ -625,7 -584,6 +630,7 @@@ from .spankwire import SpankwireI
  from .spiegel import SpiegelIE, SpiegelArticleIE
  from .spiegeltv import SpiegeltvIE
  from .spike import SpikeIE
 +from .stitcher import StitcherIE
  from .sport5 import Sport5IE
  from .sportbox import (
      SportBoxIE,
@@@ -659,7 -617,6 +664,7 @@@ from .teachingchannel import TeachingCh
  from .teamcoco import TeamcocoIE
  from .techtalks import TechTalksIE
  from .ted import TEDIE
 +from .tele13 import Tele13IE
  from .telebruxelles import TeleBruxellesIE
  from .telecinco import TelecincoIE
  from .telegraaf import TelegraafIE
@@@ -669,7 -626,6 +674,7 @@@ from .tenplay import TenPlayI
  from .testurl import TestURLIE
  from .testtube import TestTubeIE
  from .tf1 import TF1IE
 +from .theintercept import TheInterceptIE
  from .theonion import TheOnionIE
  from .theplatform import (
      ThePlatformIE,
@@@ -689,7 -645,6 +694,7 @@@ from .tnaflix import 
      EMPFlixIE,
      MovieFapIE,
  )
 +from .toggle import ToggleIE
  from .thvideo import (
      THVideoIE,
      THVideoPlaylistIE
@@@ -703,13 -658,7 +708,13 @@@ from .tube8 import Tube8I
  from .tubitv import TubiTvIE
  from .tudou import TudouIE
  from .tumblr import TumblrIE
 -from .tunein import TuneInIE
 +from .tunein import (
 +    TuneInClipIE,
 +    TuneInStationIE,
 +    TuneInProgramIE,
 +    TuneInTopicIE,
 +    TuneInShortenerIE,
 +)
  from .turbo import TurboIE
  from .tutv import TutvIE
  from .tv2 import (
@@@ -739,7 -688,7 +744,7 @@@ from .twitch import 
      TwitchBookmarksIE,
      TwitchStreamIE,
  )
 -from .twitter import TwitterCardIE
 +from .twitter import TwitterCardIE, TwitterIE
  from .ubu import UbuIE
  from .udemy import (
      UdemyIE,
@@@ -766,15 -715,16 +771,15 @@@ from .vh1 import VH1I
  from .vice import ViceIE
  from .viddler import ViddlerIE
  from .videodetective import VideoDetectiveIE
 -from .videolecturesnet import VideoLecturesNetIE
  from .videofyme import VideofyMeIE
  from .videomega import VideoMegaIE
  from .videopremium import VideoPremiumIE
  from .videott import VideoTtIE
 -from .videoweed import VideoWeedIE
  from .vidme import VidmeIE
  from .vidzi import VidziIE
  from .vier import VierIE, VierVideosIE
  from .viewster import ViewsterIE
 +from .viidea import ViideaIE
  from .vimeo import (
      VimeoIE,
      VimeoAlbumIE,
@@@ -798,7 -748,6 +803,7 @@@ from .vk import 
      VKIE,
      VKUserVideosIE,
  )
 +from .vlive import VLiveIE
  from .vodlocker import VodlockerIE
  from .voicerepublic import VoiceRepublicIE
  from .vporn import VpornIE
@@@ -827,7 -776,6 +832,7 @@@ from .wrzuta import WrzutaI
  from .wsj import WSJIE
  from .xbef import XBefIE
  from .xboxclips import XboxClipsIE
 +from .xfileshare import XFileShareIE
  from .xhamster import (
      XHamsterIE,
      XHamsterEmbedIE,
@@@ -871,7 -819,6 +876,7 @@@ from .youtube import 
      YoutubeTruncatedIDIE,
      YoutubeTruncatedURLIE,
      YoutubeUserIE,
 +    YoutubePlaylistsIE,
      YoutubeWatchLaterIE,
  )
  from .zapiks import ZapiksIE
index 9737cff14b86849a7a4b4bd838902a4d71278c93,d9485cd8677f296070e6b80859ff91da4267b389..0d140f12fd8ea81d1c486f470bd4f83a2edf82d9
@@@ -1,26 -1,91 +1,89 @@@
  # coding: utf-8
  from __future__ import unicode_literals
  
+ import re
+ import base64
  from .common import InfoExtractor
 -from ..compat import (
 -    compat_urllib_parse,
 -    compat_urllib_request,
 -)
 +from ..compat import compat_urllib_parse
  from ..utils import (
      int_or_none,
      parse_iso8601,
 +    sanitized_Request,
+     smuggle_url,
+     unsmuggle_url,
  )
  
  
  class DCNIE(InfoExtractor):
-     _VALID_URL = r'https?://(?:www\.)?dcndigital\.ae/(?:#/)?(?:video/.+|show/\d+/.+?)/(?P<id>\d+)'
+     _VALID_URL = r'https?://(?:www\.)?dcndigital\.ae/(?:#/)?show/(?P<show_id>\d+)/[^/]+(?:/(?P<video_id>\d+)/(?P<season_id>\d+))?'
+     def _real_extract(self, url):
+         show_id, video_id, season_id = re.match(self._VALID_URL, url).groups()
+         if video_id and int(video_id) > 0:
+             return self.url_result(
+                 'http://www.dcndigital.ae/media/%s' % video_id, 'DCNVideo')
+         elif season_id and int(season_id) > 0:
+             return self.url_result(smuggle_url(
+                 'http://www.dcndigital.ae/program/season/%s' % season_id,
+                 {'show_id': show_id}), 'DCNSeason')
+         else:
+             return self.url_result(
+                 'http://www.dcndigital.ae/program/%s' % show_id, 'DCNSeason')
+ class DCNBaseIE(InfoExtractor):
+     def _extract_video_info(self, video_data, video_id, is_live):
+         title = video_data.get('title_en') or video_data['title_ar']
+         img = video_data.get('img')
+         thumbnail = 'http://admin.mangomolo.com/analytics/%s' % img if img else None
+         duration = int_or_none(video_data.get('duration'))
+         description = video_data.get('description_en') or video_data.get('description_ar')
+         timestamp = parse_iso8601(video_data.get('create_time'), ' ')
+         return {
+             'id': video_id,
+             'title': self._live_title(title) if is_live else title,
+             'description': description,
+             'thumbnail': thumbnail,
+             'duration': duration,
+             'timestamp': timestamp,
+             'is_live': is_live,
+         }
+     def _extract_video_formats(self, webpage, video_id, entry_protocol):
+         formats = []
+         m3u8_url = self._html_search_regex(
+             r'file\s*:\s*"([^"]+)', webpage, 'm3u8 url', fatal=False)
+         if m3u8_url:
+             m3u8_formats = self._extract_m3u8_formats(
+                 m3u8_url, video_id, 'mp4', entry_protocol, m3u8_id='hls', fatal=None)
+             if m3u8_formats:
+                 formats.extend(m3u8_formats)
+         rtsp_url = self._search_regex(
+             r'<a[^>]+href="(rtsp://[^"]+)"', webpage, 'rtsp url', fatal=False)
+         if rtsp_url:
+             formats.append({
+                 'url': rtsp_url,
+                 'format_id': 'rtsp',
+             })
+         self._sort_formats(formats)
+         return formats
+ class DCNVideoIE(DCNBaseIE):
+     IE_NAME = 'dcn:video'
+     _VALID_URL = r'https?://(?:www\.)?dcndigital\.ae/(?:#/)?(?:video/[^/]+|media|catchup/[^/]+/[^/]+)/(?P<id>\d+)'
      _TEST = {
-         'url': 'http://www.dcndigital.ae/#/show/199074/%D8%B1%D8%AD%D9%84%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D8%B1-%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-1/17375/6887',
+         'url': 'http://www.dcndigital.ae/#/video/%D8%B1%D8%AD%D9%84%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D8%B1-%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-1/17375',
          'info_dict':
          {
              'id': '17375',
              'ext': 'mp4',
              'title': 'رحلة العمر : الحلقة 1',
              'description': 'md5:0156e935d870acb8ef0a66d24070c6d6',
-             'thumbnail': 're:^https?://.*\.jpg$',
              'duration': 2041,
              'timestamp': 1227504126,
              'upload_date': '20081124',
      def _real_extract(self, url):
          video_id = self._match_id(url)
  
 -        request = compat_urllib_request.Request(
 +        request = sanitized_Request(
              'http://admin.mangomolo.com/analytics/index.php/plus/video?id=%s' % video_id,
              headers={'Origin': 'http://www.dcndigital.ae'})
-         video = self._download_json(request, video_id)
-         title = video.get('title_en') or video['title_ar']
+         video_data = self._download_json(request, video_id)
+         info = self._extract_video_info(video_data, video_id, False)
  
          webpage = self._download_webpage(
              'http://admin.mangomolo.com/analytics/index.php/customers/embed/video?' +
              compat_urllib_parse.urlencode({
-                 'id': video['id'],
-                 'user_id': video['user_id'],
-                 'signature': video['signature'],
+                 'id': video_data['id'],
+                 'user_id': video_data['user_id'],
+                 'signature': video_data['signature'],
                  'countries': 'Q0M=',
                  'filter': 'DENY',
              }), video_id)
+         info['formats'] = self._extract_video_formats(webpage, video_id, 'm3u8_native')
+         return info
  
-         m3u8_url = self._html_search_regex(r'file:\s*"([^"]+)', webpage, 'm3u8 url')
-         formats = self._extract_m3u8_formats(
-             m3u8_url, video_id, 'mp4', entry_protocol='m3u8_native', m3u8_id='hls')
  
-         rtsp_url = self._search_regex(
-             r'<a[^>]+href="(rtsp://[^"]+)"', webpage, 'rtsp url', fatal=False)
-         if rtsp_url:
-             formats.append({
-                 'url': rtsp_url,
-                 'format_id': 'rtsp',
+ class DCNLiveIE(DCNBaseIE):
+     IE_NAME = 'dcn:live'
+     _VALID_URL = r'https?://(?:www\.)?dcndigital\.ae/(?:#/)?live/(?P<id>\d+)'
+     def _real_extract(self, url):
+         channel_id = self._match_id(url)
 -        request = compat_urllib_request.Request(
++        request = sanitized_Request(
+             'http://admin.mangomolo.com/analytics/index.php/plus/getchanneldetails?channel_id=%s' % channel_id,
+             headers={'Origin': 'http://www.dcndigital.ae'})
+         channel_data = self._download_json(request, channel_id)
+         info = self._extract_video_info(channel_data, channel_id, True)
+         webpage = self._download_webpage(
+             'http://admin.mangomolo.com/analytics/index.php/customers/embed/index?' +
+             compat_urllib_parse.urlencode({
+                 'id': base64.b64encode(channel_data['user_id'].encode()).decode(),
+                 'channelid': base64.b64encode(channel_data['id'].encode()).decode(),
+                 'signature': channel_data['signature'],
+                 'countries': 'Q0M=',
+                 'filter': 'DENY',
+             }), channel_id)
+         info['formats'] = self._extract_video_formats(webpage, channel_id, 'm3u8')
+         return info
+ class DCNSeasonIE(InfoExtractor):
+     IE_NAME = 'dcn:season'
+     _VALID_URL = r'https?://(?:www\.)?dcndigital\.ae/(?:#/)?program/(?:(?P<show_id>\d+)|season/(?P<season_id>\d+))'
+     _TEST = {
+         'url': 'http://dcndigital.ae/#/program/205024/%D9%85%D8%AD%D8%A7%D8%B6%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D9%8A%D8%AE-%D8%A7%D9%84%D8%B4%D8%B9%D8%B1%D8%A7%D9%88%D9%8A',
+         'info_dict':
+         {
+             'id': '7910',
+             'title': 'محاضرات الشيخ الشعراوي',
+         },
+         'playlist_mincount': 27,
+     }
+     def _real_extract(self, url):
+         url, smuggled_data = unsmuggle_url(url, {})
+         show_id, season_id = re.match(self._VALID_URL, url).groups()
+         data = {}
+         if season_id:
+             data['season'] = season_id
+             show_id = smuggled_data.get('show_id')
+             if show_id is None:
 -                request = compat_urllib_request.Request(
++                request = sanitized_Request(
+                     'http://admin.mangomolo.com/analytics/index.php/plus/season_info?id=%s' % season_id,
+                     headers={'Origin': 'http://www.dcndigital.ae'})
+                 season = self._download_json(request, season_id)
+                 show_id = season['id']
+         data['show_id'] = show_id
 -        request = compat_urllib_request.Request(
++        request = sanitized_Request(
+             'http://admin.mangomolo.com/analytics/index.php/plus/show',
+             compat_urllib_parse.urlencode(data),
+             {
+                 'Origin': 'http://www.dcndigital.ae',
+                 'Content-Type': 'application/x-www-form-urlencoded'
              })
  
-         self._sort_formats(formats)
+         show = self._download_json(request, show_id)
+         if not season_id:
+             season_id = show['default_season']
+         for season in show['seasons']:
+             if season['id'] == season_id:
+                 title = season.get('title_en') or season['title_ar']
  
-         img = video.get('img')
-         thumbnail = 'http://admin.mangomolo.com/analytics/%s' % img if img else None
-         duration = int_or_none(video.get('duration'))
-         description = video.get('description_en') or video.get('description_ar')
-         timestamp = parse_iso8601(video.get('create_time') or video.get('update_time'), ' ')
+                 entries = []
+                 for video in show['videos']:
+                     entries.append(self.url_result(
+                         'http://www.dcndigital.ae/media/%s' % video['id'], 'DCNVideo'))
  
-         return {
-             'id': video_id,
-             'title': title,
-             'description': description,
-             'thumbnail': thumbnail,
-             'duration': duration,
-             'timestamp': timestamp,
-             'formats': formats,
-         }
+                 return self.playlist_result(entries, season_id, title)