3 from __future__ 
import unicode_literals
 
   9 from .common 
import InfoExtractor
 
  10 from .youtube 
import YoutubeIE
 
  11 from ..compat 
import ( 
  12     compat_etree_fromstring
, 
  13     compat_urllib_parse_unquote
, 
  15     compat_xml_parse_error
, 
  33 from .commonprotocols 
import RtmpIE
 
  34 from .brightcove 
import ( 
  38 from .nbc 
import NBCSportsVPlayerIE
 
  39 from .ooyala 
import OoyalaIE
 
  40 from .rutv 
import RUTVIE
 
  41 from .tvc 
import TVCIE
 
  42 from .sportbox 
import SportBoxEmbedIE
 
  43 from .smotri 
import SmotriIE
 
  44 from .myvi 
import MyviIE
 
  45 from .condenast 
import CondeNastIE
 
  46 from .udn 
import UDNEmbedIE
 
  47 from .senateisvp 
import SenateISVPIE
 
  48 from .svt 
import SVTIE
 
  49 from .pornhub 
import PornHubIE
 
  50 from .xhamster 
import XHamsterEmbedIE
 
  51 from .tnaflix 
import TNAFlixNetworkEmbedIE
 
  52 from .drtuber 
import DrTuberIE
 
  53 from .redtube 
import RedTubeIE
 
  54 from .vimeo 
import VimeoIE
 
  55 from .dailymotion 
import ( 
  59 from .onionstudios 
import OnionStudiosIE
 
  60 from .viewlift 
import ViewLiftEmbedIE
 
  61 from .mtv 
import MTVServicesEmbeddedIE
 
  62 from .pladform 
import PladformIE
 
  63 from .videomore 
import VideomoreIE
 
  64 from .webcaster 
import WebcasterFeedIE
 
  65 from .googledrive 
import GoogleDriveIE
 
  66 from .jwplatform 
import JWPlatformIE
 
  67 from .digiteka 
import DigitekaIE
 
  68 from .arkena 
import ArkenaIE
 
  69 from .instagram 
import InstagramIE
 
  70 from .liveleak 
import LiveLeakIE
 
  71 from .threeqsdn 
import ThreeQSDNIE
 
  72 from .theplatform 
import ThePlatformIE
 
  73 from .vessel 
import VesselIE
 
  74 from .kaltura 
import KalturaIE
 
  75 from .eagleplatform 
import EaglePlatformIE
 
  76 from .facebook 
import FacebookIE
 
  77 from .soundcloud 
import SoundcloudIE
 
  78 from .tunein 
import TuneInBaseIE
 
  79 from .vbox7 
import Vbox7IE
 
  80 from .dbtv 
import DBTVIE
 
  81 from .piksel 
import PikselIE
 
  82 from .videa 
import VideaIE
 
  83 from .twentymin 
import TwentyMinutenIE
 
  84 from .ustream 
import UstreamIE
 
  85 from .openload 
import OpenloadIE
 
  86 from .videopress 
import VideoPressIE
 
  87 from .rutube 
import RutubeIE
 
  90 class GenericIE(InfoExtractor
): 
  91     IE_DESC 
= 'Generic downloader that works on some sites' 
  95         # Direct link to a video 
  97             'url': 'http://media.w3.org/2010/05/sintel/trailer.mp4', 
  98             'md5': '67d406c2bcb6af27fa886f31aa934bbe', 
 103                 'upload_date': '20100513', 
 106         # Direct link to media delivered compressed (until Accept-Encoding is *) 
 108             'url': 'http://calimero.tk/muzik/FictionJunction-Parallel_Hearts.flac', 
 109             'md5': '128c42e68b13950268b648275386fc74', 
 111                 'id': 'FictionJunction-Parallel_Hearts', 
 113                 'title': 'FictionJunction-Parallel_Hearts', 
 114                 'upload_date': '20140522', 
 116             'expected_warnings': [ 
 117                 'URL could be a direct video link, returning it as such.' 
 119             'skip': 'URL invalid', 
 121         # Direct download with broken HEAD 
 123             'url': 'http://ai-radio.org:8000/radio.opus', 
 130                 'skip_download': True,  # infinite live stream 
 132             'expected_warnings': [ 
 133                 r
'501.*Not Implemented', 
 137         # Direct link with incorrect MIME type 
 139             'url': 'http://ftp.nluug.nl/video/nluug/2014-11-20_nj14/zaal-2/5_Lennart_Poettering_-_Systemd.webm', 
 140             'md5': '4ccbebe5f36706d85221f204d7eb5913', 
 142                 'url': 'http://ftp.nluug.nl/video/nluug/2014-11-20_nj14/zaal-2/5_Lennart_Poettering_-_Systemd.webm', 
 143                 'id': '5_Lennart_Poettering_-_Systemd', 
 145                 'title': '5_Lennart_Poettering_-_Systemd', 
 146                 'upload_date': '20141120', 
 148             'expected_warnings': [ 
 149                 'URL could be a direct video link, returning it as such.' 
 154             'url': 'http://phihag.de/2014/youtube-dl/rss2.xml', 
 156                 'id': 'http://phihag.de/2014/youtube-dl/rss2.xml', 
 157                 'title': 'Zero Punctuation', 
 158                 'description': 're:.*groundbreaking video review series.*' 
 160             'playlist_mincount': 11, 
 162         # RSS feed with enclosure 
 164             'url': 'http://podcastfeeds.nbcnews.com/audio/podcast/MSNBC-MADDOW-NETCAST-M4V.xml', 
 166                 'id': 'pdv_maddow_netcast_m4v-02-27-2015-201624', 
 168                 'upload_date': '20150228', 
 169                 'title': 'pdv_maddow_netcast_m4v-02-27-2015-201624', 
 172         # SMIL from http://videolectures.net/promogram_igor_mekjavic_eng 
 174             'url': 'http://videolectures.net/promogram_igor_mekjavic_eng/video/1/smil.xml', 
 178                 'title': 'Automatics, robotics and biocybernetics', 
 179                 'description': 'md5:815fc1deb6b3a2bff99de2d5325be482', 
 180                 'upload_date': '20130627', 
 181                 'formats': 'mincount:16', 
 182                 'subtitles': 'mincount:1', 
 185                 'force_generic_extractor': True, 
 186                 'skip_download': True, 
 189         # SMIL from http://www1.wdr.de/mediathek/video/livestream/index.html 
 191             'url': 'http://metafilegenerator.de/WDR/WDR_FS/hds/hds.smil', 
 196                 'formats': 'mincount:1', 
 199                 'skip_download': True, 
 202         # SMIL from https://www.restudy.dk/video/play/id/1637 
 204             'url': 'https://www.restudy.dk/awsmedia/SmilDirectory/video_1637.xml', 
 208                 'title': 'video_1637', 
 209                 'formats': 'mincount:3', 
 212                 'skip_download': True, 
 215         # SMIL from http://adventure.howstuffworks.com/5266-cool-jobs-iditarod-musher-video.htm 
 217             'url': 'http://services.media.howstuffworks.com/videos/450221/smil-service.smil', 
 219                 'id': 'smil-service', 
 221                 'title': 'smil-service', 
 222                 'formats': 'mincount:1', 
 225                 'skip_download': True, 
 228         # SMIL from http://new.livestream.com/CoheedandCambria/WebsterHall/videos/4719370 
 230             'url': 'http://api.new.livestream.com/accounts/1570303/events/1585861/videos/4719370.smil', 
 234                 'title': '571de1fd-47bc-48db-abf9-238872a58d1f', 
 235                 'formats': 'mincount:3', 
 238                 'skip_download': True, 
 241         # XSPF playlist from http://www.telegraaf.nl/tv/nieuws/binnenland/24353229/__Tikibad_ontruimd_wegens_brand__.html 
 243             'url': 'http://www.telegraaf.nl/xml/playlist/2015/8/7/mZlp2ctYIUEB.xspf', 
 245                 'id': 'mZlp2ctYIUEB', 
 247                 'title': 'Tikibad ontruimd wegens brand', 
 248                 'description': 'md5:05ca046ff47b931f9b04855015e163a4', 
 249                 'thumbnail': r
're:^https?://.*\.jpg$', 
 253                 'skip_download': True, 
 256         # MPD from http://dash-mse-test.appspot.com/media.html 
 258             'url': 'http://yt-dash-mse-test.commondatastorage.googleapis.com/media/car-20120827-manifest.mpd', 
 259             'md5': '4b57baab2e30d6eb3a6a09f0ba57ef53', 
 261                 'id': 'car-20120827-manifest', 
 263                 'title': 'car-20120827-manifest', 
 264                 'formats': 'mincount:9', 
 265                 'upload_date': '20130904', 
 268                 'format': 'bestvideo', 
 271         # m3u8 served with Content-Type: audio/x-mpegURL; charset=utf-8 
 273             'url': 'http://once.unicornmedia.com/now/master/playlist/bb0b18ba-64f5-4b1b-a29f-0ac252f06b68/77a785f3-5188-4806-b788-0893a61634ed/93677179-2d99-4ef4-9e17-fe70d49abfbf/content.m3u8', 
 278                 'formats': 'mincount:8', 
 282                 'skip_download': True, 
 284             'skip': 'video gone', 
 286         # m3u8 served with Content-Type: text/plain 
 288             'url': 'http://www.nacentapps.com/m3u8/index.m3u8', 
 293                 'upload_date': '20140720', 
 294                 'formats': 'mincount:11', 
 298                 'skip_download': True, 
 300             'skip': 'video gone', 
 304             'url': 'http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCUQtwIwAA&url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DcmQHVoWB5FY&ei=F-sNU-LLCaXk4QT52ICQBQ&usg=AFQjCNEw4hL29zgOohLXvpJ-Bdh2bils1Q&bvm=bv.61965928,d.bGE', 
 308                 'upload_date': '20130224', 
 309                 'uploader_id': 'TheVerge', 
 310                 'description': r
're:^Chris Ziegler takes a look at the\.*', 
 311                 'uploader': 'The Verge', 
 312                 'title': 'First Firefox OS phones side-by-side', 
 315                 'skip_download': False, 
 319             # redirect in Refresh HTTP header 
 320             'url': 'https://www.facebook.com/l.php?u=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DpO8h3EaFRdo&h=TAQHsoToz&enc=AZN16h-b6o4Zq9pZkCCdOLNKMN96BbGMNtcFwHSaazus4JHT_MFYkAA-WARTX2kvsCIdlAIyHZjl6d33ILIJU7Jzwk_K3mcenAXoAzBNoZDI_Q7EXGDJnIhrGkLXo_LJ_pAa2Jzbx17UHMd3jAs--6j2zaeto5w9RTn8T_1kKg3fdC5WPX9Dbb18vzH7YFX0eSJmoa6SP114rvlkw6pkS1-T&s=1', 
 324                 'title': 'Tripeo Boiler Room x Dekmantel Festival DJ Set', 
 325                 'description': 'md5:6294cc1af09c4049e0652b51a2df10d5', 
 326                 'upload_date': '20150917', 
 327                 'uploader_id': 'brtvofficial', 
 328                 'uploader': 'Boiler Room', 
 331                 'skip_download': False, 
 335             'url': 'http://www.hodiho.fr/2013/02/regis-plante-sa-jeep.html', 
 336             'md5': '85b90ccc9d73b4acd9138d3af4c27f89', 
 338                 'id': '13601338388002', 
 340                 'uploader': 'www.hodiho.fr', 
 341                 'title': 'R\u00e9gis plante sa Jeep', 
 344         # bandcamp page with custom domain 
 346             'add_ie': ['Bandcamp'], 
 347             'url': 'http://bronyrock.com/track/the-pony-mash', 
 351                 'title': 'The Pony Mash', 
 352                 'uploader': 'M_Pallante', 
 354             'skip': 'There is a limit of 200 free downloads / month for the test song', 
 357             # embedded brightcove video 
 358             # it also tests brightcove videos that need to set the 'Referer' 
 359             # in the http requests 
 360             'add_ie': ['BrightcoveLegacy'], 
 361             'url': 'http://www.bfmtv.com/video/bfmbusiness/cours-bourse/cours-bourse-l-analyse-technique-154522/', 
 363                 'id': '2765128793001', 
 365                 'title': 'Le cours de bourse : lāanalyse technique', 
 366                 'description': 'md5:7e9ad046e968cb2d1114004aba466fd9', 
 367                 'uploader': 'BFM BUSINESS', 
 370                 'skip_download': True, 
 374             # embedded with itemprop embedURL and video id spelled as `idVideo` 
 375             'add_id': ['BrightcoveLegacy'], 
 376             'url': 'http://bfmbusiness.bfmtv.com/mediaplayer/chroniques/olivier-delamarche/', 
 378                 'id': '5255628253001', 
 380                 'title': 'md5:37c519b1128915607601e75a87995fc0', 
 381                 'description': 'md5:37f7f888b434bb8f8cc8dbd4f7a4cf26', 
 382                 'uploader': 'BFM BUSINESS', 
 383                 'uploader_id': '876450612001', 
 384                 'timestamp': 1482255315, 
 385                 'upload_date': '20161220', 
 388                 'skip_download': True, 
 392             # https://github.com/rg3/youtube-dl/issues/2253 
 393             'url': 'http://bcove.me/i6nfkrc3', 
 394             'md5': '0ba9446db037002366bab3b3eb30c88c', 
 396                 'id': '3101154703001', 
 398                 'title': 'Still no power', 
 399                 'uploader': 'thestar.com', 
 400                 '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.', 
 402             'add_ie': ['BrightcoveLegacy'], 
 403             'skip': 'video gone', 
 406             'url': 'http://www.championat.com/video/football/v/87/87499.html', 
 407             'md5': 'fb973ecf6e4a78a67453647444222983', 
 409                 'id': '3414141473001', 
 411                 'title': 'ŠŠøŠ“ео. УГаление ŠŠ·Š°Š³Š¾ŠµŠ²Š° (Š¦Š”ŠŠ)', 
 412                 'description': 'ŠŠ½Š»Š°Š¹Š½-ŃŃŠ°Š½ŃŠ»ŃŃŠøŃ маŃŃŠ° Š¦Š”ŠŠ - "ŠŠ¾Š»Š³Š°"', 
 413                 'uploader': 'Championat', 
 417             # https://github.com/rg3/youtube-dl/issues/3541 
 418             'add_ie': ['BrightcoveLegacy'], 
 419             'url': 'http://www.kijk.nl/sbs6/leermijvrouwenkennen/videos/jqMiXKAYan2S/aflevering-1', 
 421                 'id': '3866516442001', 
 423                 'title': 'Leer mij vrouwen kennen: Aflevering 1', 
 424                 'description': 'Leer mij vrouwen kennen: Aflevering 1', 
 425                 'uploader': 'SBS Broadcasting', 
 427             'skip': 'Restricted to Netherlands', 
 429                 'skip_download': True,  # m3u8 download 
 433             # Brightcove with alternative playerID key 
 434             'url': 'http://www.nature.com/nmeth/journal/v9/n7/fig_tab/nmeth.2062_SV1.html', 
 436                 'id': 'nmeth.2062_SV1', 
 437                 'title': 'Simultaneous multiview imaging of the Drosophila syncytial blastoderm : Quantitative high-speed imaging of entire developing embryos with simultaneous multiview light-sheet microscopy : Nature Methods : Nature Research', 
 441                     'id': '2228375078001', 
 443                     'title': 'nmeth.2062-sv1', 
 444                     'description': 'nmeth.2062-sv1', 
 445                     'timestamp': 1363357591, 
 446                     'upload_date': '20130315', 
 447                     'uploader': 'Nature Publishing Group', 
 448                     'uploader_id': '1964492299001', 
 454             'url': 'http://www.rollingstone.com/music/videos/norwegian-dj-cashmere-cat-goes-spartan-on-with-me-premiere-20131219', 
 455             'md5': '166dd577b433b4d4ebfee10b0824d8ff', 
 457                 'id': 'BwY2RxaTrTkslxOfcan0UCf0YqyvWysJ', 
 459                 'title': '2cc213299525360.mov',  # that's what we get 
 462             'add_ie': ['Ooyala'], 
 465             # ooyala video embedded with http://player.ooyala.com/iframe.js 
 466             'url': 'http://www.macrumors.com/2015/07/24/steve-jobs-the-man-in-the-machine-first-trailer/', 
 468                 'id': 'p0MGJndjoG5SOKqO_hZJuZFPB-Tr5VgB', 
 470                 'title': '"Steve Jobs: Man in the Machine" trailer', 
 471                 'description': 'The first trailer for the Alex Gibney documentary "Steve Jobs: Man in the Machine."', 
 475                 'skip_download': True, 
 477             'skip': 'movie expired', 
 481             'url': 'http://www.tested.com/science/weird/460206-tested-grinding-coffee-2000-frames-second/', 
 485                 'title': 'Tested: Grinding Coffee at 2000 Frames Per Second', 
 486                 'upload_date': '20140225', 
 487                 'description': 'md5:06a40fbf30b220468f1e0957c0f558ff', 
 488                 'uploader': 'Tested', 
 489                 'uploader_id': 'testedcom', 
 491             # No need to test YoutubeIE here 
 493                 'skip_download': True, 
 498             'url': 'http://www.theguardian.com/world/2014/mar/11/obama-zach-galifianakis-between-two-ferns', 
 502                 'title': 'Between Two Ferns with Zach Galifianakis: President Barack Obama', 
 503                 'description': 'Episode 18: President Barack Obama sits down with Zach Galifianakis for his most memorable interview yet.', 
 505             # HEAD requests lead to endless 301, while GET is OK 
 506             'expected_warnings': ['301'], 
 510             'url': 'http://www.rg.ru/2014/03/15/reg-dfo/anklav-anons.html', 
 514                 'title': 'ŠŃ
оŃŃŠŗŠ¾Šµ Š¼Š¾ŃŠµ ŃŃŠ°Š»Š¾ ŃŠµŠ»ŠøŠŗŠ¾Š¼ ŃŠ¾ŃŃŠøŠ¹Ńким', 
 515                 'description': 'md5:5ed62483b14663e2a95ebbe115eb8f43', 
 519                 'skip_download': True, 
 524             'url': 'http://sch1298sz.mskobr.ru/dou_edu/karamel_ki/filial_galleries/video/iframe_src_http_tvc_ru_video_iframe_id_55304_isplay_false_acc_video_id_channel_brand_id_11_show_episodes_episode_id_32307_frameb/', 
 528                 'title': 'ŠŠ¾ŃŠŗŠ¾Š»ŃŠ½Š¾Šµ Š²Š¾ŃŠæŠøŃŠ°Š½ŠøŠµ', 
 533             'url': 'http://www.vestifinance.ru/articles/25753', 
 536                 'title': 'ŠŃŃŠ¼Ńе ŃŃŠ°Š½ŃŠ»ŃŃŠøŠø Ń Š¤Š¾ŃŃŠ¼Š°-вŃŃŃŠ°Š²ŠŗŠø "ŠŠ¾Ńзаказ-2013"', 
 541                     'title': 'ŠŠ¾Ńзаказ. ŠŠµŠ½Ń 3', 
 547                     'title': 'ŠŠ¾Ńзаказ. ŠŠµŠ½Ń 2', 
 553                     'title': 'ŠŠ¾Ńзаказ. ŠŠµŠ½Ń 1', 
 559                 'skip_download': True, 
 564             'url': 'http://www.kinomyvi.tv/news/detail/Pervij-dublirovannij-trejler--Uzhastikov-_nOw1', 
 566                 'id': 'f4dafcad-ff21-423d-89b5-146cfd89fa1e', 
 568                 'title': 'УжаŃŃŠøŠŗŠø, ŃŃŃŃŠŗŠøŠ¹ ŃŃŠµŠ¹Š»ŠµŃ (2015)', 
 569                 'thumbnail': r
're:^https?://.*\.jpg$', 
 575             'url': 'http://www.numisc.com/forum/showthread.php?11696-FM15-which-pumiscer-was-this-%28-vid-%29-%28-alfa-as-fuck-srx-%29&s=711f5db534502e22260dec8c5e2d66d8', 
 578                 'title': '[NSFL] [FM15] which pumiscer was this ( vid ) ( alfa as fuck srx )', 
 580             'playlist_mincount': 7, 
 581             # This forum does not allow <iframe> syntaxes anymore 
 582             # Now HTML tags are displayed as-is 
 583             'skip': 'No videos on this page', 
 587             'url': 'http://en.support.wordpress.com/videos/ted-talks/', 
 588             'md5': '65fdff94098e4a607385a60c5177c638', 
 592                 'title': 'Hidden miracles of the natural world', 
 593                 'uploader': 'Louie Schwartzberg', 
 594                 'description': 'md5:8145d19d320ff3e52f28401f4c4283b9', 
 597         # nowvideo embed hidden behind percent encoding 
 599             'url': 'http://www.waoanime.tv/the-super-dimension-fortress-macross-episode-1/', 
 600             'md5': '2baf4ddd70f697d94b1c18cf796d5107', 
 602                 'id': '06e53103ca9aa', 
 604                 'title': 'Macross Episode 001  Watch Macross Episode 001 onl', 
 605                 'description': 'No description', 
 610             'url': 'http://www.tv-replay.fr/redirection/20-03-14/x-enius-arte-10753389.html', 
 611             'md5': '7653032cbb25bf6c80d80f217055fa43', 
 613                 'id': '048195-004_PLUS7-F', 
 616                 'description': 'md5:d5fdf32ef6613cdbfd516ae658abf168', 
 617                 'upload_date': '20140320', 
 620                 'skip_download': 'Requires rtmpdump' 
 622             'skip': 'video gone', 
 626             'url': 'http://www.tsprod.com/replay-du-concert-alcaline-de-calogero', 
 630                 'title': 'Alcaline, le concert avec Calogero', 
 631                 'description': 'md5:61f08036dcc8f47e9cfc33aed08ffaff', 
 632                 'upload_date': '20150226', 
 633                 'timestamp': 1424989860, 
 638                 'skip_download': True, 
 640             'expected_warnings': [ 
 646             'url': 'http://www.wired.com/2014/04/honda-asimo/', 
 647             'md5': 'ba0dfe966fa007657bd1443ee672db0f', 
 649                 'id': '53501be369702d3275860000', 
 651                 'title': 'Hondaās  New Asimo Robot Is More Human Than Ever', 
 656             'url': 'http://www.spi0n.com/zap-spi0n-com-n216/', 
 657             'md5': '441aeeb82eb72c422c7f14ec533999cd', 
 659                 'id': 'k2mm4bCdJ6CQ2i7c8o2', 
 661                 'title': 'Le Zap de Spi0n n°216 - Zapping du Web', 
 662                 'description': 'md5:faf028e48a461b8b7fad38f1e104b119', 
 664                 'uploader_id': 'xgditw', 
 665                 'upload_date': '20140425', 
 666                 'timestamp': 1398441542, 
 668             'add_ie': ['Dailymotion'], 
 672             'url': 'http://www.badzine.de/ansicht/datum/2014/06/09/so-funktioniert-die-neue-englische-badminton-liga.html', 
 676                 'title': 'The NBL Auction 2014', 
 677                 'uploader': 'BADMINTON England', 
 678                 'uploader_id': 'BADMINTONEvents', 
 679                 'upload_date': '20140603', 
 680                 'description': 'md5:9ef128a69f1e262a700ed83edb163a73', 
 682             'add_ie': ['Youtube'], 
 684                 'skip_download': True, 
 689             'url': 'http://www.vulture.com/2016/06/new-key-peele-sketches-released.html', 
 690             'md5': 'ca1aef97695ef2c1d6973256a57e5252', 
 692                 'id': '769f7ec0-0692-4d62-9b45-0d88074bffc1', 
 694                 'title': 'Key and Peele|October 10, 2012|2|203|Liam Neesons - Uncensored', 
 695                 'description': 'Two valets share their love for movie star Liam Neesons.', 
 696                 'timestamp': 1349922600, 
 697                 'upload_date': '20121011', 
 700         # YouTube embed via <data-embed-url=""> 
 702             'url': 'https://play.google.com/store/apps/details?id=com.gameloft.android.ANMP.GloftA8HM', 
 706                 'title': 'Asphalt 8: Airborne - Update - Welcome to Dubai!', 
 707                 'uploader': 'Gameloft', 
 708                 'uploader_id': 'gameloft', 
 709                 'upload_date': '20140828', 
 710                 'description': 'md5:c80da9ed3d83ae6d1876c834de03e1c4', 
 713                 'skip_download': True, 
 718             'url': 'http://www.ll.mit.edu/workshops/education/videocourses/antennas/lecture1/video/', 
 720                 'md5': '0c5e352edabf715d762b0ad4e6d9ee67', 
 722                     'id': 'Fenn-AA_PA_Radar_Course_Lecture_1c_Final', 
 723                     'title': 'Fenn-AA_PA_Radar_Course_Lecture_1c_Final - video1', 
 728                 'md5': '10e4bb3aaca9fd630e273ff92d9f3c63', 
 730                     'id': 'Fenn-AA_PA_Radar_Course_Lecture_1c_Final_PIP', 
 731                     'title': 'Fenn-AA_PA_Radar_Course_Lecture_1c_Final - pip', 
 737                 'title': 'Fenn-AA_PA_Radar_Course_Lecture_1c_Final', 
 742             'url': 'http://www.handjobhub.com/video/busty-blonde-siri-tit-fuck-while-wank-6313.html', 
 743             'md5': '9d65602bf31c6e20014319c7d07fba27', 
 745                 'id': '5123ea6d5e5a7', 
 748                 'uploader': 'www.handjobhub.com', 
 749                 'title': 'Busty Blonde Siri Tit Fuck While Wank at HandjobHub.com', 
 752         # Multiple brightcove videos 
 753         # https://github.com/rg3/youtube-dl/issues/2283 
 755             'url': 'http://www.newyorker.com/online/blogs/newsdesk/2014/01/always-never-nuclear-command-and-control.html', 
 757                 'id': 'always-never', 
 758                 'title': 'Always / Never - The New Yorker', 
 762                 'extract_flat': False, 
 763                 'skip_download': True, 
 768             'url': 'http://umpire-empire.com/index.php/topic/58125-laz-decides-no-thats-low/', 
 769             'md5': '96f09a37e44da40dd083e12d9a683327', 
 773                 'title': 'Ump changes call to ball', 
 774                 'description': 'md5:71c11215384298a172a6dcb4c2e20685', 
 776                 'timestamp': 1401537900, 
 777                 'upload_date': '20140531', 
 778                 'thumbnail': r
're:^https?://.*\.jpg$', 
 783             'url': 'http://study.com/academy/lesson/north-american-exploration-failed-colonies-of-spain-france-england.html#lesson', 
 784             'md5': '1953f3a698ab51cfc948ed3992a0b7ff', 
 788                 'title': 'paywall_north-american-exploration-failed-colonies-of-spain-france-england', 
 789                 'description': 'a Paywall Videos video from Remilon', 
 791                 'uploader': 'study.com', 
 792                 'timestamp': 1459678540, 
 793                 'upload_date': '20160403', 
 794                 'filesize': 24687186, 
 798             'url': 'http://thoughtworks.wistia.com/medias/uxjb0lwrcz', 
 799             'md5': 'baf49c2baa8a7de5f3fc145a8506dcd4', 
 803                 'title': 'Conversation about Hexagonal Rails Part 1', 
 804                 'description': 'a Martin Fowler video from ThoughtWorks', 
 806                 'uploader': 'thoughtworks.wistia.com', 
 807                 'timestamp': 1401832161, 
 808                 'upload_date': '20140603', 
 811         # Wistia standard embed (async) 
 813             'url': 'https://www.getdrip.com/university/brennan-dunn-drip-workshop/', 
 817                 'title': 'Drip Brennan Dunn Workshop', 
 818                 'description': 'a JV Webinars video from getdrip-1', 
 820                 'timestamp': 1463607249, 
 821                 'upload_date': '20160518', 
 824                 'skip_download': True, 
 829             'url': 'http://nakedsecurity.sophos.com/2014/10/29/sscc-171-are-you-sure-that-1234-is-a-bad-password-podcast/', 
 833                 'description': 'md5:ff867d6b555488ad3c52572bb33d432c', 
 834                 'uploader': 'Sophos Security', 
 835                 'title': 'Chet Chat 171 - Oct 29, 2014', 
 836                 'upload_date': '20141029', 
 839         # Soundcloud multiple embeds 
 841             'url': 'http://www.guitarplayer.com/lessons/1014/legato-workout-one-hour-to-more-fluid-performance---tab/52809', 
 844                 'title': 'Guitar Essentials: Legato WorkoutāOne-Hour to Fluid Performance  | TAB + AUDIO', 
 846             'playlist_mincount': 7, 
 848         # TuneIn station embed 
 850             'url': 'http://radiocnrv.com/promouvoir-radio-cnrv/', 
 855                 'location': 'Paris, France', 
 860                 'skip_download': True, 
 865             'url': 'http://www.esa.int/Our_Activities/Space_Science/Rosetta/Philae_comet_touch-down_webcast', 
 869                 'upload_date': '20141112', 
 870                 'title': 'Rosetta #CometLanding webcast HL 10', 
 873         # Another Livestream embed, without 'new.' in URL 
 875             'url': 'https://www.freespeech.org/', 
 879                 'title': 're:^FSTV [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}$', 
 883                 'skip_download': True, 
 888             'url': 'http://discourse.ubuntu.com/t/unity-8-desktop-mode-windows-on-mir/1986', 
 891                 'title': 'Unity 8 desktop-mode windows on Mir! - Ubuntu Discourse', 
 893             'playlist_mincount': 2, 
 897             'url': 'http://undergroundwellness.com/podcasts/306-5-steps-to-permanent-gut-healing/', 
 901                 'upload_date': '20141126', 
 902                 'title': 'Jack Tips: 5 Steps to Permanent Gut Healing', 
 907             'url': 'http://www.abc.net.au/7.30/content/2015/s4164797.htm', 
 909                 'id': '730m_DandD_1901_512k', 
 911                 'uploader': 'www.abc.net.au', 
 912                 'title': 'Game of Thrones with dice - Dungeons and Dragons fantasy role-playing game gets new life - 19/01/2015', 
 915         # embedded viddler video 
 917             'url': 'http://deadspin.com/i-cant-stop-watching-john-wall-chop-the-nuggets-with-th-1681801597', 
 921                 'uploader': 'deadspin', 
 922                 'title': 'WALL-TO-GORTAT', 
 923                 'timestamp': 1422285291, 
 924                 'upload_date': '20150126', 
 926             'add_ie': ['Viddler'], 
 930             'url': 'http://thedailyshow.cc.com/podcast/episodetwelve', 
 934                 'title': "The Daily Show Podcast without Jon Stewart - Episode 12: Bassem Youssef: Egypt's Jon Stewart", 
 935                 'description': 'md5:601cb790edd05908957dae8aaa866465', 
 936                 'upload_date': '20150220', 
 938             'skip': 'All The Daily Show URLs now redirect to http://www.cc.com/shows/', 
 942             'url': 'http://media.nationalarchives.gov.uk/index.php/webinar-using-discovery-national-archives-online-catalogue/', 
 946                 'upload_date': '20150212', 
 947                 'uploader': 'The National Archives UK', 
 948                 'description': 'md5:a236581cd2449dd2df4f93412f3f01c6', 
 949                 'uploader_id': 'NationalArchives08', 
 950                 'title': 'Webinar: Using Discovery, The National Archivesā online catalogue', 
 955             'url': 'http://www.suffolk.edu/sjc/', 
 959                 'title': 'Massachusetts Supreme Judicial Court Oral Arguments', 
 960                 'uploader': 'www.suffolk.edu', 
 963                 'skip_download': True, 
 968             'url': 'http://www.indiedb.com/games/king-machine/videos', 
 972                 'title': 'king machine trailer 1', 
 973                 'thumbnail': r
're:^https?://.*\.jpg$', 
 978             'url': 'http://www.rtlnieuws.nl/nieuws/buitenland/aanslagen-kopenhagen', 
 979             'playlist_mincount': 5, 
 981                 'id': 'aanslagen-kopenhagen', 
 982                 'title': 'Aanslagen Kopenhagen | RTL Nieuws', 
 987             'url': 'http://www.skipass.com/news/116090-bon-appetit-s5ep3-baqueira-mi-cor.html', 
 991                 'title': 'EP3S5 - Bon AppƩtit - Baqueira Mi Corazon !', 
 994         # Kaltura embed (different embed code) 
 996             'url': 'http://www.premierchristianradio.com/Shows/Saturday/Unbelievable/Conference-Videos/Os-Guinness-Is-It-Fools-Talk-Unbelievable-Conference-2014', 
1000                 'upload_date': '20150127', 
1001                 'uploader_id': 'PremierMedia', 
1003                 'title': 'Os Guinness // Is It Fools Talk? // Unbelievable? Conference 2014', 
1006         # Kaltura embed with single quotes 
1008             'url': 'http://fod.infobase.com/p_ViewPlaylist.aspx?AssignmentID=NUN8ZY', 
1013                 'timestamp': 1355743100, 
1014                 'upload_date': '20121217', 
1015                 'uploader_id': 'batchUser', 
1017             'add_ie': ['Kaltura'], 
1020             # Kaltura embedded via quoted entry_id 
1021             'url': 'https://www.oreilly.com/ideas/my-cloud-makes-pretty-pictures', 
1025                 'title': '06_matthew_brender_raj_dutt', 
1026                 'timestamp': 1466638791, 
1027                 'upload_date': '20160622', 
1029             'add_ie': ['Kaltura'], 
1030             'expected_warnings': [ 
1031                 'Could not send HEAD request' 
1034                 'skip_download': True, 
1038             # Kaltura embedded, some fileExt broken (#11480) 
1039             'url': 'http://www.cornell.edu/video/nima-arkani-hamed-standard-models-of-particle-physics', 
1043                 'title': 'Our "Standard Models" of particle physics and cosmology', 
1044                 'description': 'md5:67ea74807b8c4fea92a6f38d6d323861', 
1045                 'timestamp': 1321158993, 
1046                 'upload_date': '20111113', 
1047                 'uploader_id': 'kps1', 
1049             'add_ie': ['Kaltura'], 
1051         # Eagle.Platform embed (generic URL) 
1053             'url': 'http://lenta.ru/news/2015/03/06/navalny/', 
1054             # Not checking MD5 as sometimes the direct HTTP link results in 404 and HLS is used 
1058                 'title': 'ŠŠ°Š²Š°Š»ŃŠ½ŃŠ¹ вŃŃŠµŠ» на ŃŠ²Š¾Š±Š¾Š“Ń', 
1059                 'description': 'md5:d97861ac9ae77377f3f20eaf9d04b4f5', 
1060                 'thumbnail': r
're:^https?://.*\.jpg$', 
1066         # ClipYou (Eagle.Platform) embed (custom URL) 
1068             'url': 'http://muz-tv.ru/play/7129/', 
1069             # Not checking MD5 as sometimes the direct HTTP link results in 404 and HLS is used 
1073                 'title': "'O Sole Mio", 
1074                 'thumbnail': r
're:^https?://.*\.jpg$', 
1081             'url': 'http://muz-tv.ru/kinozal/view/7400/', 
1085                 'title': 'Š¢Š°Š¹Š½Ń ŠæŠµŃŠµŠ²Š°Š»Š° ŠŃŃŠ»Š¾Š²Š° ⢠1 ŃŠµŃŠøŃ 2 ŃŠ°ŃŃŃ', 
1086                 'description': 'ŠŠ¾ŠŗŃŠ¼ŠµŠ½ŃŠ°Š»ŃŠ½ŃŠ¹ ŃŠµŃиал-ŃŠ°ŃŃŠ»ŠµŠ“ование оГной ŠøŠ· ŃŠ°Š¼ŃŃ
 жŃŃŠŗŠøŃ
 ŃŠ°Š¹Š½ ЄЄ века', 
1087                 'thumbnail': r
're:^https?://.*\.jpg$', 
1094             'url': 'http://www.cinemablend.com/new/First-Joe-Dirt-2-Trailer-Teaser-Stupid-Greatness-70874.html', 
1098                 'title': 'Joe Dirt 2 Beautiful Loser Teaser Trailer', 
1099                 'thumbnail': r
're:^https?://.*\.png$', 
1105             'url': 'http://techcrunch.com/video/facebook-creates-on-this-day-crunch-report/518726732/', 
1106             'md5': '4c6f127a30736b59b3e2c19234ee2bf7', 
1110                 'title': 'Facebook Creates "On This Day" | Crunch Report', 
1115             'url': 'http://www.svt.se/sport/ishockey/jagr-tacklar-giroux-under-intervjun', 
1119                 'title': 'HƤr trycker Jagr till Giroux (under SVT-intervjun)', 
1124         # Crooks and Liars embed 
1126             'url': 'http://crooksandliars.com/2015/04/fox-friends-says-protecting-atheists', 
1130                 'title': "Fox & Friends Says Protecting Atheists From Discrimination Is Anti-Christian!", 
1131                 'description': 'md5:e1a46ad1650e3a5ec7196d432799127f', 
1132                 'timestamp': 1428207000, 
1133                 'upload_date': '20150405', 
1134                 'uploader': 'Heather', 
1137         # Crooks and Liars external embed 
1139             'url': 'http://theothermccain.com/2010/02/02/video-proves-that-bill-kristol-has-been-watching-glenn-beck/comment-page-1/', 
1141                 'id': 'MTE3MjUtMzQ2MzA', 
1143                 'title': 'md5:5e3662a81a4014d24c250d76d41a08d5', 
1144                 'description': 'md5:9b8e9542d6c3c5de42d6451b7d780cec', 
1145                 'timestamp': 1265032391, 
1146                 'upload_date': '20100201', 
1147                 'uploader': 'Heather', 
1150         # NBC Sports vplayer embed 
1152             'url': 'http://www.riderfans.com/forum/showthread.php?121827-Freeman&s=e98fa1ea6dc08e886b1678d35212494a', 
1154                 'id': 'ln7x1qSThw4k', 
1156                 'title': "PFT Live: New leader in the 'new-look' defense", 
1157                 'description': 'md5:65a19b4bbfb3b0c0c5768bed1dfad74e', 
1158                 'uploader': 'NBCU-SPORTS', 
1159                 'upload_date': '20140107', 
1160                 'timestamp': 1389118457, 
1165             'url': 'http://www.vulture.com/2016/06/letterman-couldnt-care-less-about-late-night.html', 
1166             'md5': '1aa589c675898ae6d37a17913cf68d66', 
1168                 'id': '701714499682', 
1170                 'title': 'PREVIEW: On Assignment: David Letterman', 
1171                 'description': 'A preview of Tom Brokaw\'s interview with David Letterman as part of the On Assignment series powered by Dateline. Airs Sunday June 12 at 7/6c.', 
1176             'url': 'https://video.udn.com/news/300346', 
1177             'md5': 'fd2060e988c326991037b9aff9df21a6', 
1181                 'title': 'äøäøäøē·åø«č®ę§ å
Øę ”åø«ēåęŗ', 
1182                 'thumbnail': r
're:^https?://.*\.jpg$', 
1186                 'skip_download': True, 
1191             'url': 'http://www.businessinsider.com/excel-index-match-vlookup-video-how-to-2015-2?IR=T', 
1193                 'id': '50YnY4czr4ms1vJ7yz3xzq0excz_pUMs', 
1195                 'description': 'VIDEO: INDEX/MATCH versus VLOOKUP.', 
1196                 'title': 'This is what separates the Excel masters from the wannabes', 
1197                 'duration': 191.933, 
1201                 'skip_download': True, 
1204         # Brightcove URL in single quotes 
1206             'url': 'http://www.sportsnet.ca/baseball/mlb/sn-presents-russell-martin-world-citizen/', 
1207             'md5': '4ae374f1f8b91c889c4b9203c8c752af', 
1209                 'id': '4255764656001', 
1211                 'title': 'SN Presents: Russell Martin, World Citizen', 
1212                 'description': 'To understand why he was the Toronto Blue Jaysā top off-season priority is to appreciate his background and upbringing in Montreal, where he first developed his baseball skills. Written and narrated by Stephen Brunt.', 
1213                 'uploader': 'Rogers Sportsnet', 
1214                 'uploader_id': '1704050871', 
1215                 'upload_date': '20150525', 
1216                 'timestamp': 1432570283, 
1219         # Dailymotion Cloud video 
1221             'url': 'http://replay.publicsenat.fr/vod/le-debat/florent-kolandjian,dominique-cena,axel-decourtye,laurence-abeille,bruno-parmentier/175910', 
1222             'md5': 'dcaf23ad0c67a256f4278bce6e0bae38', 
1226                 'title': 'Sauvons les abeilles ! - Le dƩbat', 
1227                 'description': 'md5:d9082128b1c5277987825d684939ca26', 
1228                 'thumbnail': r
're:^https?://.*\.jpe?g$', 
1229                 'timestamp': 1434970506, 
1230                 'upload_date': '20150622', 
1231                 'uploader': 'Public SƩnat', 
1232                 'uploader_id': 'xa9gza', 
1235         # OnionStudios embed 
1237             'url': 'http://www.clickhole.com/video/dont-understand-bitcoin-man-will-mumble-explanatio-2537', 
1241                 'title': 'Donāt Understand Bitcoin? This Man Will Mumble An Explanation At You', 
1242                 'thumbnail': r
're:^https?://.*\.jpe?g$', 
1243                 'uploader': 'ClickHole', 
1244                 'uploader_id': 'clickhole', 
1249             'url': 'http://whilewewatch.blogspot.ru/2012/06/whilewewatch-whilewewatch-gripping.html', 
1251                 'id': '74849a00-85a9-11e1-9660-123139220831', 
1253                 'title': '#whilewewatch', 
1256         # AdobeTVVideo embed 
1258             'url': 'https://helpx.adobe.com/acrobat/how-to/new-experience-acrobat-dc.html?set=acrobat--get-started--essential-beginners', 
1259             'md5': '43662b577c018ad707a63766462b1e87', 
1263                 'title': 'New experience with Acrobat DC', 
1264                 'description': 'New experience with Acrobat DC', 
1265                 'duration': 248.667, 
1268         # BrightcoveInPageEmbed embed 
1270             'url': 'http://www.geekandsundry.com/tabletop-bonus-wils-final-thoughts-on-dread/', 
1272                 'id': '4238694884001', 
1274                 'title': 'Tabletop: Dread, Last Thoughts', 
1275                 'description': 'Tabletop: Dread, Last Thoughts', 
1279         # Brightcove embed, with no valid 'renditions' but valid 'IOSRenditions' 
1280         # This video can't be played in browsers if Flash disabled and UA set to iPhone, which is actually a false alarm 
1282             'url': 'https://dl.dropboxusercontent.com/u/29092637/interview.html', 
1284                 'id': '4785848093001', 
1286                 'title': 'The Cardinal Pell Interview', 
1287                 'description': 'Sky News Contributor Andrew Bolt interviews George Pell in Rome, following the Cardinal\'s evidence before the Royal Commission into Child Abuse. ', 
1288                 'uploader': 'GlobeCast Australia - GlobeStream', 
1289                 'uploader_id': '2733773828001', 
1290                 'upload_date': '20160304', 
1291                 'timestamp': 1457083087, 
1295                 'skip_download': True, 
1298         # Another form of arte.tv embed 
1300             'url': 'http://www.tv-replay.fr/redirection/09-04-16/arte-reportage-arte-11508975.html', 
1301             'md5': '850bfe45417ddf221288c88a0cffe2e2', 
1303                 'id': '030273-562_PLUS7-F', 
1305                 'title': 'ARTE Reportage - Nulle part, en France', 
1306                 'description': 'md5:e3a0e8868ed7303ed509b9e3af2b870d', 
1307                 'upload_date': '20160409', 
1312             'url': 'http://www.wykop.pl/link/3088787/', 
1313             'md5': 'ace83b9ed19b21f68e1b50e844fdf95d', 
1315                 'id': '874_1459135191', 
1317                 'title': 'Man shows poor quality of new apartment building', 
1318                 'description': 'The wall is like a sand pile.', 
1319                 'uploader': 'Lake8737', 
1322         # Duplicated embedded video URLs 
1324             'url': 'http://www.hudl.com/athlete/2538180/highlights/149298443', 
1326                 'id': '149298443_480_16c25b74_2', 
1328                 'title': 'vs. Blue Orange Spring Game', 
1329                 'uploader': 'www.hudl.com', 
1332         # twitter:player:stream embed 
1334             'url': 'http://www.rtl.be/info/video/589263.aspx?CategoryID=288', 
1338                 'title': 'Une nouvelle espèce de dinosaure découverte en Argentine', 
1339                 'uploader': 'www.rtl.be', 
1343                 'skip_download': True, 
1346         # twitter:player embed 
1348             'url': 'http://www.theatlantic.com/video/index/484130/what-do-black-holes-sound-like/', 
1349             'md5': 'a3e0df96369831de324f0778e126653c', 
1351                 'id': '4909620399001', 
1353                 'title': 'What Do Black Holes Sound Like?', 
1354                 'description': 'what do black holes sound like', 
1355                 'upload_date': '20160524', 
1356                 'uploader_id': '29913724001', 
1357                 'timestamp': 1464107587, 
1358                 'uploader': 'TheAtlantic', 
1360             'add_ie': ['BrightcoveLegacy'], 
1362         # Facebook <iframe> embed 
1364             'url': 'https://www.hostblogger.de/blog/archives/6181-Auto-jagt-Betonmischer.html', 
1365             'md5': 'fbcde74f534176ecb015849146dd3aee', 
1367                 'id': '599637780109885', 
1369                 'title': 'Facebook video #599637780109885', 
1372         # Facebook API embed 
1374             'url': 'http://www.lothype.com/blue-stars-2016-preview-standstill-full-show/', 
1375             'md5': 'a47372ee61b39a7b90287094d447d94e', 
1377                 'id': '10153467542406923', 
1379                 'title': 'Facebook video #10153467542406923', 
1382         # Wordpress "YouTube Video Importer" plugin 
1384             'url': 'http://www.lothype.com/blue-devils-drumline-stanford-lot-2016/', 
1385             'md5': 'd16797741b560b485194eddda8121b48', 
1387                 'id': 'HNTXWDXV9Is', 
1389                 'title': 'Blue Devils Drumline Stanford lot 2016', 
1390                 'upload_date': '20160627', 
1391                 'uploader_id': 'GENOCIDE8GENERAL10', 
1392                 'uploader': 'cylus cyrus', 
1396             # video stored on custom kaltura server 
1397             'url': 'http://www.expansion.com/multimedia/videos.html?media=EQcM30NHIPv', 
1398             'md5': '537617d06e64dfed891fa1593c4b30cc', 
1402                 'title': 'Elecciones britƔnicas: 5 lecciones para Rajoy', 
1403                 'description': 'md5:435a89d68b9760b92ce67ed227055f16', 
1404                 'uploader_id': 'videos.expansion@el-mundo.net', 
1405                 'upload_date': '20150429', 
1406                 'timestamp': 1430303472, 
1408             'add_ie': ['Kaltura'], 
1411             # Non-standard Vimeo embed 
1412             'url': 'https://openclassrooms.com/courses/understanding-the-web', 
1413             'md5': '64d86f1c7d369afd9a78b38cbb88d80a', 
1417                 'title': 'Understanding the web - Teaser', 
1418                 'description': 'This is "Understanding the web - Teaser" by openclassrooms on Vimeo, the home for high quality videos and the people who love them.', 
1419                 'upload_date': '20151214', 
1420                 'uploader': 'OpenClassrooms', 
1421                 'uploader_id': 'openclassrooms', 
1423             'add_ie': ['Vimeo'], 
1426             # generic vimeo embed that requires original URL passed as Referer 
1427             'url': 'http://racing4everyone.eu/2016/07/30/formula-1-2016-round12-germany/', 
1428             'only_matching': True, 
1431             'url': 'https://support.arkena.com/display/PLAY/Ways+to+embed+your+video', 
1432             'md5': 'b96f2f71b359a8ecd05ce4e1daa72365', 
1434                 'id': 'b41dda37-d8e7-4d3f-b1b5-9a9db578bdfe', 
1436                 'title': 'Big Buck Bunny', 
1437                 'description': 'Royalty free test video', 
1438                 'timestamp': 1432816365, 
1439                 'upload_date': '20150528', 
1443                 'skip_download': True, 
1445             'add_ie': [ArkenaIE
.ie_key()], 
1448             'url': 'http://nova.bg/news/view/2016/08/16/156543/%D0%BD%D0%B0-%D0%BA%D0%BE%D1%81%D1%8A%D0%BC-%D0%BE%D1%82-%D0%B2%D0%B7%D1%80%D0%B8%D0%B2-%D0%BE%D1%82%D1%86%D0%B5%D0%BF%D0%B8%D1%85%D0%B0-%D1%86%D1%8F%D0%BB-%D0%BA%D0%B2%D0%B0%D1%80%D1%82%D0%B0%D0%BB-%D0%B7%D0%B0%D1%80%D0%B0%D0%B4%D0%B8-%D0%B8%D0%B7%D1%82%D0%B8%D1%87%D0%B0%D0%BD%D0%B5-%D0%BD%D0%B0-%D0%B3%D0%B0%D0%B7-%D0%B2-%D0%BF%D0%BB%D0%BE%D0%B2%D0%B4%D0%B8%D0%B2/', 
1452                 'title': 'ŠŠ ŠŠŠ”ŠŖŠ ŠŠ¢ ŠŠŠ ŠŠ: ŠŠ·ŃŠøŃŠ°Š½Šµ на газ на бензиноŃŃŠ°Š½ŃŠøŃ Š² ŠŠ»Š¾Š²Š“ив', 
1455                 'skip_download': True, 
1457             'add_ie': [Vbox7IE
.ie_key()], 
1461             'url': 'http://www.dagbladet.no/2016/02/23/nyheter/nordlys/ski/troms/ver/43254897/', 
1464                 'title': 'Etter ett Ƅrs planlegging, klaffet endelig alt: - Jeg mƄtte ta en liten dans', 
1466             'playlist_mincount': 3, 
1470             'url': 'http://forum.dvdtalk.com/movie-talk/623756-deleted-magic-star-wars-ot-deleted-alt-scenes-docu-style.html', 
1472                 'id': '623756-deleted-magic-star-wars-ot-deleted-alt-scenes-docu-style', 
1473                 'title': 'Deleted Magic - Star Wars: OT Deleted / Alt. Scenes Docu. Style - DVD Talk Forum', 
1475             'playlist_mincount': 2, 
1479             'url': 'http://www.20min.ch/schweiz/news/story/So-kommen-Sie-bei-Eis-und-Schnee-sicher-an-27032552', 
1483                 'title': 'So kommen Sie bei Eis und Schnee sicher an', 
1484                 'description': 'md5:117c212f64b25e3d95747e5276863f7d', 
1487                 'skip_download': True, 
1489             'add_ie': [TwentyMinutenIE
.ie_key()], 
1493             'url': 'https://en.support.wordpress.com/videopress/', 
1497                 'title': 'IMG_5786', 
1498                 'timestamp': 1435711927, 
1499                 'upload_date': '20150701', 
1502                 'skip_download': True, 
1504             'add_ie': [VideoPressIE
.ie_key()], 
1508             'url': 'http://magazzino.friday.ru/videos/vipuski/kazan-2', 
1510                 'id': '9b3d5bee0a8740bf70dfd29d3ea43541', 
1512                 'title': 'ŠŠ°Š³Š°Š·Š·ŠøŠ½Š¾: ŠŠ°Š·Š°Š½Ń 2', 
1513                 'description': 'md5:99bccdfac2269f0e8fdbc4bbc9db184a', 
1514                 'uploader': 'ŠŠ°Š³Š°Š·Š·ŠøŠ½Š¾', 
1515                 'upload_date': '20170228', 
1516                 'uploader_id': '996642', 
1519                 'skip_download': True, 
1521             'add_ie': [RutubeIE
.ie_key()], 
1524             # ThePlatform embedded with whitespaces in URLs 
1525             'url': 'http://www.golfchannel.com/topics/shows/golftalkcentral.htm', 
1526             'only_matching': True, 
1529         #     # TODO: find another test 
1530         #     # http://schema.org/VideoObject 
1531         #     'url': 'https://flipagram.com/f/nyvTSJMKId', 
1532         #     'md5': '888dcf08b7ea671381f00fab74692755', 
1534         #         'id': 'nyvTSJMKId', 
1536         #         'title': 'Flipagram by sjuria101 featuring Midnight Memories by One Direction', 
1537         #         'description': '#love for cats.', 
1538         #         'timestamp': 1461244995, 
1539         #         'upload_date': '20160421', 
1542         #         'force_generic_extractor': True, 
1547     def report_following_redirect(self
, new_url
): 
1548         """Report information extraction.""" 
1549         self
._downloader
.to_screen('[redirect] Following redirect to %s' % new_url
) 
1551     def _extract_rss(self
, url
, video_id
, doc
): 
1552         playlist_title 
= doc
.find('./channel/title').text
 
1553         playlist_desc_el 
= doc
.find('./channel/description') 
1554         playlist_desc 
= None if playlist_desc_el 
is None else playlist_desc_el
.text
 
1557         for it 
in doc
.findall('./channel/item'): 
1558             next_url 
= xpath_text(it
, 'link', fatal
=False) 
1560                 enclosure_nodes 
= it
.findall('./enclosure') 
1561                 for e 
in enclosure_nodes
: 
1562                     next_url 
= e
.attrib
.get('url') 
1572                 'title': it
.find('title').text
, 
1576             '_type': 'playlist', 
1578             'title': playlist_title
, 
1579             'description': playlist_desc
, 
1583     def _extract_camtasia(self
, url
, video_id
, webpage
): 
1584         """ Returns None if no camtasia video can be found. """ 
1586         camtasia_cfg 
= self
._search
_regex
( 
1587             r
'fo\.addVariable\(\s*"csConfigFile",\s*"([^"]+)"\s*\);', 
1588             webpage
, 'camtasia configuration file', default
=None) 
1589         if camtasia_cfg 
is None: 
1592         title 
= self
._html
_search
_meta
('DC.title', webpage
, fatal
=True) 
1594         camtasia_url 
= compat_urlparse
.urljoin(url
, camtasia_cfg
) 
1595         camtasia_cfg 
= self
._download
_xml
( 
1596             camtasia_url
, video_id
, 
1597             note
='Downloading camtasia configuration', 
1598             errnote
='Failed to download camtasia configuration') 
1599         fileset_node 
= camtasia_cfg
.find('./playlist/array/fileset') 
1602         for n 
in fileset_node
.getchildren(): 
1603             url_n 
= n
.find('./uri') 
1608                 'id': os
.path
.splitext(url_n
.text
.rpartition('/')[2])[0], 
1609                 'title': '%s - %s' % (title
, n
.tag
), 
1610                 'url': compat_urlparse
.urljoin(url
, url_n
.text
), 
1611                 'duration': float_or_none(n
.find('./duration').text
), 
1615             '_type': 'playlist', 
1620     def _real_extract(self
, url
): 
1621         if url
.startswith('//'): 
1624                 'url': self
.http_scheme() + url
, 
1627         parsed_url 
= compat_urlparse
.urlparse(url
) 
1628         if not parsed_url
.scheme
: 
1629             default_search 
= self
._downloader
.params
.get('default_search') 
1630             if default_search 
is None: 
1631                 default_search 
= 'fixup_error' 
1633             if default_search 
in ('auto', 'auto_warning', 'fixup_error'): 
1635                     self
._downloader
.report_warning('The url doesn\'t specify the protocol, trying with http') 
1636                     return self
.url_result('http://' + url
) 
1637                 elif default_search 
!= 'fixup_error': 
1638                     if default_search 
== 'auto_warning': 
1639                         if re
.match(r
'^(?:url|URL)$', url
): 
1640                             raise ExtractorError( 
1641                                 'Invalid URL:  %r . Call youtube-dl like this:  youtube-dl -v "https://www.youtube.com/watch?v=BaW_jenozKc"  ' % url
, 
1644                             self
._downloader
.report_warning( 
1645                                 'Falling back to youtube search for  %s . Set --default-search "auto" to suppress this warning.' % url
) 
1646                     return self
.url_result('ytsearch:' + url
) 
1648             if default_search 
in ('error', 'fixup_error'): 
1649                 raise ExtractorError( 
1650                     '%r is not a valid URL. ' 
1651                     'Set --default-search "ytsearch" (or run  youtube-dl "ytsearch:%s" ) to search YouTube' 
1652                     % (url
, url
), expected
=True) 
1654                 if ':' not in default_search
: 
1655                     default_search 
+= ':' 
1656                 return self
.url_result(default_search 
+ url
) 
1658         url
, smuggled_data 
= unsmuggle_url(url
) 
1659         force_videoid 
= None 
1660         is_intentional 
= smuggled_data 
and smuggled_data
.get('to_generic') 
1661         if smuggled_data 
and 'force_videoid' in smuggled_data
: 
1662             force_videoid 
= smuggled_data
['force_videoid'] 
1663             video_id 
= force_videoid
 
1665             video_id 
= self
._generic
_id
(url
) 
1667         self
.to_screen('%s: Requesting header' % video_id
) 
1669         head_req 
= HEADRequest(url
) 
1670         head_response 
= self
._request
_webpage
( 
1672             note
=False, errnote
='Could not send HEAD request to %s' % url
, 
1675         if head_response 
is not False: 
1676             # Check for redirect 
1677             new_url 
= head_response
.geturl() 
1679                 self
.report_following_redirect(new_url
) 
1681                     new_url 
= smuggle_url( 
1682                         new_url
, {'force_videoid': force_videoid
}) 
1683                 return self
.url_result(new_url
) 
1685         full_response 
= None 
1686         if head_response 
is False: 
1687             request 
= sanitized_Request(url
) 
1688             request
.add_header('Accept-Encoding', '*') 
1689             full_response 
= self
._request
_webpage
(request
, video_id
) 
1690             head_response 
= full_response
 
1694             'title': self
._generic
_title
(url
), 
1695             'upload_date': unified_strdate(head_response
.headers
.get('Last-Modified')) 
1698         # Check for direct link to a video 
1699         content_type 
= head_response
.headers
.get('Content-Type', '').lower() 
1700         m 
= re
.match(r
'^(?P<type>audio|video|application(?=/(?:ogg$|(?:vnd\.apple\.|x-)?mpegurl)))/(?P<format_id>[^;\s]+)', content_type
) 
1702             format_id 
= m
.group('format_id') 
1703             if format_id
.endswith('mpegurl'): 
1704                 formats 
= self
._extract
_m
3u8_formats
(url
, video_id
, 'mp4') 
1705             elif format_id 
== 'f4m': 
1706                 formats 
= self
._extract
_f
4m
_formats
(url
, video_id
) 
1709                     'format_id': m
.group('format_id'), 
1711                     'vcodec': 'none' if m
.group('type') == 'audio' else None 
1713                 info_dict
['direct'] = True 
1714             self
._sort
_formats
(formats
) 
1715             info_dict
['formats'] = formats
 
1718         if not self
._downloader
.params
.get('test', False) and not is_intentional
: 
1719             force 
= self
._downloader
.params
.get('force_generic_extractor', False) 
1720             self
._downloader
.report_warning( 
1721                 '%s on generic information extractor.' % ('Forcing' if force 
else 'Falling back')) 
1723         if not full_response
: 
1724             request 
= sanitized_Request(url
) 
1725             # Some webservers may serve compressed content of rather big size (e.g. gzipped flac) 
1726             # making it impossible to download only chunk of the file (yet we need only 512kB to 
1727             # test whether it's HTML or not). According to youtube-dl default Accept-Encoding 
1728             # that will always result in downloading the whole file that is not desirable. 
1729             # Therefore for extraction pass we have to override Accept-Encoding to any in order 
1730             # to accept raw bytes and being able to download only a chunk. 
1731             # It may probably better to solve this by checking Content-Type for application/octet-stream 
1732             # after HEAD request finishes, but not sure if we can rely on this. 
1733             request
.add_header('Accept-Encoding', '*') 
1734             full_response 
= self
._request
_webpage
(request
, video_id
) 
1736         first_bytes 
= full_response
.read(512) 
1738         # Is it an M3U playlist? 
1739         if first_bytes
.startswith(b
'#EXTM3U'): 
1740             info_dict
['formats'] = self
._extract
_m
3u8_formats
(url
, video_id
, 'mp4') 
1741             self
._sort
_formats
(info_dict
['formats']) 
1744         # Maybe it's a direct link to a video? 
1745         # Be careful not to download the whole thing! 
1746         if not is_html(first_bytes
): 
1747             self
._downloader
.report_warning( 
1748                 'URL could be a direct video link, returning it as such.') 
1755         webpage 
= self
._webpage
_read
_content
( 
1756             full_response
, url
, video_id
, prefix
=first_bytes
) 
1758         self
.report_extraction(video_id
) 
1760         # Is it an RSS feed, a SMIL file, an XSPF playlist or a MPD manifest? 
1762             doc 
= compat_etree_fromstring(webpage
.encode('utf-8')) 
1763             if doc
.tag 
== 'rss': 
1764                 return self
._extract
_rss
(url
, video_id
, doc
) 
1765             elif doc
.tag 
== 'SmoothStreamingMedia': 
1766                 info_dict
['formats'] = self
._parse
_ism
_formats
(doc
, url
) 
1767                 self
._sort
_formats
(info_dict
['formats']) 
1769             elif re
.match(r
'^(?:{[^}]+})?smil$', doc
.tag
): 
1770                 smil 
= self
._parse
_smil
(doc
, url
, video_id
) 
1771                 self
._sort
_formats
(smil
['formats']) 
1773             elif doc
.tag 
== '{http://xspf.org/ns/0/}playlist': 
1774                 return self
.playlist_result(self
._parse
_xspf
(doc
, video_id
), video_id
) 
1775             elif re
.match(r
'(?i)^(?:{[^}]+})?MPD$', doc
.tag
): 
1776                 info_dict
['formats'] = self
._parse
_mpd
_formats
( 
1778                     mpd_base_url
=full_response
.geturl().rpartition('/')[0], 
1780                 self
._sort
_formats
(info_dict
['formats']) 
1782             elif re
.match(r
'^{http://ns\.adobe\.com/f4m/[12]\.0}manifest$', doc
.tag
): 
1783                 info_dict
['formats'] = self
._parse
_f
4m
_formats
(doc
, url
, video_id
) 
1784                 self
._sort
_formats
(info_dict
['formats']) 
1786         except compat_xml_parse_error
: 
1789         # Is it a Camtasia project? 
1790         camtasia_res 
= self
._extract
_camtasia
(url
, video_id
, webpage
) 
1791         if camtasia_res 
is not None: 
1794         # Sometimes embedded video player is hidden behind percent encoding 
1795         # (e.g. https://github.com/rg3/youtube-dl/issues/2448) 
1796         # Unescaping the whole page allows to handle those cases in a generic way 
1797         webpage 
= compat_urllib_parse_unquote(webpage
) 
1799         # it's tempting to parse this further, but you would 
1800         # have to take into account all the variations like 
1801         #   Video Title - Site Name 
1802         #   Site Name | Video Title 
1803         #   Video Title - Tagline | Site Name 
1804         # and so on and so forth; it's just not practical 
1805         video_title 
= self
._og
_search
_title
( 
1806             webpage
, default
=None) or self
._html
_search
_regex
( 
1807             r
'(?s)<title>(.*?)</title>', webpage
, 'video title', 
1810         # Try to detect age limit automatically 
1811         age_limit 
= self
._rta
_search
(webpage
) 
1812         # And then there are the jokers who advertise that they use RTA, 
1813         # but actually don't. 
1814         AGE_LIMIT_MARKERS 
= [ 
1815             r
'Proudly Labeled <a href="http://www.rtalabel.org/" title="Restricted to Adults">RTA</a>', 
1817         if any(re
.search(marker
, webpage
) for marker 
in AGE_LIMIT_MARKERS
): 
1820         # video uploader is domain name 
1821         video_uploader 
= self
._search
_regex
( 
1822             r
'^(?:https?://)?([^/]*)/.*', url
, 'video uploader') 
1824         video_description 
= self
._og
_search
_description
(webpage
, default
=None) 
1825         video_thumbnail 
= self
._og
_search
_thumbnail
(webpage
, default
=None) 
1828         def _playlist_from_matches(matches
, getter
=None, ie
=None): 
1830                 self
.url_result(self
._proto
_relative
_url
(getter(m
) if getter 
else m
), ie
) 
1832             return self
.playlist_result( 
1833                 urlrs
, playlist_id
=video_id
, playlist_title
=video_title
) 
1835         # Look for Brightcove Legacy Studio embeds 
1836         bc_urls 
= BrightcoveLegacyIE
._extract
_brightcove
_urls
(webpage
) 
1838             self
.to_screen('Brightcove video detected.') 
1841                 'url': smuggle_url(bc_url
, {'Referer': url
}), 
1842                 'ie_key': 'BrightcoveLegacy' 
1843             } for bc_url 
in bc_urls
] 
1846                 '_type': 'playlist', 
1847                 'title': video_title
, 
1852         # Look for Brightcove New Studio embeds 
1853         bc_urls 
= BrightcoveNewIE
._extract
_urls
(webpage
) 
1855             return _playlist_from_matches(bc_urls
, ie
='BrightcoveNew') 
1857         # Look for ThePlatform embeds 
1858         tp_urls 
= ThePlatformIE
._extract
_urls
(webpage
) 
1860             return _playlist_from_matches(tp_urls
, ie
='ThePlatform') 
1862         # Look for Vessel embeds 
1863         vessel_urls 
= VesselIE
._extract
_urls
(webpage
) 
1865             return _playlist_from_matches(vessel_urls
, ie
=VesselIE
.ie_key()) 
1867         # Look for embedded rtl.nl player 
1868         matches 
= re
.findall( 
1869             r
'<iframe[^>]+?src="((?:https?:)?//(?:www\.)?rtl\.nl/system/videoplayer/[^"]+(?:video_)?embed[^"]+)"', 
1872             return _playlist_from_matches(matches
, ie
='RtlNl') 
1874         vimeo_urls 
= VimeoIE
._extract
_urls
(url
, webpage
) 
1876             return _playlist_from_matches(vimeo_urls
, ie
=VimeoIE
.ie_key()) 
1878         vid_me_embed_url 
= self
._search
_regex
( 
1879             r
'src=[\'"](https?://vid\.me/[^\'"]+)[\'"]', 
1880             webpage, 'vid.me embed', default=None) 
1881         if vid_me_embed_url is not None: 
1882             return self.url_result(vid_me_embed_url, 'Vidme') 
1884         # Look for embedded YouTube player 
1885         matches = re.findall(r'''(?x) 
1894                 (?P
<url
>(?
:https?
:)?
//(?
:www\
.)?
youtube(?
:-nocookie
)?\
.com
/ 
1898             return _playlist_from_matches( 
1899                 matches, lambda m: unescapeHTML(m[1])) 
1901         # Look for lazyYT YouTube embed 
1902         matches = re.findall( 
1903             r'class="lazyYT" data-youtube-id="([^"]+)"', webpage) 
1905             return _playlist_from_matches(matches, lambda m: unescapeHTML(m)) 
1907         # Look for Wordpress "YouTube Video Importer" plugin 
1908         matches = re.findall(r'''(?x
)<div
[^
>]+ 
1909             class=(?P
<q1
>[\'"])[^\'"]*\byvii
_single
_video
_player
\b[^
\'"]*(?P=q1)[^>]+ 
1910             data-video_id=(?P<q2>[\'"])([^
\'"]+)(?P=q2)''', webpage) 
1912             return _playlist_from_matches(matches, lambda m: m[-1]) 
1914         matches = DailymotionIE._extract_urls(webpage) 
1916             return _playlist_from_matches(matches) 
1918         # Look for embedded Dailymotion playlist player (#3822) 
1920             r'<iframe[^>]+?src=(["\'])(?P
<url
>(?
:https?
:)?
//(?
:www\
.)?dailymotion\
.[a
-z
]{2,3}/widget
/jukebox
\?.+?
)\
1', webpage) 
1922             playlists = re.findall( 
1923                 r'list\
[\
]=/playlist
/([^
/]+)/', unescapeHTML(m.group('url
'))) 
1925                 return _playlist_from_matches( 
1926                     playlists, lambda p: '//dailymotion
.com
/playlist
/%s' % p) 
1928         # Look for embedded Wistia player 
1930             r'<(?
:meta
[^
>]+?content|iframe
[^
>]+?src
)=(["\'])(?P<url>(?:https?:)?//(?:fast\.)?wistia\.net/embed/iframe/.+?)\1', webpage) 
1932             embed_url = self._proto_relative_url( 
1933                 unescapeHTML(match.group('url'))) 
1935                 '_type': 'url_transparent', 
1938                 'uploader': video_uploader, 
1941         match = re.search(r'(?:id=["\']wistia_|data
-wistia
-?
id=["\']|Wistia\.embed\(["\'])(?P
<id>[^
"\']+)', webpage) 
1944                 '_type': 'url_transparent', 
1945                 'url': 'wistia:%s' % match.group('id'), 
1947                 'uploader': video_uploader, 
1952                 <script[^>]+src=(["'])(?:https?:)?//fast\.wistia\.com/assets/external/E-v1\.js\1[^>]*>.*? 
1953                 <div[^>]+class=(["']).*?
\bwistia
_async
_(?P
<id>[a
-z0
-9]+)\b.*?\
2 
1956             return self.url_result(self._proto_relative_url( 
1957                 'wistia:%s' % match.group('id')), 'Wistia') 
1959         # Look for SVT player 
1960         svt_url = SVTIE._extract_url(webpage) 
1962             return self.url_result(svt_url, 'SVT') 
1964         # Look for embedded condenast player 
1965         matches = re.findall( 
1966             r'<iframe\s+(?:[a-zA-Z-]+="[^"]+"\s+)*?src="(https?://player\.cnevids\.com/embed/[^"]+")', 
1970                 '_type': 'playlist', 
1973                     'ie_key': 'CondeNast', 
1975                 } for ma in matches], 
1976                 'title': video_title, 
1980         # Look for Bandcamp pages with custom domain 
1981         mobj = re.search(r'<meta property="og:url"[^>]*?content="(.*?bandcamp\.com.*?)"', webpage) 
1982         if mobj is not None: 
1983             burl = unescapeHTML(mobj.group(1)) 
1984             # Don't set the extractor because it can be a track url or an album 
1985             return self.url_result(burl) 
1987         # Look for embedded Vevo player 
1989             r'<iframe[^>]+?src=(["\'])(?P<url>(?:https?:)?//(?:cache\.)?vevo\.com/.+?)\1', webpage) 
1990         if mobj is not None: 
1991             return self.url_result(mobj.group('url')) 
1993         # Look for embedded Viddler player 
1995             r'<(?:iframe[^>]+?src|param[^>]+?value)=(["\'])(?P<url>(?:https?:)?//(?:www\.)?viddler\.com/(?:embed|player)/.+?)\1', 
1997         if mobj is not None: 
1998             return self.url_result(mobj.group('url')) 
2000         # Look for NYTimes player 
2002             r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//graphics8\.nytimes\.com/bcvideo/[^/]+/iframe/embed\.html.+?)\1>', 
2004         if mobj is not None: 
2005             return self.url_result(mobj.group('url')) 
2007         # Look for Libsyn player 
2009             r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//html5-player\.libsyn\.com/embed/.+?)\1', webpage) 
2010         if mobj is not None: 
2011             return self.url_result(mobj.group('url')) 
2013         # Look for Ooyala videos 
2014         mobj = (re.search(r'player\.ooyala\.com/[^"?]+[?#][^"]*?(?:embedCode|ec)=(?P<ec>[^"&]+)', webpage) or 
2015                 re.search(r'OO\.Player\.create\([\'"].*?[\'"],\s*[\'"](?P<ec>.{32})[\'"]', webpage) or 
2016                 re.search(r'SBN\.VideoLinkset\.ooyala\([\'"](?P<ec>.{32})[\'"]\)', webpage) or 
2017                 re.search(r'data-ooyala-video-id\s*=\s*[\'"](?P<ec>.{32})[\'"]', webpage)) 
2018         if mobj is not None: 
2019             embed_token = self._search_regex( 
2020                 r'embedToken[\'"]?\s*:\s*[\'"]([^\'"]+)', 
2021                 webpage, 'ooyala embed token', default=None) 
2022             return OoyalaIE._build_url_result(smuggle_url( 
2025                     'embed_token': embed_token, 
2028         # Look for multiple Ooyala embeds on SBN network websites 
2029         mobj = re.search(r'SBN\.VideoLinkset\.entryGroup\((\[.*?\])', webpage) 
2030         if mobj is not None: 
2031             embeds = self._parse_json(mobj.group(1), video_id, fatal=False) 
2033                 return _playlist_from_matches( 
2034                     embeds, getter=lambda v: OoyalaIE._url_for_embed_code(smuggle_url(v['provider_video_id'], {'domain': url})), ie='Ooyala') 
2036         # Look for Aparat videos 
2037         mobj = re.search(r'<iframe .*?src="(http://www\.aparat\.com/video/[^"]+)"', webpage) 
2038         if mobj is not None: 
2039             return self.url_result(mobj.group(1), 'Aparat') 
2041         # Look for MPORA videos 
2042         mobj = re.search(r'<iframe .*?src="(http://mpora\.(?:com|de)/videos/[^"]+)"', webpage) 
2043         if mobj is not None: 
2044             return self.url_result(mobj.group(1), 'Mpora') 
2046         # Look for embedded NovaMov-based player 
2048             r'''(?x
)<(?
:pagespeed_
)?iframe
[^
>]+?src
=(["\']) 
2049                     (?P<url>http://(?:(?:embed|www)\.)? 
2051                            nowvideo\.(?:ch|sx|eu|at|ag|co)| 
2052                            videoweed\.(?:es|com)| 
2053                            movshare\.(?:net|sx|ag)| 
2054                            divxstage\.(?:eu|net|ch|co|at|ag)) 
2055                         /embed\.php.+?)\1''', webpage) 
2056         if mobj is not None: 
2057             return self.url_result(mobj.group('url')) 
2059         # Look for embedded Facebook player 
2060         facebook_url = FacebookIE._extract_url(webpage) 
2061         if facebook_url is not None: 
2062             return self.url_result(facebook_url, 'Facebook') 
2064         # Look for embedded VK player 
2065         mobj = re.search(r'<iframe[^>]+?src=(["\'])(?P
<url
>https?
://vk\
.com
/video_ext\
.php
.+?
)\
1', webpage) 
2066         if mobj is not None: 
2067             return self.url_result(mobj.group('url
'), 'VK
') 
2069         # Look for embedded Odnoklassniki player 
2070         mobj = re.search(r'<iframe
[^
>]+?src
=(["\'])(?P<url>https?://(?:odnoklassniki|ok)\.ru/videoembed/.+?)\1', webpage) 
2071         if mobj is not None: 
2072             return self.url_result(mobj.group('url'), 'Odnoklassniki') 
2074         # Look for embedded ivi player 
2075         mobj = re.search(r'<embed[^>]+?src=(["\'])(?P
<url
>https?
://(?
:www\
.)?ivi\
.ru
/video
/player
.+?
)\
1', webpage) 
2076         if mobj is not None: 
2077             return self.url_result(mobj.group('url
'), 'Ivi
') 
2079         # Look for embedded Huffington Post player 
2081             r'<iframe
[^
>]+?src
=(["\'])(?P<url>https?://embed\.live\.huffingtonpost\.com/.+?)\1', webpage) 
2082         if mobj is not None: 
2083             return self.url_result(mobj.group('url'), 'HuffPost') 
2086         mobj = re.search(r'class=["\']embedly
-card
["\'][^>]href=["\'](?P
<url
>[^
"\']+)', webpage) 
2087         if mobj is not None: 
2088             return self.url_result(mobj.group('url')) 
2089         mobj = re.search(r'class=["\']embedly
-embed
["\'][^>]src=["\'][^
"\']*url=(?P<url>[^&]+)', webpage) 
2090         if mobj is not None: 
2091             return self.url_result(compat_urllib_parse_unquote(mobj.group('url'))) 
2093         # Look for funnyordie embed 
2094         matches = re.findall(r'<iframe[^>]+?src="(https?
://(?
:www\
.)?funnyordie\
.com
/embed
/[^
"]+)"', webpage) 
2096             return _playlist_from_matches( 
2097                 matches, getter=unescapeHTML, ie='FunnyOrDie
') 
2099         # Look for BBC iPlayer embed 
2100         matches = re.findall(r'setPlaylist\
("(https?://www\.bbc\.co\.uk/iplayer/[^/]+/[\da-z]{8})"\
)', webpage) 
2102             return _playlist_from_matches(matches, ie='BBCCoUk
') 
2104         # Look for embedded RUTV player 
2105         rutv_url = RUTVIE._extract_url(webpage) 
2107             return self.url_result(rutv_url, 'RUTV
') 
2109         # Look for embedded TVC player 
2110         tvc_url = TVCIE._extract_url(webpage) 
2112             return self.url_result(tvc_url, 'TVC
') 
2114         # Look for embedded SportBox player 
2115         sportbox_urls = SportBoxEmbedIE._extract_urls(webpage) 
2117             return _playlist_from_matches(sportbox_urls, ie='SportBoxEmbed
') 
2119         # Look for embedded XHamster player 
2120         xhamster_urls = XHamsterEmbedIE._extract_urls(webpage) 
2122             return _playlist_from_matches(xhamster_urls, ie='XHamsterEmbed
') 
2124         # Look for embedded TNAFlixNetwork player 
2125         tnaflix_urls = TNAFlixNetworkEmbedIE._extract_urls(webpage) 
2127             return _playlist_from_matches(tnaflix_urls, ie=TNAFlixNetworkEmbedIE.ie_key()) 
2129         # Look for embedded PornHub player 
2130         pornhub_urls = PornHubIE._extract_urls(webpage) 
2132             return _playlist_from_matches(pornhub_urls, ie=PornHubIE.ie_key()) 
2134         # Look for embedded DrTuber player 
2135         drtuber_urls = DrTuberIE._extract_urls(webpage) 
2137             return _playlist_from_matches(drtuber_urls, ie=DrTuberIE.ie_key()) 
2139         # Look for embedded RedTube player 
2140         redtube_urls = RedTubeIE._extract_urls(webpage) 
2142             return _playlist_from_matches(redtube_urls, ie=RedTubeIE.ie_key()) 
2144         # Look for embedded Tvigle player 
2146             r'<iframe
[^
>]+?src
=(["\'])(?P<url>(?:https?:)?//cloud\.tvigle\.ru/video/.+?)\1', webpage) 
2147         if mobj is not None: 
2148             return self.url_result(mobj.group('url'), 'Tvigle') 
2150         # Look for embedded TED player 
2152             r'<iframe[^>]+?src=(["\'])(?P
<url
>https?
://embed(?
:-ssl
)?\
.ted\
.com
/.+?
)\
1', webpage) 
2153         if mobj is not None: 
2154             return self.url_result(mobj.group('url
'), 'TED
') 
2156         # Look for embedded Ustream videos 
2157         ustream_url = UstreamIE._extract_url(webpage) 
2159             return self.url_result(ustream_url, UstreamIE.ie_key()) 
2161         # Look for embedded arte.tv player 
2163             r'<(?
:script|iframe
) [^
>]*?src
="(?P<url>http://www\.arte\.tv/(?:playerv2/embed|arte_vp/index)[^"]+)"', 
2165         if mobj is not None: 
2166             return self.url_result(mobj.group('url'), 'ArteTVEmbed') 
2168         # Look for embedded francetv player 
2170             r'<iframe[^>]+?src=(["\'])(?P
<url
>(?
:https?
://)?embed\
.francetv\
.fr
/\?ue
=.+?
)\
1', 
2172         if mobj is not None: 
2173             return self.url_result(mobj.group('url
')) 
2175         # Look for embedded smotri.com player 
2176         smotri_url = SmotriIE._extract_url(webpage) 
2178             return self.url_result(smotri_url, 'Smotri
') 
2180         # Look for embedded Myvi.ru player 
2181         myvi_url = MyviIE._extract_url(webpage) 
2183             return self.url_result(myvi_url) 
2185         # Look for embedded soundcloud player 
2186         soundcloud_urls = SoundcloudIE._extract_urls(webpage) 
2188             return _playlist_from_matches(soundcloud_urls, getter=unescapeHTML, ie=SoundcloudIE.ie_key()) 
2190         # Look for tunein player 
2191         tunein_urls = TuneInBaseIE._extract_urls(webpage) 
2193             return _playlist_from_matches(tunein_urls) 
2195         # Look for embedded mtvservices player 
2196         mtvservices_url = MTVServicesEmbeddedIE._extract_url(webpage) 
2198             return self.url_result(mtvservices_url, ie='MTVServicesEmbedded
') 
2200         # Look for embedded yahoo player 
2202             r'<iframe
[^
>]+?src
=(["\'])(?P<url>https?://(?:screen|movies)\.yahoo\.com/.+?\.html\?format=embed)\1', 
2204         if mobj is not None: 
2205             return self.url_result(mobj.group('url'), 'Yahoo') 
2207         # Look for embedded sbs.com.au player 
2211                 <meta\s+property="og
:video
"\s+content=| 
2214             (["\'])(?P
<url
>https?
://(?
:www\
.)?sbs\
.com\
.au
/ondemand
/video
/.+?
)\
1''', 
2216         if mobj is not None: 
2217             return self.url_result(mobj.group('url'), 'SBS') 
2219         # Look for embedded Cinchcast player 
2221             r'<iframe[^>]+?src=(["\'])(?P<url>https?://player\.cinchcast\.com/.+?)\1', 
2223         if mobj is not None: 
2224             return self.url_result(mobj.group('url'), 'Cinchcast') 
2227             r'<iframe[^>]+?src=(["\'])(?P<url>https?://m(?:lb)?\.mlb\.com/shared/video/embed/embed\.html\?.+?)\1', 
2231                 r'data-video-link=["\'](?P<url>http://m.mlb.com/video/[^"\']+)', 
2233         if mobj is not None: 
2234             return self.url_result(mobj.group('url'), 'MLB') 
2237             r'<(?:iframe|script)[^>]+?src=(["\'])(?P<url>%s)\1' % CondeNastIE.EMBED_URL, 
2239         if mobj is not None: 
2240             return self.url_result(self._proto_relative_url(mobj.group('url'), scheme='http:'), 'CondeNast') 
2243             r'<iframe[^>]+src="(?P<url>https?://(?:new\.)?livestream\.com/[^"]+/player[^"]+)"', 
2245         if mobj is not None: 
2246             return self.url_result(mobj.group('url'), 'Livestream') 
2248         # Look for Zapiks embed 
2250             r'<iframe[^>]+src="(?P<url>https?://(?:www\.)?zapiks\.fr/index\.php\?.+?)"', webpage) 
2251         if mobj is not None: 
2252             return self.url_result(mobj.group('url'), 'Zapiks') 
2254         # Look for Kaltura embeds 
2255         kaltura_url = KalturaIE._extract_url(webpage) 
2257             return self.url_result(smuggle_url(kaltura_url, {'source_url': url}), KalturaIE.ie_key()) 
2259         # Look for Eagle.Platform embeds 
2260         eagleplatform_url = EaglePlatformIE._extract_url(webpage) 
2261         if eagleplatform_url: 
2262             return self.url_result(eagleplatform_url, EaglePlatformIE.ie_key()) 
2264         # Look for ClipYou (uses Eagle.Platform) embeds 
2266             r'<iframe[^>]+src="https?://(?P<host>media\.clipyou\.ru)/index/player\?.*\brecord_id=(?P<id>\d+).*"', webpage) 
2267         if mobj is not None: 
2268             return self.url_result('eagleplatform:%(host)s:%(id)s' % mobj.groupdict(), 'EaglePlatform') 
2270         # Look for Pladform embeds 
2271         pladform_url = PladformIE._extract_url(webpage) 
2273             return self.url_result(pladform_url) 
2275         # Look for Videomore embeds 
2276         videomore_url = VideomoreIE._extract_url(webpage) 
2278             return self.url_result(videomore_url) 
2280         # Look for Webcaster embeds 
2281         webcaster_url = WebcasterFeedIE._extract_url(self, webpage) 
2283             return self.url_result(webcaster_url, ie=WebcasterFeedIE.ie_key()) 
2285         # Look for Playwire embeds 
2287             r'<script[^>]+data-config=(["\'])(?P<url>(?:https?:)?//config\.playwire\.com/.+?)\1', webpage) 
2288         if mobj is not None: 
2289             return self.url_result(mobj.group('url')) 
2291         # Look for 5min embeds 
2293             r'<meta[^>]+property="og:video"[^>]+content="https?://embed\.5min\.com/(?P<id>[0-9]+)/?', webpage) 
2294         if mobj is not None: 
2295             return self.url_result('5min:%s' % mobj.group('id'), 'FiveMin') 
2297         # Look for Crooks and Liars embeds 
2299             r'<(?:iframe[^>]+src|param[^>]+value)=(["\'])(?P<url>(?:https?:)?//embed\.crooksandliars\.com/(?:embed|v)/.+?)\1', webpage) 
2300         if mobj is not None: 
2301             return self.url_result(mobj.group('url')) 
2303         # Look for NBC Sports VPlayer embeds 
2304         nbc_sports_url = NBCSportsVPlayerIE._extract_url(webpage) 
2306             return self.url_result(nbc_sports_url, 'NBCSportsVPlayer') 
2308         # Look for NBC News embeds 
2309         nbc_news_embed_url = re.search( 
2310             r'<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//www\.nbcnews\.com/widget/video-embed/[^"\']+)\1', webpage) 
2311         if nbc_news_embed_url: 
2312             return self.url_result(nbc_news_embed_url.group('url'), 'NBCNews') 
2314         # Look for Google Drive embeds 
2315         google_drive_url = GoogleDriveIE._extract_url(webpage) 
2316         if google_drive_url: 
2317             return self.url_result(google_drive_url, 'GoogleDrive') 
2319         # Look for UDN embeds 
2321             r'<iframe[^>]+src="(?P<url>%s)"' % UDNEmbedIE._PROTOCOL_RELATIVE_VALID_URL, webpage) 
2322         if mobj is not None: 
2323             return self.url_result( 
2324                 compat_urlparse.urljoin(url, mobj.group('url')), 'UDNEmbed') 
2326         # Look for Senate ISVP iframe 
2327         senate_isvp_url = SenateISVPIE._search_iframe_url(webpage) 
2329             return self.url_result(senate_isvp_url, 'SenateISVP') 
2331         # Look for Dailymotion Cloud videos 
2332         dmcloud_url = DailymotionCloudIE._extract_dmcloud_url(webpage) 
2334             return self.url_result(dmcloud_url, 'DailymotionCloud') 
2336         # Look for OnionStudios embeds 
2337         onionstudios_url = OnionStudiosIE._extract_url(webpage) 
2338         if onionstudios_url: 
2339             return self.url_result(onionstudios_url) 
2341         # Look for ViewLift embeds 
2342         viewlift_url = ViewLiftEmbedIE._extract_url(webpage) 
2344             return self.url_result(viewlift_url) 
2346         # Look for JWPlatform embeds 
2347         jwplatform_url = JWPlatformIE._extract_url(webpage) 
2349             return self.url_result(jwplatform_url, 'JWPlatform') 
2351         # Look for Digiteka embeds 
2352         digiteka_url = DigitekaIE._extract_url(webpage) 
2354             return self.url_result(self._proto_relative_url(digiteka_url), DigitekaIE.ie_key()) 
2356         # Look for Arkena embeds 
2357         arkena_url = ArkenaIE._extract_url(webpage) 
2359             return self.url_result(arkena_url, ArkenaIE.ie_key()) 
2361         # Look for Piksel embeds 
2362         piksel_url = PikselIE._extract_url(webpage) 
2364             return self.url_result(piksel_url, PikselIE.ie_key()) 
2366         # Look for Limelight embeds 
2367         mobj = re.search(r'LimelightPlayer\.doLoad(Media|Channel|ChannelList)\(["\'](?P<id>[a-z0-9]{32})', webpage) 
2371                 'Channel': 'channel', 
2372                 'ChannelList': 'channel_list', 
2374             return self.url_result(smuggle_url('limelight:%s:%s' % ( 
2375                 lm[mobj.group(1)], mobj.group(2)), {'source_url': url}), 
2376                 'Limelight%s' % mobj.group(1), mobj.group(2)) 
2380                 <object[^
>]+class=(["\'])LimelightEmbeddedPlayerFlash\1[^>]*>.*? 
2382                         name=(["\'])flashVars\
2[^
>]+ 
2383                         value
=(["\'])(?:(?!\3).)*mediaId=(?P<id>[a-z0-9]{32}) 
2386             return self.url_result(smuggle_url( 
2387                 'limelight:media:%s' % mobj.group('id'), 
2388                 {'source_url': url}), 'LimelightMedia', mobj.group('id')) 
2390         # Look for AdobeTVVideo embeds 
2392             r'<iframe[^>]+src=[\'"]((?
:https?
:)?
//video\
.tv\
.adobe\
.com
/v
/\d
+[^
"]+)[\'"]', 
2394         if mobj is not None: 
2395             return self.url_result( 
2396                 self._proto_relative_url(unescapeHTML(mobj.group(1))), 
2399         # Look for Vine embeds 
2401             r'<iframe
[^
>]+src
=[\'"]((?:https?:)?//(?:www\.)?vine\.co/v/[^/]+/embed/(?:simple|postcard))', 
2403         if mobj is not None: 
2404             return self.url_result( 
2405                 self._proto_relative_url(unescapeHTML(mobj.group(1))), 'Vine') 
2407         # Look for VODPlatform embeds 
2409             r'<iframe[^>]+src=(["\'])(?P
<url
>(?
:https?
:)?
//(?
:www\
.)?vod
-platform\
.net
/[eE
]mbed
/.+?
)\
1', 
2411         if mobj is not None: 
2412             return self.url_result( 
2413                 self._proto_relative_url(unescapeHTML(mobj.group('url
'))), 'VODPlatform
') 
2415         # Look for Mangomolo embeds 
2417             r'''(?x)<iframe[^>]+src=(["\'])(?P<url>(?:https?:)?//(?:www\.)?admin\.mangomolo\.com/analytics/index\.php/customers/embed/ 
2419                     video\?.*?\bid=(?P<video_id>\d+)| 
2420                     index\?.*?\bchannelid=(?P<channel_id>(?:[A-Za-z0-9+/=]|%2B|%2F|%3D)+) 
2421                 ).+?)\1''', webpage) 
2422         if mobj is not None: 
2424                 '_type
': 'url_transparent
', 
2425                 'url
': self._proto_relative_url(unescapeHTML(mobj.group('url
'))), 
2426                 'title
': video_title, 
2427                 'description
': video_description, 
2428                 'thumbnail
': video_thumbnail, 
2429                 'uploader
': video_uploader, 
2431             video_id = mobj.group('video_id
') 
2434                     'ie_key
': 'MangomoloVideo
', 
2439                     'ie_key
': 'MangomoloLive
', 
2440                     'id': mobj.group('channel_id
'), 
2444         # Look for Instagram embeds 
2445         instagram_embed_url = InstagramIE._extract_embed_url(webpage) 
2446         if instagram_embed_url is not None: 
2447             return self.url_result( 
2448                 self._proto_relative_url(instagram_embed_url), InstagramIE.ie_key()) 
2450         # Look for LiveLeak embeds 
2451         liveleak_url = LiveLeakIE._extract_url(webpage) 
2453             return self.url_result(liveleak_url, 'LiveLeak
') 
2455         # Look for 3Q SDN embeds 
2456         threeqsdn_url = ThreeQSDNIE._extract_url(webpage) 
2459                 '_type
': 'url_transparent
', 
2460                 'ie_key
': ThreeQSDNIE.ie_key(), 
2461                 'url
': self._proto_relative_url(threeqsdn_url), 
2462                 'title
': video_title, 
2463                 'description
': video_description, 
2464                 'thumbnail
': video_thumbnail, 
2465                 'uploader
': video_uploader, 
2468         # Look for VBOX7 embeds 
2469         vbox7_url = Vbox7IE._extract_url(webpage) 
2471             return self.url_result(vbox7_url, Vbox7IE.ie_key()) 
2473         # Look for DBTV embeds 
2474         dbtv_urls = DBTVIE._extract_urls(webpage) 
2476             return _playlist_from_matches(dbtv_urls, ie=DBTVIE.ie_key()) 
2478         # Look for Videa embeds 
2479         videa_urls = VideaIE._extract_urls(webpage) 
2481             return _playlist_from_matches(videa_urls, ie=VideaIE.ie_key()) 
2483         # Look for 20 minuten embeds 
2484         twentymin_urls = TwentyMinutenIE._extract_urls(webpage) 
2486             return _playlist_from_matches( 
2487                 twentymin_urls, ie=TwentyMinutenIE.ie_key()) 
2489         # Look for Openload embeds 
2490         openload_urls = OpenloadIE._extract_urls(webpage) 
2492             return _playlist_from_matches( 
2493                 openload_urls, ie=OpenloadIE.ie_key()) 
2495         # Look for VideoPress embeds 
2496         videopress_urls = VideoPressIE._extract_urls(webpage) 
2498             return _playlist_from_matches( 
2499                 videopress_urls, ie=VideoPressIE.ie_key()) 
2501         # Look for Rutube embeds 
2502         rutube_urls = RutubeIE._extract_urls(webpage) 
2504             return _playlist_from_matches( 
2505                 rutube_urls, ie=RutubeIE.ie_key()) 
2507         # Looking for http://schema.org/VideoObject 
2508         json_ld = self._search_json_ld( 
2509             webpage, video_id, default={}, expected_type='VideoObject
') 
2510         if json_ld.get('url
'): 
2512                 'title
': video_title or info_dict['title
'], 
2513                 'description
': video_description, 
2514                 'thumbnail
': video_thumbnail, 
2515                 'age_limit
': age_limit 
2517             info_dict.update(json_ld) 
2520         # Look for HTML5 media 
2521         entries = self._parse_html5_media_entries(url, webpage, video_id, m3u8_id='hls
') 
2523             for entry in entries: 
2526                     'title
': video_title, 
2528                 self._sort_formats(entry['formats
']) 
2529             return self.playlist_result(entries) 
2531         jwplayer_data_str = self._find_jwplayer_data(webpage) 
2532         if jwplayer_data_str: 
2534                 jwplayer_data = self._parse_json( 
2535                     jwplayer_data_str, video_id, transform_source=js_to_json) 
2536                 return self._parse_jwplayer_data(jwplayer_data, video_id) 
2537             except ExtractorError: 
2540         def check_video(vurl): 
2541             if YoutubeIE.suitable(vurl): 
2543             if RtmpIE.suitable(vurl): 
2545             vpath = compat_urlparse.urlparse(vurl).path 
2546             vext = determine_ext(vpath) 
2547             return '.' in vpath and vext not in ('swf
', 'png
', 'jpg
', 'srt
', 'sbv
', 'sub
', 'vtt
', 'ttml
', 'js
') 
2549         def filter_video(urls): 
2550             return list(filter(check_video, urls)) 
2552         # Start with something easy: JW Player in SWFObject 
2553         found = filter_video(re.findall(r'flashvars
: [\'"](?:.*&)?file=(http[^\'"&]*)', webpage)) 
2555             # Look for gorilla-vid style embedding 
2556             found = filter_video(re.findall(r'''(?sx) 
2560                     jwplayer\s*\(\s*["'][^
'"]+["']\s
*\
)\s
*\
.setup
 
2563                 ['"]?file['"]?\s*:\s*["\'](.*?
)["\']''', webpage)) 
2565             # Broaden the search a little bit 
2566             found = filter_video(re.findall(r'[^A-Za-z0-9]?(?:file|source)=(http[^\'"&]*)', webpage)) 
2568             # Broaden the findall a little bit: JWPlayer JS loader 
2569             found = filter_video(re.findall( 
2570                 r'[^A
-Za
-z0
-9]?
(?
:file|video_url
)["\']?:\s*["\'](http(?
![^
\'"]+\.[0-9]+[\'"])[^
\'"]+)["\']', webpage)) 
2573             found = filter_video(re.findall(r'''(?xs) 
2574                 flowplayer\("[^"]+",\s* 
2576                     \s*\{[^}]+? ["']?clip
["']?\s*:\s*\{\s* 
2577                         ["']?url["']?\s
*:\s
*["']([^"']+)["'] 
2582                 r"cinerama\.embedPlayer\(\s*\'[^']+\',\s*'([^']+)'", webpage) 
2584             # Try to find twitter cards info 
2585             # twitter:player:stream should be checked before twitter:player since 
2586             # it is expected to contain a raw stream (see 
2587             # https://dev.twitter.com/cards/types/player#On_twitter.com_via_desktop_browser) 
2588             found = filter_video(re.findall( 
2589                 r'<meta (?:property|name)="twitter:player:stream" (?:content|value)="(.+?)"', webpage)) 
2591             # We look for Open Graph info: 
2592             # We have to match any number spaces between elements, some sites try to align them (eg.: statigr.am) 
2593             m_video_type = re.findall(r'<meta.*?property="og:video:type".*?content="video/(.*?)"', webpage) 
2594             # We only look in og:video if the MIME type is a video, don't try if it's a Flash player: 
2595             if m_video_type is not None: 
2596                 found = filter_video(re.findall(r'<meta.*?property="og:video".*?content="(.*?)"', webpage)) 
2598             REDIRECT_REGEX = r'[0-9]{,2};\s*(?:URL|url)=\'?([^\'"]+)' 
2600                 r'(?i)<meta\s+(?=(?:[a-z-]+="[^"]+"\s+)*http-equiv="refresh")' 
2601                 r'(?:[a-z-]+="[^"]+"\s+)*?content="%s' % REDIRECT_REGEX, 
2604                 # Look also in Refresh HTTP header 
2605                 refresh_header = head_response.headers.get('Refresh') 
2607                     # In python 2 response HTTP headers are bytestrings 
2608                     if sys.version_info < (3, 0) and isinstance(refresh_header, str): 
2609                         refresh_header = refresh_header.decode('iso-8859-1') 
2610                     found = re.search(REDIRECT_REGEX, refresh_header) 
2612                 new_url = compat_urlparse.urljoin(url, unescapeHTML(found.group(1))) 
2613                 self.report_following_redirect(new_url) 
2620             # twitter:player is a https URL to iframe player that may or may not 
2621             # be supported by youtube-dl thus this is checked the very last (see 
2622             # https://dev.twitter.com/cards/types/player#On_twitter.com_via_desktop_browser) 
2623             embed_url = self._html_search_meta('twitter:player', webpage, default=None) 
2625                 return self.url_result(embed_url) 
2628             raise UnsupportedError(url) 
2631         for video_url in orderedSet(found): 
2632             video_url = unescapeHTML(video_url) 
2633             video_url = video_url.replace('\\/', '/') 
2634             video_url = compat_urlparse.urljoin(url, video_url) 
2635             video_id = compat_urllib_parse_unquote(os.path.basename(video_url)) 
2637             # Sometimes, jwplayer extraction will result in a YouTube URL 
2638             if YoutubeIE.suitable(video_url): 
2639                 entries.append(self.url_result(video_url, 'Youtube')) 
2642             # here's a fun little line of code for you: 
2643             video_id = os.path.splitext(video_id)[0] 
2647                 'uploader': video_uploader, 
2648                 'title': video_title, 
2649                 'age_limit': age_limit, 
2652             if RtmpIE.suitable(video_url): 
2653                 entry_info_dict.update({ 
2654                     '_type': 'url_transparent', 
2655                     'ie_key': RtmpIE.ie_key(), 
2658                 entries.append(entry_info_dict) 
2661             ext = determine_ext(video_url) 
2663                 entry_info_dict['formats'] = self._extract_smil_formats(video_url, video_id) 
2665                 return self.playlist_result(self._extract_xspf_playlist(video_url, video_id), video_id) 
2667                 entry_info_dict['formats'] = self._extract_m3u8_formats(video_url, video_id, ext='mp4') 
2669                 entry_info_dict['formats'] = self._extract_mpd_formats(video_url, video_id) 
2671                 entry_info_dict['formats'] = self._extract_f4m_formats(video_url, video_id) 
2672             elif re.search(r'(?i)\.(?:ism|smil)/manifest', video_url) and video_url != url: 
2673                 # Just matching .ism/manifest is not enough to be reliably sure 
2674                 # whether it's actually an ISM manifest or some other streaming 
2675                 # manifest since there are various streaming URL formats 
2676                 # possible (see [1]) as well as some other shenanigans like 
2677                 # .smil/manifest URLs that actually serve an ISM (see [2]) and 
2679                 # Thus the most reasonable way to solve this is to delegate 
2680                 # to generic extractor in order to look into the contents of 
2681                 # the manifest itself. 
2682                 # 1. https://azure.microsoft.com/en-us/documentation/articles/media-services-deliver-content-overview/#streaming-url-formats 
2683                 # 2. https://svs.itworkscdn.net/lbcivod/smil:itwfcdn/lbci/170976.smil/Manifest 
2684                 entry_info_dict = self.url_result( 
2685                     smuggle_url(video_url, {'to_generic': True}), 
2688                 entry_info_dict['url'] = video_url 
2690             if entry_info_dict.get('formats'): 
2691                 self._sort_formats(entry_info_dict['formats']) 
2693             entries.append(entry_info_dict) 
2695         if len(entries) == 1: 
2698             for num, e in enumerate(entries, start=1): 
2699                 # 'url' results don't have a title 
2700                 if e.get('title') is not None: 
2701                     e['title'] = '%s (%d)' % (e['title'], num) 
2703                 '_type': 'playlist',