Merge branch 'jukebox' of https://github.com/remitamine/youtube-dl into remitamine...
authorremitamine <remitamine@gmail.com>
Tue, 29 Dec 2015 16:29:55 +0000 (17:29 +0100)
committerremitamine <remitamine@gmail.com>
Tue, 29 Dec 2015 16:31:18 +0000 (17:31 +0100)
1  2 
youtube_dl/extractor/__init__.py
youtube_dl/extractor/generic.py

index e46d73ed7774f6f1a2ddc6acc9f2dace3ffb5478,1813c7e1b1346302ac4e215e6687935a61f0b297..75d191d5dd695d00b3ba816e03b05037a595ff58
@@@ -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 (
@@@ -133,25 -116,15 +133,25 @@@ from .dailymotion import 
      DailymotionUserIE,
      DailymotionCloudIE,
  )
 -from .daum import DaumIE
 +from .daum import (
 +    DaumIE,
 +    DaumClipIE,
 +)
  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,
@@@ -185,7 -158,6 +185,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
@@@ -193,12 -165,14 +193,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
@@@ -206,10 -180,7 +206,10 @@@ from .fourtube import FourTubeI
  from .foxgay import FoxgayIE
  from .foxnews import FoxNewsIE
  from .foxsports import FoxSportsIE
 -from .franceculture import FranceCultureIE
 +from .franceculture import (
 +    FranceCultureIE,
 +    FranceCultureEmissionIE,
 +)
  from .franceinter import FranceInterIE
  from .francetv import (
      PluzzIE,
  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,
@@@ -240,18 -209,14 +240,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
@@@ -264,17 -229,12 +264,17 @@@ from .history import HistoryI
  from .hitbox import HitboxIE, HitboxLiveIE
  from .hornbunny import HornBunnyIE
  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
@@@ -302,8 -262,6 +302,7 @@@ from .izlesene import IzleseneI
  from .jadorecettepub import JadoreCettePubIE
  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
@@@ -338,11 -296,6 +337,11 @@@ from .lifenews import 
      LifeNewsIE,
      LifeEmbedIE,
  )
 +from .limelight import (
 +    LimelightMediaIE,
 +    LimelightChannelIE,
 +    LimelightChannelListIE,
 +)
  from .liveleak import LiveLeakIE
  from .livestream import (
      LivestreamIE,
@@@ -358,9 -311,9 +357,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
@@@ -382,6 -335,7 +381,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,
@@@ -447,22 -401,14 +446,22 @@@ from .noco import NocoI
  from .normalboots import NormalbootsIE
  from .nosvideo import NosVideoIE
  from .nova import NovaIE
 -from .novamov import NovaMovIE
 +from .novamov import (
 +    NovaMovIE,
 +    WholeCloudIE,
 +    NowVideoIE,
 +    VideoWeedIE,
 +    CloudTimeIE,
 +)
  from .nowness import (
      NownessIE,
      NownessPlaylistIE,
      NownessSeriesIE,
  )
 -from .nowtv import NowTVIE
 -from .nowvideo import NowVideoIE
 +from .nowtv import (
 +    NowTVIE,
 +    NowTVListIE,
 +)
  from .npo import (
      NPOIE,
      NPOLiveIE,
@@@ -499,7 -445,10 +498,7 @@@ from .orf import 
  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
@@@ -543,10 -492,7 +542,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
@@@ -594,10 -540,6 +593,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 (
@@@ -612,12 -554,15 +611,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,
@@@ -636,17 -581,13 +635,17 @@@ 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,
      SportBoxEmbedIE,
  )
  from .sportdeutschland import SportDeutschlandIE
 -from .srf import SrfIE
 +from .srgssr import (
 +    SRGSSRIE,
 +    SRGSSRPlayIE,
 +)
  from .srmediathek import SRMediathekIE
  from .ssa import SSAIE
  from .stanfordoc import StanfordOpenClassroomIE
@@@ -673,7 -614,6 +672,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
@@@ -683,7 -623,6 +682,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,
@@@ -703,7 -642,6 +702,7 @@@ from .tnaflix import 
      EMPFlixIE,
      MovieFapIE,
  )
 +from .toggle import ToggleIE
  from .thvideo import (
      THVideoIE,
      THVideoPlaylistIE
@@@ -717,13 -655,7 +716,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 (
@@@ -753,7 -685,7 +752,7 @@@ from .twitch import 
      TwitchBookmarksIE,
      TwitchStreamIE,
  )
 -from .twitter import TwitterCardIE
 +from .twitter import TwitterCardIE, TwitterIE
  from .ubu import UbuIE
  from .udemy import (
      UdemyIE,
@@@ -780,15 -712,16 +779,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,
@@@ -841,7 -774,6 +840,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,
@@@ -885,7 -817,6 +884,7 @@@ from .youtube import 
      YoutubeTruncatedIDIE,
      YoutubeTruncatedURLIE,
      YoutubeUserIE,
 +    YoutubePlaylistsIE,
      YoutubeWatchLaterIE,
  )
  from .zapiks import ZapiksIE
index 3c3066e38c5efb4734e1c564be38424d4bd4e004,4d1f75e6397ed4e617f30223e26e17284ee0c354..70a8d8eb9fdf1ad1dd90c031945f49ba9bcdf542
@@@ -9,8 -9,8 +9,8 @@@ import sy
  from .common import InfoExtractor
  from .youtube import YoutubeIE
  from ..compat import (
 +    compat_etree_fromstring,
      compat_urllib_parse_unquote,
 -    compat_urllib_request,
      compat_urlparse,
      compat_xml_parse_error,
  )
@@@ -21,7 -21,7 +21,7 @@@ from ..utils import 
      HEADRequest,
      is_html,
      orderedSet,
 -    parse_xml,
 +    sanitized_Request,
      smuggle_url,
      unescapeHTML,
      unified_strdate,
      url_basename,
      xpath_text,
  )
 -from .brightcove import BrightcoveIE
 +from .brightcove import (
 +    BrightcoveLegacyIE,
 +    BrightcoveNewIE,
 +)
  from .nbc import NBCSportsVPlayerIE
  from .ooyala import OoyalaIE
  from .rutv import RUTVIE
@@@ -44,6 -41,7 +44,6 @@@ from .myvi import MyviI
  from .condenast import CondeNastIE
  from .udn import UDNEmbedIE
  from .senateisvp import SenateISVPIE
 -from .bliptv import BlipTVIE
  from .svt import SVTIE
  from .pornhub import PornHubIE
  from .xhamster import XHamsterEmbedIE
@@@ -52,10 -50,7 +52,11 @@@ from .dailymotion import DailymotionClo
  from .onionstudios import OnionStudiosIE
  from .snagfilms import SnagFilmsEmbedIE
  from .screenwavemedia import ScreenwaveMediaIE
 +from .mtv import MTVServicesEmbeddedIE
 +from .pladform import PladformIE
 +from .googledrive import GoogleDriveIE
 +from .jwplatform import JWPlatformIE
+ from .ultimedia import UltimediaIE
  
  
  class GenericIE(InfoExtractor):
                  'ext': 'mp4',
                  'title': 'Automatics, robotics and biocybernetics',
                  'description': 'md5:815fc1deb6b3a2bff99de2d5325be482',
 +                'upload_date': '20130627',
                  'formats': 'mincount:16',
                  'subtitles': 'mincount:1',
              },
          # it also tests brightcove videos that need to set the 'Referer' in the
          # http requests
          {
 -            'add_ie': ['Brightcove'],
 +            'add_ie': ['BrightcoveLegacy'],
              'url': 'http://www.bfmtv.com/video/bfmbusiness/cours-bourse/cours-bourse-l-analyse-technique-154522/',
              'info_dict': {
                  'id': '2765128793001',
                  'uploader': 'thestar.com',
                  'description': 'Mississauga resident David Farmer is still out of power as a result of the ice storm a month ago. To keep the house warm, Farmer cuts wood from his property for a wood burning stove downstairs.',
              },
 -            'add_ie': ['Brightcove'],
 +            'add_ie': ['BrightcoveLegacy'],
          },
          {
              'url': 'http://www.championat.com/video/football/v/87/87499.html',
          },
          {
              # https://github.com/rg3/youtube-dl/issues/3541
 -            'add_ie': ['Brightcove'],
 +            'add_ie': ['BrightcoveLegacy'],
              'url': 'http://www.kijk.nl/sbs6/leermijvrouwenkennen/videos/jqMiXKAYan2S/aflevering-1',
              'info_dict': {
                  'id': '3866516442001',
                  'id': 'BwY2RxaTrTkslxOfcan0UCf0YqyvWysJ',
                  'ext': 'mp4',
                  'title': '2cc213299525360.mov',  # that's what we get
 +                'duration': 238.231,
              },
              'add_ie': ['Ooyala'],
          },
                  'ext': 'mp4',
                  'title': '"Steve Jobs: Man in the Machine" trailer',
                  'description': 'The first trailer for the Alex Gibney documentary "Steve Jobs: Man in the Machine."',
 +                'duration': 135.427,
              },
              'params': {
                  'skip_download': True,
                  'title': 'Os Guinness // Is It Fools Talk? // Unbelievable? Conference 2014',
              },
          },
 +        # Kaltura embed protected with referrer
 +        {
 +            'url': 'http://www.disney.nl/disney-channel/filmpjes/achter-de-schermen#/videoId/violetta-achter-de-schermen-ruggero',
 +            'info_dict': {
 +                'id': '1_g4fbemnq',
 +                'ext': 'mp4',
 +                'title': 'Violetta - Achter De Schermen - Ruggero',
 +                'description': 'Achter de schermen met Ruggero',
 +                'timestamp': 1435133761,
 +                'upload_date': '20150624',
 +                'uploader_id': 'echojecka',
 +            },
 +        },
          # Eagle.Platform embed (generic URL)
          {
              'url': 'http://lenta.ru/news/2015/03/06/navalny/',
              'info_dict': {
                  'id': '50YnY4czr4ms1vJ7yz3xzq0excz_pUMs',
                  'ext': 'mp4',
 -                'description': 'VIDEO: Index/Match versus VLOOKUP.',
 +                'description': 'VIDEO: INDEX/MATCH versus VLOOKUP.',
                  'title': 'This is what separates the Excel masters from the wannabes',
 +                'duration': 191.933,
              },
              'params': {
                  # m3u8 downloads
                  'title': 'cinemasnob',
              },
          },
 -        # Ultimedia embed
 +        # BrightcoveInPageEmbed embed
 +        {
 +            'url': 'http://www.geekandsundry.com/tabletop-bonus-wils-final-thoughts-on-dread/',
 +            'info_dict': {
 +                'id': '4238694884001',
 +                'ext': 'flv',
 +                'title': 'Tabletop: Dread, Last Thoughts',
 +                'description': 'Tabletop: Dread, Last Thoughts',
 +                'duration': 51690,
 +            },
 +        },
 +        # JWPlayer with M3U8
          {
 -            'url': 'http://www.jukebox.es/kosheen/videoclip,pride,r303r.html',
 -            'md5': '25551df6e7c7ab8096ceeeae048c5f64',
 +            'url': 'http://ren.tv/novosti/2015-09-25/sluchaynyy-prohozhiy-poymal-avtougonshchika-v-murmanske-video',
              'info_dict': {
 -                'id': 'r303r',
 +                'id': 'playlist',
                  'ext': 'mp4',
 -                'title': 'Kosheen - Pride (live)',
 -                'thumbnail': 're:^https?://.*\.jpg',
 -                'duration': 293,
 -                'upload_date': '20081103',
 -                'timestamp': 1225733392,
 -                'uploader_id': '33m03',
 +                'title': 'Случайный прохожий поймал автоугонщика в Мурманске. ВИДЕО | РЕН ТВ',
 +                'uploader': 'ren.tv',
              },
 +            'params': {
 +                # m3u8 downloads
 +                'skip_download': True,
 +            }
          }
      ]
  
  
          full_response = None
          if head_response is False:
 -            request = compat_urllib_request.Request(url)
 +            request = sanitized_Request(url)
              request.add_header('Accept-Encoding', '*')
              full_response = self._request_webpage(request, video_id)
              head_response = full_response
                  '%s on generic information extractor.' % ('Forcing' if force else 'Falling back'))
  
          if not full_response:
 -            request = compat_urllib_request.Request(url)
 +            request = sanitized_Request(url)
              # Some webservers may serve compressed content of rather big size (e.g. gzipped flac)
              # making it impossible to download only chunk of the file (yet we need only 512kB to
              # test whether it's HTML or not). According to youtube-dl default Accept-Encoding
  
          # Is it an RSS feed, a SMIL file or a XSPF playlist?
          try:
 -            doc = parse_xml(webpage)
 +            doc = compat_etree_fromstring(webpage.encode('utf-8'))
              if doc.tag == 'rss':
                  return self._extract_rss(url, video_id, doc)
              elif re.match(r'^(?:{[^}]+})?smil$', doc.tag):
              return self.playlist_result(
                  urlrs, playlist_id=video_id, playlist_title=video_title)
  
 -        # Look for BrightCove:
 -        bc_urls = BrightcoveIE._extract_brightcove_urls(webpage)
 +        # Look for Brightcove Legacy Studio embeds
 +        bc_urls = BrightcoveLegacyIE._extract_brightcove_urls(webpage)
          if bc_urls:
              self.to_screen('Brightcove video detected.')
              entries = [{
                  '_type': 'url',
                  'url': smuggle_url(bc_url, {'Referer': url}),
 -                'ie_key': 'Brightcove'
 +                'ie_key': 'BrightcoveLegacy'
              } for bc_url in bc_urls]
  
              return {
                  'entries': entries,
              }
  
 +        # Look for Brightcove New Studio embeds
 +        bc_urls = BrightcoveNewIE._extract_urls(webpage)
 +        if bc_urls:
 +            return _playlist_from_matches(bc_urls, ie='BrightcoveNew')
 +
          # Look for embedded rtl.nl player
          matches = re.findall(
              r'<iframe[^>]+?src="((?:https?:)?//(?:www\.)?rtl\.nl/system/videoplayer/[^"]+(?:video_)?embed[^"]+)"',
                  'id': match.group('id')
              }
  
 -        # Look for embedded blip.tv player
 -        bliptv_url = BlipTVIE._extract_url(webpage)
 -        if bliptv_url:
 -            return self.url_result(bliptv_url, 'BlipTV')
 -
          # Look for SVT player
          svt_url = SVTIE._extract_url(webpage)
          if svt_url:
                  re.search(r'SBN\.VideoLinkset\.ooyala\([\'"](?P<ec>.{32})[\'"]\)', webpage) or
                  re.search(r'data-ooyala-video-id\s*=\s*[\'"](?P<ec>.{32})[\'"]', webpage))
          if mobj is not None:
 -            return OoyalaIE._build_url_result(mobj.group('ec'))
 +            return OoyalaIE._build_url_result(smuggle_url(mobj.group('ec'), {'domain': url}))
  
          # Look for multiple Ooyala embeds on SBN network websites
          mobj = re.search(r'SBN\.VideoLinkset\.entryGroup\((\[.*?\])', webpage)
              embeds = self._parse_json(mobj.group(1), video_id, fatal=False)
              if embeds:
                  return _playlist_from_matches(
 -                    embeds, getter=lambda v: OoyalaIE._url_for_embed_code(v['provider_video_id']), ie='Ooyala')
 +                    embeds, getter=lambda v: OoyalaIE._url_for_embed_code(smuggle_url(v['provider_video_id'], {'domain': url})), ie='Ooyala')
  
          # Look for Aparat videos
          mobj = re.search(r'<iframe .*?src="(http://www\.aparat\.com/video/[^"]+)"', webpage)
              return self.url_result(url, ie='Vulture')
  
          # Look for embedded mtvservices player
 -        mobj = re.search(
 -            r'<iframe src="(?P<url>https?://media\.mtvnservices\.com/embed/[^"]+)"',
 -            webpage)
 -        if mobj is not None:
 -            url = unescapeHTML(mobj.group('url'))
 -            return self.url_result(url, ie='MTVServicesEmbedded')
 +        mtvservices_url = MTVServicesEmbeddedIE._extract_url(webpage)
 +        if mtvservices_url:
 +            return self.url_result(mtvservices_url, ie='MTVServicesEmbedded')
  
          # Look for embedded yahoo player
          mobj = re.search(
              return self.url_result(mobj.group('url'), 'MLB')
  
          mobj = re.search(
 -            r'<iframe[^>]+?src=(["\'])(?P<url>%s)\1' % CondeNastIE.EMBED_URL,
 +            r'<(?:iframe|script)[^>]+?src=(["\'])(?P<url>%s)\1' % CondeNastIE.EMBED_URL,
              webpage)
          if mobj is not None:
              return self.url_result(self._proto_relative_url(mobj.group('url'), scheme='http:'), 'CondeNast')
              return self.url_result(mobj.group('url'), 'Zapiks')
  
          # Look for Kaltura embeds
 -        mobj = (re.search(r"(?s)kWidget\.(?:thumb)?[Ee]mbed\(\{.*?'wid'\s*:\s*'_?(?P<partner_id>[^']+)',.*?'entry_id'\s*:\s*'(?P<id>[^']+)',", webpage) or
 -                re.search(r'(?s)(["\'])(?:https?:)?//cdnapisec\.kaltura\.com/.*?(?:p|partner_id)/(?P<partner_id>\d+).*?\1.*?entry_id\s*:\s*(["\'])(?P<id>[^\2]+?)\2', webpage))
 +        mobj = (re.search(r"(?s)kWidget\.(?:thumb)?[Ee]mbed\(\{.*?'wid'\s*:\s*'_?(?P<partner_id>[^']+)',.*?'entry_?[Ii]d'\s*:\s*'(?P<id>[^']+)',", webpage) or
 +                re.search(r'(?s)(?P<q1>["\'])(?:https?:)?//cdnapi(?:sec)?\.kaltura\.com/.*?(?:p|partner_id)/(?P<partner_id>\d+).*?(?P=q1).*?entry_?[Ii]d\s*:\s*(?P<q2>["\'])(?P<id>.+?)(?P=q2)', webpage))
          if mobj is not None:
 -            return self.url_result('kaltura:%(partner_id)s:%(id)s' % mobj.groupdict(), 'Kaltura')
 +            return self.url_result(smuggle_url(
 +                'kaltura:%(partner_id)s:%(id)s' % mobj.groupdict(),
 +                {'source_url': url}), 'Kaltura')
  
          # Look for Eagle.Platform embeds
          mobj = re.search(
              return self.url_result('eagleplatform:%(host)s:%(id)s' % mobj.groupdict(), 'EaglePlatform')
  
          # Look for Pladform embeds
 -        mobj = re.search(
 -            r'<iframe[^>]+src="(?P<url>https?://out\.pladform\.ru/player\?.+?)"', webpage)
 -        if mobj is not None:
 -            return self.url_result(mobj.group('url'), 'Pladform')
 +        pladform_url = PladformIE._extract_url(webpage)
 +        if pladform_url:
 +            return self.url_result(pladform_url)
  
          # Look for Playwire embeds
          mobj = re.search(
          if nbc_sports_url:
              return self.url_result(nbc_sports_url, 'NBCSportsVPlayer')
  
 +        # Look for Google Drive embeds
 +        google_drive_url = GoogleDriveIE._extract_url(webpage)
 +        if google_drive_url:
 +            return self.url_result(google_drive_url, 'GoogleDrive')
 +
          # Look for UDN embeds
          mobj = re.search(
 -            r'<iframe[^>]+src="(?P<url>%s)"' % UDNEmbedIE._VALID_URL, webpage)
 +            r'<iframe[^>]+src="(?P<url>%s)"' % UDNEmbedIE._PROTOCOL_RELATIVE_VALID_URL, webpage)
          if mobj is not None:
              return self.url_result(
                  compat_urlparse.urljoin(url, mobj.group('url')), 'UDNEmbed')
          if snagfilms_url:
              return self.url_result(snagfilms_url)
  
 +        # Look for JWPlatform embeds
 +        jwplatform_url = JWPlatformIE._extract_url(webpage)
 +        if jwplatform_url:
 +            return self.url_result(jwplatform_url, 'JWPlatform')
 +
          # Look for ScreenwaveMedia embeds
          mobj = re.search(ScreenwaveMediaIE.EMBED_PATTERN, webpage)
          if mobj is not None:
              return self.url_result(unescapeHTML(mobj.group('url')), 'ScreenwaveMedia')
  
+         # Look for Ulltimedia embeds
+         ultimedia_url = UltimediaIE._extract_url(webpage)
+         if ultimedia_url:
+             return self.url_result(self._proto_relative_url(ultimedia_url), 'Ultimedia')
          # Look for AdobeTVVideo embeds
          mobj = re.search(
              r'<iframe[^>]+src=[\'"]((?:https?:)?//video\.tv\.adobe\.com/v/\d+[^"]+)[\'"]',
  
          entries = []
          for video_url in found:
 +            video_url = video_url.replace('\\/', '/')
              video_url = compat_urlparse.urljoin(url, video_url)
              video_id = compat_urllib_parse_unquote(os.path.basename(video_url))
  
              # here's a fun little line of code for you:
              video_id = os.path.splitext(video_id)[0]
  
 +            entry_info_dict = {
 +                'id': video_id,
 +                'uploader': video_uploader,
 +                'title': video_title,
 +                'age_limit': age_limit,
 +            }
 +
              ext = determine_ext(video_url)
              if ext == 'smil':
 -                entries.append({
 -                    'id': video_id,
 -                    'formats': self._extract_smil_formats(video_url, video_id),
 -                    'uploader': video_uploader,
 -                    'title': video_title,
 -                    'age_limit': age_limit,
 -                })
 +                entry_info_dict['formats'] = self._extract_smil_formats(video_url, video_id)
              elif ext == 'xspf':
                  return self.playlist_result(self._extract_xspf_playlist(video_url, video_id), video_id)
 +            elif ext == 'm3u8':
 +                entry_info_dict['formats'] = self._extract_m3u8_formats(video_url, video_id, ext='mp4')
              else:
 -                entries.append({
 -                    'id': video_id,
 -                    'url': video_url,
 -                    'uploader': video_uploader,
 -                    'title': video_title,
 -                    'age_limit': age_limit,
 -                })
 +                entry_info_dict['url'] = video_url
 +
 +            entries.append(entry_info_dict)
  
          if len(entries) == 1:
              return entries[0]