From 6f5ac90cf314e8e1a7c5c416fb51e3a7b8483e9c Mon Sep 17 00:00:00 2001 From: Philipp Hagemeister Date: Thu, 27 Jun 2013 20:46:46 +0200 Subject: [PATCH] Move tests to the IE definitions --- test/tests.json | 480 +------------------------- youtube_dl/extractor/ard.py | 9 + youtube_dl/extractor/bandcamp.py | 9 + youtube_dl/extractor/bliptv.py | 11 + youtube_dl/extractor/breakcom.py | 8 + youtube_dl/extractor/comedycentral.py | 11 + youtube_dl/extractor/cspan.py | 9 + youtube_dl/extractor/dailymotion.py | 9 + youtube_dl/extractor/escapist.py | 10 + youtube_dl/extractor/facebook.py | 9 + youtube_dl/extractor/flickr.py | 10 + youtube_dl/extractor/funnyordie.py | 9 + youtube_dl/extractor/gametrailers.py | 9 + youtube_dl/extractor/generic.py | 9 + youtube_dl/extractor/hotnewhiphop.py | 8 + youtube_dl/extractor/howcast.py | 9 + youtube_dl/extractor/hypem.py | 8 + youtube_dl/extractor/ina.py | 8 + youtube_dl/extractor/justintv.py | 11 + youtube_dl/extractor/keek.py | 9 + youtube_dl/extractor/liveleak.py | 10 + youtube_dl/extractor/myspass.py | 9 + youtube_dl/extractor/myvideo.py | 8 + youtube_dl/extractor/nba.py | 9 + youtube_dl/extractor/photobucket.py | 10 + youtube_dl/extractor/pornotube.py | 9 + youtube_dl/extractor/rbmaradio.py | 12 + youtube_dl/extractor/redtube.py | 8 + youtube_dl/extractor/soundcloud.py | 11 + youtube_dl/extractor/spiegel.py | 8 + youtube_dl/extractor/stanfordoc.py | 8 + youtube_dl/extractor/statigram.py | 9 + youtube_dl/extractor/teamcoco.py | 9 + youtube_dl/extractor/ted.py | 9 + youtube_dl/extractor/tudou.py | 8 + youtube_dl/extractor/tumblr.py | 8 + youtube_dl/extractor/ustream.py | 9 + youtube_dl/extractor/vbox7.py | 8 + youtube_dl/extractor/vevo.py | 10 + youtube_dl/extractor/vimeo.py | 12 + youtube_dl/extractor/vine.py | 9 + youtube_dl/extractor/wimp.py | 8 + youtube_dl/extractor/xhamster.py | 10 + youtube_dl/extractor/xnxx.py | 8 + youtube_dl/extractor/xvideos.py | 8 + youtube_dl/extractor/yahoo.py | 9 + youtube_dl/extractor/youjizz.py | 8 + youtube_dl/extractor/youporn.py | 11 + 48 files changed, 431 insertions(+), 479 deletions(-) diff --git a/test/tests.json b/test/tests.json index ce4e7fe088..fe51488c70 100644 --- a/test/tests.json +++ b/test/tests.json @@ -1,479 +1 @@ -[ - { - "name": "Dailymotion", - "md5": "392c4b85a60a90dc4792da41ce3144eb", - "url": "http://www.dailymotion.com/video/x33vw9_tutoriel-de-youtubeur-dl-des-video_tech", - "file": "x33vw9.mp4", - "info_dict": { - "uploader": "Alex and Van .", - "title": "Tutoriel de Youtubeur\"DL DES VIDEO DE YOUTUBE\"" - } - }, - { - "name": "BlipTV", - "md5": "b2d849efcf7ee18917e4b4d9ff37cafe", - "url": "http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352", - "file": "5779306.m4v", - "info_dict": { - "upload_date": "20111205", - "description": "md5:9bc31f227219cde65e47eeec8d2dc596", - "uploader": "Comic Book Resources - CBR TV", - "title": "CBR EXCLUSIVE: \"Gotham City Imposters\" Bats VS Jokerz Short 3" - } - }, - { - "name": "XVideos", - "md5": "1d0c835822f0a71a7bf011855db929d0", - "url": "http://www.xvideos.com/video939581/funny_porns_by_s_-1", - "file": "939581.flv", - "info_dict": { - "title": "Funny Porns By >>>>S<<<<<< -1" - } - }, - { - "name": "YouPorn", - "md5": "c37ddbaaa39058c76a7e86c6813423c1", - "url": "http://www.youporn.com/watch/505835/sex-ed-is-it-safe-to-masturbate-daily/", - "file": "505835.mp4", - "info_dict": { - "upload_date": "20101221", - "description": "Love & Sex Answers: http://bit.ly/DanAndJenn -- Is It Unhealthy To Masturbate Daily?", - "uploader": "Ask Dan And Jennifer", - "title": "Sex Ed: Is It Safe To Masturbate Daily?" - } - }, - { - "name": "Pornotube", - "md5": "374dd6dcedd24234453b295209aa69b6", - "url": "http://pornotube.com/c/173/m/1689755/Marilyn-Monroe-Bathing", - "file": "1689755.flv", - "info_dict": { - "upload_date": "20090708", - "title": "Marilyn-Monroe-Bathing" - } - }, - { - "name": "YouJizz", - "md5": "07e15fa469ba384c7693fd246905547c", - "url": "http://www.youjizz.com/videos/zeichentrick-1-2189178.html", - "file": "2189178.flv", - "info_dict": { - "title": "Zeichentrick 1" - } - }, - { - "name": "Vimeo", - "md5": "8879b6cc097e987f02484baf890129e5", - "url": "http://vimeo.com/56015672", - "file": "56015672.mp4", - "info_dict": { - "title": "youtube-dl test video - ★ \" ' 幸 / \\ ä ↭ 𝕐", - "uploader": "Filippo Valsorda", - "uploader_id": "user7108434", - "upload_date": "20121220", - "description": "This is a test case for youtube-dl.\nFor more information, see github.com/rg3/youtube-dl\nTest chars: ★ \" ' 幸 / \\ ä ↭ 𝕐" - } - }, - { - "name": "Soundcloud", - "md5": "ebef0a451b909710ed1d7787dddbf0d7", - "url": "http://soundcloud.com/ethmusic/lostin-powers-she-so-heavy", - "file": "62986583.mp3", - "info_dict": { - "upload_date": "20121011", - "description": "No Downloads untill we record the finished version this weekend, i was too pumped n i had to post it , earl is prolly gonna b hella p.o'd", - "uploader": "E.T. ExTerrestrial Music", - "title": "Lostin Powers - She so Heavy (SneakPreview) Adrian Ackers Blueprint 1" - } - }, - { - "name": "StanfordOpenClassroom", - "md5": "544a9468546059d4e80d76265b0443b8", - "url": "http://openclassroom.stanford.edu/MainFolder/VideoPage.php?course=PracticalUnix&video=intro-environment&speed=100", - "file": "PracticalUnix_intro-environment.mp4", - "info_dict": { - "title": "Intro Environment" - } - }, - { - "name": "XNXX", - "md5": "0831677e2b4761795f68d417e0b7b445", - "url": "http://video.xnxx.com/video1135332/lida_naked_funny_actress_5_", - "file": "1135332.flv", - "info_dict": { - "title": "lida » Naked Funny Actress (5)" - } - }, - { - "name": "NBA", - "url": "http://www.nba.com/video/games/nets/2012/12/04/0021200253-okc-bkn-recap.nba/index.html", - "file": "0021200253-okc-bkn-recap.nba.mp4", - "md5": "c0edcfc37607344e2ff8f13c378c88a4", - "info_dict": { - "description": "Kevin Durant scores 32 points and dishes out six assists as the Thunder beat the Nets in Brooklyn.", - "title": "Thunder vs. Nets" - } - }, - { - "name": "JustinTV", - "url": "http://www.twitch.tv/thegamedevhub/b/296128360", - "file": "296128360.flv", - "md5": "ecaa8a790c22a40770901460af191c9a", - "info_dict": { - "upload_date": "20110927", - "uploader_id": 25114803, - "uploader": "thegamedevhub", - "title": "Beginner Series - Scripting With Python Pt.1" - } - }, - { - "name": "MyVideo", - "url": "http://www.myvideo.de/watch/8229274/bowling_fail_or_win", - "file": "8229274.flv", - "md5": "2d2753e8130479ba2cb7e0a37002053e", - "info_dict": { - "title": "bowling-fail-or-win" - } - }, - { - "name": "Escapist", - "url": "http://www.escapistmagazine.com/videos/view/the-escapist-presents/6618-Breaking-Down-Baldurs-Gate", - "file": "6618-Breaking-Down-Baldurs-Gate.mp4", - "md5": "c6793dbda81388f4264c1ba18684a74d", - "info_dict": { - "description": "Baldur's Gate: Original, Modded or Enhanced Edition? I'll break down what you can expect from the new Baldur's Gate: Enhanced Edition.", - "uploader": "the-escapist-presents", - "title": "Breaking Down Baldur's Gate" - } - }, - { - "name": "FunnyOrDie", - "url": "http://www.funnyordie.com/videos/0732f586d7/heart-shaped-box-literal-video-version", - "file": "0732f586d7.mp4", - "md5": "f647e9e90064b53b6e046e75d0241fbd", - "info_dict": { - "description": "Lyrics changed to match the video. Spoken cameo by Obscurus Lupa (from ThatGuyWithTheGlasses.com). Based on a concept by Dustin McLean (DustFilms.com). Performed, edited, and written by David A. Scott.", - "title": "Heart-Shaped Box: Literal Video Version" - } - }, - { - "name": "Ustream", - "url": "http://www.ustream.tv/recorded/20274954", - "file": "20274954.flv", - "md5": "088f151799e8f572f84eb62f17d73e5c", - "info_dict": { - "title": "Young Americans for Liberty February 7, 2012 2:28 AM", - "uploader": "Young Americans for Liberty" - } - }, - { - "name": "ComedyCentral", - "url": "http://www.thedailyshow.com/watch/thu-december-13-2012/kristen-stewart", - "file": "422212.mp4", - "md5": "4e2f5cb088a83cd8cdb7756132f9739d", - "info_dict": { - "upload_date": "20121214", - "description": "Kristen Stewart", - "uploader": "thedailyshow", - "title": "thedailyshow-kristen-stewart part 1" - } - }, - { - "name": "RBMARadio", - "url": "http://www.rbmaradio.com/shows/ford-lopatin-live-at-primavera-sound-2011", - "file": "ford-lopatin-live-at-primavera-sound-2011.mp3", - "md5": "6bc6f9bcb18994b4c983bc3bf4384d95", - "info_dict": { - "title": "Live at Primavera Sound 2011", - "description": "Joel Ford and Daniel \u2019Oneohtrix Point Never\u2019 Lopatin fly their midified pop extravaganza to Spain. Live at Primavera Sound 2011.", - "uploader": "Ford & Lopatin", - "uploader_id": "ford-lopatin", - "location": "Spain" - } - }, - { - "name": "Facebook", - "url": "https://www.facebook.com/photo.php?v=120708114770723", - "file": "120708114770723.mp4", - "md5": "48975a41ccc4b7a581abd68651c1a5a8", - "info_dict": { - "title": "PEOPLE ARE AWESOME 2013", - "duration": 279 - } - }, - { - "name": "Keek", - "url": "http://www.keek.com/ytdl/keeks/NODfbab", - "file": "NODfbab.mp4", - "md5": "9b0636f8c0f7614afa4ea5e4c6e57e83", - "info_dict": { - "uploader": "ytdl", - "title": "test chars: \"'/\\ä<>This is a test video for youtube-dl.For more information, contact phihag@phihag.de ." - } - }, - { - "name": "TED", - "url": "http://www.ted.com/talks/dan_dennett_on_our_consciousness.html", - "file": "102.mp4", - "md5": "8cd9dfa41ee000ce658fd48fb5d89a61", - "info_dict": { - "title": "Dan Dennett: The illusion of consciousness", - "description": "md5:c6fa72e6eedbd938c9caf6b2702f5922" - } - }, - { - "name": "MySpass", - "url": "http://www.myspass.de/myspass/shows/tvshows/absolute-mehrheit/Absolute-Mehrheit-vom-17022013-Die-Highlights-Teil-2--/11741/", - "file": "11741.mp4", - "md5": "0b49f4844a068f8b33f4b7c88405862b", - "info_dict": { - "description": "Wer kann in die Fußstapfen von Wolfgang Kubicki treten und die Mehrheit der Zuschauer hinter sich versammeln? Wird vielleicht sogar die Absolute Mehrheit geknackt und der Jackpot von 200.000 Euro mit nach Hause genommen?", - "title": "Absolute Mehrheit vom 17.02.2013 - Die Highlights, Teil 2" - } - }, - { - "name": "Generic", - "url": "http://www.hodiho.fr/2013/02/regis-plante-sa-jeep.html", - "file": "13601338388002.mp4", - "md5": "85b90ccc9d73b4acd9138d3af4c27f89", - "info_dict": { - "uploader": "www.hodiho.fr", - "title": "Régis plante sa Jeep" - } - }, - { - "name": "Spiegel", - "url": "http://www.spiegel.de/video/vulkan-tungurahua-in-ecuador-ist-wieder-aktiv-video-1259285.html", - "file": "1259285.mp4", - "md5": "2c2754212136f35fb4b19767d242f66e", - "info_dict": { - "title": "Vulkanausbruch in Ecuador: Der \"Feuerschlund\" ist wieder aktiv" - } - }, - { - "name": "LiveLeak", - "md5": "0813c2430bea7a46bf13acf3406992f4", - "url": "http://www.liveleak.com/view?i=757_1364311680", - "file": "757_1364311680.mp4", - "info_dict": { - "title": "Most unlucky car accident", - "description": "extremely bad day for this guy..!", - "uploader": "ljfriel2" - } - }, - { - "name": "ARD", - "url": "http://www.ardmediathek.de/das-erste/tagesschau-in-100-sek?documentId=14077640", - "file": "14077640.mp4", - "md5": "6ca8824255460c787376353f9e20bbd8", - "info_dict": { - "title": "11.04.2013 09:23 Uhr - Tagesschau in 100 Sekunden" - }, - "skip": "Requires rtmpdump" - }, - { - "name": "Tumblr", - "url": "http://resigno.tumblr.com/post/53364321212/e-de-extrema-importancia-que-esse-video-seja", - "file": "53364321212.mp4", - "md5": "0716d3dd51baf68a28b40fdf1251494e", - "info_dict": { - "title": "Rafael Lemos | Tumblr" - } - }, - { - "name":"Bandcamp", - "url":"http://youtube-dl.bandcamp.com/track/youtube-dl-test-song", - "file":"1812978515.mp3", - "md5":"cdeb30cdae1921719a3cbcab696ef53c", - "info_dict": { - "title":"youtube-dl test song \"'/\\ä↭" - }, - "skip": "There is a limit of 200 free downloads / month for the test song" - }, - { - "name": "RedTube", - "url": "http://www.redtube.com/66418", - "file": "66418.mp4", - "md5": "7b8c22b5e7098a3e1c09709df1126d2d", - "info_dict":{ - "title":"Sucked on a toilet" - } - }, - { - "name": "Photobucket", - "url": "http://media.photobucket.com/user/rachaneronas/media/TiredofLinkBuildingTryBacklinkMyDomaincom_zpsc0c3b9fa.mp4.html?filters[term]=search&filters[primary]=videos&filters[secondary]=images&sort=1&o=0", - "file": "zpsc0c3b9fa.mp4", - "md5": "7dabfb92b0a31f6c16cebc0f8e60ff99", - "info_dict": { - "upload_date": "20130504", - "uploader": "rachaneronas", - "title": "Tired of Link Building? Try BacklinkMyDomain.com!" - } - }, - { - "name": "Ina", - "url": "www.ina.fr/video/I12055569/francois-hollande-je-crois-que-c-est-clair-video.html", - "file": "I12055569.mp4", - "md5": "a667021bf2b41f8dc6049479d9bb38a3", - "info_dict":{ - "title":"François Hollande \"Je crois que c'est clair\"" - } - }, - { - "name": "Yahoo", - "url": "http://screen.yahoo.com/julian-smith-travis-legg-watch-214727115.html", - "file": "214727115.flv", - "md5": "2e717f169c1be93d84d3794a00d4a325", - "info_dict": { - "title": "Julian Smith & Travis Legg Watch Julian Smith" - }, - "skip": "Requires rtmpdump" - }, - { - "name": "Howcast", - "url": "http://www.howcast.com/videos/390161-How-to-Tie-a-Square-Knot-Properly", - "file": "390161.mp4", - "md5": "1d7ba54e2c9d7dc6935ef39e00529138", - "info_dict":{ - "title":"How to Tie a Square Knot Properly", - "description":"The square knot, also known as the reef knot, is one of the oldest, most basic knots to tie, and can be used in many different ways. Here's the proper way to tie a square knot." - } - }, - { - "name": "Vine", - "url": "https://vine.co/v/b9KOOWX7HUx", - "file": "b9KOOWX7HUx.mp4", - "md5": "2f36fed6235b16da96ce9b4dc890940d", - "info_dict":{ - "title": "Chicken.", - "uploader": "Jack Dorsey" - } - }, - { - "name": "Flickr", - "url": "http://www.flickr.com/photos/forestwander-nature-pictures/5645318632/in/photostream/", - "file": "5645318632.mp4", - "md5": "6fdc01adbc89d72fc9c4f15b4a4ba87b", - "info_dict":{ - "title": "Dark Hollow Waterfalls", - "uploader_id": "forestwander-nature-pictures", - "description": "Waterfalls in the Springtime at Dark Hollow Waterfalls. These are located just off of Skyline Drive in Virginia. They are only about 6/10 of a mile hike but it is a pretty steep hill and a good climb back up." - } - }, - { - "name": "Teamcoco", - "url": "http://teamcoco.com/video/louis-ck-interview-george-w-bush", - "file": "19705.mp4", - "md5": "27b6f7527da5acf534b15f21b032656e", - "info_dict":{ - "title": "Louis C.K. Interview Pt. 1 11/3/11", - "description": "Louis C.K. got starstruck by George W. Bush, so what? Part one." - } - }, - { - "name": "XHamster", - "url": "http://xhamster.com/movies/1509445/femaleagent_shy_beauty_takes_the_bait.html", - "file": "1509445.flv", - "md5": "9f48e0e8d58e3076bb236ff412ab62fa", - "info_dict": { - "upload_date": "20121014", - "uploader_id": "Ruseful2011", - "title": "FemaleAgent Shy beauty takes the bait" - } - }, - { - "name": "Hypem", - "url": "http://hypem.com/track/1v6ga/BODYWORK+-+TAME", - "file": "1v6ga.mp3", - "md5": "b9cc91b5af8995e9f0c1cee04c575828", - "info_dict":{ - "title":"Tame" - } - }, - { - "name": "Vbox7", - "url": "http://vbox7.com/play:249bb972c2", - "file": "249bb972c2.flv", - "md5": "9c70d6d956f888bdc08c124acc120cfe", - "info_dict":{ - "title":"Смях! Чудо - чист за секунди - Скрита камера" - } - }, - { - "name": "Gametrailers", - "url": "http://www.gametrailers.com/videos/zbvr8i/mirror-s-edge-2-e3-2013--debut-trailer", - "file": "zbvr8i.flv", - "md5": "c3edbc995ab4081976e16779bd96a878", - "info_dict": { - "title": "E3 2013: Debut Trailer" - }, - "skip": "Requires rtmpdump" - }, - { - "name": "Statigram", - "url": "http://statigr.am/p/484091715184808010_284179915", - "file": "484091715184808010_284179915.mp4", - "md5": "deda4ff333abe2e118740321e992605b", - "info_dict": { - "uploader_id": "videoseconds", - "title": "Instagram photo by @videoseconds (Videos)" - } - }, - { - "name": "Break", - "url": "http://www.break.com/video/when-girls-act-like-guys-2468056", - "file": "2468056.mp4", - "md5": "a3513fb1547fba4fb6cfac1bffc6c46b", - "info_dict": { - "title": "When Girls Act Like D-Bags" - } - }, - { - "name": "Vevo", - "url": "http://www.vevo.com/watch/hurts/somebody-to-die-for/GB1101300280", - "file": "GB1101300280.mp4", - "md5": "06bea460acb744eab74a9d7dcb4bfd61", - "info_dict": { - "title": "Somebody To Die For", - "upload_date": "20130624", - "uploader": "Hurts" - } - }, - { - "name": "Tudou", - "url": "http://www.tudou.com/listplay/zzdE77v6Mmo/2xN2duXMxmw.html", - "file": "159447792.f4v", - "md5": "ad7c358a01541e926a1e413612c6b10a", - "info_dict": { - "title": "卡马乔国足开大脚长传冲吊集锦" - } - }, - { - "name": "CSpan", - "url": "http://www.c-spanvideo.org/program/HolderonV", - "file": "315139.flv", - "md5": "74a623266956f69e4df0068ab6c80fe4", - "info_dict": { - "title": "Attorney General Eric Holder on Voting Rights Act Decision" - }, - "skip": "Requires rtmpdump" - }, - { - "name": "Wimp", - "url": "http://www.wimp.com/deerfence/", - "file": "deerfence.flv", - "md5": "8b215e2e0168c6081a1cf84b2846a2b5", - "info_dict": { - "title": "Watch Till End: Herd of deer jump over a fence." - } - }, - { - "name": "HotNewHipHop", - "url": "http://www.hotnewhiphop.com/freddie-gibbs-lay-it-down-song.1435540.html'", - "file": "1435540.mp3", - "md5": "2c2cd2f76ef11a9b3b581e8b232f3d96", - "info_dict": { - "title": "Freddie Gibbs Songs - Lay It Down" - } - } -] +[] diff --git a/youtube_dl/extractor/ard.py b/youtube_dl/extractor/ard.py index e1ecdf4d36..5793a4129d 100644 --- a/youtube_dl/extractor/ard.py +++ b/youtube_dl/extractor/ard.py @@ -9,6 +9,15 @@ class ARDIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:(?:www\.)?ardmediathek\.de|mediathek\.daserste\.de)/(?:.*/)(?P[^/\?]+)(?:\?.*)?' _TITLE = r'(?P.*)</h1>' _MEDIA_STREAM = r'mediaCollection\.addMediaStream\((?P<media_type>\d+), (?P<quality>\d+), "(?P<rtmp_url>[^"]*)", "(?P<video_url>[^"]*)", "[^"]*"\)' + _TEST = { + u'url': u'http://www.ardmediathek.de/das-erste/tagesschau-in-100-sek?documentId=14077640', + u'file': u'14077640.mp4', + u'md5': u'6ca8824255460c787376353f9e20bbd8', + u'info_dict': { + u"title": u"11.04.2013 09:23 Uhr - Tagesschau in 100 Sekunden" + }, + u'skip': u'Requires rtmpdump' + } def _real_extract(self, url): # determine video id from url diff --git a/youtube_dl/extractor/bandcamp.py b/youtube_dl/extractor/bandcamp.py index dcf6721ee1..129a20f449 100644 --- a/youtube_dl/extractor/bandcamp.py +++ b/youtube_dl/extractor/bandcamp.py @@ -9,6 +9,15 @@ from ..utils import ( class BandcampIE(InfoExtractor): _VALID_URL = r'http://.*?\.bandcamp\.com/track/(?P<title>.*)' + _TEST = { + u'url': u'http://youtube-dl.bandcamp.com/track/youtube-dl-test-song', + u'file': u'1812978515.mp3', + u'md5': u'cdeb30cdae1921719a3cbcab696ef53c', + u'info_dict': { + u"title": u"youtube-dl test song \"'/\\\u00e4\u21ad" + }, + u'skip': u'There is a limit of 200 free downloads / month for the test song' + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/bliptv.py b/youtube_dl/extractor/bliptv.py index df2ad4be2a..37141e6a0a 100644 --- a/youtube_dl/extractor/bliptv.py +++ b/youtube_dl/extractor/bliptv.py @@ -24,6 +24,17 @@ class BlipTVIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:\w+\.)?blip\.tv/((.+/)|(play/)|(api\.swf#))(.+)$' _URL_EXT = r'^.*\.([a-z0-9]+)$' IE_NAME = u'blip.tv' + _TEST = { + u'url': u'http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352', + u'file': u'5779306.m4v', + u'md5': u'b2d849efcf7ee18917e4b4d9ff37cafe', + u'info_dict': { + u"upload_date": u"20111205", + u"description": u"md5:9bc31f227219cde65e47eeec8d2dc596", + u"uploader": u"Comic Book Resources - CBR TV", + u"title": u"CBR EXCLUSIVE: \"Gotham City Imposters\" Bats VS Jokerz Short 3" + } + } def report_direct_download(self, title): """Report information extraction.""" diff --git a/youtube_dl/extractor/breakcom.py b/youtube_dl/extractor/breakcom.py index 1f6620d915..34f555e891 100644 --- a/youtube_dl/extractor/breakcom.py +++ b/youtube_dl/extractor/breakcom.py @@ -5,6 +5,14 @@ from .common import InfoExtractor class BreakIE(InfoExtractor): _VALID_URL = r'(?:http://)?(?:www\.)?break\.com/video/([^/]+)' + _TEST = { + u'url': u'http://www.break.com/video/when-girls-act-like-guys-2468056', + u'file': u'2468056.mp4', + u'md5': u'a3513fb1547fba4fb6cfac1bffc6c46b', + u'info_dict': { + u"title": u"When Girls Act Like D-Bags" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/comedycentral.py b/youtube_dl/extractor/comedycentral.py index 6985e88f0a..d9337f8a1d 100644 --- a/youtube_dl/extractor/comedycentral.py +++ b/youtube_dl/extractor/comedycentral.py @@ -27,6 +27,17 @@ class ComedyCentralIE(InfoExtractor): (the-colbert-report-(videos|collections)/(?P<clipID>[0-9]+)/[^/]*/(?P<cntitle>.*?)) |(watch/(?P<date>[^/]*)/(?P<tdstitle>.*))))) $""" + _TEST = { + u'url': u'http://www.thedailyshow.com/watch/thu-december-13-2012/kristen-stewart', + u'file': u'422212.mp4', + u'md5': u'4e2f5cb088a83cd8cdb7756132f9739d', + u'info_dict': { + u"upload_date": u"20121214", + u"description": u"Kristen Stewart", + u"uploader": u"thedailyshow", + u"title": u"thedailyshow-kristen-stewart part 1" + } + } _available_formats = ['3500', '2200', '1700', '1200', '750', '400'] diff --git a/youtube_dl/extractor/cspan.py b/youtube_dl/extractor/cspan.py index 2246515f2a..a4853279bb 100644 --- a/youtube_dl/extractor/cspan.py +++ b/youtube_dl/extractor/cspan.py @@ -7,6 +7,15 @@ from ..utils import ( class CSpanIE(InfoExtractor): _VALID_URL = r'http://www.c-spanvideo.org/program/(.*)' + _TEST = { + u'url': u'http://www.c-spanvideo.org/program/HolderonV', + u'file': u'315139.flv', + u'md5': u'74a623266956f69e4df0068ab6c80fe4', + u'info_dict': { + u"title": u"Attorney General Eric Holder on Voting Rights Act Decision" + }, + u'skip': u'Requires rtmpdump' + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/dailymotion.py b/youtube_dl/extractor/dailymotion.py index 34306b073c..3297a8549e 100644 --- a/youtube_dl/extractor/dailymotion.py +++ b/youtube_dl/extractor/dailymotion.py @@ -14,6 +14,15 @@ class DailymotionIE(InfoExtractor): _VALID_URL = r'(?i)(?:https?://)?(?:www\.)?dailymotion\.[a-z]{2,3}/video/([^/]+)' IE_NAME = u'dailymotion' + _TEST = { + u'url': u'http://www.dailymotion.com/video/x33vw9_tutoriel-de-youtubeur-dl-des-video_tech', + u'file': u'x33vw9.mp4', + u'md5': u'392c4b85a60a90dc4792da41ce3144eb', + u'info_dict': { + u"uploader": u"Alex and Van .", + u"title": u"Tutoriel de Youtubeur\"DL DES VIDEO DE YOUTUBE\"" + } + } def _real_extract(self, url): # Extract id and simplified title from URL diff --git a/youtube_dl/extractor/escapist.py b/youtube_dl/extractor/escapist.py index 86b145bca9..794460e845 100644 --- a/youtube_dl/extractor/escapist.py +++ b/youtube_dl/extractor/escapist.py @@ -12,6 +12,16 @@ from ..utils import ( class EscapistIE(InfoExtractor): _VALID_URL = r'^(https?://)?(www\.)?escapistmagazine\.com/videos/view/(?P<showname>[^/]+)/(?P<episode>[^/?]+)[/?]?.*$' + _TEST = { + u'url': u'http://www.escapistmagazine.com/videos/view/the-escapist-presents/6618-Breaking-Down-Baldurs-Gate', + u'file': u'6618-Breaking-Down-Baldurs-Gate.mp4', + u'md5': u'c6793dbda81388f4264c1ba18684a74d', + u'info_dict': { + u"description": u"Baldur's Gate: Original, Modded or Enhanced Edition? I'll break down what you can expect from the new Baldur's Gate: Enhanced Edition.", + u"uploader": u"the-escapist-presents", + u"title": u"Breaking Down Baldur's Gate" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/facebook.py b/youtube_dl/extractor/facebook.py index c694f9adbb..beaa5b4bdf 100644 --- a/youtube_dl/extractor/facebook.py +++ b/youtube_dl/extractor/facebook.py @@ -22,6 +22,15 @@ class FacebookIE(InfoExtractor): _LOGIN_URL = 'https://login.facebook.com/login.php?m&next=http%3A%2F%2Fm.facebook.com%2Fhome.php&' _NETRC_MACHINE = 'facebook' IE_NAME = u'facebook' + _TEST = { + u'url': u'https://www.facebook.com/photo.php?v=120708114770723', + u'file': u'120708114770723.mp4', + u'md5': u'48975a41ccc4b7a581abd68651c1a5a8', + u'info_dict': { + u"duration": 279, + u"title": u"PEOPLE ARE AWESOME 2013" + } + } def report_login(self): """Report attempt to log in.""" diff --git a/youtube_dl/extractor/flickr.py b/youtube_dl/extractor/flickr.py index 791d5b61dd..bd97bff9a7 100644 --- a/youtube_dl/extractor/flickr.py +++ b/youtube_dl/extractor/flickr.py @@ -10,6 +10,16 @@ from ..utils import ( class FlickrIE(InfoExtractor): """Information Extractor for Flickr videos""" _VALID_URL = r'(?:https?://)?(?:www\.)?flickr\.com/photos/(?P<uploader_id>[\w\-_@]+)/(?P<id>\d+).*' + _TEST = { + u'url': u'http://www.flickr.com/photos/forestwander-nature-pictures/5645318632/in/photostream/', + u'file': u'5645318632.mp4', + u'md5': u'6fdc01adbc89d72fc9c4f15b4a4ba87b', + u'info_dict': { + u"description": u"Waterfalls in the Springtime at Dark Hollow Waterfalls. These are located just off of Skyline Drive in Virginia. They are only about 6/10 of a mile hike but it is a pretty steep hill and a good climb back up.", + u"uploader_id": u"forestwander-nature-pictures", + u"title": u"Dark Hollow Waterfalls" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/funnyordie.py b/youtube_dl/extractor/funnyordie.py index 3045978f1b..388aacf2f1 100644 --- a/youtube_dl/extractor/funnyordie.py +++ b/youtube_dl/extractor/funnyordie.py @@ -5,6 +5,15 @@ from .common import InfoExtractor class FunnyOrDieIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:www\.)?funnyordie\.com/videos/(?P<id>[0-9a-f]+)/.*$' + _TEST = { + u'url': u'http://www.funnyordie.com/videos/0732f586d7/heart-shaped-box-literal-video-version', + u'file': u'0732f586d7.mp4', + u'md5': u'f647e9e90064b53b6e046e75d0241fbd', + u'info_dict': { + u"description": u"Lyrics changed to match the video. Spoken cameo by Obscurus Lupa (from ThatGuyWithTheGlasses.com). Based on a concept by Dustin McLean (DustFilms.com). Performed, edited, and written by David A. Scott.", + u"title": u"Heart-Shaped Box: Literal Video Version" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/gametrailers.py b/youtube_dl/extractor/gametrailers.py index 33e59e82c4..3ce93b492e 100644 --- a/youtube_dl/extractor/gametrailers.py +++ b/youtube_dl/extractor/gametrailers.py @@ -9,6 +9,15 @@ from ..utils import ( class GametrailersIE(InfoExtractor): _VALID_URL = r'http://www.gametrailers.com/(?P<type>videos|reviews|full-episodes)/(?P<id>.*?)/(?P<title>.*)' + _TEST = { + u'url': u'http://www.gametrailers.com/videos/zbvr8i/mirror-s-edge-2-e3-2013--debut-trailer', + u'file': u'zbvr8i.flv', + u'md5': u'c3edbc995ab4081976e16779bd96a878', + u'info_dict': { + u"title": u"E3 2013: Debut Trailer" + }, + u'skip': u'Requires rtmpdump' + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/generic.py b/youtube_dl/extractor/generic.py index 7a877b3bcb..f2bb4aa210 100644 --- a/youtube_dl/extractor/generic.py +++ b/youtube_dl/extractor/generic.py @@ -15,6 +15,15 @@ class GenericIE(InfoExtractor): _VALID_URL = r'.*' IE_NAME = u'generic' + _TEST = { + u'url': u'http://www.hodiho.fr/2013/02/regis-plante-sa-jeep.html', + u'file': u'13601338388002.mp4', + u'md5': u'85b90ccc9d73b4acd9138d3af4c27f89', + u'info_dict': { + u"uploader": u"www.hodiho.fr", + u"title": u"R\u00e9gis plante sa Jeep" + } + } def report_download_webpage(self, video_id): """Report webpage download.""" diff --git a/youtube_dl/extractor/hotnewhiphop.py b/youtube_dl/extractor/hotnewhiphop.py index 82752f9128..ca3abb7d7f 100644 --- a/youtube_dl/extractor/hotnewhiphop.py +++ b/youtube_dl/extractor/hotnewhiphop.py @@ -6,6 +6,14 @@ from .common import InfoExtractor class HotNewHipHopIE(InfoExtractor): _VALID_URL = r'http://www\.hotnewhiphop.com/.*\.(?P<id>.*)\.html' + _TEST = { + u'url': u"http://www.hotnewhiphop.com/freddie-gibbs-lay-it-down-song.1435540.html'", + u'file': u'1435540.mp3', + u'md5': u'2c2cd2f76ef11a9b3b581e8b232f3d96', + u'info_dict': { + u"title": u"Freddie Gibbs Songs - Lay It Down" + } + } def _real_extract(self, url): m = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/howcast.py b/youtube_dl/extractor/howcast.py index 7b94f85adc..6104c4b5e9 100644 --- a/youtube_dl/extractor/howcast.py +++ b/youtube_dl/extractor/howcast.py @@ -5,6 +5,15 @@ from .common import InfoExtractor class HowcastIE(InfoExtractor): _VALID_URL = r'(?:https?://)?(?:www\.)?howcast\.com/videos/(?P<id>\d+)' + _TEST = { + u'url': u'http://www.howcast.com/videos/390161-How-to-Tie-a-Square-Knot-Properly', + u'file': u'390161.mp4', + u'md5': u'1d7ba54e2c9d7dc6935ef39e00529138', + u'info_dict': { + u"description": u"The square knot, also known as the reef knot, is one of the oldest, most basic knots to tie, and can be used in many different ways. Here's the proper way to tie a square knot.", + u"title": u"How to Tie a Square Knot Properly" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/hypem.py b/youtube_dl/extractor/hypem.py index ceec4f616e..ab2b591036 100644 --- a/youtube_dl/extractor/hypem.py +++ b/youtube_dl/extractor/hypem.py @@ -15,6 +15,14 @@ from ..utils import ( class HypemIE(InfoExtractor): """Information Extractor for hypem""" _VALID_URL = r'(?:http://)?(?:www\.)?hypem\.com/track/([^/]+)/([^/]+)' + _TEST = { + u'url': u'http://hypem.com/track/1v6ga/BODYWORK+-+TAME', + u'file': u'1v6ga.mp3', + u'md5': u'b9cc91b5af8995e9f0c1cee04c575828', + u'info_dict': { + u"title": u"Tame" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/ina.py b/youtube_dl/extractor/ina.py index c19b956592..962c592144 100644 --- a/youtube_dl/extractor/ina.py +++ b/youtube_dl/extractor/ina.py @@ -6,6 +6,14 @@ from .common import InfoExtractor class InaIE(InfoExtractor): """Information Extractor for Ina.fr""" _VALID_URL = r'(?:http://)?(?:www\.)?ina\.fr/video/(?P<id>I[0-9]+)/.*' + _TEST = { + u'url': u'www.ina.fr/video/I12055569/francois-hollande-je-crois-que-c-est-clair-video.html', + u'file': u'I12055569.mp4', + u'md5': u'a667021bf2b41f8dc6049479d9bb38a3', + u'info_dict': { + u"title": u"Fran\u00e7ois Hollande \"Je crois que c'est clair\"" + } + } def _real_extract(self,url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/justintv.py b/youtube_dl/extractor/justintv.py index b2006e3349..f600179923 100644 --- a/youtube_dl/extractor/justintv.py +++ b/youtube_dl/extractor/justintv.py @@ -26,6 +26,17 @@ class JustinTVIE(InfoExtractor): """ _JUSTIN_PAGE_LIMIT = 100 IE_NAME = u'justin.tv' + _TEST = { + u'url': u'http://www.twitch.tv/thegamedevhub/b/296128360', + u'file': u'296128360.flv', + u'md5': u'ecaa8a790c22a40770901460af191c9a', + u'info_dict': { + u"upload_date": u"20110927", + u"uploader_id": 25114803, + u"uploader": u"thegamedevhub", + u"title": u"Beginner Series - Scripting With Python Pt.1" + } + } def report_download_page(self, channel, offset): """Report attempt to download a single page of videos.""" diff --git a/youtube_dl/extractor/keek.py b/youtube_dl/extractor/keek.py index e2093a0be9..72ad6a3d00 100644 --- a/youtube_dl/extractor/keek.py +++ b/youtube_dl/extractor/keek.py @@ -6,6 +6,15 @@ from .common import InfoExtractor class KeekIE(InfoExtractor): _VALID_URL = r'http://(?:www\.)?keek\.com/(?:!|\w+/keeks/)(?P<videoID>\w+)' IE_NAME = u'keek' + _TEST = { + u'url': u'http://www.keek.com/ytdl/keeks/NODfbab', + u'file': u'NODfbab.mp4', + u'md5': u'9b0636f8c0f7614afa4ea5e4c6e57e83', + u'info_dict': { + u"uploader": u"ytdl", + u"title": u"test chars: \"'/\\\u00e4<>This is a test video for youtube-dl.For more information, contact phihag@phihag.de ." + } + } def _real_extract(self, url): m = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/liveleak.py b/youtube_dl/extractor/liveleak.py index d4b142ea09..cf8a2c9312 100644 --- a/youtube_dl/extractor/liveleak.py +++ b/youtube_dl/extractor/liveleak.py @@ -10,6 +10,16 @@ class LiveLeakIE(InfoExtractor): _VALID_URL = r'^(?:http?://)?(?:\w+\.)?liveleak\.com/view\?(?:.*?)i=(?P<video_id>[\w_]+)(?:.*)' IE_NAME = u'liveleak' + _TEST = { + u'url': u'http://www.liveleak.com/view?i=757_1364311680', + u'file': u'757_1364311680.mp4', + u'md5': u'0813c2430bea7a46bf13acf3406992f4', + u'info_dict': { + u"description": u"extremely bad day for this guy..!", + u"uploader": u"ljfriel2", + u"title": u"Most unlucky car accident" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/myspass.py b/youtube_dl/extractor/myspass.py index 7b016bb86a..107665d15f 100644 --- a/youtube_dl/extractor/myspass.py +++ b/youtube_dl/extractor/myspass.py @@ -11,6 +11,15 @@ from ..utils import ( class MySpassIE(InfoExtractor): _VALID_URL = r'http://www.myspass.de/.*' + _TEST = { + u'url': u'http://www.myspass.de/myspass/shows/tvshows/absolute-mehrheit/Absolute-Mehrheit-vom-17022013-Die-Highlights-Teil-2--/11741/', + u'file': u'11741.mp4', + u'md5': u'0b49f4844a068f8b33f4b7c88405862b', + u'info_dict': { + u"description": u"Wer kann in die Fu\u00dfstapfen von Wolfgang Kubicki treten und die Mehrheit der Zuschauer hinter sich versammeln? Wird vielleicht sogar die Absolute Mehrheit geknackt und der Jackpot von 200.000 Euro mit nach Hause genommen?", + u"title": u"Absolute Mehrheit vom 17.02.2013 - Die Highlights, Teil 2" + } + } def _real_extract(self, url): META_DATA_URL_TEMPLATE = 'http://www.myspass.de/myspass/includes/apps/video/getvideometadataxml.php?id=%s' diff --git a/youtube_dl/extractor/myvideo.py b/youtube_dl/extractor/myvideo.py index 47a44e3e0e..b2a7b1df04 100644 --- a/youtube_dl/extractor/myvideo.py +++ b/youtube_dl/extractor/myvideo.py @@ -18,6 +18,14 @@ class MyVideoIE(InfoExtractor): _VALID_URL = r'(?:http://)?(?:www\.)?myvideo\.de/watch/([0-9]+)/([^?/]+).*' IE_NAME = u'myvideo' + _TEST = { + u'url': u'http://www.myvideo.de/watch/8229274/bowling_fail_or_win', + u'file': u'8229274.flv', + u'md5': u'2d2753e8130479ba2cb7e0a37002053e', + u'info_dict': { + u"title": u"bowling-fail-or-win" + } + } # Original Code from: https://github.com/dersphere/plugin.video.myvideo_de.git # Released into the Public Domain by Tristan Fischer on 2013-05-19 diff --git a/youtube_dl/extractor/nba.py b/youtube_dl/extractor/nba.py index 296d4cd36e..122b7dd262 100644 --- a/youtube_dl/extractor/nba.py +++ b/youtube_dl/extractor/nba.py @@ -8,6 +8,15 @@ from ..utils import ( class NBAIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:watch\.|www\.)?nba\.com/(?:nba/)?video(/[^?]*?)(?:/index\.html)?(?:\?.*)?$' + _TEST = { + u'url': u'http://www.nba.com/video/games/nets/2012/12/04/0021200253-okc-bkn-recap.nba/index.html', + u'file': u'0021200253-okc-bkn-recap.nba.mp4', + u'md5': u'c0edcfc37607344e2ff8f13c378c88a4', + u'info_dict': { + u"description": u"Kevin Durant scores 32 points and dishes out six assists as the Thunder beat the Nets in Brooklyn.", + u"title": u"Thunder vs. Nets" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/photobucket.py b/youtube_dl/extractor/photobucket.py index cd7fe6f52f..305b79773b 100644 --- a/youtube_dl/extractor/photobucket.py +++ b/youtube_dl/extractor/photobucket.py @@ -16,6 +16,16 @@ class PhotobucketIE(InfoExtractor): # Check if it's necessary to keep the old extracion process _VALID_URL = r'(?:http://)?(?:[a-z0-9]+\.)?photobucket\.com/.*(([\?\&]current=)|_)(?P<id>.*)\.(?P<ext>(flv)|(mp4))' IE_NAME = u'photobucket' + _TEST = { + u'url': u'http://media.photobucket.com/user/rachaneronas/media/TiredofLinkBuildingTryBacklinkMyDomaincom_zpsc0c3b9fa.mp4.html?filters[term]=search&filters[primary]=videos&filters[secondary]=images&sort=1&o=0', + u'file': u'zpsc0c3b9fa.mp4', + u'md5': u'7dabfb92b0a31f6c16cebc0f8e60ff99', + u'info_dict': { + u"upload_date": u"20130504", + u"uploader": u"rachaneronas", + u"title": u"Tired of Link Building? Try BacklinkMyDomain.com!" + } + } def _real_extract(self, url): # Extract id from URL diff --git a/youtube_dl/extractor/pornotube.py b/youtube_dl/extractor/pornotube.py index 0adb40db07..add76a11e5 100644 --- a/youtube_dl/extractor/pornotube.py +++ b/youtube_dl/extractor/pornotube.py @@ -10,6 +10,15 @@ from ..utils import ( class PornotubeIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:\w+\.)?pornotube\.com(/c/(?P<channel>[0-9]+))?(/m/(?P<videoid>[0-9]+))(/(?P<title>.+))$' + _TEST = { + u'url': u'http://pornotube.com/c/173/m/1689755/Marilyn-Monroe-Bathing', + u'file': u'1689755.flv', + u'md5': u'374dd6dcedd24234453b295209aa69b6', + u'info_dict': { + u"upload_date": u"20090708", + u"title": u"Marilyn-Monroe-Bathing" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/rbmaradio.py b/youtube_dl/extractor/rbmaradio.py index 0c75eee2a8..4b6147a735 100644 --- a/youtube_dl/extractor/rbmaradio.py +++ b/youtube_dl/extractor/rbmaradio.py @@ -11,6 +11,18 @@ from ..utils import ( class RBMARadioIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?rbmaradio\.com/shows/(?P<videoID>[^/]+)$' + _TEST = { + u'url': u'http://www.rbmaradio.com/shows/ford-lopatin-live-at-primavera-sound-2011', + u'file': u'ford-lopatin-live-at-primavera-sound-2011.mp3', + u'md5': u'6bc6f9bcb18994b4c983bc3bf4384d95', + u'info_dict': { + u"uploader_id": u"ford-lopatin", + u"location": u"Spain", + u"description": u"Joel Ford and Daniel \u2019Oneohtrix Point Never\u2019 Lopatin fly their midified pop extravaganza to Spain. Live at Primavera Sound 2011.", + u"uploader": u"Ford & Lopatin", + u"title": u"Live at Primavera Sound 2011" + } + } def _real_extract(self, url): m = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/redtube.py b/youtube_dl/extractor/redtube.py index ebc4e23261..1d2cf1f56d 100644 --- a/youtube_dl/extractor/redtube.py +++ b/youtube_dl/extractor/redtube.py @@ -5,6 +5,14 @@ from .common import InfoExtractor class RedTubeIE(InfoExtractor): _VALID_URL = r'(?:http://)?(?:www\.)?redtube\.com/(?P<id>[0-9]+)' + _TEST = { + u'url': u'http://www.redtube.com/66418', + u'file': u'66418.mp4', + u'md5': u'7b8c22b5e7098a3e1c09709df1126d2d', + u'info_dict': { + u"title": u"Sucked on a toilet" + } + } def _real_extract(self,url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/soundcloud.py b/youtube_dl/extractor/soundcloud.py index 05342c9b1b..9f81fa87ac 100644 --- a/youtube_dl/extractor/soundcloud.py +++ b/youtube_dl/extractor/soundcloud.py @@ -21,6 +21,17 @@ class SoundcloudIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:www\.)?soundcloud\.com/([\w\d-]+)/([\w\d-]+)' IE_NAME = u'soundcloud' + _TEST = { + u'url': u'http://soundcloud.com/ethmusic/lostin-powers-she-so-heavy', + u'file': u'62986583.mp3', + u'md5': u'ebef0a451b909710ed1d7787dddbf0d7', + u'info_dict': { + u"upload_date": u"20121011", + u"description": u"No Downloads untill we record the finished version this weekend, i was too pumped n i had to post it , earl is prolly gonna b hella p.o'd", + u"uploader": u"E.T. ExTerrestrial Music", + u"title": u"Lostin Powers - She so Heavy (SneakPreview) Adrian Ackers Blueprint 1" + } + } def report_resolve(self, video_id): """Report information extraction.""" diff --git a/youtube_dl/extractor/spiegel.py b/youtube_dl/extractor/spiegel.py index 98a65b78ba..13c86401c0 100644 --- a/youtube_dl/extractor/spiegel.py +++ b/youtube_dl/extractor/spiegel.py @@ -6,6 +6,14 @@ from .common import InfoExtractor class SpiegelIE(InfoExtractor): _VALID_URL = r'https?://(?:www\.)?spiegel\.de/video/[^/]*-(?P<videoID>[0-9]+)(?:\.html)?(?:#.*)?$' + _TEST = { + u'url': u'http://www.spiegel.de/video/vulkan-tungurahua-in-ecuador-ist-wieder-aktiv-video-1259285.html', + u'file': u'1259285.mp4', + u'md5': u'2c2754212136f35fb4b19767d242f66e', + u'info_dict': { + u"title": u"Vulkanausbruch in Ecuador: Der \"Feuerschlund\" ist wieder aktiv" + } + } def _real_extract(self, url): m = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/stanfordoc.py b/youtube_dl/extractor/stanfordoc.py index 8d3e32ab97..25a0d09f79 100644 --- a/youtube_dl/extractor/stanfordoc.py +++ b/youtube_dl/extractor/stanfordoc.py @@ -20,6 +20,14 @@ class StanfordOpenClassroomIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?openclassroom.stanford.edu(?P<path>/?|(/MainFolder/(?:HomePage|CoursePage|VideoPage)\.php([?]course=(?P<course>[^&]+)(&video=(?P<video>[^&]+))?(&.*)?)?))$' IE_NAME = u'stanfordoc' + _TEST = { + u'url': u'http://openclassroom.stanford.edu/MainFolder/VideoPage.php?course=PracticalUnix&video=intro-environment&speed=100', + u'file': u'PracticalUnix_intro-environment.mp4', + u'md5': u'544a9468546059d4e80d76265b0443b8', + u'info_dict': { + u"title": u"Intro Environment" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/statigram.py b/youtube_dl/extractor/statigram.py index 95d2ee3c04..25bf5b85ce 100644 --- a/youtube_dl/extractor/statigram.py +++ b/youtube_dl/extractor/statigram.py @@ -4,6 +4,15 @@ from .common import InfoExtractor class StatigramIE(InfoExtractor): _VALID_URL = r'(?:http://)?(?:www\.)?statigr\.am/p/([^/]+)' + _TEST = { + u'url': u'http://statigr.am/p/484091715184808010_284179915', + u'file': u'484091715184808010_284179915.mp4', + u'md5': u'deda4ff333abe2e118740321e992605b', + u'info_dict': { + u"uploader_id": u"videoseconds", + u"title": u"Instagram photo by @videoseconds (Videos)" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/teamcoco.py b/youtube_dl/extractor/teamcoco.py index 092ac74d8e..1dd5e1b685 100644 --- a/youtube_dl/extractor/teamcoco.py +++ b/youtube_dl/extractor/teamcoco.py @@ -8,6 +8,15 @@ from ..utils import ( class TeamcocoIE(InfoExtractor): _VALID_URL = r'http://teamcoco\.com/video/(?P<url_title>.*)' + _TEST = { + u'url': u'http://teamcoco.com/video/louis-ck-interview-george-w-bush', + u'file': u'19705.mp4', + u'md5': u'27b6f7527da5acf534b15f21b032656e', + u'info_dict': { + u"description": u"Louis C.K. got starstruck by George W. Bush, so what? Part one.", + u"title": u"Louis C.K. Interview Pt. 1 11/3/11" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/ted.py b/youtube_dl/extractor/ted.py index ccad1c7c20..46b66582ce 100644 --- a/youtube_dl/extractor/ted.py +++ b/youtube_dl/extractor/ted.py @@ -14,6 +14,15 @@ class TEDIE(InfoExtractor): (/lang/(.*?))? # The url may contain the language /(?P<name>\w+) # Here goes the name and then ".html" ''' + _TEST = { + u'url': u'http://www.ted.com/talks/dan_dennett_on_our_consciousness.html', + u'file': u'102.mp4', + u'md5': u'8cd9dfa41ee000ce658fd48fb5d89a61', + u'info_dict': { + u"description": u"md5:c6fa72e6eedbd938c9caf6b2702f5922", + u"title": u"Dan Dennett: The illusion of consciousness" + } + } @classmethod def suitable(cls, url): diff --git a/youtube_dl/extractor/tudou.py b/youtube_dl/extractor/tudou.py index 9ca860ab08..4681a6f797 100644 --- a/youtube_dl/extractor/tudou.py +++ b/youtube_dl/extractor/tudou.py @@ -5,6 +5,14 @@ from .common import InfoExtractor class TudouIE(InfoExtractor): _VALID_URL = r'(?:http://)?(?:www\.)?tudou\.com/(?:listplay|programs)/(?:view|(.+?))/(?:([^/]+)|([^/]+)\.html)' + _TEST = { + u'url': u'http://www.tudou.com/listplay/zzdE77v6Mmo/2xN2duXMxmw.html', + u'file': u'159447792.f4v', + u'md5': u'ad7c358a01541e926a1e413612c6b10a', + u'info_dict': { + u"title": u"\u5361\u9a6c\u4e54\u56fd\u8db3\u5f00\u5927\u811a\u957f\u4f20\u51b2\u540a\u96c6\u9526" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/tumblr.py b/youtube_dl/extractor/tumblr.py index b0851b4f9c..618199d6b9 100644 --- a/youtube_dl/extractor/tumblr.py +++ b/youtube_dl/extractor/tumblr.py @@ -8,6 +8,14 @@ from ..utils import ( class TumblrIE(InfoExtractor): _VALID_URL = r'http://(?P<blog_name>.*?)\.tumblr\.com/((post)|(video))/(?P<id>\d*)/(.*?)' + _TEST = { + u'url': u'http://resigno.tumblr.com/post/53364321212/e-de-extrema-importancia-que-esse-video-seja', + u'file': u'53364321212.mp4', + u'md5': u'0716d3dd51baf68a28b40fdf1251494e', + u'info_dict': { + u"title": u"Rafael Lemos | Tumblr" + } + } def _real_extract(self, url): m_url = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/ustream.py b/youtube_dl/extractor/ustream.py index cfe3a6840a..5f423870ab 100644 --- a/youtube_dl/extractor/ustream.py +++ b/youtube_dl/extractor/ustream.py @@ -6,6 +6,15 @@ from .common import InfoExtractor class UstreamIE(InfoExtractor): _VALID_URL = r'https?://www\.ustream\.tv/recorded/(?P<videoID>\d+)' IE_NAME = u'ustream' + _TEST = { + u'url': u'http://www.ustream.tv/recorded/20274954', + u'file': u'20274954.flv', + u'md5': u'088f151799e8f572f84eb62f17d73e5c', + u'info_dict': { + u"uploader": u"Young Americans for Liberty", + u"title": u"Young Americans for Liberty February 7, 2012 2:28 AM" + } + } def _real_extract(self, url): m = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/vbox7.py b/youtube_dl/extractor/vbox7.py index 2f3ce46e86..4f803bcd3c 100644 --- a/youtube_dl/extractor/vbox7.py +++ b/youtube_dl/extractor/vbox7.py @@ -12,6 +12,14 @@ from ..utils import ( class Vbox7IE(InfoExtractor): """Information Extractor for Vbox7""" _VALID_URL = r'(?:http://)?(?:www\.)?vbox7\.com/play:([^/]+)' + _TEST = { + u'url': u'http://vbox7.com/play:249bb972c2', + u'file': u'249bb972c2.flv', + u'md5': u'9c70d6d956f888bdc08c124acc120cfe', + u'info_dict': { + u"title": u"\u0421\u043c\u044f\u0445! \u0427\u0443\u0434\u043e - \u0447\u0438\u0441\u0442 \u0437\u0430 \u0441\u0435\u043a\u0443\u043d\u0434\u0438 - \u0421\u043a\u0440\u0438\u0442\u0430 \u043a\u0430\u043c\u0435\u0440\u0430" + } + } def _real_extract(self,url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/vevo.py b/youtube_dl/extractor/vevo.py index 49a249ae32..3b16dcfbc1 100644 --- a/youtube_dl/extractor/vevo.py +++ b/youtube_dl/extractor/vevo.py @@ -12,6 +12,16 @@ class VevoIE(InfoExtractor): (currently used by MTVIE) """ _VALID_URL = r'((http://www.vevo.com/watch/.*?/.*?/)|(vevo:))(?P<id>.*)$' + _TEST = { + u'url': u'http://www.vevo.com/watch/hurts/somebody-to-die-for/GB1101300280', + u'file': u'GB1101300280.mp4', + u'md5': u'06bea460acb744eab74a9d7dcb4bfd61', + u'info_dict': { + u"upload_date": u"20130624", + u"uploader": u"Hurts", + u"title": u"Somebody To Die For" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/vimeo.py b/youtube_dl/extractor/vimeo.py index 20dc255d4c..11741e27d0 100644 --- a/youtube_dl/extractor/vimeo.py +++ b/youtube_dl/extractor/vimeo.py @@ -18,6 +18,18 @@ class VimeoIE(InfoExtractor): # _VALID_URL matches Vimeo URLs _VALID_URL = r'(?P<proto>https?://)?(?:(?:www|player)\.)?vimeo(?P<pro>pro)?\.com/(?:(?:(?:groups|album)/[^/]+)|(?:.*?)/)?(?P<direct_link>play_redirect_hls\?clip_id=)?(?:videos?/)?(?P<id>[0-9]+)' IE_NAME = u'vimeo' + _TEST = { + u'url': u'http://vimeo.com/56015672', + u'file': u'56015672.mp4', + u'md5': u'8879b6cc097e987f02484baf890129e5', + u'info_dict': { + u"upload_date": u"20121220", + u"description": u"This is a test case for youtube-dl.\nFor more information, see github.com/rg3/youtube-dl\nTest chars: \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550", + u"uploader_id": u"user7108434", + u"uploader": u"Filippo Valsorda", + u"title": u"youtube-dl test video - \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550" + } + } def _verify_video_password(self, url, video_id, webpage): password = self._downloader.params.get('videopassword', None) diff --git a/youtube_dl/extractor/vine.py b/youtube_dl/extractor/vine.py index b44b1cb024..bdd3522ebf 100644 --- a/youtube_dl/extractor/vine.py +++ b/youtube_dl/extractor/vine.py @@ -5,6 +5,15 @@ from .common import InfoExtractor class VineIE(InfoExtractor): _VALID_URL = r'(?:https?://)?(?:www\.)?vine\.co/v/(?P<id>\w+)' + _TEST = { + u'url': u'https://vine.co/v/b9KOOWX7HUx', + u'file': u'b9KOOWX7HUx.mp4', + u'md5': u'2f36fed6235b16da96ce9b4dc890940d', + u'info_dict': { + u"uploader": u"Jack Dorsey", + u"title": u"Chicken." + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/wimp.py b/youtube_dl/extractor/wimp.py index 84f065a3df..b9c3b13f91 100644 --- a/youtube_dl/extractor/wimp.py +++ b/youtube_dl/extractor/wimp.py @@ -6,6 +6,14 @@ from .common import InfoExtractor class WimpIE(InfoExtractor): _VALID_URL = r'(?:http://)?(?:www\.)?wimp\.com/([^/]+)/' + _TEST = { + u'url': u'http://www.wimp.com/deerfence/', + u'file': u'deerfence.flv', + u'md5': u'8b215e2e0168c6081a1cf84b2846a2b5', + u'info_dict': { + u"title": u"Watch Till End: Herd of deer jump over a fence." + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/xhamster.py b/youtube_dl/extractor/xhamster.py index 0013509262..0f1feeffd7 100644 --- a/youtube_dl/extractor/xhamster.py +++ b/youtube_dl/extractor/xhamster.py @@ -11,6 +11,16 @@ from ..utils import ( class XHamsterIE(InfoExtractor): """Information Extractor for xHamster""" _VALID_URL = r'(?:http://)?(?:www.)?xhamster\.com/movies/(?P<id>[0-9]+)/.*\.html' + _TEST = { + u'url': u'http://xhamster.com/movies/1509445/femaleagent_shy_beauty_takes_the_bait.html', + u'file': u'1509445.flv', + u'md5': u'9f48e0e8d58e3076bb236ff412ab62fa', + u'info_dict': { + u"upload_date": u"20121014", + u"uploader_id": u"Ruseful2011", + u"title": u"FemaleAgent Shy beauty takes the bait" + } + } def _real_extract(self,url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/xnxx.py b/youtube_dl/extractor/xnxx.py index 68acb84098..40d8489000 100644 --- a/youtube_dl/extractor/xnxx.py +++ b/youtube_dl/extractor/xnxx.py @@ -13,6 +13,14 @@ class XNXXIE(InfoExtractor): VIDEO_URL_RE = r'flv_url=(.*?)&' VIDEO_TITLE_RE = r'<title>(.*?)\s+-\s+XNXX.COM' VIDEO_THUMB_RE = r'url_bigthumb=(.*?)&' + _TEST = { + u'url': u'http://video.xnxx.com/video1135332/lida_naked_funny_actress_5_', + u'file': u'1135332.flv', + u'md5': u'0831677e2b4761795f68d417e0b7b445', + u'info_dict': { + u"title": u"lida \u00bb Naked Funny Actress (5)" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/xvideos.py b/youtube_dl/extractor/xvideos.py index 8b3cb3930d..c3b9736d70 100644 --- a/youtube_dl/extractor/xvideos.py +++ b/youtube_dl/extractor/xvideos.py @@ -8,6 +8,14 @@ from ..utils import ( class XVideosIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:www\.)?xvideos\.com/video([0-9]+)(?:.*)' + _TEST = { + u'url': u'http://www.xvideos.com/video939581/funny_porns_by_s_-1', + u'file': u'939581.flv', + u'md5': u'1d0c835822f0a71a7bf011855db929d0', + u'info_dict': { + u"title": u"Funny Porns By >>>>S<<<<<< -1" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/yahoo.py b/youtube_dl/extractor/yahoo.py index 4b3aec9d1f..1f98f24eb6 100644 --- a/youtube_dl/extractor/yahoo.py +++ b/youtube_dl/extractor/yahoo.py @@ -13,6 +13,15 @@ from ..utils import ( class YahooIE(InfoExtractor): """Information extractor for screen.yahoo.com.""" _VALID_URL = r'http://screen\.yahoo\.com/.*?-(?P<id>\d*?)\.html' + _TEST = { + u'url': u'http://screen.yahoo.com/julian-smith-travis-legg-watch-214727115.html', + u'file': u'214727115.flv', + u'md5': u'2e717f169c1be93d84d3794a00d4a325', + u'info_dict': { + u"title": u"Julian Smith & Travis Legg Watch Julian Smith" + }, + u'skip': u'Requires rtmpdump' + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/youjizz.py b/youtube_dl/extractor/youjizz.py index d9efac76eb..6f022670cb 100644 --- a/youtube_dl/extractor/youjizz.py +++ b/youtube_dl/extractor/youjizz.py @@ -8,6 +8,14 @@ from ..utils import ( class YouJizzIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:\w+\.)?youjizz\.com/videos/(?P<videoid>[^.]+).html$' + _TEST = { + u'url': u'http://www.youjizz.com/videos/zeichentrick-1-2189178.html', + u'file': u'2189178.flv', + u'md5': u'07e15fa469ba384c7693fd246905547c', + u'info_dict': { + u"title": u"Zeichentrick 1" + } + } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) diff --git a/youtube_dl/extractor/youporn.py b/youtube_dl/extractor/youporn.py index 5d8b7db2ce..d1156bf425 100644 --- a/youtube_dl/extractor/youporn.py +++ b/youtube_dl/extractor/youporn.py @@ -16,6 +16,17 @@ from ..utils import ( class YouPornIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:\w+\.)?youporn\.com/watch/(?P<videoid>[0-9]+)/(?P<title>[^/]+)' + _TEST = { + u'url': u'http://www.youporn.com/watch/505835/sex-ed-is-it-safe-to-masturbate-daily/', + u'file': u'505835.mp4', + u'md5': u'c37ddbaaa39058c76a7e86c6813423c1', + u'info_dict': { + u"upload_date": u"20101221", + u"description": u"Love & Sex Answers: http://bit.ly/DanAndJenn -- Is It Unhealthy To Masturbate Daily?", + u"uploader": u"Ask Dan And Jennifer", + u"title": u"Sex Ed: Is It Safe To Masturbate Daily?" + } + } def _print_formats(self, formats): """Print all available formats"""