From c512650955de0b16d37e7fa7fb29ea0985e415bb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Rog=C3=A9rio=20Brito?= Date: Sun, 8 Jun 2014 10:58:42 -0300 Subject: [PATCH] Imported Upstream version 2014.06.07 --- CHANGELOG | 14 - MANIFEST.in | 1 + Makefile | 11 +- README.md | 128 +++++- README.txt | 146 +++++- devscripts/make_readme.py | 2 +- devscripts/prepare_manpage.py | 20 + devscripts/release.sh | 20 +- docs/.gitignore | 1 + docs/Makefile | 177 ++++++++ docs/conf.py | 71 +++ docs/index.rst | 23 + docs/module_guide.rst | 67 +++ test/helper.py | 75 ++- test/test_InfoExtractor.py | 44 ++ test/test_YoutubeDL.py | 94 ++-- test/test_age_restriction.py | 2 +- test/test_all_urls.py | 68 ++- test/test_download.py | 36 +- test/test_playlists.py | 155 ++++++- test/test_subtitles.py | 2 +- test/test_utils.py | 34 ++ test/test_youtube_lists.py | 16 +- youtube-dl | Bin 380523 -> 482247 bytes youtube-dl.1 | 155 ++++++- youtube-dl.bash-completion | 2 +- youtube_dl/InfoExtractors.py | 4 - youtube_dl/YoutubeDL.py | 252 +++++++---- youtube_dl/__init__.py | 90 +++- youtube_dl/downloader/common.py | 5 +- youtube_dl/downloader/f4m.py | 12 +- youtube_dl/downloader/hls.py | 6 +- youtube_dl/downloader/http.py | 29 +- youtube_dl/downloader/rtmp.py | 58 ++- youtube_dl/extractor/__init__.py | 124 ++++- youtube_dl/extractor/academicearth.py | 8 +- youtube_dl/extractor/addanime.py | 31 +- youtube_dl/extractor/aftonbladet.py | 66 +++ youtube_dl/extractor/aol.py | 65 +++ youtube_dl/extractor/appletrailers.py | 29 +- youtube_dl/extractor/ard.py | 33 +- youtube_dl/extractor/arte.py | 192 ++++---- youtube_dl/extractor/auengine.py | 21 +- youtube_dl/extractor/bandcamp.py | 46 +- youtube_dl/extractor/bbccouk.py | 18 +- youtube_dl/extractor/bilibili.py | 106 +++++ youtube_dl/extractor/blinkx.py | 30 +- youtube_dl/extractor/bliptv.py | 186 ++++---- youtube_dl/extractor/bloomberg.py | 36 +- youtube_dl/extractor/br.py | 139 ++++++ youtube_dl/extractor/breakcom.py | 11 +- youtube_dl/extractor/brightcove.py | 8 +- youtube_dl/extractor/byutv.py | 48 ++ youtube_dl/extractor/c56.py | 29 +- youtube_dl/extractor/canal13cl.py | 48 ++ youtube_dl/extractor/canalc2.py | 28 +- youtube_dl/extractor/canalplus.py | 83 ++-- youtube_dl/extractor/cbsnews.py | 87 ++++ youtube_dl/extractor/ceskatelevize.py | 126 ++++++ youtube_dl/extractor/cinemassacre.py | 128 +++--- youtube_dl/extractor/clipfish.py | 37 +- youtube_dl/extractor/clipsyndicate.py | 23 +- youtube_dl/extractor/clubic.py | 58 +++ youtube_dl/extractor/cmt.py | 24 +- youtube_dl/extractor/cnet.py | 75 +++ youtube_dl/extractor/cnn.py | 10 +- youtube_dl/extractor/collegehumor.py | 21 +- youtube_dl/extractor/comedycentral.py | 143 +++--- youtube_dl/extractor/common.py | 75 ++- youtube_dl/extractor/condenast.py | 30 +- youtube_dl/extractor/crunchyroll.py | 32 +- youtube_dl/extractor/cspan.py | 49 +- youtube_dl/extractor/dailymotion.py | 34 +- youtube_dl/extractor/daum.py | 28 +- youtube_dl/extractor/depositfiles.py | 60 --- youtube_dl/extractor/discovery.py | 5 +- youtube_dl/extractor/divxstage.py | 27 ++ youtube_dl/extractor/ehow.py | 43 +- youtube_dl/extractor/empflix.py | 54 +++ youtube_dl/extractor/engadget.py | 43 ++ youtube_dl/extractor/extremetube.py | 40 +- youtube_dl/extractor/facebook.py | 79 ++-- youtube_dl/extractor/fc2.py | 60 +++ youtube_dl/extractor/firstpost.py | 29 +- youtube_dl/extractor/fivemin.py | 88 ++++ youtube_dl/extractor/fourtube.py | 2 +- youtube_dl/extractor/franceculture.py | 77 ++++ youtube_dl/extractor/francetv.py | 22 +- youtube_dl/extractor/funnyordie.py | 63 ++- youtube_dl/extractor/gamekings.py | 13 +- youtube_dl/extractor/gamespot.py | 11 +- youtube_dl/extractor/gdcvault.py | 134 ++++++ youtube_dl/extractor/generic.py | 426 +++++++++++++++--- youtube_dl/extractor/googlesearch.py | 2 +- youtube_dl/extractor/hentaistigma.py | 42 ++ youtube_dl/extractor/huffpost.py | 3 +- .../{statigram.py => iconosquare.py} | 8 +- youtube_dl/extractor/ign.py | 109 +++-- youtube_dl/extractor/infoq.py | 54 ++- youtube_dl/extractor/instagram.py | 68 +++ youtube_dl/extractor/iprima.py | 52 ++- youtube_dl/extractor/ivi.py | 12 +- youtube_dl/extractor/jukebox.py | 75 +-- youtube_dl/extractor/justintv.py | 83 ++-- youtube_dl/extractor/keezmovies.py | 26 +- youtube_dl/extractor/kickstarter.py | 46 +- youtube_dl/extractor/kontrtube.py | 24 +- youtube_dl/extractor/ku6.py | 35 ++ youtube_dl/extractor/lifenews.py | 41 +- youtube_dl/extractor/liveleak.py | 55 ++- youtube_dl/extractor/lynda.py | 47 +- youtube_dl/extractor/mailru.py | 86 ++++ youtube_dl/extractor/mdr.py | 22 +- youtube_dl/extractor/metacafe.py | 164 +++---- youtube_dl/extractor/metacritic.py | 3 +- youtube_dl/extractor/mit.py | 135 ++++-- youtube_dl/extractor/mixcloud.py | 60 ++- youtube_dl/extractor/mooshare.py | 2 +- youtube_dl/extractor/morningstar.py | 47 ++ youtube_dl/extractor/motorsport.py | 63 +++ youtube_dl/extractor/moviezine.py | 45 ++ youtube_dl/extractor/movshare.py | 27 ++ youtube_dl/extractor/mpora.py | 6 +- youtube_dl/extractor/mtv.py | 40 +- youtube_dl/extractor/musicplayon.py | 75 +++ youtube_dl/extractor/myvideo.py | 101 ++--- youtube_dl/extractor/naver.py | 34 +- youtube_dl/extractor/nba.py | 8 +- youtube_dl/extractor/nbc.py | 91 +++- youtube_dl/extractor/ndr.py | 31 +- youtube_dl/extractor/newstube.py | 87 ++++ youtube_dl/extractor/nfb.py | 18 +- youtube_dl/extractor/niconico.py | 81 ++-- youtube_dl/extractor/ninegag.py | 61 ++- youtube_dl/extractor/noco.py | 106 +++++ youtube_dl/extractor/normalboots.py | 68 ++- youtube_dl/extractor/novamov.py | 48 +- youtube_dl/extractor/nowness.py | 9 +- youtube_dl/extractor/nowvideo.py | 60 +-- youtube_dl/extractor/nrk.py | 145 ++++++ youtube_dl/extractor/ntv.py | 149 ++++++ youtube_dl/extractor/nuvid.py | 48 ++ youtube_dl/extractor/nytimes.py | 77 ++++ youtube_dl/extractor/oe1.py | 40 ++ youtube_dl/extractor/ooyala.py | 49 +- youtube_dl/extractor/orf.py | 11 +- youtube_dl/extractor/parliamentliveuk.py | 53 +++ youtube_dl/extractor/pbs.py | 11 +- youtube_dl/extractor/photobucket.py | 81 +--- youtube_dl/extractor/playvid.py | 80 ++++ youtube_dl/extractor/podomatic.py | 47 +- youtube_dl/extractor/pornhd.py | 77 +++- youtube_dl/extractor/pornhub.py | 23 +- youtube_dl/extractor/prosiebensat1.py | 286 ++++++++++++ youtube_dl/extractor/pyvideo.py | 62 +-- youtube_dl/extractor/radiofrance.py | 34 +- youtube_dl/extractor/ro220.py | 2 +- youtube_dl/extractor/roxwel.py | 52 ++- youtube_dl/extractor/rtbf.py | 49 ++ youtube_dl/extractor/rtlnow.py | 251 ++++++----- youtube_dl/extractor/rts.py | 154 +++++++ youtube_dl/extractor/rtve.py | 84 ++++ youtube_dl/extractor/rutube.py | 33 +- youtube_dl/extractor/rutv.py | 194 ++++++++ youtube_dl/extractor/savefrom.py | 37 ++ youtube_dl/extractor/scivee.py | 56 +++ youtube_dl/extractor/slashdot.py | 24 - youtube_dl/extractor/slideshare.py | 3 +- youtube_dl/extractor/slutload.py | 47 ++ youtube_dl/extractor/smotri.py | 51 ++- youtube_dl/extractor/soundcloud.py | 153 ++++--- youtube_dl/extractor/space.py | 18 +- youtube_dl/extractor/spankwire.py | 65 ++- youtube_dl/extractor/spiegeltv.py | 81 ++++ youtube_dl/extractor/spike.py | 15 +- youtube_dl/extractor/steam.py | 158 ++++--- youtube_dl/extractor/streamcz.py | 22 +- youtube_dl/extractor/swrmediathek.py | 104 +++++ youtube_dl/extractor/syfy.py | 28 +- youtube_dl/extractor/tagesschau.py | 79 ++++ youtube_dl/extractor/teachertube.py | 93 ++++ youtube_dl/extractor/teachingchannel.py | 33 ++ youtube_dl/extractor/teamcoco.py | 39 +- youtube_dl/extractor/ted.py | 224 +++++---- youtube_dl/extractor/testurl.py | 68 +++ youtube_dl/extractor/tf1.py | 40 +- youtube_dl/extractor/theplatform.py | 41 +- youtube_dl/extractor/tinypic.py | 2 +- youtube_dl/extractor/tlc.py | 60 +++ youtube_dl/extractor/toypics.py | 75 +++ youtube_dl/extractor/trutube.py | 44 ++ youtube_dl/extractor/tube8.py | 92 ++-- youtube_dl/extractor/tvigle.py | 84 ++++ youtube_dl/extractor/udemy.py | 164 +++++++ youtube_dl/extractor/urort.py | 61 +++ youtube_dl/extractor/ustream.py | 22 +- youtube_dl/extractor/veoh.py | 124 ++++- youtube_dl/extractor/vesti.py | 131 ++---- youtube_dl/extractor/vevo.py | 77 +++- youtube_dl/extractor/vh1.py | 124 +++++ youtube_dl/extractor/vice.py | 38 -- youtube_dl/extractor/videobam.py | 81 ++++ youtube_dl/extractor/videodetective.py | 22 +- youtube_dl/extractor/videolecturesnet.py | 70 +++ youtube_dl/extractor/videott.py | 58 +++ youtube_dl/extractor/videoweed.py | 26 ++ youtube_dl/extractor/viki.py | 45 +- youtube_dl/extractor/vimeo.py | 150 ++++-- youtube_dl/extractor/vine.py | 74 ++- youtube_dl/extractor/vk.py | 25 +- youtube_dl/extractor/vube.py | 88 ++-- youtube_dl/extractor/vuclip.py | 66 +++ youtube_dl/extractor/washingtonpost.py | 103 +++++ youtube_dl/extractor/wat.py | 52 +-- youtube_dl/extractor/wdr.py | 224 +++++++++ youtube_dl/extractor/weibo.py | 30 +- youtube_dl/extractor/wimp.py | 38 +- youtube_dl/extractor/worldstarhiphop.py | 45 +- youtube_dl/extractor/xbef.py | 50 ++ youtube_dl/extractor/xhamster.py | 136 +++--- youtube_dl/extractor/xnxx.py | 46 +- youtube_dl/extractor/xtube.py | 102 ++++- youtube_dl/extractor/xvideos.py | 17 +- youtube_dl/extractor/yahoo.py | 90 ++-- youtube_dl/extractor/youporn.py | 32 +- youtube_dl/extractor/youtube.py | 399 ++++++++-------- youtube_dl/extractor/zdf.py | 70 ++- youtube_dl/jsinterp.py | 116 +++++ youtube_dl/postprocessor/__init__.py | 4 + youtube_dl/postprocessor/atomicparsley.py | 56 +++ youtube_dl/postprocessor/ffmpeg.py | 25 +- youtube_dl/postprocessor/xattrpp.py | 3 +- youtube_dl/utils.py | 266 +++++++++-- youtube_dl/version.py | 2 +- 234 files changed, 11716 insertions(+), 3385 deletions(-) delete mode 100644 CHANGELOG create mode 100644 devscripts/prepare_manpage.py create mode 100644 docs/.gitignore create mode 100644 docs/Makefile create mode 100644 docs/conf.py create mode 100644 docs/index.rst create mode 100644 docs/module_guide.rst create mode 100644 test/test_InfoExtractor.py delete mode 100755 youtube_dl/InfoExtractors.py mode change 100644 => 100755 youtube_dl/YoutubeDL.py create mode 100644 youtube_dl/extractor/aftonbladet.py create mode 100644 youtube_dl/extractor/aol.py create mode 100644 youtube_dl/extractor/bilibili.py create mode 100644 youtube_dl/extractor/br.py create mode 100644 youtube_dl/extractor/byutv.py create mode 100644 youtube_dl/extractor/canal13cl.py create mode 100644 youtube_dl/extractor/cbsnews.py create mode 100644 youtube_dl/extractor/ceskatelevize.py create mode 100644 youtube_dl/extractor/clubic.py create mode 100644 youtube_dl/extractor/cnet.py delete mode 100644 youtube_dl/extractor/depositfiles.py create mode 100644 youtube_dl/extractor/divxstage.py create mode 100644 youtube_dl/extractor/empflix.py create mode 100644 youtube_dl/extractor/engadget.py create mode 100644 youtube_dl/extractor/fc2.py create mode 100644 youtube_dl/extractor/fivemin.py create mode 100644 youtube_dl/extractor/franceculture.py create mode 100644 youtube_dl/extractor/gdcvault.py create mode 100644 youtube_dl/extractor/hentaistigma.py rename youtube_dl/extractor/{statigram.py => iconosquare.py} (76%) create mode 100644 youtube_dl/extractor/ku6.py create mode 100644 youtube_dl/extractor/mailru.py create mode 100644 youtube_dl/extractor/morningstar.py create mode 100644 youtube_dl/extractor/motorsport.py create mode 100644 youtube_dl/extractor/moviezine.py create mode 100644 youtube_dl/extractor/movshare.py create mode 100644 youtube_dl/extractor/musicplayon.py create mode 100644 youtube_dl/extractor/newstube.py create mode 100644 youtube_dl/extractor/noco.py create mode 100644 youtube_dl/extractor/nrk.py create mode 100644 youtube_dl/extractor/ntv.py create mode 100644 youtube_dl/extractor/nuvid.py create mode 100644 youtube_dl/extractor/nytimes.py create mode 100644 youtube_dl/extractor/oe1.py create mode 100644 youtube_dl/extractor/parliamentliveuk.py create mode 100644 youtube_dl/extractor/playvid.py create mode 100644 youtube_dl/extractor/prosiebensat1.py create mode 100644 youtube_dl/extractor/rtbf.py create mode 100644 youtube_dl/extractor/rts.py create mode 100644 youtube_dl/extractor/rtve.py create mode 100644 youtube_dl/extractor/rutv.py create mode 100644 youtube_dl/extractor/savefrom.py create mode 100644 youtube_dl/extractor/scivee.py delete mode 100644 youtube_dl/extractor/slashdot.py create mode 100644 youtube_dl/extractor/slutload.py create mode 100644 youtube_dl/extractor/spiegeltv.py create mode 100644 youtube_dl/extractor/swrmediathek.py create mode 100644 youtube_dl/extractor/tagesschau.py create mode 100644 youtube_dl/extractor/teachertube.py create mode 100644 youtube_dl/extractor/teachingchannel.py create mode 100644 youtube_dl/extractor/testurl.py create mode 100644 youtube_dl/extractor/tlc.py create mode 100644 youtube_dl/extractor/toypics.py create mode 100644 youtube_dl/extractor/trutube.py create mode 100644 youtube_dl/extractor/tvigle.py create mode 100644 youtube_dl/extractor/udemy.py create mode 100644 youtube_dl/extractor/urort.py create mode 100644 youtube_dl/extractor/vh1.py delete mode 100644 youtube_dl/extractor/vice.py create mode 100644 youtube_dl/extractor/videobam.py create mode 100644 youtube_dl/extractor/videolecturesnet.py create mode 100644 youtube_dl/extractor/videott.py create mode 100644 youtube_dl/extractor/videoweed.py create mode 100644 youtube_dl/extractor/vuclip.py create mode 100644 youtube_dl/extractor/washingtonpost.py create mode 100644 youtube_dl/extractor/wdr.py create mode 100644 youtube_dl/extractor/xbef.py create mode 100644 youtube_dl/jsinterp.py create mode 100644 youtube_dl/postprocessor/atomicparsley.py diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index 3fa1167..0000000 --- a/CHANGELOG +++ /dev/null @@ -1,14 +0,0 @@ -2013.01.02 Codename: GIULIA - - * Add support for ComedyCentral clips - * Corrected Vimeo description fetching - * Added the --no-post-overwrites argument - * --verbose offers more environment info - * New info_dict field: uploader_id - * New updates system, with signature checking - * New IEs: NBA, JustinTV, FunnyOrDie, TweetReel, Steam, Ustream - * Fixed IEs: BlipTv - * Fixed for Python 3 IEs: Xvideo, Youku, XNXX, Dailymotion, Vimeo, InfoQ - * Simplified IEs and test code - * Various (Python 3 and other) fixes - * Revamped and expanded tests diff --git a/MANIFEST.in b/MANIFEST.in index 8f8af7a..d43cc1f 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -3,3 +3,4 @@ include test/*.py include test/*.json include youtube-dl.bash-completion include youtube-dl.1 +recursive-include docs Makefile conf.py *.rst diff --git a/Makefile b/Makefile index c6d0993..c079761 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ all: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion clean: - rm -rf youtube-dl.1 youtube-dl.bash-completion README.txt MANIFEST build/ dist/ .coverage cover/ youtube-dl.tar.gz + rm -rf youtube-dl.1.temp.md youtube-dl.1 youtube-dl.bash-completion README.txt MANIFEST build/ dist/ .coverage cover/ youtube-dl.tar.gz cleanall: clean rm -f youtube-dl youtube-dl.exe @@ -55,7 +55,9 @@ README.txt: README.md pandoc -f markdown -t plain README.md -o README.txt youtube-dl.1: README.md - pandoc -s -f markdown -t man README.md -o youtube-dl.1 + python devscripts/prepare_manpage.py >youtube-dl.1.temp.md + pandoc -s -f markdown -t man youtube-dl.1.temp.md -o youtube-dl.1 + rm -f youtube-dl.1.temp.md youtube-dl.bash-completion: youtube_dl/*.py youtube_dl/*/*.py devscripts/bash-completion.in python devscripts/bash-completion.py @@ -72,8 +74,9 @@ youtube-dl.tar.gz: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash- --exclude '__pycache' \ --exclude '.git' \ --exclude 'testdata' \ + --exclude 'docs/_build' \ -- \ - bin devscripts test youtube_dl \ - CHANGELOG LICENSE README.md README.txt \ + bin devscripts test youtube_dl docs \ + LICENSE README.md README.txt \ Makefile MANIFEST.in youtube-dl.1 youtube-dl.bash-completion setup.py \ youtube-dl diff --git a/README.md b/README.md index 35876d9..2bea609 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,24 @@ -% YOUTUBE-DL(1) - -# NAME youtube-dl - download videos from youtube.com or other video platforms # SYNOPSIS **youtube-dl** [OPTIONS] URL [URL...] +# INSTALLATION + +To install it right away for all UNIX users (Linux, OS X, etc.), type: + + sudo curl https://yt-dl.org/latest/youtube-dl -o /usr/local/bin/youtube-dl + sudo chmod a+x /usr/local/bin/youtube-dl + +If you do not have curl, you can alternatively use a recent wget: + + sudo wget https://yt-dl.org/downloads/2014.05.13/youtube-dl -O /usr/local/bin/youtube-dl + sudo chmod a+x /usr/local/bin/youtube-dl + +Windows users can [download a .exe file](https://yt-dl.org/latest/youtube-dl.exe) and place it in their home directory or any other location on their [PATH](http://en.wikipedia.org/wiki/PATH_%28variable%29). + +Alternatively, refer to the developer instructions below for how to check out and work with the git repository. For further options, including PGP signatures, see https://rg3.github.io/youtube-dl/download.html . + # DESCRIPTION **youtube-dl** is a small command-line program to download videos from YouTube.com and a few more sites. It requires the Python interpreter, version @@ -20,7 +33,7 @@ which means you can modify it, redistribute it or use it however you like. sure that you have sufficient permissions (run with sudo if needed) -i, --ignore-errors continue on download errors, for example to - to skip unavailable videos in a playlist + skip unavailable videos in a playlist --abort-on-error Abort downloading of further videos (in the playlist or the command line) if an error occurs @@ -28,6 +41,9 @@ which means you can modify it, redistribute it or use it however you like. --user-agent UA specify a custom user agent --referer REF specify a custom referer, use if the video access is restricted to one domain + --add-header FIELD:VALUE specify a custom HTTP header and its value, + separated by a colon ':'. You can use this + option multiple times --list-extractors List all supported extractors and the URLs they would handle --extractor-descriptions Output descriptions of all supported @@ -36,6 +52,9 @@ which means you can modify it, redistribute it or use it however you like. an empty string (--proxy "") for direct connection --no-check-certificate Suppress HTTPS certificate validation. + --prefer-insecure Use an unencrypted connection to retrieve + information about the video. (Currently + supported only for YouTube) --cache-dir DIR Location in the filesystem where youtube-dl can store some downloaded information permanently. By default $XDG_CACHE_HOME @@ -59,6 +78,7 @@ which means you can modify it, redistribute it or use it however you like. configuration in ~/.config/youtube-dl.conf (%APPDATA%/youtube-dl/config.txt on Windows) + --encoding ENCODING Force the specified encoding (experimental) ## Video Selection: --playlist-start NUMBER playlist video to start at (default is 1) @@ -124,8 +144,12 @@ which means you can modify it, redistribute it or use it however you like. video id, %(playlist)s for the playlist the video is in, %(playlist_index)s for the position in the playlist and %% for a - literal percent. Use - to output to stdout. - Can also be used to download to a different + literal percent. %(height)s and %(width)s + for the width and height of the video + format. %(resolution)s for a textual + description of the resolution of the video + format. Use - to output to stdout. Can also + be used to download to a different directory, for example with -o '/my/downloa ds/%(uploader)s/%(title)s-%(id)s.%(ext)s' . --autonumber-size NUMBER Specifies the number of digits in @@ -159,6 +183,7 @@ which means you can modify it, redistribute it or use it however you like. ## Verbosity / Simulation Options: -q, --quiet activates quiet mode + --no-warnings Ignore warnings -s, --simulate do not download the video and do not write anything to disk --skip-download do not download the video @@ -170,7 +195,9 @@ which means you can modify it, redistribute it or use it however you like. --get-duration simulate, quiet but print video length --get-filename simulate, quiet but print output filename --get-format simulate, quiet but print output format - -j, --dump-json simulate, quiet but print JSON information + -j, --dump-json simulate, quiet but print JSON information. + See --output for a description of available + keys. --newline output progress bar as new lines --no-progress do not print progress bar --console-title display progress in console titlebar @@ -187,9 +214,9 @@ which means you can modify it, redistribute it or use it however you like. preference using slashes: "-f 22/17/18". "-f mp4" and "-f flv" are also supported. You can also use the special names "best", - "bestaudio", "worst", and "worstaudio". By - default, youtube-dl will pick the best - quality. + "bestvideo", "bestaudio", "worst", + "worstvideo" and "worstaudio". By default, + youtube-dl will pick the best quality. --all-formats download all available video formats --prefer-free-formats prefer free video formats unless a specific one is requested @@ -236,6 +263,7 @@ which means you can modify it, redistribute it or use it however you like. default --embed-subs embed subtitles in the video (only for mp4 videos) + --embed-thumbnail embed thumbnail in the audio as cover art --add-metadata write metadata to the video file --xattrs write metadata to the video file's xattrs (using dublin core and xdg standards) @@ -246,7 +274,7 @@ which means you can modify it, redistribute it or use it however you like. # CONFIGURATION -You can configure youtube-dl by placing default arguments (such as `--extract-audio --no-mtime` to always extract the audio and not copy the mtime) into `/etc/youtube-dl.conf` and/or `~/.config/youtube-dl.conf`. On Windows, the configuration file locations are `%APPDATA%\youtube-dl\config.txt` and `C:\Users\\youtube-dl.conf`. +You can configure youtube-dl by placing default arguments (such as `--extract-audio --no-mtime` to always extract the audio and not copy the mtime) into `/etc/youtube-dl.conf` and/or `~/.config/youtube-dl/config`. On Windows, the configuration file locations are `%APPDATA%\youtube-dl\config.txt` and `C:\Users\\youtube-dl.conf`. # OUTPUT TEMPLATE @@ -281,12 +309,14 @@ Videos can be filtered by their upload date using the options `--date`, `--dateb Examples: - $ # Download only the videos uploaded in the last 6 months - $ youtube-dl --dateafter now-6months - $ # Download only the videos uploaded on January 1, 1970 - $ youtube-dl --date 19700101 - $ # will only download the videos uploaded in the 200x decade - $ youtube-dl --dateafter 20000101 --datebefore 20091231 + # Download only the videos uploaded in the last 6 months + $ youtube-dl --dateafter now-6months + + # Download only the videos uploaded on January 1, 1970 + $ youtube-dl --date 19700101 + + $ # will only download the videos uploaded in the 200x decade + $ youtube-dl --dateafter 20000101 --datebefore 20091231 # FAQ @@ -355,7 +385,67 @@ If you want to create a build of youtube-dl yourself, you'll need ### Adding support for a new site -If you want to add support for a new site, copy *any* [recently modified](https://github.com/rg3/youtube-dl/commits/master/youtube_dl/extractor) file in `youtube_dl/extractor`, add an import in [`youtube_dl/extractor/__init__.py`](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/__init__.py). Have a look at [`youtube_dl/common/extractor/common.py`](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/common.py) for possible helper methods and a [detailed description of what your extractor should return](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/common.py#L38). Don't forget to run the tests with `python test/test_download.py Test_Download.test_YourExtractor`! For a detailed tutorial, refer to [this blog post](http://filippo.io/add-support-for-a-new-video-site-to-youtube-dl/). +If you want to add support for a new site, you can follow this quick list (assuming your service is called `yourextractor`): + +1. [Fork this repository](https://github.com/rg3/youtube-dl/fork) +2. Check out the source code with `git clone git@github.com:YOUR_GITHUB_USERNAME/youtube-dl.git` +3. Start a new git branch with `cd youtube-dl; git checkout -b yourextractor` +4. Start with this simple template and save it to `youtube_dl/extractor/yourextractor.py`: + + # coding: utf-8 + from __future__ import unicode_literals + + import re + + from .common import InfoExtractor + + + class YourExtractorIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?yourextractor\.com/watch/(?P[0-9]+)' + _TEST = { + 'url': 'http://yourextractor.com/watch/42', + 'md5': 'TODO: md5 sum of the first 10KiB of the video file', + 'info_dict': { + 'id': '42', + 'ext': 'mp4', + 'title': 'Video title goes here', + # TODO more properties, either as: + # * A value + # * MD5 checksum; start the string with md5: + # * A regular expression; start the string with re: + # * Any Python type (for example int or float) + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + # TODO more code goes here, for example ... + webpage = self._download_webpage(url, video_id) + title = self._html_search_regex(r'

(.*?)

', webpage, 'title') + + return { + 'id': video_id, + 'title': title, + # TODO more properties (see youtube_dl/extractor/common.py) + } + + +5. Add an import in [`youtube_dl/extractor/__init__.py`](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/__init__.py). +6. Run `python test/test_download.py TestDownload.test_YourExtractor`. This *should fail* at first, but you can continually re-run it until you're done. +7. Have a look at [`youtube_dl/common/extractor/common.py`](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/common.py) for possible helper methods and a [detailed description of what your extractor should return](https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/common.py#L38). Add tests and code for as many as you want. +8. If you can, check the code with [pyflakes](https://pypi.python.org/pypi/pyflakes) (a good idea) and [pep8](https://pypi.python.org/pypi/pep8) (optional, ignore E501). +9. When the tests pass, [add](https://www.kernel.org/pub/software/scm/git/docs/git-add.html) the new files and [commit](https://www.kernel.org/pub/software/scm/git/docs/git-commit.html) them and [push](https://www.kernel.org/pub/software/scm/git/docs/git-push.html) the result, like this: + + $ git add youtube_dl/extractor/__init__.py + $ git add youtube_dl/extractor/yourextractor.py + $ git commit -m '[yourextractor] Add new extractor' + $ git push origin yourextractor + +10. Finally, [create a pull request](https://help.github.com/articles/creating-a-pull-request). We'll then review and merge it. + +In any case, thank you very much for your contributions! # BUGS @@ -381,7 +471,7 @@ If your report is shorter than two lines, it is almost certainly missing some of For bug reports, this means that your report should contain the *complete* output of youtube-dl when called with the -v flag. The error message you get for (most) bugs even says so, but you would not believe how many of our bug reports do not contain this information. -Site support requests must contain an example URL. An example URL is a URL you might want to download, like http://www.youtube.com/watch?v=BaW_jenozKc . There should be an obvious video present. Except under very special circumstances, the main page of a video service (e.g. http://www.youtube.com/ ) is *not* an example URL. +Site support requests **must contain an example URL**. An example URL is a URL you might want to download, like http://www.youtube.com/watch?v=BaW_jenozKc . There should be an obvious video present. Except under very special circumstances, the main page of a video service (e.g. http://www.youtube.com/ ) is *not* an example URL. ### Are you using the latest version? diff --git a/README.txt b/README.txt index 0015a74..4757a33 100644 --- a/README.txt +++ b/README.txt @@ -1,6 +1,3 @@ -NAME -==== - youtube-dl - download videos from youtube.com or other video platforms SYNOPSIS @@ -8,6 +5,27 @@ SYNOPSIS youtube-dl OPTIONS URL [URL...] +INSTALLATION +============ + +To install it right away for all UNIX users (Linux, OS X, etc.), type: + + sudo curl https://yt-dl.org/latest/youtube-dl -o /usr/local/bin/youtube-dl + sudo chmod a+x /usr/local/bin/youtube-dl + +If you do not have curl, you can alternatively use a recent wget: + + sudo wget https://yt-dl.org/downloads/2014.05.13/youtube-dl -O /usr/local/bin/youtube-dl + sudo chmod a+x /usr/local/bin/youtube-dl + +Windows users can download a .exe file and place it in their home +directory or any other location on their PATH. + +Alternatively, refer to the developer instructions below for how to +check out and work with the git repository. For further options, +including PGP signatures, see +https://rg3.github.io/youtube-dl/download.html . + DESCRIPTION =========== @@ -27,7 +45,7 @@ OPTIONS sure that you have sufficient permissions (run with sudo if needed) -i, --ignore-errors continue on download errors, for example to - to skip unavailable videos in a playlist + skip unavailable videos in a playlist --abort-on-error Abort downloading of further videos (in the playlist or the command line) if an error occurs @@ -35,6 +53,9 @@ OPTIONS --user-agent UA specify a custom user agent --referer REF specify a custom referer, use if the video access is restricted to one domain + --add-header FIELD:VALUE specify a custom HTTP header and its value, + separated by a colon ':'. You can use this + option multiple times --list-extractors List all supported extractors and the URLs they would handle --extractor-descriptions Output descriptions of all supported @@ -43,6 +64,9 @@ OPTIONS an empty string (--proxy "") for direct connection --no-check-certificate Suppress HTTPS certificate validation. + --prefer-insecure Use an unencrypted connection to retrieve + information about the video. (Currently + supported only for YouTube) --cache-dir DIR Location in the filesystem where youtube-dl can store some downloaded information permanently. By default $XDG_CACHE_HOME @@ -66,6 +90,7 @@ OPTIONS configuration in ~/.config/youtube-dl.conf (%APPDATA%/youtube-dl/config.txt on Windows) + --encoding ENCODING Force the specified encoding (experimental) Video Selection: ---------------- @@ -137,8 +162,12 @@ Filesystem Options: video id, %(playlist)s for the playlist the video is in, %(playlist_index)s for the position in the playlist and %% for a - literal percent. Use - to output to stdout. - Can also be used to download to a different + literal percent. %(height)s and %(width)s + for the width and height of the video + format. %(resolution)s for a textual + description of the resolution of the video + format. Use - to output to stdout. Can also + be used to download to a different directory, for example with -o '/my/downloa ds/%(uploader)s/%(title)s-%(id)s.%(ext)s' . --autonumber-size NUMBER Specifies the number of digits in @@ -174,6 +203,7 @@ Verbosity / Simulation Options: ------------------------------- -q, --quiet activates quiet mode + --no-warnings Ignore warnings -s, --simulate do not download the video and do not write anything to disk --skip-download do not download the video @@ -185,7 +215,9 @@ Verbosity / Simulation Options: --get-duration simulate, quiet but print video length --get-filename simulate, quiet but print output filename --get-format simulate, quiet but print output format - -j, --dump-json simulate, quiet but print JSON information + -j, --dump-json simulate, quiet but print JSON information. + See --output for a description of available + keys. --newline output progress bar as new lines --no-progress do not print progress bar --console-title display progress in console titlebar @@ -204,9 +236,9 @@ Video Format Options: preference using slashes: "-f 22/17/18". "-f mp4" and "-f flv" are also supported. You can also use the special names "best", - "bestaudio", "worst", and "worstaudio". By - default, youtube-dl will pick the best - quality. + "bestvideo", "bestaudio", "worst", + "worstvideo" and "worstaudio". By default, + youtube-dl will pick the best quality. --all-formats download all available video formats --prefer-free-formats prefer free video formats unless a specific one is requested @@ -259,6 +291,7 @@ Post-processing Options: default --embed-subs embed subtitles in the video (only for mp4 videos) + --embed-thumbnail embed thumbnail in the audio as cover art --add-metadata write metadata to the video file --xattrs write metadata to the video file's xattrs (using dublin core and xdg standards) @@ -272,7 +305,7 @@ CONFIGURATION You can configure youtube-dl by placing default arguments (such as --extract-audio --no-mtime to always extract the audio and not copy the -mtime) into /etc/youtube-dl.conf and/or ~/.config/youtube-dl.conf. On +mtime) into /etc/youtube-dl.conf and/or ~/.config/youtube-dl/config. On Windows, the configuration file locations are %APPDATA%\youtube-dl\config.txt and C:\Users\\youtube-dl.conf. @@ -330,11 +363,14 @@ Videos can be filtered by their upload date using the options --date, Examples: -$ # Download only the videos uploaded in the last 6 months $ youtube-dl ---dateafter now-6months $ # Download only the videos uploaded on January -1, 1970 $ youtube-dl --date 19700101 $ # will only download the videos -uploaded in the 200x decade $ youtube-dl --dateafter 20000101 ---datebefore 20091231 + # Download only the videos uploaded in the last 6 months + $ youtube-dl --dateafter now-6months + + # Download only the videos uploaded on January 1, 1970 + $ youtube-dl --date 19700101 + + $ # will only download the videos uploaded in the 200x decade + $ youtube-dl --dateafter 20000101 --datebefore 20091231 FAQ === @@ -433,14 +469,76 @@ If you want to create a build of youtube-dl yourself, you'll need Adding support for a new site -If you want to add support for a new site, copy any recently modified -file in youtube_dl/extractor, add an import in -youtube_dl/extractor/__init__.py. Have a look at -youtube_dl/common/extractor/common.py for possible helper methods and a -detailed description of what your extractor should return. Don't forget -to run the tests with -python test/test_download.py Test_Download.test_YourExtractor! For a -detailed tutorial, refer to this blog post. +If you want to add support for a new site, you can follow this quick +list (assuming your service is called yourextractor): + +1. Fork this repository +2. Check out the source code with + git clone git@github.com:YOUR_GITHUB_USERNAME/youtube-dl.git +3. Start a new git branch with + cd youtube-dl; git checkout -b yourextractor +4. Start with this simple template and save it to + youtube_dl/extractor/yourextractor.py: + + # coding: utf-8 + from __future__ import unicode_literals + + import re + + from .common import InfoExtractor + + + class YourExtractorIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?yourextractor\.com/watch/(?P[0-9]+)' + _TEST = { + 'url': 'http://yourextractor.com/watch/42', + 'md5': 'TODO: md5 sum of the first 10KiB of the video file', + 'info_dict': { + 'id': '42', + 'ext': 'mp4', + 'title': 'Video title goes here', + # TODO more properties, either as: + # * A value + # * MD5 checksum; start the string with md5: + # * A regular expression; start the string with re: + # * Any Python type (for example int or float) + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + # TODO more code goes here, for example ... + webpage = self._download_webpage(url, video_id) + title = self._html_search_regex(r'

(.*?)

', webpage, 'title') + + return { + 'id': video_id, + 'title': title, + # TODO more properties (see youtube_dl/extractor/common.py) + } + +5. Add an import in youtube_dl/extractor/__init__.py. +6. Run python test/test_download.py TestDownload.test_YourExtractor. + This should fail at first, but you can continually re-run it until + you're done. +7. Have a look at youtube_dl/common/extractor/common.py for possible + helper methods and a detailed description of what your extractor + should return. Add tests and code for as many as you want. +8. If you can, check the code with pyflakes (a good idea) and pep8 + (optional, ignore E501). +9. When the tests pass, add the new files and commit them and push the + result, like this: + + $ git add youtube_dl/extractor/__init__.py + $ git add youtube_dl/extractor/yourextractor.py + $ git commit -m '[yourextractor] Add new extractor' + $ git push origin yourextractor + +10. Finally, create a pull request. We'll then review and merge it. + +In any case, thank you very much for your contributions! BUGS ==== diff --git a/devscripts/make_readme.py b/devscripts/make_readme.py index cae1fa4..70fa942 100755 --- a/devscripts/make_readme.py +++ b/devscripts/make_readme.py @@ -15,7 +15,7 @@ header = oldreadme[:oldreadme.index('# OPTIONS')] footer = oldreadme[oldreadme.index('# CONFIGURATION'):] options = helptext[helptext.index(' General Options:') + 19:] -options = re.sub(r'^ (\w.+)$', r'## \1', options, flags=re.M) +options = re.sub(r'(?m)^ (\w.+)$', r'## \1', options) options = '# OPTIONS\n' + options + '\n' with io.open(README_FILE, 'w', encoding='utf-8') as f: diff --git a/devscripts/prepare_manpage.py b/devscripts/prepare_manpage.py new file mode 100644 index 0000000..d9c8570 --- /dev/null +++ b/devscripts/prepare_manpage.py @@ -0,0 +1,20 @@ + +import io +import os.path +import sys +import re + +ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +README_FILE = os.path.join(ROOT_DIR, 'README.md') + +with io.open(README_FILE, encoding='utf-8') as f: + readme = f.read() + +PREFIX = '%YOUTUBE-DL(1)\n\n# NAME\n' +readme = re.sub(r'(?s)# INSTALLATION.*?(?=# DESCRIPTION)', '', readme) +readme = PREFIX + readme + +if sys.version_info < (3, 0): + print(readme.encode('utf-8')) +else: + print(readme) diff --git a/devscripts/release.sh b/devscripts/release.sh index 323acf8..453087e 100755 --- a/devscripts/release.sh +++ b/devscripts/release.sh @@ -14,14 +14,20 @@ set -e -skip_tests=false -if [ "$1" = '--skip-test' ]; then - skip_tests=true +skip_tests=true +if [ "$1" = '--run-tests' ]; then + skip_tests=false shift fi if [ -z "$1" ]; then echo "ERROR: specify version number like this: $0 1994.09.06"; exit 1; fi version="$1" +major_version=$(echo "$version" | sed -n 's#^\([0-9]*\.[0-9]*\.[0-9]*\).*#\1#p') +if test "$major_version" '!=' "$(date '+%Y.%m.%d')"; then + echo "$version does not start with today's date!" + exit 1 +fi + if [ ! -z "`git tag | grep "$version"`" ]; then echo 'ERROR: version already present'; exit 1; fi if [ ! -z "`git status --porcelain | grep -v CHANGELOG`" ]; then echo 'ERROR: the working directory is not clean; commit or stash changes'; exit 1; fi useless_files=$(find youtube_dl -type f -not -name '*.py') @@ -39,9 +45,9 @@ fi /bin/echo -e "\n### Changing version in version.py..." sed -i "s/__version__ = '.*'/__version__ = '$version'/" youtube_dl/version.py -/bin/echo -e "\n### Committing CHANGELOG README.md and youtube_dl/version.py..." +/bin/echo -e "\n### Committing README.md and youtube_dl/version.py..." make README.md -git add CHANGELOG README.md youtube_dl/version.py +git add README.md youtube_dl/version.py git commit -m "release $version" /bin/echo -e "\n### Now tagging, signing and pushing..." @@ -70,7 +76,7 @@ RELEASE_FILES="youtube-dl youtube-dl.exe youtube-dl-$version.tar.gz" git checkout HEAD -- youtube-dl youtube-dl.exe /bin/echo -e "\n### Signing and uploading the new binaries to yt-dl.org ..." -for f in $RELEASE_FILES; do gpg --detach-sig "build/$version/$f"; done +for f in $RELEASE_FILES; do gpg --passphrase-repeat 5 --detach-sig "build/$version/$f"; done scp -r "build/$version" ytdl@yt-dl.org:html/tmp/ ssh ytdl@yt-dl.org "mv html/tmp/$version html/downloads/" ssh ytdl@yt-dl.org "sh html/update_latest.sh $version" @@ -97,7 +103,7 @@ rm -rf build make pypi-files echo "Uploading to PyPi ..." -python setup.py sdist upload +python setup.py sdist bdist_wheel upload make clean /bin/echo -e "\n### DONE!" diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..69fa449 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1 @@ +_build/ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..7122180 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,177 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# User-friendly check for sphinx-build +ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) +$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) +endif + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext + +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + +clean: + rm -rf $(BUILDDIR)/* + +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/youtube-dl.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/youtube-dl.qhc" + +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/youtube-dl" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/youtube-dl" + @echo "# devhelp" + +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..4a04ad7 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# +# youtube-dl documentation build configuration file, created by +# sphinx-quickstart on Fri Mar 14 21:05:43 2014. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +import sys +import os +# Allows to import youtube_dl +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +# -- General configuration ------------------------------------------------ + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix of source filenames. +source_suffix = '.rst' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'youtube-dl' +copyright = u'2014, Ricardo Garcia Gonzalez' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +import youtube_dl +version = youtube_dl.__version__ +# The full version, including alpha/beta/rc tags. +release = version + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +exclude_patterns = ['_build'] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +html_theme = 'default' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Output file base name for HTML help builder. +htmlhelp_basename = 'youtube-dldoc' diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..b746ff9 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,23 @@ +Welcome to youtube-dl's documentation! +====================================== + +*youtube-dl* is a command-line program to download videos from YouTube.com and more sites. +It can also be used in Python code. + +Developer guide +--------------- + +This section contains information for using *youtube-dl* from Python programs. + +.. toctree:: + :maxdepth: 2 + + module_guide + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/module_guide.rst b/docs/module_guide.rst new file mode 100644 index 0000000..03d7288 --- /dev/null +++ b/docs/module_guide.rst @@ -0,0 +1,67 @@ +Using the ``youtube_dl`` module +=============================== + +When using the ``youtube_dl`` module, you start by creating an instance of :class:`YoutubeDL` and adding all the available extractors: + +.. code-block:: python + + >>> from youtube_dl import YoutubeDL + >>> ydl = YoutubeDL() + >>> ydl.add_default_info_extractors() + +Extracting video information +---------------------------- + +You use the :meth:`YoutubeDL.extract_info` method for getting the video information, which returns a dictionary: + +.. code-block:: python + + >>> info = ydl.extract_info('http://www.youtube.com/watch?v=BaW_jenozKc', download=False) + [youtube] Setting language + [youtube] BaW_jenozKc: Downloading webpage + [youtube] BaW_jenozKc: Downloading video info webpage + [youtube] BaW_jenozKc: Extracting video information + >>> info['title'] + 'youtube-dl test video "\'/\\ä↭𝕐' + >>> info['height'], info['width'] + (720, 1280) + +If you want to download or play the video you can get its url: + +.. code-block:: python + + >>> info['url'] + 'https://...' + +Extracting playlist information +------------------------------- + +The playlist information is extracted in a similar way, but the dictionary is a bit different: + +.. code-block:: python + + >>> playlist = ydl.extract_info('http://www.ted.com/playlists/13/open_source_open_world', download=False) + [TED] open_source_open_world: Downloading playlist webpage + ... + >>> playlist['title'] + 'Open-source, open world' + + + +You can access the videos in the playlist with the ``entries`` field: + +.. code-block:: python + + >>> for video in playlist['entries']: + ... print('Video #%d: %s' % (video['playlist_index'], video['title'])) + + Video #1: How Arduino is open-sourcing imagination + Video #2: The year open data went worldwide + Video #3: Massive-scale online collaboration + Video #4: The art of asking + Video #5: How cognitive surplus will change the world + Video #6: The birth of Wikipedia + Video #7: Coding a better government + Video #8: The era of open innovation + Video #9: The currency of the new economy is trust + diff --git a/test/helper.py b/test/helper.py index b1f421a..230d2bd 100644 --- a/test/helper.py +++ b/test/helper.py @@ -9,7 +9,10 @@ import sys import youtube_dl.extractor from youtube_dl import YoutubeDL -from youtube_dl.utils import preferredencoding +from youtube_dl.utils import ( + compat_str, + preferredencoding, +) def get_params(override=None): @@ -71,15 +74,77 @@ class FakeYDL(YoutubeDL): old_report_warning(message) self.report_warning = types.MethodType(report_warning, self) -def get_testcases(): + +def gettestcases(include_onlymatching=False): for ie in youtube_dl.extractor.gen_extractors(): t = getattr(ie, '_TEST', None) if t: - t['name'] = type(ie).__name__[:-len('IE')] - yield t - for t in getattr(ie, '_TESTS', []): + assert not hasattr(ie, '_TESTS'), \ + '%s has _TEST and _TESTS' % type(ie).__name__ + tests = [t] + else: + tests = getattr(ie, '_TESTS', []) + for t in tests: + if not include_onlymatching and t.get('only_matching', False): + continue t['name'] = type(ie).__name__[:-len('IE')] yield t md5 = lambda s: hashlib.md5(s.encode('utf-8')).hexdigest() + + +def expect_info_dict(self, expected_dict, got_dict): + for info_field, expected in expected_dict.items(): + if isinstance(expected, compat_str) and expected.startswith('re:'): + got = got_dict.get(info_field) + match_str = expected[len('re:'):] + match_rex = re.compile(match_str) + + self.assertTrue( + isinstance(got, compat_str) and match_rex.match(got), + u'field %s (value: %r) should match %r' % (info_field, got, match_str)) + elif isinstance(expected, type): + got = got_dict.get(info_field) + self.assertTrue(isinstance(got, expected), + u'Expected type %r for field %s, but got value %r of type %r' % (expected, info_field, got, type(got))) + else: + if isinstance(expected, compat_str) and expected.startswith('md5:'): + got = 'md5:' + md5(got_dict.get(info_field)) + else: + got = got_dict.get(info_field) + self.assertEqual(expected, got, + u'invalid value for field %s, expected %r, got %r' % (info_field, expected, got)) + + # Check for the presence of mandatory fields + for key in ('id', 'url', 'title', 'ext'): + self.assertTrue(got_dict.get(key), 'Missing mandatory field %s' % key) + # Check for mandatory fields that are automatically set by YoutubeDL + for key in ['webpage_url', 'extractor', 'extractor_key']: + self.assertTrue(got_dict.get(key), u'Missing field: %s' % key) + + # Are checkable fields missing from the test case definition? + test_info_dict = dict((key, value if not isinstance(value, compat_str) or len(value) < 250 else 'md5:' + md5(value)) + for key, value in got_dict.items() + if value and key in ('title', 'description', 'uploader', 'upload_date', 'timestamp', 'uploader_id', 'location')) + missing_keys = set(test_info_dict.keys()) - set(expected_dict.keys()) + if missing_keys: + sys.stderr.write(u'\n"info_dict": ' + json.dumps(test_info_dict, ensure_ascii=False, indent=4) + u'\n') + self.assertFalse( + missing_keys, + 'Missing keys in test definition: %s' % ( + ', '.join(sorted(missing_keys)))) + + +def assertRegexpMatches(self, text, regexp, msg=None): + if hasattr(self, 'assertRegexpMatches'): + return self.assertRegexpMatches(text, regexp, msg) + else: + m = re.match(regexp, text) + if not m: + note = 'Regexp didn\'t match: %r not found in %r' % (regexp, text) + if msg is None: + msg = note + else: + msg = note + ', ' + msg + self.assertTrue(m, msg) diff --git a/test/test_InfoExtractor.py b/test/test_InfoExtractor.py new file mode 100644 index 0000000..13c18ed --- /dev/null +++ b/test/test_InfoExtractor.py @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +from __future__ import unicode_literals + +# Allow direct execution +import os +import sys +import unittest +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + +from test.helper import FakeYDL +from youtube_dl.extractor.common import InfoExtractor +from youtube_dl.extractor import YoutubeIE, get_info_extractor + + +class TestIE(InfoExtractor): + pass + + +class TestInfoExtractor(unittest.TestCase): + def setUp(self): + self.ie = TestIE(FakeYDL()) + + def test_ie_key(self): + self.assertEqual(get_info_extractor(YoutubeIE.ie_key()), YoutubeIE) + + def test_html_search_regex(self): + html = '

Watch this video

' + search = lambda re, *args: self.ie._html_search_regex(re, html, *args) + self.assertEqual(search(r'

(.+?)

', 'foo'), 'Watch this video') + + def test_opengraph(self): + ie = self.ie + html = ''' + + + + ''' + self.assertEqual(ie._og_search_title(html), 'Foo') + self.assertEqual(ie._og_search_description(html), 'Some video\'s description ') + self.assertEqual(ie._og_search_thumbnail(html), 'http://domain.com/pic.jpg?key1=val1&key2=val2') + +if __name__ == '__main__': + unittest.main() diff --git a/test/test_YoutubeDL.py b/test/test_YoutubeDL.py index 37e7b9b..e794cc9 100644 --- a/test/test_YoutubeDL.py +++ b/test/test_YoutubeDL.py @@ -8,7 +8,7 @@ import sys import unittest sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from test.helper import FakeYDL +from test.helper import FakeYDL, assertRegexpMatches from youtube_dl import YoutubeDL from youtube_dl.extractor import YoutubeIE @@ -26,16 +26,27 @@ class YDL(FakeYDL): self.msgs.append(msg) +def _make_result(formats, **kwargs): + res = { + 'formats': formats, + 'id': 'testid', + 'title': 'testttitle', + 'extractor': 'testex', + } + res.update(**kwargs) + return res + + class TestFormatSelection(unittest.TestCase): def test_prefer_free_formats(self): # Same resolution => download webm ydl = YDL() ydl.params['prefer_free_formats'] = True formats = [ - {'ext': 'webm', 'height': 460}, - {'ext': 'mp4', 'height': 460}, + {'ext': 'webm', 'height': 460, 'url': 'x'}, + {'ext': 'mp4', 'height': 460, 'url': 'y'}, ] - info_dict = {'formats': formats, 'extractor': 'test'} + info_dict = _make_result(formats) yie = YoutubeIE(ydl) yie._sort_formats(info_dict['formats']) ydl.process_ie_result(info_dict) @@ -46,8 +57,8 @@ class TestFormatSelection(unittest.TestCase): ydl = YDL() ydl.params['prefer_free_formats'] = True formats = [ - {'ext': 'webm', 'height': 720}, - {'ext': 'mp4', 'height': 1080}, + {'ext': 'webm', 'height': 720, 'url': 'a'}, + {'ext': 'mp4', 'height': 1080, 'url': 'b'}, ] info_dict['formats'] = formats yie = YoutubeIE(ydl) @@ -56,13 +67,13 @@ class TestFormatSelection(unittest.TestCase): downloaded = ydl.downloaded_info_dicts[0] self.assertEqual(downloaded['ext'], 'mp4') - # No prefer_free_formats => prefer mp4 and flv for greater compatibilty + # No prefer_free_formats => prefer mp4 and flv for greater compatibility ydl = YDL() ydl.params['prefer_free_formats'] = False formats = [ - {'ext': 'webm', 'height': 720}, - {'ext': 'mp4', 'height': 720}, - {'ext': 'flv', 'height': 720}, + {'ext': 'webm', 'height': 720, 'url': '_'}, + {'ext': 'mp4', 'height': 720, 'url': '_'}, + {'ext': 'flv', 'height': 720, 'url': '_'}, ] info_dict['formats'] = formats yie = YoutubeIE(ydl) @@ -74,8 +85,8 @@ class TestFormatSelection(unittest.TestCase): ydl = YDL() ydl.params['prefer_free_formats'] = False formats = [ - {'ext': 'flv', 'height': 720}, - {'ext': 'webm', 'height': 720}, + {'ext': 'flv', 'height': 720, 'url': '_'}, + {'ext': 'webm', 'height': 720, 'url': '_'}, ] info_dict['formats'] = formats yie = YoutubeIE(ydl) @@ -91,8 +102,7 @@ class TestFormatSelection(unittest.TestCase): {'format_id': 'great', 'url': 'http://example.com/great', 'preference': 3}, {'format_id': 'excellent', 'url': 'http://example.com/exc', 'preference': 4}, ] - info_dict = { - 'formats': formats, 'extractor': 'test', 'id': 'testvid'} + info_dict = _make_result(formats) ydl = YDL() ydl.process_ie_result(info_dict) @@ -120,12 +130,12 @@ class TestFormatSelection(unittest.TestCase): def test_format_selection(self): formats = [ - {'format_id': '35', 'ext': 'mp4', 'preference': 1}, - {'format_id': '45', 'ext': 'webm', 'preference': 2}, - {'format_id': '47', 'ext': 'webm', 'preference': 3}, - {'format_id': '2', 'ext': 'flv', 'preference': 4}, + {'format_id': '35', 'ext': 'mp4', 'preference': 1, 'url': '_'}, + {'format_id': '45', 'ext': 'webm', 'preference': 2, 'url': '_'}, + {'format_id': '47', 'ext': 'webm', 'preference': 3, 'url': '_'}, + {'format_id': '2', 'ext': 'flv', 'preference': 4, 'url': '_'}, ] - info_dict = {'formats': formats, 'extractor': 'test'} + info_dict = _make_result(formats) ydl = YDL({'format': '20/47'}) ydl.process_ie_result(info_dict.copy()) @@ -154,12 +164,12 @@ class TestFormatSelection(unittest.TestCase): def test_format_selection_audio(self): formats = [ - {'format_id': 'audio-low', 'ext': 'webm', 'preference': 1, 'vcodec': 'none'}, - {'format_id': 'audio-mid', 'ext': 'webm', 'preference': 2, 'vcodec': 'none'}, - {'format_id': 'audio-high', 'ext': 'flv', 'preference': 3, 'vcodec': 'none'}, - {'format_id': 'vid', 'ext': 'mp4', 'preference': 4}, + {'format_id': 'audio-low', 'ext': 'webm', 'preference': 1, 'vcodec': 'none', 'url': '_'}, + {'format_id': 'audio-mid', 'ext': 'webm', 'preference': 2, 'vcodec': 'none', 'url': '_'}, + {'format_id': 'audio-high', 'ext': 'flv', 'preference': 3, 'vcodec': 'none', 'url': '_'}, + {'format_id': 'vid', 'ext': 'mp4', 'preference': 4, 'url': '_'}, ] - info_dict = {'formats': formats, 'extractor': 'test'} + info_dict = _make_result(formats) ydl = YDL({'format': 'bestaudio'}) ydl.process_ie_result(info_dict.copy()) @@ -172,16 +182,34 @@ class TestFormatSelection(unittest.TestCase): self.assertEqual(downloaded['format_id'], 'audio-low') formats = [ - {'format_id': 'vid-low', 'ext': 'mp4', 'preference': 1}, - {'format_id': 'vid-high', 'ext': 'mp4', 'preference': 2}, + {'format_id': 'vid-low', 'ext': 'mp4', 'preference': 1, 'url': '_'}, + {'format_id': 'vid-high', 'ext': 'mp4', 'preference': 2, 'url': '_'}, ] - info_dict = {'formats': formats, 'extractor': 'test'} + info_dict = _make_result(formats) ydl = YDL({'format': 'bestaudio/worstaudio/best'}) ydl.process_ie_result(info_dict.copy()) downloaded = ydl.downloaded_info_dicts[0] self.assertEqual(downloaded['format_id'], 'vid-high') + def test_format_selection_video(self): + formats = [ + {'format_id': 'dash-video-low', 'ext': 'mp4', 'preference': 1, 'acodec': 'none', 'url': '_'}, + {'format_id': 'dash-video-high', 'ext': 'mp4', 'preference': 2, 'acodec': 'none', 'url': '_'}, + {'format_id': 'vid', 'ext': 'mp4', 'preference': 3, 'url': '_'}, + ] + info_dict = _make_result(formats) + + ydl = YDL({'format': 'bestvideo'}) + ydl.process_ie_result(info_dict.copy()) + downloaded = ydl.downloaded_info_dicts[0] + self.assertEqual(downloaded['format_id'], 'dash-video-high') + + ydl = YDL({'format': 'worstvideo'}) + ydl.process_ie_result(info_dict.copy()) + downloaded = ydl.downloaded_info_dicts[0] + self.assertEqual(downloaded['format_id'], 'dash-video-low') + def test_youtube_format_selection(self): order = [ '38', '37', '46', '22', '45', '35', '44', '18', '34', '43', '6', '5', '36', '17', '13', @@ -199,10 +227,12 @@ class TestFormatSelection(unittest.TestCase): for f1id, f2id in zip(order, order[1:]): f1 = YoutubeIE._formats[f1id].copy() f1['format_id'] = f1id + f1['url'] = 'url:' + f1id f2 = YoutubeIE._formats[f2id].copy() f2['format_id'] = f2id + f2['url'] = 'url:' + f2id - info_dict = {'formats': [f1, f2], 'extractor': 'youtube'} + info_dict = _make_result([f1, f2], extractor='youtube') ydl = YDL() yie = YoutubeIE(ydl) yie._sort_formats(info_dict['formats']) @@ -210,7 +240,7 @@ class TestFormatSelection(unittest.TestCase): downloaded = ydl.downloaded_info_dicts[0] self.assertEqual(downloaded['format_id'], f1id) - info_dict = {'formats': [f2, f1], 'extractor': 'youtube'} + info_dict = _make_result([f2, f1], extractor='youtube') ydl = YDL() yie = YoutubeIE(ydl) yie._sort_formats(info_dict['formats']) @@ -244,6 +274,12 @@ class TestFormatSelection(unittest.TestCase): # Replace missing fields with 'NA' self.assertEqual(fname('%(uploader_date)s-%(id)s.%(ext)s'), 'NA-1234.mp4') + def test_format_note(self): + ydl = YoutubeDL() + self.assertEqual(ydl._format_note({}), '') + assertRegexpMatches(self, ydl._format_note({ + 'vbr': 10, + }), '^\s*10k$') if __name__ == '__main__': unittest.main() diff --git a/test/test_age_restriction.py b/test/test_age_restriction.py index c9cdb96..71e80b0 100644 --- a/test/test_age_restriction.py +++ b/test/test_age_restriction.py @@ -13,7 +13,7 @@ from youtube_dl import YoutubeDL def _download_restricted(url, filename, age): - """ Returns true iff the file has been downloaded """ + """ Returns true if the file has been downloaded """ params = { 'age_limit': age, diff --git a/test/test_all_urls.py b/test/test_all_urls.py index aa8e4e4..4b56137 100644 --- a/test/test_all_urls.py +++ b/test/test_all_urls.py @@ -9,7 +9,7 @@ import unittest sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from test.helper import get_testcases +from test.helper import gettestcases from youtube_dl.extractor import ( FacebookIE, @@ -49,6 +49,7 @@ class TestAllURLsMatching(unittest.TestCase): self.assertMatch('http://youtu.be/BaW_jenozKc', ['youtube']) self.assertMatch('http://www.youtube.com/v/BaW_jenozKc', ['youtube']) self.assertMatch('https://youtube.googleapis.com/v/BaW_jenozKc', ['youtube']) + self.assertMatch('http://www.cleanvideosearch.com/media/action/yt/watch?videoId=8v_4O44sfjM', ['youtube']) def test_youtube_channel_matching(self): assertChannel = lambda url: self.assertMatch(url, ['youtube:channel']) @@ -68,21 +69,28 @@ class TestAllURLsMatching(unittest.TestCase): def test_youtube_show_matching(self): self.assertMatch('http://www.youtube.com/show/airdisasters', ['youtube:show']) + def test_youtube_truncated(self): + self.assertMatch('http://www.youtube.com/watch?', ['youtube:truncated_url']) + + def test_youtube_search_matching(self): + self.assertMatch('http://www.youtube.com/results?search_query=making+mustard', ['youtube:search_url']) + self.assertMatch('https://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=video', ['youtube:search_url']) + def test_justin_tv_channelid_matching(self): - self.assertTrue(JustinTVIE.suitable(u"justin.tv/vanillatv")) - self.assertTrue(JustinTVIE.suitable(u"twitch.tv/vanillatv")) - self.assertTrue(JustinTVIE.suitable(u"www.justin.tv/vanillatv")) - self.assertTrue(JustinTVIE.suitable(u"www.twitch.tv/vanillatv")) - self.assertTrue(JustinTVIE.suitable(u"http://www.justin.tv/vanillatv")) - self.assertTrue(JustinTVIE.suitable(u"http://www.twitch.tv/vanillatv")) - self.assertTrue(JustinTVIE.suitable(u"http://www.justin.tv/vanillatv/")) - self.assertTrue(JustinTVIE.suitable(u"http://www.twitch.tv/vanillatv/")) + self.assertTrue(JustinTVIE.suitable('justin.tv/vanillatv')) + self.assertTrue(JustinTVIE.suitable('twitch.tv/vanillatv')) + self.assertTrue(JustinTVIE.suitable('www.justin.tv/vanillatv')) + self.assertTrue(JustinTVIE.suitable('www.twitch.tv/vanillatv')) + self.assertTrue(JustinTVIE.suitable('http://www.justin.tv/vanillatv')) + self.assertTrue(JustinTVIE.suitable('http://www.twitch.tv/vanillatv')) + self.assertTrue(JustinTVIE.suitable('http://www.justin.tv/vanillatv/')) + self.assertTrue(JustinTVIE.suitable('http://www.twitch.tv/vanillatv/')) def test_justintv_videoid_matching(self): - self.assertTrue(JustinTVIE.suitable(u"http://www.twitch.tv/vanillatv/b/328087483")) + self.assertTrue(JustinTVIE.suitable('http://www.twitch.tv/vanillatv/b/328087483')) def test_justin_tv_chapterid_matching(self): - self.assertTrue(JustinTVIE.suitable(u"http://www.twitch.tv/tsm_theoddone/c/2349361")) + self.assertTrue(JustinTVIE.suitable('http://www.twitch.tv/tsm_theoddone/c/2349361')) def test_youtube_extract(self): assertExtractId = lambda url, id: self.assertEqual(YoutubeIE.extract_id(url), id) @@ -98,7 +106,7 @@ class TestAllURLsMatching(unittest.TestCase): def test_no_duplicates(self): ies = gen_extractors() - for tc in get_testcases(): + for tc in gettestcases(include_onlymatching=True): url = tc['url'] for ie in ies: if type(ie).__name__ in ('GenericIE', tc['name'] + 'IE'): @@ -117,6 +125,8 @@ class TestAllURLsMatching(unittest.TestCase): def test_vimeo_matching(self): self.assertMatch('http://vimeo.com/channels/tributes', ['vimeo:channel']) + self.assertMatch('http://vimeo.com/channels/31259', ['vimeo:channel']) + self.assertMatch('http://vimeo.com/channels/31259/53576664', ['vimeo']) self.assertMatch('http://vimeo.com/user7108434', ['vimeo:user']) self.assertMatch('http://vimeo.com/user7108434/videos', ['vimeo:user']) self.assertMatch('https://vimeo.com/user21297594/review/75524534/3c257a1b5d', ['vimeo:review']) @@ -132,6 +142,40 @@ class TestAllURLsMatching(unittest.TestCase): def test_pbs(self): # https://github.com/rg3/youtube-dl/issues/2350 self.assertMatch('http://video.pbs.org/viralplayer/2365173446/', ['PBS']) + self.assertMatch('http://video.pbs.org/widget/partnerplayer/980042464/', ['PBS']) + + def test_ComedyCentralShows(self): + self.assertMatch( + 'http://thedailyshow.cc.com/extended-interviews/xm3fnq/andrew-napolitano-extended-interview', + ['ComedyCentralShows']) + self.assertMatch( + 'http://thecolbertreport.cc.com/videos/29w6fx/-realhumanpraise-for-fox-news', + ['ComedyCentralShows']) + self.assertMatch( + 'http://thecolbertreport.cc.com/videos/gh6urb/neil-degrasse-tyson-pt--1?xrs=eml_col_031114', + ['ComedyCentralShows']) + self.assertMatch( + 'http://thedailyshow.cc.com/guests/michael-lewis/3efna8/exclusive---michael-lewis-extended-interview-pt--3', + ['ComedyCentralShows']) + self.assertMatch( + 'http://thedailyshow.cc.com/episodes/sy7yv0/april-8--2014---denis-leary', + ['ComedyCentralShows']) + self.assertMatch( + 'http://thecolbertreport.cc.com/episodes/8ase07/april-8--2014---jane-goodall', + ['ComedyCentralShows']) + self.assertMatch( + 'http://thedailyshow.cc.com/video-playlists/npde3s/the-daily-show-19088-highlights', + ['ComedyCentralShows']) + self.assertMatch( + 'http://thedailyshow.cc.com/special-editions/2l8fdb/special-edition---a-look-back-at-food', + ['ComedyCentralShows']) + + def test_yahoo_https(self): + # https://github.com/rg3/youtube-dl/issues/2701 + self.assertMatch( + 'https://screen.yahoo.com/smartwatches-latest-wearable-gadgets-163745379-cbs.html', + ['Yahoo']) + if __name__ == '__main__': unittest.main() diff --git a/test/test_download.py b/test/test_download.py index 7587a18..f171c10 100644 --- a/test/test_download.py +++ b/test/test_download.py @@ -8,10 +8,11 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from test.helper import ( get_params, - get_testcases, - try_rm, + gettestcases, + expect_info_dict, md5, - report_warning + try_rm, + report_warning, ) @@ -50,7 +51,7 @@ def _file_md5(fn): with open(fn, 'rb') as f: return hashlib.md5(f.read()).hexdigest() -defs = get_testcases() +defs = gettestcases() class TestDownload(unittest.TestCase): @@ -72,9 +73,7 @@ def generator(test_case): if 'playlist' not in test_case: info_dict = test_case.get('info_dict', {}) if not test_case.get('file') and not (info_dict.get('id') and info_dict.get('ext')): - print_skipping('The output file cannot be know, the "file" ' - 'key is missing or the info_dict is incomplete') - return + raise Exception('Test definition incorrect. The output file cannot be known. Are both \'id\' and \'ext\' keys present?') if 'skip' in test_case: print_skipping(test_case['skip']) return @@ -136,27 +135,8 @@ def generator(test_case): self.assertEqual(md5_for_file, tc['md5']) with io.open(info_json_fn, encoding='utf-8') as infof: info_dict = json.load(infof) - for (info_field, expected) in tc.get('info_dict', {}).items(): - if isinstance(expected, compat_str) and expected.startswith('md5:'): - got = 'md5:' + md5(info_dict.get(info_field)) - else: - got = info_dict.get(info_field) - self.assertEqual(expected, got, - u'invalid value for field %s, expected %r, got %r' % (info_field, expected, got)) - - # If checkable fields are missing from the test case, print the info_dict - test_info_dict = dict((key, value if not isinstance(value, compat_str) or len(value) < 250 else 'md5:' + md5(value)) - for key, value in info_dict.items() - if value and key in ('title', 'description', 'uploader', 'upload_date', 'uploader_id', 'location')) - if not all(key in tc.get('info_dict', {}).keys() for key in test_info_dict.keys()): - sys.stderr.write(u'\n"info_dict": ' + json.dumps(test_info_dict, ensure_ascii=False, indent=4) + u'\n') - - # Check for the presence of mandatory fields - for key in ('id', 'url', 'title', 'ext'): - self.assertTrue(key in info_dict.keys() and info_dict[key]) - # Check for mandatory fields that are automatically set by YoutubeDL - for key in ['webpage_url', 'extractor', 'extractor_key']: - self.assertTrue(info_dict.get(key), u'Missing field: %s' % key) + + expect_info_dict(self, tc.get('info_dict', {}), info_dict) finally: try_rm_tcs_files() diff --git a/test/test_playlists.py b/test/test_playlists.py index 1de9e8e..465b07b 100644 --- a/test/test_playlists.py +++ b/test/test_playlists.py @@ -9,8 +9,11 @@ import sys import unittest sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) -from test.helper import FakeYDL - +from test.helper import ( + assertRegexpMatches, + expect_info_dict, + FakeYDL, +) from youtube_dl.extractor import ( AcademicEarthCourseIE, @@ -20,9 +23,12 @@ from youtube_dl.extractor import ( VimeoUserIE, VimeoAlbumIE, VimeoGroupsIE, + VineUserIE, UstreamChannelIE, SoundcloudSetIE, SoundcloudUserIE, + SoundcloudPlaylistIE, + TeacherTubeClassroomIE, LivestreamIE, NHLVideocenterIE, BambuserChannelIE, @@ -36,6 +42,12 @@ from youtube_dl.extractor import ( RutubeChannelIE, GoogleSearchIE, GenericIE, + TEDIE, + ToypicsUserIE, + XTubeUserIE, + InstagramUserIE, + CSpanIE, + AolIE, ) @@ -92,13 +104,20 @@ class TestPlaylists(unittest.TestCase): self.assertEqual(result['title'], 'Rolex Awards for Enterprise') self.assertTrue(len(result['entries']) > 72) + def test_vine_user(self): + dl = FakeYDL() + ie = VineUserIE(dl) + result = ie.extract('https://vine.co/Visa') + self.assertIsPlaylist(result) + self.assertTrue(len(result['entries']) >= 50) + def test_ustream_channel(self): dl = FakeYDL() ie = UstreamChannelIE(dl) result = ie.extract('http://www.ustream.tv/channel/young-americans-for-liberty') self.assertIsPlaylist(result) self.assertEqual(result['id'], '5124905') - self.assertTrue(len(result['entries']) >= 11) + self.assertTrue(len(result['entries']) >= 6) def test_soundcloud_set(self): dl = FakeYDL() @@ -116,6 +135,17 @@ class TestPlaylists(unittest.TestCase): self.assertEqual(result['id'], '9615865') self.assertTrue(len(result['entries']) >= 12) + def test_soundcloud_playlist(self): + dl = FakeYDL() + ie = SoundcloudPlaylistIE(dl) + result = ie.extract('http://api.soundcloud.com/playlists/4110309') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], '4110309') + self.assertEqual(result['title'], 'TILT Brass - Bowery Poetry Club, August \'03 [Non-Site SCR 02]') + assertRegexpMatches( + self, result['description'], r'TILT Brass - Bowery Poetry Club') + self.assertEqual(len(result['entries']), 6) + def test_livestream_event(self): dl = FakeYDL() ie = LivestreamIE(dl) @@ -170,30 +200,30 @@ class TestPlaylists(unittest.TestCase): def test_AcademicEarthCourse(self): dl = FakeYDL() ie = AcademicEarthCourseIE(dl) - result = ie.extract('http://academicearth.org/courses/building-dynamic-websites/') + result = ie.extract('http://academicearth.org/playlists/laws-of-nature/') self.assertIsPlaylist(result) - self.assertEqual(result['id'], 'building-dynamic-websites') - self.assertEqual(result['title'], 'Building Dynamic Websites') - self.assertEqual(result['description'], u"Today's websites are increasingly dynamic. Pages are no longer static HTML files but instead generated by scripts and database calls. User interfaces are more seamless, with technologies like Ajax replacing traditional page reloads. This course teaches students how to build dynamic websites with Ajax and with Linux, Apache, MySQL, and PHP (LAMP), one of today's most popular frameworks. Students learn how to set up domain names with DNS, how to structure pages with XHTML and CSS, how to program in JavaScript and PHP, how to configure Apache and MySQL, how to design and query databases with SQL, how to use Ajax with both XML and JSON, and how to build mashups. The course explores issues of security, scalability, and cross-browser support and also discusses enterprise-level deployments of websites, including third-party hosting, virtualization, colocation in data centers, firewalling, and load-balancing.") - self.assertEqual(len(result['entries']), 10) + self.assertEqual(result['id'], 'laws-of-nature') + self.assertEqual(result['title'], 'Laws of Nature') + self.assertEqual(result['description'],u'Introduce yourself to the laws of nature with these free online college lectures from Yale, Harvard, and MIT.')# u"Today's websites are increasingly dynamic. Pages are no longer static HTML files but instead generated by scripts and database calls. User interfaces are more seamless, with technologies like Ajax replacing traditional page reloads. This course teaches students how to build dynamic websites with Ajax and with Linux, Apache, MySQL, and PHP (LAMP), one of today's most popular frameworks. Students learn how to set up domain names with DNS, how to structure pages with XHTML and CSS, how to program in JavaScript and PHP, how to configure Apache and MySQL, how to design and query databases with SQL, how to use Ajax with both XML and JSON, and how to build mashups. The course explores issues of security, scalability, and cross-browser support and also discusses enterprise-level deployments of websites, including third-party hosting, virtualization, colocation in data centers, firewalling, and load-balancing.") + self.assertEqual(len(result['entries']), 4) def test_ivi_compilation(self): dl = FakeYDL() ie = IviCompilationIE(dl) - result = ie.extract('http://www.ivi.ru/watch/dezhurnyi_angel') + result = ie.extract('http://www.ivi.ru/watch/dvoe_iz_lartsa') self.assertIsPlaylist(result) - self.assertEqual(result['id'], 'dezhurnyi_angel') - self.assertEqual(result['title'], 'Дежурный ангел (2010 - 2012)') - self.assertTrue(len(result['entries']) >= 36) - + self.assertEqual(result['id'], 'dvoe_iz_lartsa') + self.assertEqual(result['title'], 'Двое из ларца (2006 - 2008)') + self.assertTrue(len(result['entries']) >= 24) + def test_ivi_compilation_season(self): dl = FakeYDL() ie = IviCompilationIE(dl) - result = ie.extract('http://www.ivi.ru/watch/dezhurnyi_angel/season2') + result = ie.extract('http://www.ivi.ru/watch/dvoe_iz_lartsa/season1') self.assertIsPlaylist(result) - self.assertEqual(result['id'], 'dezhurnyi_angel/season2') - self.assertEqual(result['title'], 'Дежурный ангел (2010 - 2012) 2 сезон') - self.assertTrue(len(result['entries']) >= 20) + self.assertEqual(result['id'], 'dvoe_iz_lartsa/season1') + self.assertEqual(result['title'], 'Двое из ларца (2006 - 2008) 1 сезон') + self.assertTrue(len(result['entries']) >= 12) def test_imdb_list(self): dl = FakeYDL() @@ -248,7 +278,96 @@ class TestPlaylists(unittest.TestCase): self.assertIsPlaylist(result) self.assertEqual(result['id'], 'python language') self.assertEqual(result['title'], 'python language') - self.assertTrue(len(result['entries']) == 15) + self.assertEqual(len(result['entries']), 15) + + def test_generic_rss_feed(self): + dl = FakeYDL() + ie = GenericIE(dl) + result = ie.extract('http://phihag.de/2014/youtube-dl/rss.xml') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], 'http://phihag.de/2014/youtube-dl/rss.xml') + self.assertEqual(result['title'], 'Zero Punctuation') + self.assertTrue(len(result['entries']) > 10) + + def test_ted_playlist(self): + dl = FakeYDL() + ie = TEDIE(dl) + result = ie.extract('http://www.ted.com/playlists/who_are_the_hackers') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], '10') + self.assertEqual(result['title'], 'Who are the hackers?') + self.assertTrue(len(result['entries']) >= 6) + + def test_toypics_user(self): + dl = FakeYDL() + ie = ToypicsUserIE(dl) + result = ie.extract('http://videos.toypics.net/Mikey') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], 'Mikey') + self.assertTrue(len(result['entries']) >= 17) + + def test_xtube_user(self): + dl = FakeYDL() + ie = XTubeUserIE(dl) + result = ie.extract('http://www.xtube.com/community/profile.php?user=greenshowers') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], 'greenshowers') + self.assertTrue(len(result['entries']) >= 155) + + def test_InstagramUser(self): + dl = FakeYDL() + ie = InstagramUserIE(dl) + result = ie.extract('http://instagram.com/porsche') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], 'porsche') + self.assertTrue(len(result['entries']) >= 2) + test_video = next( + e for e in result['entries'] + if e['id'] == '614605558512799803_462752227') + dl.add_default_extra_info(test_video, ie, '(irrelevant URL)') + dl.process_video_result(test_video, download=False) + EXPECTED = { + 'id': '614605558512799803_462752227', + 'ext': 'mp4', + 'title': '#Porsche Intelligent Performance.', + 'thumbnail': 're:^https?://.*\.jpg', + 'uploader': 'Porsche', + 'uploader_id': 'porsche', + 'timestamp': 1387486713, + 'upload_date': '20131219', + } + expect_info_dict(self, EXPECTED, test_video) + + def test_CSpan_playlist(self): + dl = FakeYDL() + ie = CSpanIE(dl) + result = ie.extract( + 'http://www.c-span.org/video/?318608-1/gm-ignition-switch-recall') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], '342759') + self.assertEqual( + result['title'], 'General Motors Ignition Switch Recall') + whole_duration = sum(e['duration'] for e in result['entries']) + self.assertEqual(whole_duration, 14855) + + def test_aol_playlist(self): + dl = FakeYDL() + ie = AolIE(dl) + result = ie.extract( + 'http://on.aol.com/playlist/brace-yourself---todays-weirdest-news-152147?icid=OnHomepageC4_Omg_Img#_videoid=518184316') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], '152147') + self.assertEqual( + result['title'], 'Brace Yourself - Today\'s Weirdest News') + self.assertTrue(len(result['entries']) >= 10) + + def test_TeacherTubeClassroom(self): + dl = FakeYDL() + ie = TeacherTubeClassroomIE(dl) + result = ie.extract('http://www.teachertube.com/view_classroom.php?user=rbhagwati2') + self.assertIsPlaylist(result) + self.assertEqual(result['id'], 'rbhagwati2') + self.assertTrue(len(result['entries']) >= 20) if __name__ == '__main__': unittest.main() diff --git a/test/test_subtitles.py b/test/test_subtitles.py index 79991e6..5736fe5 100644 --- a/test/test_subtitles.py +++ b/test/test_subtitles.py @@ -181,7 +181,7 @@ class TestTedSubtitles(BaseTestSubtitles): self.DL.params['writesubtitles'] = True self.DL.params['allsubtitles'] = True subtitles = self.getSubtitles() - self.assertEqual(len(subtitles.keys()), 28) + self.assertTrue(len(subtitles.keys()) >= 28) def test_list_subtitles(self): self.DL.expect_warning(u'Automatic Captions not supported by this server') diff --git a/test/test_utils.py b/test/test_utils.py index 84553b9..51eb0b6 100644 --- a/test/test_utils.py +++ b/test/test_utils.py @@ -9,6 +9,8 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # Various small unit tests +import io +import json import xml.etree.ElementTree #from youtube_dl.utils import htmlentity_transform @@ -21,6 +23,7 @@ from youtube_dl.utils import ( orderedSet, PagedList, parse_duration, + read_batch_urls, sanitize_filename, shell_quote, smuggle_url, @@ -31,7 +34,11 @@ from youtube_dl.utils import ( unified_strdate, unsmuggle_url, url_basename, + urlencode_postdata, xpath_with_ns, + parse_iso8601, + strip_jsonp, + uppercase_escape, ) if sys.version_info < (3, 0): @@ -250,5 +257,32 @@ class TestUtil(unittest.TestCase): def test_struct_unpack(self): self.assertEqual(struct_unpack(u'!B', b'\x00'), (0,)) + def test_read_batch_urls(self): + f = io.StringIO(u'''\xef\xbb\xbf foo + bar\r + baz + # More after this line\r + ; or after this + bam''') + self.assertEqual(read_batch_urls(f), [u'foo', u'bar', u'baz', u'bam']) + + def test_urlencode_postdata(self): + data = urlencode_postdata({'username': 'foo@bar.com', 'password': '1234'}) + self.assertTrue(isinstance(data, bytes)) + + def test_parse_iso8601(self): + self.assertEqual(parse_iso8601('2014-03-23T23:04:26+0100'), 1395612266) + self.assertEqual(parse_iso8601('2014-03-23T22:04:26+0000'), 1395612266) + self.assertEqual(parse_iso8601('2014-03-23T22:04:26Z'), 1395612266) + + def test_strip_jsonp(self): + stripped = strip_jsonp('cb ([ {"id":"532cb",\n\n\n"x":\n3}\n]\n);') + d = json.loads(stripped) + self.assertEqual(d, [{"id": "532cb", "x": 3}]) + + def test_uppercase_escpae(self): + self.assertEqual(uppercase_escape(u'aä'), u'aä') + self.assertEqual(uppercase_escape(u'\\U0001d550'), u'𝕐') + if __name__ == '__main__': unittest.main() diff --git a/test/test_youtube_lists.py b/test/test_youtube_lists.py index 38ac989..3aadedd 100644 --- a/test/test_youtube_lists.py +++ b/test/test_youtube_lists.py @@ -16,6 +16,7 @@ from youtube_dl.extractor import ( YoutubeChannelIE, YoutubeShowIE, YoutubeTopListIE, + YoutubeSearchURLIE, ) @@ -111,13 +112,15 @@ class TestYoutubeLists(unittest.TestCase): def test_youtube_mix(self): dl = FakeYDL() ie = YoutubePlaylistIE(dl) - result = ie.extract('http://www.youtube.com/watch?v=lLJf9qJHR3E&list=RDrjFaenf1T-Y') + result = ie.extract('https://www.youtube.com/watch?v=W01L70IGBgE&index=2&list=RDOQpdSVF_k_w') entries = result['entries'] self.assertTrue(len(entries) >= 20) original_video = entries[0] - self.assertEqual(original_video['id'], 'rjFaenf1T-Y') + self.assertEqual(original_video['id'], 'OQpdSVF_k_w') def test_youtube_toptracks(self): + print('Skipping: The playlist page gives error 500') + return dl = FakeYDL() ie = YoutubePlaylistIE(dl) result = ie.extract('https://www.youtube.com/playlist?list=MCUS') @@ -131,5 +134,14 @@ class TestYoutubeLists(unittest.TestCase): entries = result['entries'] self.assertTrue(len(entries) >= 5) + def test_youtube_search_url(self): + dl = FakeYDL() + ie = YoutubeSearchURLIE(dl) + result = ie.extract('https://www.youtube.com/results?baz=bar&search_query=youtube-dl+test+video&filters=video&lclk=video') + entries = result['entries'] + self.assertIsPlaylist(result) + self.assertEqual(result['title'], 'youtube-dl test video') + self.assertTrue(len(entries) >= 5) + if __name__ == '__main__': unittest.main() diff --git a/youtube-dl b/youtube-dl index 063e40dc742bd6eafc3ba996dbc5a6443dc6e651..b98d36a19b220dd47c8259ed766b2634f84f9251 100755 GIT binary patch delta 369492 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

5ZiJJCct}Zo_n5_X7ukeB)L#J~dpq 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

VFaTPf?aVZPquOwryLLwr$(C?VYym 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 z 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 delta 270804 zcmZ5{Q*hv2@MUb0zg1gXyVdvf!+q%L`*N$h zPoJ?4!izlYBogoy9R6f-HW-fnziR)3CPN%h;J-Twajg>8KoAg+iT^@2p-<>AfOPZ;2ATkbEil z9o2Tuh?BI&BXU%x)MRro`2(U;P*)D}5HP;U-1Nrh; zY(2mf_nm9ZP+;#CR7D;f0^`3Yz<|8z3Q9mt5f{C%gMbMB0Rh1VA;`S=3xx;&U+!y5 zr)vL$)Ot_?e!m?zXlYPmA(Gw%uOH86*z1jPxMq3M4fYO2)NgF@p%&veqPh)E%~S#7D}Yj zfC&QWHaRs~!f>Cf$c!Xp-#GhKCzIY>=*o6cVw^a%5$oLC#G1HA_S^;uZTO~%$ z%}j<%Pl}|0<2luzp35G&?y6WN=Xo!VCmFydm!AoJmM1a#r*6}KY#@{A*GbG0&opCzFLE!`uIqfQ;m%Qk`DMI(6_fE%JF4<}yssFfjOy9PW%$||I zOC-Z?TZUla$+xbD{QEO_FzukR@pK4a4z9)923A;jP7eNVHaPll4|n-!%PTPUb9UT6T>zq=^HysyD6V)DcGj>7PkE%H8djorSqAr{z z+!%9O*mdu=>cC9SkWAkE?AW>Dac!J8|=7~Jgu&)#$ zYQXoM^hu`a#Me0FBxm6u9?jc-7R%{}x>gt4fRiomw6>foV%7)CEP(OslA(w+87^Ccs%FuDNH6g4qy(HkAaJ4&#ivBEx#8+6wtxix*UTDQj94^dVH zQo6co>2g7@C#cQD&J`%uI!Nb~wDzC9fv?r^=NJZp-lUr@ZEE+Eh!@i?mz@og4E z_Iv&vbRcI!;#%vB^Bj8cSz)eDsJAsYdNpU9Nb|uI@xLOPkSxUVikSfQ5~rfMmeX#` z4@7@jJu!tvVRndn)hL~@)|6}=3tf)-)gQ|zmY`j63t=obPY@mPCD57{aZ0Ex+Z6Q)5=70fMb{s4VsJ{^cY6P zM!#gyaG~C$$jEt>rKOF=Y5pP{gh^bVWn(;TJO|n)c3=s=nX#yl1XEWj%sD(TUfihG zz^0|TW0l@67bSiAR3v|PFmF&dR_Iw0d6bKNISFK%fJj}AN)?FHQ)Mcxdx|6vWr{RC{ECH}buGDue;3}jMqP3C?(%On7v3T;jq+ERdVwA96{S7Lr)?IvVkE3m3 z)fy-`U`=Xr&|cFws%?N6iBpAOgFgCGGgu)aH5l%3fzDtp?FGKy$2Qc^arFUCVvhns zE8x*(LbBTi4lOg)i1MOTQ!<;6dgxPA@-m{Gp>9y`ycEzRnkh&v4oqzd=>n17*qz<& zKa6o~+6hUwelTusYM6%^)8dA~TipK^{)G@A(l4_{IXI<@UGuRz!fBI-WI+Rdaw57s zxL)S7r$@rP?Q1SC>rT32lXMRfc7s3vA;TJtibGwLf|XBZ;aB1-_F(>a3J8)>&L%-o=YX+FBI^U*>wAY|7j(K#Xj(??TTQP;Hs$cT!G0l744Wpp0-rv zKOGT=t*N?dmP$EN=mWc=ToJHfd&K4MfYPaqA?wAvRm_C8W74|LQfpeYD0dM^Xj48fTquU;>4*;5b3FJAmmI^B?YQ@{N%%BQ7xCnY+wl2Jc`~pafrbH zO*n)TCH*!O+9n zux^LkYgzvO0M|_qZPk=m%XY?Yb#MM3qG`GwGd3hxYqtI^l&qN;E~nL_#G;+3X5u#4 zgU?>xf6vZn^h12YkL|r$7iN1C+&OSoSOAcMT%E{PmP)D3ByP8TdSr+6;`B1b74T$hHYPDrF^&9uu2-IZVw^n5OA9Dn-P|Mc6AXq@6yI z1z7Ke!;b3VpmYI0TOEzP$YABe8_UDl>Wh<=AZIZKgd(67Jg9`rxHe4kMKEEMPyv`` z6)b4};UBSWD6^sCO9JTLef1gyqCSFh4&^QIBJ*5Q1rA{xuPc)2J6H!lw~>iykf?t1 z{ib87b*^=K0WoymOdwnq>trXKD|1869(X{$hUMct-PFC}OCZkq_-pt)k2JVY0KvmE z>{F(wDLo9&skj4R&^G%eVs!Hr_X4S$I#?`N+$Q#8N=xJ$L8b_36Yl#;4z>*;k4CK`egDX-73T93_*gkTwl*5R%3yj^im z@!-XGRt}vq_TkAWkx>T@HtffnPZ2%xnYfN*R<3e6;J6L&IOyLimOmZ*+NGZnreHm$Dusqeg$*6$6Lo|VqFGiS-CzRR=9>7`oZ@Q zCTF4ShdW?k9phs@iogOhy%i^+8A*8ZO^nt!6lGdATnzE}EuvIsiTYybBbDT~3!b6T zUBk@iSNSqo5<;(0rCFO{r4-_Z@qiyn2yf{QJ!rxr2Gur`B6h_dj-3lQ~Zx;*NEPt(Y-u|S;v zqAjh~9WsYUhfL(yydg^2;k#S@UY_OC>QYFF{2w<@rgrAm*?QY)%G$l`q3t7{Mrqb- z)*v_JpP(O8HhhyXc7*pBjB(uSh18+ELC z5k0IJd<_Zo2L8V0dAlkr%x;D~V8XQ~Pxw>S6Ww{;e0Y`I_xKy}b z$Q)(#w4*;}fYX9K-siPf4&Go_0KteLqg;=0<EAl=4fx%?og$mR zzNmW4>jbeHMx)JFZLYIbKBo_i%?NnbcK1q56(dCx|K*IrwKO!b8p0-j+_S95aH%)h zkw3t;5IZnPv^P$^WNBr<(!XD>Ag~>ly+4KNC(K4Ao+)u|#((^>-NrP4Kn%iSr-Mhz z9X>TZ10aW^>f7)tom`189ML};T28Qy=MF%opd*b^2Pw{Msv$IU^-L#vTcOoFNB?PMLrg%Z_Qkb$swM>q0A62IpZ#-I#zcaj zhd@x=qloFB)&mi`N4D$mphJ3P521t|?FC#);8tSJJK#ZIX{f0bbZ%}Zh(pbxruxRB zm0ONT`1Ah7xXS`TRs?zG)o0Ubb=o=nAbAuu6b^nuVZEtxe#mMt{) z)A;moF&zDX^OMd~AySbJw_n|Y!$cK2RR zo-#1qJeink1W7J3smd9S5)#HVO@nCukZ>~49@cy=jg=*8GU#`;B-7POy6EOIAcXNV z90p$kf?7lgmJBwoJ4j@`4ocp8Q)6678X_J3a>XIL#Wb*31Zw5B6ZCm|>!<>h6%kAt z=q!q!3{MV=_!7y?M=F8Ow!>EAmCYT%X;I%CjlijzFM*3=z13R60e^ivv}!S5Ldj^C zFHJIdN=_Rjro%T~rvWWr3JPHYh+CkXjHJ^vtZBU;<|mV}PrBYIla- zEynU!l0Y@HvhN+1%*(3ME9(-8k~s*iJVL^L8l+KDqeL8HAfsAu(cTSD)rFIirqaeh z!62@4hh~&1&bS3#rO0{~xLx#`Pf^WCWpL#z)v3a=H55&2wuHZ_I%a4z@_Y0k;VSAX zt6%_HU-U+$M+1HkNhsr&K`^$|%1dgj-e*)}`~Dgt;d7Nm-;`CAUKR+Zw-6hmiIl(gpDnb^@Mu zz(QtrW$>5-3YsyAvO1U>5L||5$49Jx@aEG(qNtj*o&PqsKtgTpl^2AL;@Vc+?!;lC zp=JY@%Iz`_|86J2#C(J9y!uI;S+fm@jPv*ALy_5OS+Fvjn=yQOjUj_iekIe{7>iHY zG(z`_f^WqBVDjXQ>*b?$d9g=m|biy zYL12g+zSJ|%nR5rEDp3*IKa!tP&fC@m#-N}ukN|O$rj3jDVdMzeVu)by?1OE1nhVy z5A8@9;<0Wp10a)CJL&s5y>nPo;J$5CNiX^U=3goM@v1ymP>%`sVdbcI@h~5{a8pa+ zVwV^7+8B?d&jF8K+fLdyCB?2IAd^bOyj~34ZC!i`*r(o5LNDo+pT=YsQv-_%>#hs*7a6SnATybCqTgNiwic6#jNiQrc-2jw~zRKpw>{(u5G{I^@hvZC?`XH zZau}kJBZJsJQ>7k9e;}t;0!}}ijV>Ze-H#H@e&$2B5aQO2uOjehr%p?12}SU=h<0Y z3KdauM-dY&*e~Wz@*uPg_n2Py^eNYbl7WJ8_ymBEvJCBjAZX@R~cU)}JD-WLRTa2Z7fziF7o%9*p}M zh9#3i0YS6_tk*Q#6T>qI?FxT?X3HrjjU9)7@Mk^`n*73jOs&rd5nBq51Y(F*@Fqqc zW^l^n|B(ItA6C6?gnNANK0cNyE@|bi#}ZYXaCDQBrSIo@_S}iUhz4QKAuuYMwQd^4 zE+^7#_FNpUd&Ptzxg^^Fq9Pmg6HcS*->IAy!e9Vo1#vK<~Mm#0A1 z-E$SiaSsl}MrABXv_=G6YiRDa_G$#n6Mv#NPEhpzV-az-?3@g$l_+d4Uyn8N)PGnd zDVlCcTE5hpF2mJ{0lAY)Eh4FzW^HeUD^m5Mll!w>h<1rXSUrqQ<1D&BUy+9=uZbWTy`o&Ek?>p?bo4d#9 zVHIZGXG!LjTz(6|>IgMCGdK zG5ouE*UQy3jTWx#O16QyZs!$9$CD;;c#9~rpLnw?Y2y|kwE9bj)mCQoe715_P+@RoiFdQ^S&#FU?%ga|gT)(=^OKhZBKC#~&b zQ9-9*l!}Q>{Ot(r*&jXp8^R(7f_Z_~an*q?k))>>1K`puJS~VuFH)R}W+vR@j9sv| zoGd}hUp1k@=UJqH$gz9B9gFs}Sb3`Dg-vJu(TbqYWW*MDWcSO{!8o72lS$FRTt(j? zXUXmF$nRnIMrM#Pildp)t1zrcSnU(EYTb?-jCnUK< zy{2w)^r)*GA`(t$V(B-!)B{BgXeM_)oZF1ASB!62cl zYMc^|4Eqv`A#BDMFGFHq0TDD?$S(D~T&QZo5>0 zF`5G)HHq4zGSG?ImtNfE5U*LJaIITWw1FGl$8X2=ZedQ4+)7r?0P2wAa%%$K@)mw) z(9ZDoJdJZz3=##fkaG2ZWj~d)9p2E}r{y$bS0$_;mw8EKN2eJB5($ z2Z|$O?kE-8h*0>?dr3E3 z&@`FkYPbG2_XA52r;WBaRp2N%#~Sc$q;0{~UMNtJygM07x881(lWCsnBL%QjY3qB) zg9XaGD%g6|TX+~jM z55$BEC=9=$)u6}LKO3yGxQuPXK&Xble`FyI6S-Vgx*KV?fHncq2?dL~ zBDGzQ?c@iceHrm%v=}#2ov}5ra(XIaJAIV1p$R~G2xQKr>#s)S4|q_RSH~`;s*iHN zf~w`vKCYUc=f4fX>{xMmkkbE3r-q&J${2bXYdQ99i!jx;WUu8}=9P z=2$Wtt~8QA#NwFq><<*#oGsBPsyeQw38dRF2@%G)UaxpFI3yyUfhcxb=pal%HYJhG zh%d0)r~=-;N8NrJiy z!I)u=lfDtws=jB&Z4d&2jP0kpdf&o+#43|i)wk#0kP`*Gn40X_JYVBqjILMgmv;tE zDV@~@ST1%@cngOk;ZWb@#vmnW{E$sEunf}w?cltEVZ&I?7AZ+(>sHjU9W}C)XG=5H zdfhHn%Yc~N8PpU!8}><>)lA>L9t!w8K28!w1mb&n{J{?jolgL~K*YmZ9F1OoNcvV5 zLHxC_6(jAn5>Fjcv-&iF`X|=agPAmf4khQ)zCkqo%SG-=w(XnP*H@rj?WgnX0r~q% zE;B8X#?FCoQR>R;P0NKMF{ZQ$J-iBWy`}2G@oM=*yitLK{GxW1x{{-g-z%8-9tFnj zkaV!?F%j;`uhn>ODlZ`?^ z);(4_rjoW%=2;m=04Ux`F#om@?q!X@;t(!W4^4eNNtMBZ`VkoVD*M%3SBlHWUL5xpv;5C}1)4NUke=E@_Wa#RT_FqA<& za70MaOi^#|G=Y**hOjEmp>#;|@9gy?dUVttb1G~JcdL_rI+=DKa%&a>lVz_`}&zJqP!@-+Z_g`01mXb^{ zR-#@2_o+j0wa0^L2%MEZrm&M=vVE4~$_gVCQN}FC#7p%lu|Go(^fgl3JK4~LTf%*e z{6GI^2t&xraXXQ4sY*dB$T?xQYFD{gu&FPOnMt$5KN1*MiqJVXz3$}ajlhef#3iBSOW;uEpm|08r_@5CeWER=7q=vJ(X*8>S*5Dg%`u` zNt?;1Q!Y=;3QsIlr@iTxX5<`=7EJghnz-z05#WZe!#P_ED}=w zh;SDTJc6xoZoqr$)MuQ(gAzoJ*5KqKHZot=Rufh4IL(yj)UC_ZS zm3%->FG4ta*m2==+(up*a<0(OeOZfnYN|?zq2@G4t;XnJ0e%J45Lj zoQk?RMmPydBL|8&Z$FcK_RMCB%Y5xiRszdH%f%t%j31GiJqh)wZI>LPan}$Tl%FBr z6^y1U+~_@^KBr}?KOjkwwot5$nb5XgD&T){#p!!FQ0weXg9+FWC;GSqg?WZ7G$K+6 z^GCMoO6|8Z{FOSm+a7Vnd6wS;Xg&^Jy-hAsnXtkFeeNF<`^WT&57r&9Hv7P~Eq@Ux zy}~?|6JA9%fG$6Bpp~8D&Ivi>6ghNzy7aQKw7%%neuQz#?XDnAES|hQQu)_`Lzg|@ z&I-ZiOW$WXW6eHwx*hfns~PVKB;nrVLlb1o-?1NM_+LCoa|h`KB9G?*a=2hK*|Nk; zeY~+e9(ia(e*-M}=n>{Z*3ik}U_k&u#Bdcgh#_sN%ixxL?TIXPjA`LVk<1Mb0do|6 z^#EcvJ?`TKGRw?&idF}ZcanLXDTn4g7bA& z&f#`B6R(e0W(ffJD@bbNaC5Un%q2><(L7U&ezS9cmvob~Nuv7JqeY2~tDu`8y#=@>KV1@}jO&o3eOZC>IJ@^>@{xi1OTKZ0)H90Qd5-Zjkpe45%sx3gk2 zYGFv`KfI&HKJI`S#O~$(iUf><{#a<*5p0vM7J{3d7VDc9r{NcW$apVo0aJ_~7kitJ z%WiF!z`+h-RrqAU<5Q{PQZQ^Qo}idCjPgxgsq09zn9p_K%-`CE(mXdflp)$a#2+1%*Na6iPgJ;=Df)0NBp zpNAvC(I67HyKT2oD~HS(eoRqTX^ z)ba3g(`qm^d)biwnuAfsBHQBjs-30O-==cj7o08@@TZw~iP!%*Vx%^xh^FAGEcMHXovfgJ-; zOv>IUI_u{U!}tF8gXVFJV1+%Zv6oosf%!LN#x8-rKhzkr&}O-;*Vg~6s-+|Hg%)!7 zT*WZFBhUD2{ITRva(63OJsooO*R$8&{0Y#U4M2ve%mFg(Q`L2RTW=)TX;K^nA|uk9 zB2ss2nQwo_GcOut$v6w--PEjFoP~SR?NkB{J+`R~(;#J@FE3(a*?X%Y9SVJakn{DO zFcF+ysE)kc^(~tUUrZB7=1E6hl_pXqmgap_?U!}zt#<6(nTcPV{w}^S31pPyr~pDX zu0pVy{z`5j!3#5i1jnBEWZ$B!C8M@Z|8*Qb=b?V*(yyV<++oB+NQ88E=b{f-?eIdr zdcD;@Zu#=)^tQZGf%JIv5mKkwG$e8r>G{`OxYsIujw`gXf1pHH{2kZ09Jo@_S-~%E z)NkZG{KWnEaH(KKBcLHa$*EmXJ`PC#V8+rHvT+T&dfj`PczZtb?7?12olp9*?)|&P zk1nI*JoR&}2)EVkrz&o>yZE$gwBVSb{W_y}T?ZS^(%sCCx7(@%a+Lo^^z zfT_N1YAGFm2l1+B0~vuW^u9{w+?!t%U{3sui+wyib@qM=n#~q_^|N86C~I$!vbfuI z_Kf?5bP#DM3No^y)j5~IStO*QxlVN!I2q=A^{=K)-G9KNh)3l zQQ!#)<2Suhx{mdIkMzbLHD+4GiT*}`!AC(vXm#u4Rl&@ zEN@|(5-C4@qBg&H1-TN!CN0FMI6Fq`^M|i3gDM;fBFWSvtg!|*kJ`H6bu#<1UdBIm+uIYm ztqgOaTyvyl<99`bU*l~-%3+nS4@QLQ>+juzkQXc``rfBi_C=rf_NDk%ll@bP%{r_C zO&LEGvpR9u%)#jvd{VBSshwS^=JnPyvvkb#3+=mqPf{elEBjF|)uOZGjkB1Or1)-& z(h|!l1^-4}4}l5C-6E;w@)woriU*eQ&E=(M4X#|>mim;&d_;-c^J~w}caI20{YZMF zdQkCoP~pC;m^t%TB1XAnPLk%>kajp>7=a7py$#OZ>B#!CUevT4Dw83EJh`1h>tTm& zBmV3xCuv&G@)j_^79Ol)TUr7_c)18+@EpIN8oq4C0Zj-sv?xp$O2*wy@OrJ z^*6%1w+DRw&;{VU&Wn#aB#$kI$VuujJ z+c@=B7Lo=vexWP==EfiOJQtMSM2r>pB1d%dsrCxx;jZ!lG3a8hT?ky{asSCae8@0e zfUXTP^sZ!4oG*q{hE^kdKlJ>E$*X-QAe*{($z-xyN4o_XtHbYQ9z>4E5LrQzrXel z0n%?Lwvf`w3S*WF>lk+^G@;{J+m$Q4N4BI|<+Y>(^r{98U93e$;oW4=_+Dd+(&Dsk zccy;KbDEkoKdx%4M^)SV3sZ}VoNTUNNV1xA0vRUJZh>v$V=jy6I>=vM1;m1b??@0(`CRR_ETosTCOe4Hl#AjDLzxLBm|Qfn=O= z$n=0)B0TOz^Mwv%J{uAHs36bflh3$6SSjD$?PvZ|l<-fL?^S67^zuOKosQPlK?-U3 zPzuxIBd>-2M71T`PVHImJT)pXaI`(&I`tuxpx3-)FY~N*e2J^d=_ONmI_EO1KSzmu`?a~!z}Q(FRSKhb{A@GZk!zOkhTXi zQW4lgtHH8l1Odx>660cM2X5}j5uc02<0m!=Kg8u&%tI=_a^B7cAV)qD3b z1LFmO#1sRy+TJJgOREO?lr+yqgp-4sWiO>is_(q8kPP93C@sRY;KZ*$pl#<28P4E) z4-+v%O+dL6V*At#mxM4QtE%)Z>I#-HmOmOAgh+537IhBehv)$)75arlboxMEMOxmt zdWPQ1EqQDZb+Y(-HD4jk3N7M}D0jPN;K9e@3vpAtd&maf*QahgCRGmTXkvz~n^k#wA5GGX< zm1!%tje&pmTH*^e%f>qzx_BMB4?{Ea*sQNt30G1Ha5ZQ$N&9bw{Gsb=U7~<}>g*5) zePC^elG7bi@D|ir+Nb)r6~>pW`agQbHv4LjC+%de9$Be~J!|VFpqogX>Cm393H9jk z8RphmwlyKahL-62<8ApNQ`AGUdqepOYbUSwx7%irjN(l|!`A_m@KZ-Z?e2Qd2!KAz zBCGzbL2i?k@zE5Si)(ZJ)J}($rM5&LnZ3K|1l0~2mt#@#oB2zi5;-82IWh4oi;%HF zC~{VOCP)_lc-=S_U=q{269RKsw?>V0dXCle@W7HLer+X=)i7&#HB~3 z*(GD#Mf_!S16h|DqX^03W*x%yYN>mPMn>}(M}IKi_YZ%C$Oye4i>f&4EXvakrY0f% zyejS@;s5Fc^?6$|QiN&kT8|p(03@ThaAGs=!gXg_oEdT%gVV@5*65eF8z$Sg(y$XP&K1lKLy zII(d}1YZ5W(KFUv+R@>ufjh^)!WN-{ziiErF2f?gn9rRcsk>5vKrpRKTmGTMeOYJV z^RPm{a!h-8MZw4ZYi)sx3$$&x-hu39dS@)1zHA^~*-|-!GH%v0{S>BoZ)xi>3agBB zz)Uz={RKk@OshVv6J$+M>OH)lvI;i^a*fD+R#miGcab24j zr!J2`xJ{RttXuoKsS~M>-4{m~Fg}IZ`X7f9@K5W>Q<_t2GBhmLIhIX3XH#_N>~iVv zP%C#*WmsWA5otXu{0ZNoBYjTkB_2A_dS2e7`Q6RAW48X7fOW27bZsIQkAc?+J;a?# zi0`IEtmEdgeTMx=au1e!0H{0WYPrbekE=xhEF}*f^@{ODxsdQX`S{Yn-TS3lS!0W6 z@bfn1=_;B~k>#z_>$2To@cMQo^rE?7sCD$koOvsJf#uKwsn3k?+q{!8uN)q|g`zKy zXqkhT_Z9fR(jhzpRf%&59^_ma5D>F`5D={YR}W=uY@3S9iwLOy1yw&j09F706i~wk z`fi&to`I_kr!EI%yz(mT?CaUClIkN(6!PsB)e`Fk(N|)e!Bp#5Ozzww(Mp!Y_uThs zV*-~KU!bdB4S9dKK`2Df3S{f;n9Pj(-LBk}xSzI#36IqXl)PQXQz&)ontgHz{H1}O z8$q-(Qe~?-nF7V$!p6UQ1248nss)$WCQ{@;iI21dR& zB>AIUB$?FN`YIES7r^Vj_{xJ*G3Uo6q>S#?SPQ}ZrJU|rZe0_nTL6$+Q6j{R7t}+B^+v5Bxt;3p8I0t8kk~G?gWOo0?l}mi&27sP1TRa8RR+755l7k%E zrzpE0MPP!%aE!y88{o)h{X}&ETd9?V5?f*nT7hm${PZKTa$~3MRW3=3pcX4D!NHn0 znH6)=V>$~Zq;}3aUnGPdtf-nMm2W*{(_h3Uowu}IE%cu#sXiMEVBk@?hD)po7|FRL1<*Oh)wumf(RMlI*zI7) zgS|9B5tWiphCp!D_;rRnY7Cza3r zfq0%`_;#O*9_5)7FVH&48%D=Uc!)M@yn6FUvn=U>uKFiBULkQtSru_v-WVP9DP@*1 z#xQZTaKT~v30O;oR}4dU!?j^e>|o&J1i5@p(3!gif!h#S{>N11;J&6tYu zTIozW&FwO~h?dBp`W8nYa@C3+u!GG86rRFjedOLU6u1Ol_X*4}g=hvDL7}pX2v2Ha z&g>MY&^-T9UU-!xWl=%G96`0}m#xBtw)}*Xkgpv^0EdYBQe8JDFa2rueVCN0AajIh zn%oLK6h4?~XeiyqZqOl^Vb-%8K_HBEAc&*?@tisjUT~8uOffFx0&9Psq;S!Cn_Q>s^N0Gpl(wBh$Pbzy(luS}!vZHoq9G_;L>5p!88t9_Tt%|=wE z@FZmdR8@NKxjq%80QwkG&oq!mnf9W&Koey6+j*Ym)lc~jWPSuh+i#K-eK7r#5JS9- z`Ybn}DNxl2Kt&6K8+jVeueRt6ET8phKdWj%@PLwbvR(ggb#$u5t z?!_?2=S467`mN%8Kj;^W-*}G98ihH)dL0k=DaUWA3@MI35qwLNJDS}R59sjNtO)jA zF?Ra#0A?^}kEo_##RXp)_t@J`nU7sYF**A_UEQ11J9ESG(8CXpbVv6`o{ygH;H9zk zri}*T;2Nit5q)6<+E+~62@JdtpBA!fn*{G)cVmIucBmBWeoV&^KN}#a1&~q#?%4q! zwHBmE8$*j;>H*l-N@HnFshh0FOpeL@)&Q;bK6xV9*VTkLQYAgLh212LN^=a@+9lgVK{3`*9xYOuR0)44AZHdzs;tb1)`nNo^K@ZoOX6b=3H08_A{P9YI{C7emQ}Hk@=r~_oA;ZW>vyd+Uwt-o z+rA_!S*5I^Ll7R} zcHejvUk{v&ZgcYWPEc!meX5n3YA3NRmz$wJB?H=ffL2rI*9ILI;;y>ZD$5qTE&u7$ zh8fP}RQj||&#GDF$StQ9JF94@{uQks_eWBkPoDI}0lod-q=;fxr6`Q!4f)b|ui6Df zO<(t=Wy8sELJv*JXbZqC$~H}TYE4{fAZuXkembaO+uBwM-2CoIzjJ5O$!05LbU4G{ zdHp(`H%3FU%9K01Jmep4*JmO*l>2A?OlxNWbpsUCQ`p2d7=lN^Q$H9>#(>)cL73GKW#n73jomVol`{?68N7ZMZ+IUlk%FzPsaEwuoja@q$`$!vJRkgyOw0IXwY4i;{KFU7^L6PWKp2#jk z){%K2gRi=h&P9L~YGjqs-|}cHIN4AVY}eeR9+pIGI+*)Cf4SyQ$T0MPywg?1C5>l7B1tE@UQNWYRIl6lv=d#P38)}{FegQ zHzw&cNv$r-R&%@hDhOwSK%L^*#4>0)!4ek)%?}_W`G)~w(F$|c@!uk(8Z&)er9*yh zu6hUh$ssF4(&=|Gi??4XqtStf5{fsF=j3Iudn8yo_*SP+mk56$lJ~f|vC#nC|yRK-=z0>=Bew6S7KF4Zn>TFI=FebCQFSD0AkaGfbW zUpG~-8d0DxS)oaro)B8Xx}#$?^0kmv^#XB%GkxPO*f|Q@<@H=8^Ktqs3I91A9;tCmD+*O&7mwmPSQuwX9XpJZ;Ao>fOqF?t2EWZ<2mL+Hj1S-( z+T9A|)LXiuf>23I_?K`F2q*J0c>)x^T{LK+4lt#jTQD#Yjs{rWgo>B+<4<-)jl#8^ zxCpa<)U>w&H0f67&`eURGs^}N-R~{sB9{R6(s%z9&+oQ*E4rkH3J-Nxik8oVuLxmcCEx~B_P9JL)B0>tqDhz?wcMQ zha86Z%y8=A?&XnDZ>uka0+ ze_L1AF54-9_t;DjCb3T@&i>OF)oRwVZ=lu`az%jKmI41j>nc7SD(m2-j6549Ej6zM6 zboUMN(@)>p|00NMPRDfx^57&Vaq6>0&O=-D9a}h!HS9W6Z-2t2soVHJsQRg9!_yR& zD%oDZ#%&kQJw4r>x;>UHx&kzGFb#%&Vkn4yg-ebKHlP0WXvmOQOT4_grU51e7#Nu3J#e?d2^?f%L z)1jeyqRTVgsYkNZ0ZOGo4qo^pShwhQNcrG36^48C|i zJ!k7bFUPb4l{n7Gt7`J(FbG`%S)TKyDCxGy%h~#L$??= z!HMNGP+B!dzHB7l7-Ua1NcK68vLrQwquOc|>{zm(oCN5*v-l%+3394un?A7Iy+T#p zPFqF2KeFX3oW82_i8&5XLd6$97Ix&A3b_g zV;95z>=x*LlYQEani8Hj%$s0h7Sb&eAmUY)v0Q7i#NDR#(*nQz-Wb7^Qbz23CrUx% zMtMe8F9u-t8)FKF>XJa1#Ozb$P@X2+YL1qT5q7f}&(z)0iLt{y2ou_4)pACRo?V3; z+J?`&1_ehF^ZS{*nbkxwxQ;Rp4;r$bIb@!{D>*z{7^L7Q;Cm})Rv|nXM#NWD8AV*M zSW_J4{B)91OeQG6F7GI`nw?}d8oN}?Bs-Jw;{!mcEd5aR438l8sV`NyDG<7-x3@7- zs{g*`hXd_Q(4n+KVT@NO7tjruR!i2aQ zDJI*O1vmEIt6WXWxjZoGUF~TZs}4oM(;Ak(7Xi0e#CQgEr6{70;5&hnZ{1Qch%+;p z69O!KMaK`hjTDNVRgDYB$Z8?ZkNu=CdF)hzu1s5b&AzW}uiHG)?g#mCcwJmEMq*5J^l| z^ZJm?h$UgpZf03usmwH4XT?j#EL>q2X(@x4TI;%K)kg^^9HRAZy17`>8V3!~;RQ6Z zP-}*Ds?ITB#r2EVUs3oW)5-6kyP__tTA(WtWG@^v?P z%Ak(m1|l0N_ZZ5wj9I@=fNyVPJ^&KyLDLTJM8tK?9E6K|RDJ+m_^IsUrC7A5?}qTy zTRRGYEN)=gVdM3(vrIBx_pfJ&W5pBz-=!Vs*1$q;ZXyb*TV!_D-Io^&59DA}>l01> zDklebtKF4RqQtKxX&*XUi$T>2#Um{WB@JB>d;IfE&WIH$o*%ajJpV~nbJ*`Ghg2f7^Xhie zitM2{-Nl71pn-S!FQ~@h$w4DA)y?Fl?JheIX7+CKI0?1%9ywsh(IZ`&Ap*VGw%^LI zeT>r#C09aQFo~Q=X0#7Z$bhR@%Miqu!h|>L9E2#AyYOINrHY)-CZHi0f#aG=a8hsX z7FZR>#+KGgBqV!c7OdGp-n`p7-WVGMa{-WkHSS}Usr7MM?%HNr^ws%`Mm2}blPi!a z+t%N`tQO8UI|zpnH~w?OJBl?iU^5PD@qqLq z#Ece+NCpQ1d)Oj7A;1wgzVznq*#G zGyf9r)PTv1w0W}BjPiX(Qn+^ha1FRMq&$6WlucPTRM8HQr39ESNTp}7Z#mJJWbwun zV4%hL{GG-OSpE+m(62lu))zT+A$J8c*v$xgB(m8q0nybD6o4he#Nr>q;}1dEAU$Dw zWubcbDu{IG2>o444`t{kYeqW_)KC0-4z}kAK)Q(N>-iQT-#odSr8m5C*JL%wOjB^n zBWb(I5|FB{b=f&8`wi-yhAXs_uwVnUO64tD3w>}YR8gBh`N=4{z?FeW%kP}Mz`r~F z*)PP}e$U43r+{Di$fXrCho0I2FXS@6q9s*xUB8M%moUheX3CR{rH-rNHM?@VN zMqd{Y8ovfX&LwJ^p-(6FMOA9XH*<9K^vl$RGZnnInqQ;)a$uvRLcsJ1`Om3lo|D-F z#-uq(zCsHmp0u~$OFzoYbI`+m6;GRGrJNy(unr#T+yGdJ*JxOL;P&jQD`A=kA;FCQ zP%TLfs)k!qr1NfIC}Bi9omgHIGKCnXzf&lm&jtq~J^?8w=kJbG7eu_O1D8BLQatyE zXY#RxzJK1^0!`~?)*MTFjn7!!$UdDBcwlVHmr^R1Fph6@eNG47{F@idiyjX3eK#9| zk9%V6djV`FMtVVC5d5jBqodQ2Z43y>DSm^{x?v9NG+OMST){gU&wyrKO=sM8WZ&7^ zw6UY9I$EWK*hRChswDMga(eHTn5J!$NjD81v3rqy#iFvphL4@V9={PL;rWZ#{scdW zzo)=B>Mtt?$Ln3!2{;uLjJ`uDlC2~qy%88GGk}qa;yxfl1Q%HlDkLw8fsWf-;(2)H zWmAVYZnnXSR6B@c1x%kEi;R4xr=ice$(SQz@1T(*)SU`qqafB(mNfI65zJd4Wjxt268`%!sLW67D`@Xf z{DLG~YAF;BQ|igj2p)=P7;i_n&vW!w@_sl_6F$7S!OZqKAa4N4L->*rM+ttRm02pf znFP%g)YZ;PM6^p^YkwXu=(=bSqijB$AX(AFnTel(58iiZ3hurcrk0YE2Y zkWR4^7-3~Mr*GP~&*DVY7J>U+aLDk3HHP4Jext;`C$)2>{aBp%xUoHR*GN!~rR@P% z^>~U`c?Lb&CidiEvcz3*VuJ^Ey2@Cbs!Do0eX77tZaXXE%e;-H&G~EQ8X!WVNNEIn{FJ$O-oc$MKQ1%4T$aQTc`3T-;9!rihki5 ze2(4p+*>m2OY9qCk?}%>`v_1z{@>3_bIC1Qq7_nvRFa-F~HA$kiszt9fTIG zZILd^J(|^$zW?@Z<)JcD{{$1WcU!H{(p#S1GD25vY2dlU)E8Ly{*8Z$kVvomdY2j! z<6aC|JrIq;Tt`sNs%exj_UiU<%4ErRW5&V4Jw2y<@d1kB#n zIPSo?MykZtOmT(f+P{+(VaiLrIA(p0kG;^C6YNhJiSy^+2;gNFTSZXtCDn~(Gg#i# z6AddsQ`oS-%~7&}-Hb>BSAD*UOH^Xq&xn$(Msh*1EO&f)w0^d!SCu`(r)Nu~%m<45 zPTbg$J>@QERf_J|_(iaL6XFjJmbn8d#n#+Mwt(U&+V1wr#NhYd;|EKE6|4{)n;|D0>e_kTfvD5>^B9gx1-B;kil920UsGBpnqw6K>ud^g#-xbVVJfrnZGpLU-SP#R{;&e z2s4@iI>egdZ(;aV9-971Vsx-Lly4mo<7dgt(PU8D0X#gXY%rt;4`hrao*0vM4|Lec z2;;1h2nbd88J(ew8vJ#R>=Ez+@^?kEH}|OZ>2myF6TS~}?d0NOxPphHt!#SE)5Prj z(ZKUgv#R`9*CtOsu8KHXJ$eL}I>(lmt)KTz#DEY~!d#ynco| zXwX$GhVReI+gr*}&q`sTQy{+MUzJec_}xv{6oBI$Z73GuhnQd&HC-AO$xf3#85e=1 zGjQQx_;(Bg4Eu3GHUb2qs7*|=p6^d;|Dh@F82I$O%LqW#m?a}Lz zvm!?9+RGt?Ap{&Fg=t1_cB6yj6vYD94j7O3KgPX0i$S)aq@OLxww|EsdFdgAi!(>P zvH_IjT_pR3lNgo$G{L|DpDk0CF4&ZKTdedOfvRA(;E`tQi0-_9l_CRXe%w#>e!b;t zMUah=@%_87Q*aDTbL%d=K;czu9RGaZ?(V)(G&Xl%{E?bqZa?qqg@~@;W3S6&X*Gpq zd0bbYvvo|qOw&4{C@r;@mp;$qQ3u|nd<0mj>^=2xEa>aPH$C3Hh!+tD{t2>J`3<@0 z2DE5`k}%nKYM_8oFD17u9zP93X$k>pt0ED-bgTeAT3WBDI9cg)pM4%jADEJe_ZMPz zujV<>!60~jaX=k5PB&X1{~5=&Le1l0pB6nzsH^Jwqbka}Fyf-(<=h0Q4q6O<2L~X! z1uX>Px!$jc%Zcf!hS$r_%lmd$%HC_TlilOvb8k$MnkO9May#2vTC4x{%6{%nZ+~@< znBQJ8?oBb5q@$2!#>fl@GuDV2I+;=_d1)**M%Y{uzb*7!q_K1w3v z8k%!4FxtQb?%W4Nz)DHCusE66XbfQf((RlR!-d5mi&BTtW;2WMA*j(2Hm6{ai~ZsA z@VS@Hfudo}yG&$;((RZTy||$69MUFlo7Xs@X_SA{A+DeU7b-q7xzib zMW-ccqK>G3G`OU<><>lH$e)Gw%-LgP|LLiRE892iR^SpZ!^qzS3_HzE+wV3g zj!fa89=>}c1_Nbazj##zf@bchw=NDy6Sp+oMeV}@?HQAGo4H5gi3BEB3GD! zU6FLFG@LjI6B8Dgl!Iz}b07eSS`%BA7FA)h&OvEIW(lWLhrtrARX3R+S za8Jg?24y|PE+HICGQ3@m2#>_*LfASPrWUM(w*>>z`hF{T{fC|K?M(Ob*{ruQOSu%jh-ze>0+%4-5 z=_q)|ZRLa9i7(wahqk}R1$Kds`DYyHFzrz5JcA(SyRWpKI4j=4%2{R29gXXXaYOwe zfvR;bddq?Od1J+$^^+#^+NQbe(z5xT_0F}zA^KUMvuJ)|!IwL5V-(4L1&3<()ks4* zsvoR@Z^&0uDDwsF&NrYNZRLi{^i@OX z(wxk3aFn~gh3uW`btQI)@}&d@QwS1QW@AuO%_WvYuSBUY;&KB_d&3c|I5-!U1;V6n zF?iIuuYk>o@+ow`czzvD0+O$8SRe&4)FOplm#3dlevSjR3K+0Up$Xe(-#VDdSf@QW zT5RrRS7TXc#qDQMJg@1rRj}~Nk*FN!gYrB7vXX1O`NLo_aRpp7?|KAiXGHt*=$8fSJhkpPi1}FFS zMK=;m8P{PyAF#NA9lX5Ro}=oSE^Sv}aPUkWG%>58Gus#*j}2z~no-w`Y z26vCTX@Z*#cPduF9(Zisigz=QYBtF?US7@=vUA%2tyfm1A+^({Cm z3{gBci(|n%OrV{hFu5EgP0f#02bdw-j9=!M0YGz`7*^wYyTdgadCXscySoiQ1fYJu z^yS>(z)hT-q}8W}LaRK4zE4Q(p zs6c7%Zj@?45aNn93!hma+VOPYQ%2rbHL#|}QE=a!$366T2VsazG$C#O z0F0wUSUw+gYGG~8_b#u$NI*fX#_#S#4Cx6bf7=F=+~wP)&q%8bfxW5R^ZYu6Z5vc1 z)CYej*GKU~r+)H-f*$*6eT0;hP?1Ly{?L@HJOyLHmxL2+%M=5#8UD9bb7+y84XU$K|Uu;u&rRwS5Ys zl#RFAU7YWhb4VaTTRBxqu}H@3ph?;L9Wq`aa5=3$VM#Kk5d4oOk*Qs9`NBw6I8O!> zJ@gD@%9eY0B|{RNB>OIhLd(&|Cb;h==PlydD3en?yqEZ0pD5L?;<=<1gsELz1hCLe z5~)BQPMTN@?%tJ9lAs_DBPLK3uuAwdLsl1Xkfr=cnXRugt1c!;TmAP^40-3mC!f;= zn}RL#xV45$7-0Ey{h1@uzkw!-;fa=P1;|~tj8~4LFPI-BS$-2=kT#OQvozsnC3P2D z%-Adu+qBLyi1kU%cMS?TM+eXU$Dn1S&3T1uHA4_J7X*DBssIOg!=Ev!##gqfnu?XC zwwioTs@ElK-8}|J(k4?E-*f9}bEPSt(R3w6RSf*9|q7QK=cvO$IUD;&y0k}pOHgn3^MjfrLQM?pD(>nYaLNj zmMBuOeR*}2g6D(MFEy8bASVV8rB zsy>8ri)ZqCu|P?d}9#W@{erXx>01-x&${RV_oB)-#G< z9z`$(j62)ZYsBAtc=WW*z9PeYuSs*C1RU&WLMIwr^VeOY55MdT0#-i!BfGrSUG_if z9-jtAq~yz1VJXe1TiA^(Ce{&i*^@LG^tWhG{*3pK4Hi#oO}+B2_} z-;Hp-(;IPnsGshHH<}UTd0R5b9c>4FI)GmkZGe4we+)e+05^-33o!1$cYaL=Ai4f7 ziwbODnre6v-ca#8(`BdN1#UL@_yqNPonz?_T$kW+O+PPu0=pD_@|KH)XEFwf*0|jF zWwTK#d*wah>smJfz5OCKS+~rf`<1XCkf1U^+yQCKn~N9czAS|F6txBy9Xbp(iPJt= zj)5srJWhLd$g_(t{Qm<@{*%Zj%9+sq*DRl^e+cmd`~Pk1|Jg>FQv7$@*l9YA^dA|0 zqP92n|4gI3sh|O~T8bj=)&oyX3_w62|L{xH|BYX|x>(x$*Fygv{__7~FnKP#HrN_| zp3us=si?FIOxh(;$(%AuX6$-o6SG#&+Q+C<3y30_M5)2fq}O{s(y{+Bmr5-QIg!0X z02JUU1I9FNfg4|DN)fg+@o_(jR2%2S+WDf!$#-ubjFL!7PQpeK{bxdB=~C2ccFUAT z#@;oD{9FvdnFovMCuV&}#Y=Qgv{Ye_6tZ$(jvo};#}~>I&76{@u`;}8Ng%Rw@2n6( z9l1J$`{eJOl(@{XJWEu_x8Kvt@0>LLfZ(vnT1$`qhkL5oh&nIo<4jukc1p#F%zNt` zaN=CZy`mQdou4C++-m(g# znki<+EtA^|dUcAZ2Nv8Fwk!@q>tKb)KjCj=1-6a$0W!DbNUVUT%Z*!=M21EefUUeP zaa%N+{>x4%Iq!IG<}MA#6GdASy0r1SYL0yuqbvi-Hx(mzk;bv3FeW=q$f%|9% z?cNB`w-K}6@KRmDB2&t7ejk7ifEnFXn}&E}F<@$_yRId%INFSC5qq{VOn>=MtJRmz z@kLyRqV66JXH~`szUIabJmA7Kvn~<>Lk)YXP_zWOVwi@UVc->@AH_( zzMmnHB*uHH-Kpb+DQuqFhb>u@eM|h(ZH-^A>+>WnyM{x%#4$@xu&<8<(C=gcwLp82 z&jdMz{lF?=6esQ%5C&s9)Q^AApq|7B4(4EyNds50>evR|I|;ZDn$nVC#V~fbkd((PQwCnH5RE zm`fmSLr$M&cddeIiSg^EWKeUhM?^a5fi)84oC|B#W?wp-4Pej@kd(?l>{yfJK_EeT z(+_Cdoj+WJ)F`@^hgx#s$?$ZNt!dm}8HrKzhJ=ucCWtoQfEqNs3c3n778%=gR)KW` z*Lp4QlZc1jm7l_`LQn?|%0XiG*1rA1^ZN%7w&S%@*Rdfu){%ret=uQZ=2sHdM=1Z`&ALI8s8n2 zK-4nwjZO_OY?_fVVPFM{-j0-1hPYql}%oNwM0_$7VY_>Q3+7=0;H%EgIeVfr>L zBOHtfum|>*4iHhe?F?tsu?)IB>Ukwa`n-05)0Alp#-&CEMlgOu&0*?`N%&KRiRC6G z_wRwTdR8WZ_?>?PWlUhgG@`eAPV6Pwe_^g}P{z%nkA|8$^VS@T3e3r(Kf=2dsfO$z z)N@$tQMXH)&^vcHBi`Tm9qAnAmBr-jE7vOmaKwWn@De`$9_{Z}eulU_VD0q%90NRV zDW~YhAckz$O@7Y|M!GQK5Wwy20DGgG{z=zEtV?WXP>-v)tNB&D>WNJ9^Uk2&mdi4I zk?8(48cWD`M))Yvo8y}U*L~ydeZLSgc*og01F3<2=HEB0C;`27Xr?K(DJxBekc;9Q@!6)x4CH)33aP7A+>K;sko|6708av3q20>;ZVQ_Y;ozikE zuf&};R9>8LQCQ)af|7>sa3JiS<-q9zKq?vu76aN&SQ~*pYvCYKc{H)UDN@+9R3!;Q z?d0H$MuvmC#7~aL`c|dqU(>>G)7dodRa|QNjAQ(QznkbKTgi0f_^b*2&Hfw) zRfs;tN7ruD2QC+2{y;}##cbmySv?qLaryZQrur1cbGJ3#E<}5D5l;|UjeCal03wKj zP4-!jx@THHVX!cw;z^=(;BpBjy?IWUM5GsEOv778J3x3x?hOCa>TjkL(R|D${}kvH z-(w^=Ve3DH+d_9ad^7_UP%+ynl1&lQ zCGI3&w~bgZ+ik1~#lzau$QoJ?+mB(nzx%cUaS`JOLCn;Eg!|VGj%1gc5;@&^91Kl{ zAGyXvfaKHlUnz_p{+OiG1c7k2L$qoS)&vKY{#lH_99FWcrV6JqXU~A;5n1{k#thmTtR7g8gf-c?NUfzMVGu~5UWIZ zK25f+tHJ(>W*ig`qpM_(pfXLbd&NiJKY!IgKdH)e6_vb%|4f5~P{q9&&*2LzB0&4OtStMDJhfY@4uizAzQ1j$zlF$^j|7lrKp#45dGkoYu>(6r-t+b2Y3-> zG8N5~0mod-E!~&*x3x8+UTHCmQFqpAusjgS&MsKkq`lj9qafl!ryz=ZqDk<3?2=A5 zD>0y7r~*#6V<}S6fG&p+rBjnhx_~NVczZ)EFYR!N5RomX13q%hCfB9yu}ks2Fo9y@ zEAI`Ae)Ql;y#m{w+_R`YdEnGZe7 zw^4(qt&;=hdc@wXlUZ_Q^Ank=js^YMpwGRwM9`A+sOPd$1LJZ2qc(pSUmZHu5_lKRooJ-HalsB%g4x3pb^ z6rmf12A)Q=YJc7{O%n^Bzn#(?g7gt&ZpAfYo|0iEpx;%K@=bU*f^)YM+(Pv#t(tEf z84HGXHhr>!Q>nsqn>@2&sQmasQYG!HXy9sDgc7y}Ly*9L&pCziM+2r10Wzfn~U*Q(36&(svEEE-e zBa%$Eb2KH!Z)@b!*eCt(dPuUpG1dVo>7#5XljRiEuN^0`9%9HW)Vn0qWRn;}YwcxB zK~VfSmaM;ly{cWe`a5d_t(~QaBL`SO1lX`c#SwoT5Nu6<*asCEXgXus55_E4Rj9G7 zsf*a}JRY3BXi2|jv_O*Tp4Rul1R84r8&^iIT3Uva)IGO#mT{j0&CQHV=Ygdj z$cCKENQE-5yG*Z=8TcZsLe+CT&8mzxt6dA8)}9F*Dj5wd9jX}WE?gj6q>XF~(aaRV zSK2}f@Kbp~95LH~+Aw2dY)ZNv)Wjd|pW;YTkIb*P)yxo?=PyGVc(Ke52-NIllFTmY zbYzh_NQO;#^z`^s=MMxKyEOni!FxxYiiHSqk_S4BXS^Wj=F8D08QGQg@J&J>BIKt8 zN5G3?OG6j!b@@TSt4M6z*N2;Pb~E>*#56E$|B4 z_nanNM*%7x@q@3?iI3t9H2;0N=K(zIAz=s#M729Xgxqw+#)NPm6_WF}sT_ za%YB-6M?RiX7VaIez6$#y%zq-55HAB&t{Zo9FpA1@r3jxWuy;DIMMrfy;|r~4_rd3 z0fDn?yaa=5YWI=)Y4>We!R#?MF5Y-u$;4HqHq7pIlr@Z181<9sO!}%f#Lo#f;1kCH z`4H;+7m&YdSNS0EU!ZS$G$=m%l3s%8=NPR#_cdrP&2aE%)uvsS98d3A=r)LV!5R?+ zhJQUSP%sV$hIPc#>@CVy;c($ev8kEFAdIkcnAel2DNtRs<1~El7cTwN0kp|_^`miv zFhMi02d95TS4{4zkYWoICd*lH0V4GZ&036)f4awq=}vi`*TIUE>AJ9G8IktMPr7KA ztMt*TkkV?)sir>@YZ-FE)%xO{Hh)dHkj7TQ?)s;XB zE`zT~iZwtr1oPx3bk$IgJicEMedDi=<>w2R7^DN%g0jFlg^!}Nj2WZP_+!cw` zx&?^N^(;s{FoG;Fkj(k)S5k7~aZdBd_O6i957OE{PW%h?;|=$TR*~ontezl)Q{_aK z40xaXyuM#WBK}zJZ2Waq0JYMiP3?Pw@(IcVEvi5z)pZNpE6JO>oQGxW!f-?!%3h^M zw9_wFEQWKJC9cW5asstE1Wa7E*Y3o-Uevo&JpPjxdZuXN0?!h38-@tRNbhtVU^3_v zyybIx`q8=%=|L&1vxYNSD#0uGYu&4)u9?p_e>0zAtl7dO=36b~z zV~krFoM=gvb+)@U=W%j*`NI6_>Fd_Q4*E-(qw_X1rui1d{(&#~8_=JWhZh37(l{wo z*{+b!NNNs3QplS{GAA{E_UB*Kk*5mzqMGp}aJ^l`paBCw0)*vJKuAWFvH zzNY-b*+aD;O_{R8co9U#pY7tDy|((f>4-cO2$ z;qUe?`jtu;RF=}O3H5&1pqoCnYZ7cXxM(_)<6Q33fzxwLgn%Jjo3N#TqtLmRYFD&_ z0ghPND()-$LJou(TgHT`7Uvf9Sr1r(-kq56rwv9?jV2D<&z_e{3tYa7<4%7J-41P% zx8n`w(JMLgUclE~Yw6E>bE|aMpdJH?%i)dNh1e$_s!A8%`ivE5AYZx;czVxj(S5>z zVsW}_oue(W-))I@1#Nd=fRn{$nx=o>AWKi-wuPn65UshQ>&R~*h%^Ee3oaS&GC0C& z;?7Ic4!zQ3`3=uxGafGa)vTK8Lf4zdgF~K}A(%zPhM^l4e(SgxJt$YHLx?ES_OI1-wLwkoM{cLrj#0>BOqSVeUl>O9A zA;zk6VyiD)9#ObOqig-5wC*WoR&lkkgPSoo%ztLl%3J4w6eqa>d6TqN4S8xewyjGx z&~(3Gx&WNF)fZR%H+-sZQeR$>QZ~4y;j0;w;QByBBQ#;I|9XG+Rkjx9(5YCSkH+X| zD(LUdl>t5g1Y_mhNpV;F*Wr&9tywMm82snex?=LbO#WIzj_K4}3Twbx7-z`}WoJc* ziu`!E=T8LI@^zp#$a|g9j~FDLw1IN{e&2x9F~F(?2i`pC@QA>{_mDG?cy2jl53lLY zTxMdP7v?JhW{|Xn&q_Z0Zh25u^2^zK0}QyS6UT zyxEZ~A?@9Ey1ZA}b^!6a<-a$o8R@knMt>+4!3Ce(!n&fhwy~@F0eu@eV{%o_v5=sQ z9DqIWQ@0kdR{5oCgWJRL!N5^OM2Jwt(47qmw~>D$!&-SqJVf2X<<{?d(^15vv+aIisU`iw&OwZK|^EB znZV)Keg{&(+!GrPFV^4N9IrnD^13#@ESF46&lY9wof(I7&s4OR)fOU&S3pq?94fZ^ zTy49LQXk?~ufz^aS_$6g_1)c(l|r6Y0*``4qts-WFk^3#s3NwqI=O%UB7+3wWsHVpC7bkxsT>r zT}bmCc(Jlie`-2v<0Eu*p9BzGm)vDs=L^XEW6D@)F9<|R4^F^$qkM+Id>0;_;1f5;_VRW^}-#5x^T$e2qjeiapK@IJ`jM;NI%S3C=`czVskHkQA zCR;L2AR|>`?8_3tYH$N^l9P*2o#_??Az@eA_X(@si)|e2Hz>e^N{F?#6#&zqh~~(L zM|YvhKUbZtquQ_{=i*-RZptp0RaHReYkYV=8>1_PF#xN1NbC+oJVc_TNAzlq2$Yap z_8`5%eSdN2sHSuUDFOY{g=7rm;RA$U4naB_A2snyTU2~CB<2Ntbd6-9_pdlVm&)He zOS+cs8)^w(*ZTe%)j&;>8UQyG_g1_$I&G&aJ6rLFM2-jqM2P^jQBuKwz!1a3MycJB zHgH@@;&?jqd5mOF^R`}X%147v)RbFu*5v(Qfa7n<0x`h=VV$9d?>3>d(?+)9r6R{8asZ}-puf#)m-utLs!_}f2#_=WLOyM zN=g7Xs4G9DY4S=sRe-aE8A^kBR?+l;gOy`!cGxENNpZx#u)F=?bTgWxz&WdDXq6I| zE*49Vzp1@AB*lzy`7h+9w5}PQ#q9m8M;+#T*borHw&Ik^n~27Vt&LHss3V)#VWa;g zwe7Y2wXIKN`&v^tO=9aoClqItWvty(CdIZJD7c@38`UQTtpVgXTMFL3Sp=HHrW^id zco3^LC#f@8tPRG!Xzehz<5CV)b7|d|8Skm-yqX~Pwr@oPQKzG5$QM%H@%n67X3dIO zeXb9T+FerapZc$M=1XIuh7mjCHD;?UsdmC#f<(oc za;{&@RY|_oVF2RDNW78f?o6N;fG*h9*pPl9(w>#qU}Llz9HwaIkpmC4Gt=wB_KODm zeixoFrGxN8)-kUUD%q#}v5RaGuLPmscFw)%2h2A8lZw?kmg{E4)tnoUeKb$=kh4v^ zIa!b>vTmU%0pp0QDM+i)Y`P3aEIZ4zwfWlpU;SyuTmZQ;#xO0u8R>5S`#hBM3t$=v zQG=^rRQ61TKp4Ki)i_=N40GJH0?!Si11$%*DjZx>BHEG>3-hJ|19?V;uO#t60}P_+ zUxa}w0i11%&YZ=%(&I48s)2_#fP=xj2|RoddycNPZq3h=!~znHJfk74VAEOqjij8d z+%rOr7XUP+X(W@DV9g6LESZ7i%w}Q5gO9Lq*ip!hBgdf3HAYNuQA|bZk;Q6vy*E-= zUyegTEW+9J_2;NbDRY&~s^5wkqocw-|2y6(`78MrrbOv3wgijbaJa~mn4GJ&@$ymV zS0Zb(L@_L-VINhm*EX#tc||eLXuX~Z%Bd_SE&zT>L&k9x(bHW%iI@eUGwXOI3IU=G z17Vc2rpD^nGCu9Mu#!3=L~y~`N}*hbp?fe*QuAtTI0AS5V?5glfBqJ4j85O#ncYb2G2B)UK$T`hb zPh;S^Kz{TKwwsL7lZb^`q55CLTwI(bLb4mJa2!sKaWRQmiWccelmtg8Jo&q+@;ucV zBfdQ5jhVry+1b872ev!fsfjrBZUp4SkR{vLLgg-LX8=z|du+n|i4uN{?{kiv7{HS{ zR3ir_6_J~QZ{7r!B*$R0RFaR3e58i=`@R+=Ce(*he#%Sf7hXTYx+X_+WZgdNzfk+V z#+lm8G6EOgpSmyWm(&yQT6t^s14M{{hvncFHDuWZJRPVfQ_SB4jI8T9Leo!dexw_l z)_k?q(cu{@b#!g`L4_{ulj;6q5U2xT^^3#g*@6E&n*I4 zs;n#%nX4haKI1X`80};btGdXlULadk)T1x;QW}^#@blrByO;Z2^O-kuN~(%3a|raj z)$$gp540B?A2MwXW``<%)LPngT*9d3%_x87t;bUnyn2d6$qXD&Li*o~tO47bzioe+ z${l;Xu$LGG+Zu07n3`6f#*Xlq`S#RK%X8XXf|+{fwpWs5Fp4bbB)!!vCpd0o#|Sr( zOJ261Pnw3Jhcs55ni}NP34(AatARdXxecRRzMX=Kl9+#@eu270UG;?_Z{V2UIXiH9 zi^o%!irTQ#%~vztsP4|iKj#52_4dQ{=p- z)f^(4KWm+y5wvLug>Qe?R!n?#m0EV_;J$zNzx@1pj3p$n4`WMe#q4P7w`fsAJE*wd z3~9G}ti$Ko^mzP2K_69m8d8rPTQf8N)AL8;d(na=cEV`@Hy`*(KNetBR_T;-02lGg z$@P_HGB-7@ZE_h=wYA%}@z}^2E**()eX72t2+rz;bp})b1 zXrrlaybDT4hDNkx(T4y`Nmk{Wno;|+n_UBQas8`__A&_+2t>x0HrA^EAbzFcu8Rmq zTxI=gQOyn4b`98Nez3XB6$T4f9E`Jo`pZ|6JU@4|eTK$m`PQCDLRA_@J0QU?qaZtKnDn)D{N8{3ZmCQ>9Uti7gHzj^JXT^;>)NuTHZpQC z$UwfTk!|Ez6yX@PU2`?Ogekh#3}HN$Bipt3hzTFK(`VkrfAIb52_GOn#S=VitN5!b_&YlP6eZ0@#Fe2``Z z-GAP0m<8agiiU!8&eMS5qEyZowtc*O6$fJD2VeVyP2vH6NAm?@{61@NTXb^=QgJkm z_Ju7I3v{LOt3WcGf#}=n1(!5GBop>ny;rM961%E>*DL?c^+}zq*|!*DwFTvTRoV)g zXH4LPq3YL-Yh6FSnXq$j9WGzQ!)R*Hd;_OD z1wSxgVUqkT&vrl=#0mDw4;J%}lQcNl%`*;kg>G(_KKTp0T-8dK?O@@_SCOmz(Eg?@&X z-`8_Y*enzhV5nh97u!PR?#@NzxjE63v*`^DqfbTtA6?(TWJ$m!+qP}noHnLyo40M7 zciOgXOxxzPZQHgvZ@w3?yYV*SRYd-Ss;JC!GV>_8U^<3GSzoe#YNOyyrDk5Gi)#KP zUA}*Rh?|!6$fWgF3Bc0(83WSw)}*wG4WzAqqjRNLL3HIF6ykit=RenT{YFt0tvSnT zN{#INxdA%2M_Di;1H0Tz1L|a)Qeg!7J(N^Umr@#3f-KGL?(ZOB32`7+fxX9V2%CJ~ z=YPHBk~28F&yb_xNPy+F%Ggq=}UA%$O|Qea=+ z0>82icNuY+ujC`OFkJFe7zWNirGK~Z$XA`o*{6Ga{Q~&!{KX+Q& zpicIe>9y9Y(Hd~qD=`J$V!GF^4cUa((SH?nVF2hT7)gQ8Bm zCMlk;$~gx`{7#W69D2%0RV?IFVq=#i`5aVLk1rfj93G5Ha@}Zv(Ep;|i zVWNo+HR$H8FKTqhpk94JR7)m;vV#2{_kQj`(VyQnDzK=; zzk-jp_8a@s-uNVJb#m_leJu@2KQ?dikyPO_S!zKDINo z!dY`Uq%+O4ZipQ-!A(QO~ z03?+=Gj|y)DbJ~`5vyyovG6nBa1@|B#DqTUe*R9H2| zm7}VU-BtVG@V4#tkUw*kvlXR}*ry2spPb_t)>V;+C4uKBj4Pl zdWz6GMzYT^a@SJuvGV6Iwd=b;K-`$A`4+Q}Hsbuao7>(4UTh_eP8<9n7c5lu0(%Nj z@-ev5d1aqq|946umzZ#@D96D(Y52~0zy|j3JL?Bf2+qJ`%b1{ssX=-@$5d0;w410x zi26JbX1}fXf_oyah|a6Sc=Wj6Rcb+fXvr2I?Kg}Cye(&OxEcLjypc_PEe5ANt*POi zaaesxy-kuk@T5f+hlFT4h-w*)+FjmOblg*z8?n)trhjhs7wD3n&y`L%g;N&qE$U9P z8*@b2%t=Hu`65=zYW=Kc4-=E^zeBdmGm__TS$qvTD-TU~}#h z8SI-+)CQ?&k0(A0ISVa9nl2cBJGZDXeDz1PzhzhG+T z;QM<*q(>b#wTkfiXRxY0Ad9M1{J&~Qv38B6Ly=d`e+)&|!lT&&?RnM$=F)X(9pqV0 zqKjrPfJmjf&niW*W9BH&HV<{udi$Iw>$rg!jdOqu9g7Ui3UP-(7}jZg&$`z1&8p(n z9HbZl8=`nA7uA5VV*8-w05912L!~YJ8=jh}K(u58`;;8?^UXr$f$lE)ICfrb9>A=4 zI3(j+)E>O!PuW$=JnN?_{v3FK3O2@`1LLbW5Ft052Ks?^R`IFfO7zqu=9L%elriz# zr^OwOo3L9`n#T1FfgMZ6JfP678>P^$bcSC&rKVn%JAKbdUPs9; zt<#yEM|!=9H5I!GXysZ=wd;~>RUUdcNR-!3nwMIzwW<42$$NW2cH|#MUKNKHFS{Ww z&Qd(O{qf;C7@RBQ$4Tu_e|@fmw)L+DwC#XfUk{X7B;_<&`(*%n_SZN zhOerTxKJ5XK%_N&=G1cUXbJ=>G8vDx^3z0fE3eI8B6tb6nom(Lxg9_t;#!q zQ$aKAm#vDz+GhnFvyW5L-{aj|U@~2uVlc>?JlkTNN`>;!@1j}0<)OnF0Qk_zq@b72 zqP7+T78jsB@(w!lMo@?mq*&J;)n}wr$wj2f0MX;x1%*@ko3^x8M zvRZngOI+CpyfLtbK~N1047>+ReT@=T}AQNU|<>2K{N2e3BKJx*&_0n&B(p2 z`Fqjt54mW_$fN7>`i~*vo4#^r^S^Nv{!R4K;D3Xd-XAM#wpsn8$k}s0IeHs;e#xVi zk|VwAK6_|O;y&W1HP=OM*?IU%p6 z&*=}2h+_%$Tv#P9#x$-!sR&ktj0g$x6l)^o@Iq8cK6>c~V8q@!26I3iY|gh&PG}O8 zx$(Y>&mAuhK6Le_iy;G90yl_=3?s_huxbuIfwim?EMkjV@C4lSJ<9&N7>1vt=#Qq> zdV{~^g`bK<*0i~SEDB6=h4?3GYT0*LbZB1J3S9cI2!(eTL=NP)l8J1usLE-*Y+abZ zz2twL6%!a@0EtM3yS9?`omW00YF6wE&CU%z>T#dnYc?`Nyf1bkb-)C~RK5D^!o^OF zhsCM;>*!@WS84sQEBlKAhX;=cgRaHTa4EFch(6ijw|#z~#LwyMh5X4i1$yVXrc^eL zxV7W}H8mlvfxeH%7^OQB>dioGWIFN^Ab4x-40qb0Q$ z*R#F|$blK4>+ouX2Ahac1=W|Q3ELSQQev1UVv#2JGQlgt;z-QQ-AGv8KMhAf_Zl;b zVK2)OhsQFi?49#G0ZA}H{=Rs`1Nba(rV$#*x4 z>(ur2uCB|26NL$NtIbf%YB-NMtnepNNAUOowYL$dQtso{zkLdJECMZbol0n?1Gw=M zgjP4p4VRQRf~H5YF&rc2bQG!d@I7&2z!YB6#RxM^p4S$^A4#Kdc9DTq^M8X1sGt|#Oo+{`VwU8(1YmNio(hDo`JUM7FP|LD0=q@CzNsq=2TJ?z( z1JeiUcE(7E@*!Jd{kyawC=&s_7~V*xvbzFyq_vwfZDVa#-|z_FS0emXc&*OnIcCws z+mj9Xa&}~f!`@q_YwzXuLUUkoG?Xv*^d8RtTHYUzi$ z7U{a>z3LQUl(rGBgQOg)22(I+M@1fZ2ABnshL%c19a+#rh-2c5Z>tc{p?(#uEFkXs z<*U?K#E81V8nO14j}PTYS(>EjVX~@Fs=^sb?;)amDfd`%y6C{G z4l->MRqEmzj8dflOMKm1-CV-Y;%Woo*i-jVJ78aU&j8yAw5+FXkV12QdU*)}J0zKK z6&fMM*yt}v?xLWrp$irU0o;0Gdh~KZmHi5>-+m6^5^-$(xJH=h3$**vJudr`Zax_$ zo=q?P#uX}fn*FJ6R*B&6BD=wrQvjgJD)S{&kBM1~3(ejmbk%)Lz9~MH{Tbxt%g&D2 zHRAceYyg&~AQHk?4E5a9o%Z&Hg{9sqCF6y-GSKpD;<*9dW}ln|_6L#R9xx3mP^ zbE`kk-P#kW5L~Ezp71;sLPz_4;G~u0+jiw{)1z8ao&B|=yrR@vwBX8%JhTqgUat}y zleXjW4gH^30vyPH9_oKx&UA^n@JThDRM1xc8k_$iX`_=0osEf=iyH2K@(braib)t< zTrk|;e^vg2M%6AOP{e-;1+nQbpt3X~2nbnHe>eSqXBCnjyWRdppk=jhZ^XwceJ9GA zLb+wNx9)VZLQ<+)+o!R7rj{NVc=-5qQ`=P#=6aG|)M+0ASL*dXhtqg7(5K(tcm&P2 zTqLB(PXQp`5O-V8H8m}Kpu`ovsF#>7Qgsmv0b@YLw5@o?JHxiClCaiVvb~ciy zx;1J&P^dnhZ5t}KAz>GnV~ep5fpe;>=0l@=f||Zo%I!6fnt}_4nO9))-DJq*<}l5Y ze~pE&Q+xOHrEdv-aUh>;yFWaezA}> z8UMQVBJ7C9>`~5Vjpc#Z;udFtKD|Ez>)jsAd?H`E_E;4JmjX zCVI;0y@De$%;(y(rJV>^$$fA)prNljkXe+$hZgpRA;wu+bD^(@7Q50r->P24y~|h+ zRLvL5>I!5Ar3bMUjqrtM;5ZyHSa;Ws zX2X_g2sKr2A50?ikc7Z37A6+^b>qn6GM!>q+$ByczrnZ$ zF1g35R=)cE)Pf#FOWOGdJOyM(WHZ2!r;Qf);hgH4kH5B97m7nvMY;0GvZPd(WKu_t7_&4H5K`{eXpVDDZ;i`Qo;h?AwSfauG|4KTTbW zU6JLEHI9zArOkqyZlw+4o?_>I5orEnzexwKDK3Pc5=Btg+5+YQr%iF`(z)JXjC~2T z{vm5Yjk5!5_cv5!eW*wzu$gILLV6LKBh&Y{RMOmG)T1?L#;y=Snxxy98_|F&O$-VC zwj$}yDFK-M+TxS2jJJCS87XTZ5KP^DEIdSUf{jEds3G`QuW|nP+ETXPu>VjM*|M)d zsTH#gNt)!8w7MKXiC2REE>>qKo98cc)+4wyPgHh1-IU-hpISBTLM)w!GiTASzF*qD zH4( ztT9GnTHDe>h1pGlta-2j-HwHM3fl$#M@=pS>S|+J1VVTvjz8$_uVi*QkSfEuU_itn z`16q}19Pd$%<0RzMQam8?W$gYqlzM2p+KHR$)A*<(~Xsh&OGgoK_RIPTU{`z1g;i)=dt7JA4%lBF_JuhwBQ%1Cvdg zCSo>fQP)7py^)#rQ1f{O%G>$CjPhBlwT)3Oc0oHuOyDvGHTtOgbR6@>t~-GQlS(X* z@M){zhj>!FClXa9be0FJK4-r7V)PpKij}(JRa9eTbo!3nBDB!gNo;5 zRuNoLvf6vZ z&t@YjnuL*H2=YhAM^m}I_$rCQGT1Qa;g1PoNeE)^;v z41(ZfXXTHFvPoHP(9*lmh;1RzZD4diT8;Q{C;Ta=4T``7E`>NRMV0w8AaWDX%lHlo zp&>|GWxV00(t~RUUM~jbkP$hTUKxHkKpV@Fok=1D5LFHlD1BVAKYPcR=u%;Oi2SG+ ze7|F277sv&t&!m2_s&HK1b?*oEPM!G<+CqkybAaTb*%&9L|Hy`Kw@{F=YtSN(2aPl zlSgD5OnUAD4`8#%is`2^PlNbQh3ap34|$?UKANk#0t!+pb5@P0XK6J1em`N@rX}1Y z7w)edBbM?F$S3Uke&2x`x35aRI9S! zF6<26d~*;yigP~3I^pA*$Gs&i;7jk0n|8!`EWcxz^fNzLUlRSwtSAezmqF&FX&`a? z_q2ByFbCOPRTT!0d#s!$yTLL4D5QbDkFZ%4jv3yYgf8?XlrXmdFZ2zI$o!arM5CK@ zGePSdrRZgeaj^>1$L+z5<@GtV?qHI!FC64+?;7=|2w64Dwq9B^%b&r#h#a>selw=q zK-li2fE&F7uFGi*48Pu30a%GE2Y;OqN`V(XV6tr-FX8JQp`+|<;)HCF|Ix!s?!2q~frFlkNRAWWv|3XdJyP!>S==%(t(oT5UqJx#4ne(2#7xw zFKv+|qfXOzV7!=aY4;+v^TAMzMy)T9Yu=xq1e`M|Mn~G#$nD~P>M8S~ZD(_e;iGf?R2xlav@UWrY6wh>`4> zI8x$gF%Lg@sh?Z1NMT-c+e@gYA=fI34(>?yFzR*wF(VAye-DP}`T9EgvxJV-v)Vr! zcX29^5Mtqqb(kV5i0uTDT57@i1pOtE+JUX4YZBM{kLPFdws(9?Udq8h?wX6W;PIbS zmH=N51LrP3PFttaXQX1_T79=JMCXubQHj?ao~gYmg@F+Pf*bQ?>dB)5;XlT6!*t36 zxzX;j^f2vYV1v>W*r$nhe@$p15Yfy!Hc{*lrgv!yAj(qVvLG^LWUIXlZln`IqR7zS+{eXqdr3{$3Nb3=LN{ z1$3Q9J`#JG%>Eg!P!V z9221Gbd4^Z0IIg?7B6S)+3~fkXw7eOWx==gKpi#cB=-yXpLD{3!1yPzU_eSs6vf&+ zL2N$%X)Xa;5DBh5h+4yna=?{sg7-}jq zu{@M^;WbR0*k&(~rpMfz<;kT|r2c6=1vV{1w6+RH#_J=C^MEYEs+iq1y5d*3pcIcG zDt6UZ_Kzp5{^?_8^i2_@~>93t6E3r+b{l}Hz5$DCsMkn zMBnCw6rd8EH*tg$frxwcE6SZuAL*xXLn%U`DTjS3!Q9UjjjOfd8|OPe(cI@3$0!yc z70NW4Ejx4+!5RV2(H4nre+j(?+Q$!A-2F2!iZ3loFxO>l-<&}NeMM;V@k0BUBA%d6 zSL0@&Xlr=`_DsdAkQ##adQSs-Tv^{CpKD8B>OuEn3 zv0Oi5OTBy}mgccGe;2h#GL46-iur+4j@D`q(*XGsJf3*VPH3gbx^gmTo%qM6f{P>$ zroG+s%b%5zUPSW4`S;iibUN^d4sss{zSR}2PChME({4!SiFoWLR7d@(e^`ON5+2=& z&K6A`qh9#Qv2hRrWn0W%V_{009Jkn#2QfO~sX|8fp%(NU@>OyepPm|NDUSW@y9BJ} zt>(l){7J$HPOs{fJynU`{F>4bo4Mfhvr@v}wx+GfvnFvN2gyalFIvL-gI9bDUDwr> z7i0p{j}SH6wHa~t>cSeOcfZR{;c3^XM>_xyv^tqH4HHp7j`NuE(VsBEm;k>S7&_;E zDk_+t=h3f44J0Tn(g&typ|cA0)`mgAT6sjK4b1VQ2ZAd^Ew3ZW8t`J%L6Q(y^ma5IUEKzm8H=i*OWDlo0R%Fm#&mu!Y#`GjfcD zTx!KvpQ&m0v*Pk1F$);-ZSD@D)@DZ6(F9fb8MetGIzC$21~Zukd8kPw9b6;m_T~+uo$K zmPh#2(3(*P7y8Qr&1ldA@oEh{Q4aTm98PD1Z5a?*LxmQx@a25lu6jQ*q!*U0()u3n zbG!ZkzwemKupi8qq>Ov)nRohhI!jI&|JwXD{(BIxNaSM)8Kvm)*K^P6FV>J1p86zo zY0L#nckL)Fj{2mviG}1*zp?-8745^QDn>J_yjvHH=gv{`%L-&q7lBf60&y*QY7@p| z>>e4#%>Hv||4QS`DHbPj7E?9!=S2ocr@P zF?L98T(YLI_!(sX69hPvkC>__B-#KHLBFGdmP>UJMdFT{mk>y%Cx$;Z= zpB)o2g$Jo-V%Gdy_hi@{gRq&!tic`I(CjBp-jLaW@7q01iD&Eah4?c)$L@(E44}jX zX?m)`=qimmT$)wS8P8vC><~`a+UA@~T_ZgD@~}W{nq)s^P(#*b;@=OjQ>Nt+_=d%# z|NO$ydL|<*dyJ$^78)i)mQ|$1!PAj7~^`3Xdu`qjRX? zwq@ADiZn~|H(!mdfHZ|ih&yQj7@;Gb8rI}i*1NW-yUBdXK6RI;|7JpfD%KQ@Dsx;U zMu`6dh^k;;9S_aPw42=g#13!`3nHR>eL{09WFCQlmztA|>Y|#F>{)C@w9cbZv$$IU z_4<+MxJa9NFJeT}6M(Je8t<;jqdVuiui_dNPfc#0Rj1E`>cR@PbiQH%B#DTExG_PC zTv<_d75PYpBoCxXfYQL{Y)A1(qvG2Nyg^y8{SFc%CP(xVoU+p?t(M6uW=C2GU6p8j zW7;r*vF2j~ho%6JXurwt>|Eqx3MRPSzz*YYn(^f3b}49t9kAET3$*(Axm~t)Q~k=c z1gKKppsox3(=MWYsq2#h9GPMb?C`g^jD+$qV3-&5D+~yoijrEHY^O=vYCBkOiR9Ua z?DopM&I3JMz_!92ay3fS1zaoCPK2W4p$0*9G+8fqF;GvWDF*GTnx(4ui6Pmr^_Nubi8EpkS zxn6S|e+1DEB;ODW$Ha0t`UXU2FcPZ_KdaJvcC_$JcZyBrhb%%*=!93cW(Lffb(enq zxpb*g0r?eJ3=GMY1(WoBF>4ci!%vR=Li%+58-oS=fuoh*b`SHaMUXU1W zLLXFjU+Y9oFy;09|Mn?~VdHWRn}UIW6era$(*QYok5vAH|3#uh)Z}drSWvn@G!a5b zvgAdLUg{v6FH*Nuk*{*+0T@=<;p2%35>|~9-!CZy8xa@6ZY;)+kH-fB+DkER5X%1I!ZII3i54h8Y&;`MsW+RmiSqMBo+CysnMGuht|Zd~(l3Ipf94d$$UKL(r% zwYcS)Q_uux2c)%=UW$i)6?dEkCDe6GYH^vt>GeVLd+-ql*tq+cx&T_~{7tT#s#Wss zdzzgRdj9-C<=m79Ms3;qH6NZOyC^$L=Q6y&`YVqgXV*0#74q|qT&z0CO(Orv6eTOK z=;$ZhV35QeB^(KGCkYyc?{A)7AvB}=cUFF6uWpKfUmD*sWdlmy{;P1W$xwq`O`n&vd%Z!EV4soAyH^FLb3J8bhGy^byK(NxS*`Y1SnB*ceW@bJSmb-iUE8)BkGVPif%C zWXTg5Q}KPzD|oj?GkxupQ_AHI5ktR|coP^$cDUJT%PN<5gv!1lCISH= z{J(n7($&@RzXad^=Upw)){Wcvf#v^F3qXfRR9?GfSZ6|+gn;=0s{^Q~O*|VQLxj*N zw6iyzqgT0`#Cp5=AXLFtNjzF(BsRCb&mM5;oxS%|NimXPF8(k*RA#{Hlp$Q>RUIj! z({=&gD`4%%@TP_Ax0mC^yV;o*=*D~Y*Zp$er>d?jjNfQN`&$$8V{9;?oKC$xsQ34L z`1~gQ(;bM6!&ZaSdwl(4iW08Bjfr}xEjun zwe*EfE~nA2`;wutp;+}mY^&|;K^=_F;H!1uL^^{9-ISR*9)iwp?$#4^9+|CJUZ;r* zfAcE{d7uq>Y+3S;{b$p)02^?m*k7MvbVG$3{?pqu8gxNE4TaN??9lxN78%?bOS<#n z3@?`?RkS(;FX}-@D%JEtO=#>)E_esi>OgW$X%Q8eUi%$*FP$=rVRa8#bkGq9h&zx zM9#taXtj)VVdCdG2_UxXxS;chOZsDgJXIxBh7qDSaRMhgvFYTIv`7U>sc;nY;Yr$T zgqWZa7MAwj2{f1U7ybk1sAjl_tBq0!G7`dd+X4(T;OyxPLLlqDu8H?K>e_Q*B zUS1d_wG>%aqkJ*zv29~zNEly=b2Qeo_u16bhV7r?OA|#}fB(^xbAd465>Pz>f+MWV zws+gii6Z&N1-Z*6;0F7H7*~w2uJCYu8Vm2y(~{Zu#4R<6lYO9_9|zoHMp4gyzn^@3 z80u$Q$PRN3T&I(^$wmip@-TOr3EBUUQ?J_aavSkqxBX>s{6&?09hQ|h+>~wXPd_vO z`;Njxj+Aa@j@GiT5;Ye=)2HeIT-i$L7c|CdLjLctn$h+(!{1Yr<%4WoDyF9TX1kfQCamy z6WCg25CG%)WwBMJ-!sPKHD_k4voHl?3tf98UOxtTG{3y2lm_apIJbp4C0$Jx>g12nOR z$Za}l6KZRfygwZ2JjbeM$mFCXeJgu(45umWdYi7omzx1I4&U$ONufDL*D}81J5chO z;9QzaKO3Fn%tNf)Fc!Cg)}hY%V~})CgJ!SO?)#Ir0)UoUN(qR>$n~{23R~x+)XQHm zMWt2Z05#7Hro(SQKE}8*ZY^g(HeHCNkhQfAqi%F2Ww$x;Qi`ts&za1zYzWOow;;GG zSWwsQoz6*PT-0kpb!!k!Ld6wRC9%2izR<&%0=f3htMVC!S(QW}sLX|7_j}Ez$lz#9 ziL5TP!4X64p(g7Mqd&B8S8>cqi9jX#)swi)XoZyVfPMMRSDrAL0L>F+29&$J`v0KF#AM+cl0V&iCEbfVSCuF}Ff`Qk;4pLua8)zvyiH|69KocH$#V1`qB zXQw{P2$^rkACZzYe`Ix^f>DAynA^LybnLCz_ActelDSuf?6+d{4FcF_h`p0O`^M&8 zl2w&G{^hrG#khRdIi}?butj`*joaB|asH%p;CWniv`Z40H?H{M7NN6%oeKiK#P(Dd zs(;7MTee%E_GmkrMA=7t47=-_3IYM2j^$C zFZ-a}bIVOx)WA*%mkfd~=<#r$3R%1;s`oRedBjCv6hB{nBMyu`HQ`3+XXWznGxDPj z51`abDX1u>5w$w%K<$zR{V$}0G}aR_{(yM_J?}zugiVv%@Ig6ZrS$1urIG$I-Bliv zUk%mW7jHrlc5+R9u2tkZ=*8EFdGh;F_ZN$hviwp}2fkYhC)&Hty`0#UY%m)nQ?hW; zr&vC4z9T)0s`?0{qos$KdotNEMh@1dxQjtAtp~x|Tp9ME#4+!V%k~V&;vg|C2O8!P0)* zGoi$ty5)`Wj$IOM`15?fb0fb!9m&ink6r;-I3Db$jvun@ioHSph`{AjKV$G`7?ZTC zV`St-+KG?US2?c=a%ZK3r^tvC)>?Z%Iv&LY{6N4?BjTNPJVkU8KY(o*M*`QtwNKwD z7vxeE8{`XtH`H%F{4hq0aYKp|T~!&v4FnEY79KzBc+P>H4aA4+yI6oVaT-G13gHLJ zuxr#aEv_LIRg+KR@Vr7Amjd(^rB%;PVF?@AE$I-U{PI$En4H)Wmpp;nK zdp36TKf+T${9lB}+12j93D2$Uv&w()zsPyFww=QUH`@2L;ZF`23J2RE>Do4VCvAX3 zCuHP+ew1Cu3n}YA#$#e{sw}B;_a1ra(2FZmXduON_v9#|%(vf#e6oiy)fy6?3B$R! z#5I=bP@#vZLLs-t+1v^=dEqy?8DyG)kk6=+E>wAtJ@;&0k(;7g7&A>YRinL++Qz!s3GrK7Xbq({v#HB8chad1 zjx@W#)#gfsomnAM@G7)HnovKkhZwVJXB45kQMVu@E}_-(vC9U=-1a)I>!!)2=we~Z zQ87sV0fuM4(cn#J;gzW^;2=CGo3!ou;lG|H(P-JrWd(5VHg;Xt_`g27>=YI!%Z#R< zI8D1d4ZA?y+nb)9N6oE<6b3tH;9LcxX*sCwvo~u3 z`EVy;d=LAb^}gCz(90Ta$XR7@mt}C2QXG+t!N($_sTdpuYP%)ed)LwPX7pnCa>Df< zHXGY8D|bkA62&8xGi*h0gIlBCmhLZ^*zybwh2+Nu499>xXT3eXWRaAIOjV=329r#A z=gntlTNngl58XWl3cZHkWC!g?E4MmfqqtkL%2;(qr91izOn(n|xa0?1j(+x zXwBx()xi&JnHkA>y5NKOoddx+_Z`46%+9{b)AI`$1{%od#{z}OnVi94`64Mi?LDIF zxk`)9U+&D!Z1Ruq!9>E@@pkN6sP|c<8}>5X{NCO7Q*`S>-7i@BbmK7oNi8v4zgx{* z+2{nSW69mkcmt2qBJR=#E_zZ6&QBPMtu&yqM5zNb={|V#bNmHrjJ$aJm$V?AD!*d> zsKmz^eUwDrL^v0|v(m^0)KZX*+kH=JjgEPQ3+$PO>A(dg>+UUYk6kdF*onyLu1$puB}V+h>||%$4>*M)ip>YbT<*(fM|d^v=n%G`Gs^O;+XdQAtGn(!`oGplO621%TX$YSteV|J^^rf& z5qUOt)6v~@&u-RnpXSF7ge-ebl!{@PIRKmPPx7DD=kzpfD6vie?^Dcep2N1^r}KjM zfWM+vf%NO$!;A{t>6M@_hhZoedX6QVUKri`(eX_lgK1K-RjMWTqecl;EuN3z&;4-* z&XNvePtg6^?sL~Oi0XDX(h{)j=7cEVI*vv*9RDr|xKiCA8r1tVjkCyOXhsZp=pNCQ z@;{6CD)Of#-PD5h{7+0J$=M>BLP)K3R27(#S2`2a_O-r6xW8~+C8#zwGWmT%mQCy| zSTY_G{=RXz^9uQKdPpn(N-MXRc8GQ_`gCr$K#d4XU@bRv5r3Nd>i`Au|{_<^WXt_rl^{EAA zAKge-_g}*#@c!l}>P_C?i zxbXx1aMO*4n|U!uqLd+6Kzg9PO$OZNBZ%8D~%gya(@i?VKi_XXS9>arPAAE!vvE-)a#O}~g zaW{fHg7SA5T%hMCW}O)6o!bHh?6Om_#JaC2?P?eW_Djn{2eiQ=M$xh6aamPI7TcuD zHFu=|pZ&P$;l$l;C&^sE9!()7j4r@6MD-7biG5&-h>1z!+!bAk1QP-&MYumYKXPjm z45EkWsrhnn|B#X2G?3+e685IPrwm!)leVciM92c10&&FZL-498K#Q!m+p>!%7#2-M!Y5ZWeLuyU z1nuHu`2ZL-qi2_VL``vpf+L&ZFWJ!7pO;n{cmTcpeL$iyX5EW`Q{suR2nF<2@ExJ{ zF`qwcY6@=@$t{6!4jJrZ=l&RDtH@iCf;>-G(y;;q~Fb3aU0LRP2FY1kzbu65X zsV#{<1HVIBbhm-@*=*ao_9_I8Q)YQkG)_&JJst5}(2Y{yogB_v$H6ifJUIvYc;61_ zam`;t%6j*U0^^hqEnb;*Vr2n_83X3Gn&fEzmt!+WXnrk;r$U>;>807s69N)u!cBMq zFN@r5&WMvbJ2G4IwmM(8wBCC$GnQm+hT(b`iEP5K;WatQGTP&!bu?)6y1yX*!+OMZ zmBskDW6$gVE%0SY(@3kq@smbwP=NghpsN4D|6(;}+WHO~yl8$mwYSeDv@JBxSZ%Fa z`kP^c#7=m8cQFK9-Qvo#Xm<6fQq?qLPX1p=(pKiDP%u?ICsO+(j^EA@X~eC3_DafBKocUNkpccS0gUwi{aH6#SPr<3C-|k6 z=pPPo23^?ddZRAli1Q63U)hk$kNnd#6;%)cBw~*aW_c*7(VV;Sit zguU0`I^;GHBTEoClPd}Q^q>5hnA*lMGQrueGjd_(>%sNPr}yXan$hEB5hG-CqKgrc zlL6ooHWwsM+o(#%$?zVSj6?uE+pYyc(azKGn}at=N6Wee{2GKrx*EWd+|LvZ{YzR0 zm~&i)mnlUSEM-prQ&GB4nC^pPH%SpfWRf?f)aV9jfQ!@^M*^xE&WSGhqMun!%ba62 z!_o;>9zyplqbgc`3Mr6^_kjYy9+oi6(Xv%Is4KRtq8+)6&Vr6r!`_~>F5}(9RV%+S zWf{qCw$)IrNP`dZjHhZh#oj%fB{jhae4Heb*9UOqd7nlFNkPR1d~Om%I2M5GQ48!U z$q_a^qa<GZXTWmvRUR%z#iD*CKy&DafT!wyup!@otj9Jd8AhNT2$cGLy{^N|N3 zCG)o4DFRmLJu~Hy6F+Wil+Hj01}AkNrOE|8!z=(J-PIuqCHtg~#|2q5P*7`L4EE(UCH*VNXZ z4OeJTa#|iSkny=KHzTDX=!t05s*#GI4Ss)NWc;RNSd!34P80NTy`06IP!uxzxZH^5 z1@RS?o+qN1V9W~|v)lj*-|+3{Oc}4wjH|T>&`_PBCKCh;D(O33Fp`z{(#n_7Ant%Q zJiQB0x}6;?LaXC4nmodF76e znuvp-m%6$S_tW}?crnWMlNz38PkMF?lKJf43bcWYOOIqf6;d1cqI4dVrn;ssoIz)- zsKae}OX;xt!_Bc6%>!C?ogkU)$*7K1&5K$5T(n>yy)NGAs6{MT40n3K`Chor7Qp85 z7`Pn^sT8aNqfaJ676NL4cn0X!-mcmbej{GwFRSb9LukCTLj#ExZFPlGHn*r645>$; zDvAl2mCZS|L(2wIFHn|9d$jN5dH!J7NW;p5T(ONvp)Rjf^I&s9;YBS3J)PFwOBm^Xtu?{wQalVqC220mPJo zpZCq_U-9&pR|;5U&dAY{*(Psq4SJT1o+Vm)A1F2i+uvjEll}LM@NY8M!qjD^1H;}> za&?tgI@Lb?awNc#a*MzdQne!W>l5hx$Czl#lJ?BNlh&xR02C1ku(4u3>NMn7xM~FS zBw5o+Rp*GkJ(E9imFr!)1{2p?N>I$VB zCEyrM=D1E5FsmeWtNVL3l1;2pcS2ccn~IZrWma-O*KE>e;sj~m;e-EHHT=c2m;kh{ zIfSwBJn?ffV9_{DUmIK5$+yrWJo^_=qJ-Q;n3JhI&l6bogr3pVi#>9dn+6}5gY2O6 zLcJxVwH(TIMgo=;{`t090E@kdU?_Pvjw4W_!NiI(m$|)L4l!RmYz11fh?%djLg)Vv@a(h=7~ZijLAZz*b@pslzX*?OH1pd|h9%3t@~@;X1o!T3QMePhuF?C{Jm;M~^WkIBLLDYN1|E^i7)gOS*v+VO99F_eV zy%4+l7{`VE+Xa#KRX8--l6+1};_fr<{S76tLQD~2uw`0v6Doy2{N6(>aY6hI2>1CYO&7FZ-in0`FsEL)($YD$Hu>TOYZt8G=^`t zS~ig1lMgL7ftB`V-XZvWfu{r(CF;?undxxV{rJJZ#o`Ni1pN2w?|;lQg<2c5-+_UE zD8PV#NdHITP-4eB@jTP6JsM8NE-go4`BC?Z&9!Z)C)7P@66jOuhJL};*AD-$sArQi0$!gwkO=g@b@l=_Y^!RP)73RAGXYc-mO*{O_p;;)EvdpQ^N8}hE z%Cg#Tov%1EHk2NU!j7ZR!4T(w#4zxVtBLTQ7fpO2-qIbCzF84`V1rYi*!PpgC?s5g zy#zZYN%Kddu%_01`li>8t#CjG{AunwU6Q+k;YrMqlQ3nElR z`75xd$S5oF`y5C?79xq3R&DM3iY-fZ-eCAmQt5YJogE!HlIf#@x*6ri zT&aqK7<%I-5HohCqUDAv04j9S?uGNmk1$ir_FnWGrH#E0lRUQLG9E6xVC9`>f0HRag$pv$v zdRVdX5Vp5w*tbu*joEOmbabaWV^i_XPRUEPwT5Ec**m&~U)>w$0rGOUK`v3>r1?{3 z2Wl$oGA!|DUQ9gi4$f~grE`}@m*BXIbwYUlz?If*j$X^N5rOfFUc8;Zvw^ue^X!yXc>g;5y#tJ|%H@s}~Ux7_RsS7^D) zXovx2K<*MEg%j}{5Gl*N7=X6%P1K`t`5q$NoNNeu6s0A_0e%%rp|d73m?Q_d(}mRo5HF;^~r}sGpGyjl+!e*@xTaZ zh%}-qYtwro0G-YD@vM>N0F@VdbL*QD8B20I

  • i^C9+^m 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

    du+}7;ii@dt``mkDYD-<;L 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 i4L-%DW4x;b? diff --git a/youtube-dl.1 b/youtube-dl.1 index 7abbe59..f17addd 100644 --- a/youtube-dl.1 +++ b/youtube-dl.1 @@ -24,7 +24,7 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sure\ that\ you\ have\ sufficient\ permissions \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (run\ with\ sudo\ if\ needed) \-i,\ \-\-ignore\-errors\ \ \ \ \ \ \ \ \ \ \ \ \ \ continue\ on\ download\ errors,\ for\ example\ to -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ to\ skip\ unavailable\ videos\ in\ a\ playlist +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ skip\ unavailable\ videos\ in\ a\ playlist \-\-abort\-on\-error\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Abort\ downloading\ of\ further\ videos\ (in\ the \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ playlist\ or\ the\ command\ line)\ if\ an\ error \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ occurs @@ -32,6 +32,9 @@ redistribute it or use it however you like. \-\-user\-agent\ UA\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ specify\ a\ custom\ user\ agent \-\-referer\ REF\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ specify\ a\ custom\ referer,\ use\ if\ the\ video \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ access\ is\ restricted\ to\ one\ domain +\-\-add\-header\ FIELD:VALUE\ \ \ \ \ \ \ \ \ specify\ a\ custom\ HTTP\ header\ and\ its\ value, +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ separated\ by\ a\ colon\ \[aq]:\[aq].\ You\ can\ use\ this +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ option\ multiple\ times \-\-list\-extractors\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ List\ all\ supported\ extractors\ and\ the\ URLs \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ they\ would\ handle \-\-extractor\-descriptions\ \ \ \ \ \ \ \ \ Output\ descriptions\ of\ all\ supported @@ -40,6 +43,9 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ an\ empty\ string\ (\-\-proxy\ "")\ for\ direct \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ connection \-\-no\-check\-certificate\ \ \ \ \ \ \ \ \ \ \ Suppress\ HTTPS\ certificate\ validation. +\-\-prefer\-insecure\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Use\ an\ unencrypted\ connection\ to\ retrieve +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ information\ about\ the\ video.\ (Currently +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ supported\ only\ for\ YouTube) \-\-cache\-dir\ DIR\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Location\ in\ the\ filesystem\ where\ youtube\-dl \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ can\ store\ some\ downloaded\ information \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ permanently.\ By\ default\ $XDG_CACHE_HOME @@ -63,6 +69,7 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ configuration\ in\ ~/.config/youtube\-dl.conf \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (%APPDATA%/youtube\-dl/config.txt\ on \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Windows) +\-\-encoding\ ENCODING\ \ \ \ \ \ \ \ \ \ \ \ \ \ Force\ the\ specified\ encoding\ (experimental) \f[] .fi .SS Video Selection: @@ -140,8 +147,12 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ video\ id,\ %(playlist)s\ for\ the\ playlist\ the \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ video\ is\ in,\ %(playlist_index)s\ for\ the \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ position\ in\ the\ playlist\ and\ %%\ for\ a -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ literal\ percent.\ Use\ \-\ to\ output\ to\ stdout. -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Can\ also\ be\ used\ to\ download\ to\ a\ different +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ literal\ percent.\ %(height)s\ and\ %(width)s +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ for\ the\ width\ and\ height\ of\ the\ video +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ format.\ %(resolution)s\ for\ a\ textual +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ description\ of\ the\ resolution\ of\ the\ video +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ format.\ Use\ \-\ to\ output\ to\ stdout.\ Can\ also +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ be\ used\ to\ download\ to\ a\ different \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ directory,\ for\ example\ with\ \-o\ \[aq]/my/downloa \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ds/%(uploader)s/%(title)s\-%(id)s.%(ext)s\[aq]\ . \-\-autonumber\-size\ NUMBER\ \ \ \ \ \ \ \ \ Specifies\ the\ number\ of\ digits\ in @@ -179,6 +190,7 @@ redistribute it or use it however you like. .nf \f[C] \-q,\ \-\-quiet\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ activates\ quiet\ mode +\-\-no\-warnings\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Ignore\ warnings \-s,\ \-\-simulate\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ do\ not\ download\ the\ video\ and\ do\ not\ write \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ anything\ to\ disk \-\-skip\-download\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ do\ not\ download\ the\ video @@ -190,7 +202,9 @@ redistribute it or use it however you like. \-\-get\-duration\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ video\ length \-\-get\-filename\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ filename \-\-get\-format\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ format -\-j,\ \-\-dump\-json\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ JSON\ information +\-j,\ \-\-dump\-json\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ JSON\ information. +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ See\ \-\-output\ for\ a\ description\ of\ available +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ keys. \-\-newline\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ output\ progress\ bar\ as\ new\ lines \-\-no\-progress\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ do\ not\ print\ progress\ bar \-\-console\-title\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ display\ progress\ in\ console\ titlebar @@ -211,9 +225,9 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ preference\ using\ slashes:\ "\-f\ 22/17/18". \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "\-f\ mp4"\ and\ "\-f\ flv"\ are\ also\ supported. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ You\ can\ also\ use\ the\ special\ names\ "best", -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "bestaudio",\ "worst",\ and\ "worstaudio".\ By -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default,\ youtube\-dl\ will\ pick\ the\ best -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ quality. +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "bestvideo",\ "bestaudio",\ "worst", +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ "worstvideo"\ and\ "worstaudio".\ By\ default, +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ youtube\-dl\ will\ pick\ the\ best\ quality. \-\-all\-formats\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ download\ all\ available\ video\ formats \-\-prefer\-free\-formats\ \ \ \ \ \ \ \ \ \ \ \ prefer\ free\ video\ formats\ unless\ a\ specific \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ one\ is\ requested @@ -272,6 +286,7 @@ redistribute it or use it however you like. \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ default \-\-embed\-subs\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ embed\ subtitles\ in\ the\ video\ (only\ for\ mp4 \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ videos) +\-\-embed\-thumbnail\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ embed\ thumbnail\ in\ the\ audio\ as\ cover\ art \-\-add\-metadata\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ write\ metadata\ to\ the\ video\ file \-\-xattrs\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ write\ metadata\ to\ the\ video\ file\[aq]s\ xattrs \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (using\ dublin\ core\ and\ xdg\ standards) @@ -286,7 +301,7 @@ redistribute it or use it however you like. You can configure youtube\-dl by placing default arguments (such as \f[C]\-\-extract\-audio\ \-\-no\-mtime\f[] to always extract the audio and not copy the mtime) into \f[C]/etc/youtube\-dl.conf\f[] and/or -\f[C]~/.config/youtube\-dl.conf\f[]. +\f[C]~/.config/youtube\-dl/config\f[]. On Windows, the configuration file locations are \f[C]%APPDATA%\\youtube\-dl\\config.txt\f[] and \f[C]C:\\Users\\\\youtube\-dl.conf\f[]. @@ -359,12 +374,19 @@ Relative dates: Dates in the format \f[C](now|today)[+\-][0\-9](day|week|month|year)(s)?\f[] .PP Examples: -.PP -$ # Download only the videos uploaded in the last 6 months $ youtube\-dl -\-\-dateafter now\-6months $ # Download only the videos uploaded on -January 1, 1970 $ youtube\-dl \-\-date 19700101 $ # will only download -the videos uploaded in the 200x decade $ youtube\-dl \-\-dateafter -20000101 \-\-datebefore 20091231 +.IP +.nf +\f[C] +#\ Download\ only\ the\ videos\ uploaded\ in\ the\ last\ 6\ months +$\ youtube\-dl\ \-\-dateafter\ now\-6months + +#\ Download\ only\ the\ videos\ uploaded\ on\ January\ 1,\ 1970 +$\ youtube\-dl\ \-\-date\ 19700101 + +$\ #\ will\ only\ download\ the\ videos\ uploaded\ in\ the\ 200x\ decade +$\ youtube\-dl\ \-\-dateafter\ 20000101\ \-\-datebefore\ 20091231 +\f[] +.fi .SH FAQ .SS Can you please put the \-b option back? .PP @@ -473,19 +495,108 @@ zip nosetests .SS Adding support for a new site .PP -If you want to add support for a new site, copy \f[I]any\f[] recently -modified (https://github.com/rg3/youtube-dl/commits/master/youtube_dl/extractor) -file in \f[C]youtube_dl/extractor\f[], add an import in +If you want to add support for a new site, you can follow this quick +list (assuming your service is called \f[C]yourextractor\f[]): +.IP " 1." 4 +Fork this repository (https://github.com/rg3/youtube-dl/fork) +.IP " 2." 4 +Check out the source code with +\f[C]git\ clone\ git\@github.com:YOUR_GITHUB_USERNAME/youtube\-dl.git\f[] +.IP " 3." 4 +Start a new git branch with +\f[C]cd\ youtube\-dl;\ git\ checkout\ \-b\ yourextractor\f[] +.IP " 4." 4 +Start with this simple template and save it to +\f[C]youtube_dl/extractor/yourextractor.py\f[]: +.RS 4 +.IP +.nf +\f[C] +#\ coding:\ utf\-8 +from\ __future__\ import\ unicode_literals + +import\ re + +from\ .common\ import\ InfoExtractor + + +class\ YourExtractorIE(InfoExtractor): +\ \ \ \ _VALID_URL\ =\ r\[aq]https?://(?:www\\.)?yourextractor\\.com/watch/(?P[0\-9]+)\[aq] +\ \ \ \ _TEST\ =\ { +\ \ \ \ \ \ \ \ \[aq]url\[aq]:\ \[aq]http://yourextractor.com/watch/42\[aq], +\ \ \ \ \ \ \ \ \[aq]md5\[aq]:\ \[aq]TODO:\ md5\ sum\ of\ the\ first\ 10KiB\ of\ the\ video\ file\[aq], +\ \ \ \ \ \ \ \ \[aq]info_dict\[aq]:\ { +\ \ \ \ \ \ \ \ \ \ \ \ \[aq]id\[aq]:\ \[aq]42\[aq], +\ \ \ \ \ \ \ \ \ \ \ \ \[aq]ext\[aq]:\ \[aq]mp4\[aq], +\ \ \ \ \ \ \ \ \ \ \ \ \[aq]title\[aq]:\ \[aq]Video\ title\ goes\ here\[aq], +\ \ \ \ \ \ \ \ \ \ \ \ #\ TODO\ more\ properties,\ either\ as: +\ \ \ \ \ \ \ \ \ \ \ \ #\ *\ A\ value +\ \ \ \ \ \ \ \ \ \ \ \ #\ *\ MD5\ checksum;\ start\ the\ string\ with\ md5: +\ \ \ \ \ \ \ \ \ \ \ \ #\ *\ A\ regular\ expression;\ start\ the\ string\ with\ re: +\ \ \ \ \ \ \ \ \ \ \ \ #\ *\ Any\ Python\ type\ (for\ example\ int\ or\ float) +\ \ \ \ \ \ \ \ } +\ \ \ \ } + +\ \ \ \ def\ _real_extract(self,\ url): +\ \ \ \ \ \ \ \ mobj\ =\ re.match(self._VALID_URL,\ url) +\ \ \ \ \ \ \ \ video_id\ =\ mobj.group(\[aq]id\[aq]) + +\ \ \ \ \ \ \ \ #\ TODO\ more\ code\ goes\ here,\ for\ example\ ... +\ \ \ \ \ \ \ \ webpage\ =\ self._download_webpage(url,\ video_id) +\ \ \ \ \ \ \ \ title\ =\ self._html_search_regex(r\[aq]

    (.*?)

    \[aq],\ webpage,\ \[aq]title\[aq]) + +\ \ \ \ \ \ \ \ return\ { +\ \ \ \ \ \ \ \ \ \ \ \ \[aq]id\[aq]:\ video_id, +\ \ \ \ \ \ \ \ \ \ \ \ \[aq]title\[aq]:\ title, +\ \ \ \ \ \ \ \ \ \ \ \ #\ TODO\ more\ properties\ (see\ youtube_dl/extractor/common.py) +\ \ \ \ \ \ \ \ } +\f[] +.fi +.RE +.IP " 5." 4 +Add an import in \f[C]youtube_dl/extractor/__init__.py\f[] (https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/__init__.py). +.IP " 6." 4 +Run +\f[C]python\ test/test_download.py\ TestDownload.test_YourExtractor\f[]. +This \f[I]should fail\f[] at first, but you can continually re\-run it +until you\[aq]re done. +.IP " 7." 4 Have a look at \f[C]youtube_dl/common/extractor/common.py\f[] (https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/common.py) for possible helper methods and a detailed description of what your extractor should return (https://github.com/rg3/youtube-dl/blob/master/youtube_dl/extractor/common.py#L38). -Don\[aq]t forget to run the tests with -\f[C]python\ test/test_download.py\ Test_Download.test_YourExtractor\f[]! -For a detailed tutorial, refer to this blog -post (http://filippo.io/add-support-for-a-new-video-site-to-youtube-dl/). +Add tests and code for as many as you want. +.IP " 8." 4 +If you can, check the code with +pyflakes (https://pypi.python.org/pypi/pyflakes) (a good idea) and +pep8 (https://pypi.python.org/pypi/pep8) (optional, ignore E501). +.IP " 9." 4 +When the tests pass, +add (https://www.kernel.org/pub/software/scm/git/docs/git-add.html) the +new files and +commit (https://www.kernel.org/pub/software/scm/git/docs/git-commit.html) +them and +push (https://www.kernel.org/pub/software/scm/git/docs/git-push.html) +the result, like this: +.RS 4 +.IP +.nf +\f[C] +$\ git\ add\ youtube_dl/extractor/__init__.py +$\ git\ add\ youtube_dl/extractor/yourextractor.py +$\ git\ commit\ \-m\ \[aq][yourextractor]\ Add\ new\ extractor\[aq] +$\ git\ push\ origin\ yourextractor +\f[] +.fi +.RE +.IP "10." 4 +Finally, create a pull +request (https://help.github.com/articles/creating-a-pull-request). +We\[aq]ll then review and merge it. +.PP +In any case, thank you very much for your contributions! .SH BUGS .PP Bugs and suggestions should be reported at: @@ -537,7 +648,7 @@ For bug reports, this means that your report should contain the The error message you get for (most) bugs even says so, but you would not believe how many of our bug reports do not contain this information. .PP -Site support requests must contain an example URL. +Site support requests \f[B]must contain an example URL\f[]. An example URL is a URL you might want to download, like http://www.youtube.com/watch?v=BaW_jenozKc . There should be an obvious video present. diff --git a/youtube-dl.bash-completion b/youtube-dl.bash-completion index a5398bb..498e841 100644 --- a/youtube-dl.bash-completion +++ b/youtube-dl.bash-completion @@ -4,7 +4,7 @@ __youtube_dl() COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="--help --version --update --ignore-errors --abort-on-error --dump-user-agent --user-agent --referer --list-extractors --extractor-descriptions --proxy --no-check-certificate --cache-dir --no-cache-dir --socket-timeout --bidi-workaround --default-search --ignore-config --playlist-start --playlist-end --match-title --reject-title --max-downloads --min-filesize --max-filesize --date --datebefore --dateafter --min-views --max-views --no-playlist --age-limit --download-archive --include-ads --youtube-include-dash-manifest --rate-limit --retries --buffer-size --no-resize-buffer --test --title --id --literal --auto-number --output --autonumber-size --restrict-filenames --batch-file --load-info --no-overwrites --continue --no-continue --cookies --no-part --no-mtime --write-description --write-info-json --write-annotations --write-thumbnail --quiet --simulate --skip-download --get-url --get-title --get-id --get-thumbnail --get-description --get-duration --get-filename --get-format --dump-json --newline --no-progress --console-title --verbose --dump-intermediate-pages --write-pages --youtube-print-sig-code --print-traffic --format --all-formats --prefer-free-formats --max-quality --list-formats --write-sub --write-auto-sub --all-subs --list-subs --sub-format --sub-lang --username --password --netrc --video-password --extract-audio --audio-format --audio-quality --recode-video --keep-video --no-post-overwrites --embed-subs --add-metadata --xattrs --prefer-avconv --prefer-ffmpeg" + opts="--help --version --update --ignore-errors --abort-on-error --dump-user-agent --user-agent --referer --add-header --list-extractors --extractor-descriptions --proxy --no-check-certificate --prefer-insecure --cache-dir --no-cache-dir --socket-timeout --bidi-workaround --default-search --ignore-config --encoding --playlist-start --playlist-end --match-title --reject-title --max-downloads --min-filesize --max-filesize --date --datebefore --dateafter --min-views --max-views --no-playlist --age-limit --download-archive --include-ads --youtube-include-dash-manifest --rate-limit --retries --buffer-size --no-resize-buffer --test --title --id --literal --auto-number --output --autonumber-size --restrict-filenames --batch-file --load-info --no-overwrites --continue --no-continue --cookies --no-part --no-mtime --write-description --write-info-json --write-annotations --write-thumbnail --quiet --no-warnings --simulate --skip-download --get-url --get-title --get-id --get-thumbnail --get-description --get-duration --get-filename --get-format --dump-json --newline --no-progress --console-title --verbose --dump-intermediate-pages --write-pages --youtube-print-sig-code --print-traffic --format --all-formats --prefer-free-formats --max-quality --list-formats --write-sub --write-auto-sub --all-subs --list-subs --sub-format --sub-lang --username --password --netrc --video-password --extract-audio --audio-format --audio-quality --recode-video --keep-video --no-post-overwrites --embed-subs --embed-thumbnail --add-metadata --xattrs --prefer-avconv --prefer-ffmpeg" keywords=":ytfavorites :ytrecommended :ytsubscriptions :ytwatchlater :ythistory" fileopts="-a|--batch-file|--download-archive|--cookies|--load-info" diropts="--cache-dir" diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py deleted file mode 100755 index 672ef9e..0000000 --- a/youtube_dl/InfoExtractors.py +++ /dev/null @@ -1,4 +0,0 @@ -# Legacy file for backwards compatibility, use youtube_dl.extractor instead! - -from .extractor.common import InfoExtractor, SearchInfoExtractor -from .extractor import gen_extractors, get_info_extractor diff --git a/youtube_dl/YoutubeDL.py b/youtube_dl/YoutubeDL.py old mode 100644 new mode 100755 index 42cbcf6..dc0ba98 --- a/youtube_dl/YoutubeDL.py +++ b/youtube_dl/YoutubeDL.py @@ -4,9 +4,11 @@ from __future__ import absolute_import, unicode_literals import collections +import datetime import errno import io import json +import locale import os import platform import re @@ -29,6 +31,7 @@ from .utils import ( ContentTooShortError, date_from_str, DateRange, + DEFAULT_OUTTMPL, determine_ext, DownloadError, encodeFilename, @@ -93,6 +96,7 @@ class YoutubeDL(object): usenetrc: Use netrc for authentication instead. verbose: Print additional info to stdout. quiet: Do not print messages to stdout. + no_warnings: Do not print out anything for warnings. forceurl: Force printing final URL. forcetitle: Force printing title. forceid: Force printing ID. @@ -147,6 +151,8 @@ class YoutubeDL(object): again. cookiefile: File name where cookies should be read from and dumped to. nocheckcertificate:Do not verify SSL certificates + prefer_insecure: Use HTTP instead of HTTPS to retrieve information. + At the moment, this is only supported by YouTube. proxy: URL of the proxy server to use socket_timeout: Time to wait for unresponsive hosts, in seconds bidi_workaround: Work around buggy terminals without bidirectional text @@ -155,6 +161,7 @@ class YoutubeDL(object): include_ads: Download ads as well default_search: Prepend this string if an input url is not valid. 'auto' for elaborate guessing + encoding: Use this encoding instead of the system-specified. The following parameters are not used by YoutubeDL itself, they are used by the FileDownloader: @@ -280,6 +287,9 @@ class YoutubeDL(object): """Print message to stdout if not in quiet mode.""" return self.to_stdout(message, skip_eol, check_quiet=True) + def _write_string(self, s, out=None): + write_string(s, out=out, encoding=self.params.get('encoding')) + def to_stdout(self, message, skip_eol=False, check_quiet=False): """Print message to stdout if not in quiet mode.""" if self.params.get('logger'): @@ -289,7 +299,7 @@ class YoutubeDL(object): terminator = ['\n', ''][skip_eol] output = message + terminator - write_string(output, self._screen_file) + self._write_string(output, self._screen_file) def to_stderr(self, message): """Print message to stderr.""" @@ -299,7 +309,7 @@ class YoutubeDL(object): else: message = self._bidi_workaround(message) output = message + '\n' - write_string(output, self._err_file) + self._write_string(output, self._err_file) def to_console_title(self, message): if not self.params.get('consoletitle', False): @@ -309,21 +319,21 @@ class YoutubeDL(object): # already of type unicode() ctypes.windll.kernel32.SetConsoleTitleW(ctypes.c_wchar_p(message)) elif 'TERM' in os.environ: - write_string('\033]0;%s\007' % message, self._screen_file) + self._write_string('\033]0;%s\007' % message, self._screen_file) def save_console_title(self): if not self.params.get('consoletitle', False): return if 'TERM' in os.environ: # Save the title on stack - write_string('\033[22;0t', self._screen_file) + self._write_string('\033[22;0t', self._screen_file) def restore_console_title(self): if not self.params.get('consoletitle', False): return if 'TERM' in os.environ: # Restore the title from stack - write_string('\033[23;0t', self._screen_file) + self._write_string('\033[23;0t', self._screen_file) def __enter__(self): self.save_console_title() @@ -370,12 +380,17 @@ class YoutubeDL(object): Print the message to stderr, it will be prefixed with 'WARNING:' If stderr is a tty file the 'WARNING:' will be colored ''' - if self._err_file.isatty() and os.name != 'nt': - _msg_header = '\033[0;33mWARNING:\033[0m' + if self.params.get('logger') is not None: + self.params['logger'].warning(message) else: - _msg_header = 'WARNING:' - warning_message = '%s %s' % (_msg_header, message) - self.to_stderr(warning_message) + if self.params.get('no_warnings'): + return + if self._err_file.isatty() and os.name != 'nt': + _msg_header = '\033[0;33mWARNING:\033[0m' + else: + _msg_header = 'WARNING:' + warning_message = '%s %s' % (_msg_header, message) + self.to_stderr(warning_message) def report_error(self, message, tb=None): ''' @@ -409,6 +424,13 @@ class YoutubeDL(object): template_dict['autonumber'] = autonumber_templ % self._num_downloads if template_dict.get('playlist_index') is not None: template_dict['playlist_index'] = '%05d' % template_dict['playlist_index'] + if template_dict.get('resolution') is None: + if template_dict.get('width') and template_dict.get('height'): + template_dict['resolution'] = '%dx%d' % (template_dict['width'], template_dict['height']) + elif template_dict.get('height'): + template_dict['resolution'] = '%sp' % template_dict['height'] + elif template_dict.get('width'): + template_dict['resolution'] = '?x%d' % template_dict['width'] sanitize = lambda k, v: sanitize_filename( compat_str(v), @@ -419,7 +441,8 @@ class YoutubeDL(object): if v is not None) template_dict = collections.defaultdict(lambda: 'NA', template_dict) - tmpl = os.path.expanduser(self.params['outtmpl']) + outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL) + tmpl = os.path.expanduser(outtmpl) filename = tmpl % template_dict return filename except ValueError as err: @@ -499,13 +522,7 @@ class YoutubeDL(object): '_type': 'compat_list', 'entries': ie_result, } - self.add_extra_info(ie_result, - { - 'extractor': ie.IE_NAME, - 'webpage_url': url, - 'webpage_url_basename': url_basename(url), - 'extractor_key': ie.ie_key(), - }) + self.add_default_extra_info(ie_result, ie, url) if process: return self.process_ie_result(ie_result, download, extra_info) else: @@ -522,7 +539,15 @@ class YoutubeDL(object): else: raise else: - self.report_error('no suitable InfoExtractor: %s' % url) + self.report_error('no suitable InfoExtractor for URL %s' % url) + + def add_default_extra_info(self, ie_result, ie, url): + self.add_extra_info(ie_result, { + 'extractor': ie.IE_NAME, + 'webpage_url': url, + 'webpage_url_basename': url_basename(url), + 'extractor_key': ie.ie_key(), + }) def process_ie_result(self, ie_result, download=True, extra_info={}): """ @@ -656,6 +681,18 @@ class YoutubeDL(object): if f.get('vcodec') == 'none'] if audio_formats: return audio_formats[0] + elif format_spec == 'bestvideo': + video_formats = [ + f for f in available_formats + if f.get('acodec') == 'none'] + if video_formats: + return video_formats[-1] + elif format_spec == 'worstvideo': + video_formats = [ + f for f in available_formats + if f.get('acodec') == 'none'] + if video_formats: + return video_formats[0] else: extensions = ['mp4', 'flv', 'webm', '3gp'] if format_spec in extensions: @@ -670,11 +707,35 @@ class YoutubeDL(object): def process_video_result(self, info_dict, download=True): assert info_dict.get('_type', 'video') == 'video' + if 'id' not in info_dict: + raise ExtractorError('Missing "id" field in extractor result') + if 'title' not in info_dict: + raise ExtractorError('Missing "title" field in extractor result') + if 'playlist' not in info_dict: # It isn't part of a playlist info_dict['playlist'] = None info_dict['playlist_index'] = None + thumbnails = info_dict.get('thumbnails') + if thumbnails: + thumbnails.sort(key=lambda t: ( + t.get('width'), t.get('height'), t.get('url'))) + for t in thumbnails: + if 'width' in t and 'height' in t: + t['resolution'] = '%dx%d' % (t['width'], t['height']) + + if thumbnails and 'thumbnail' not in info_dict: + info_dict['thumbnail'] = thumbnails[-1]['url'] + + if 'display_id' not in info_dict and 'id' in info_dict: + info_dict['display_id'] = info_dict['id'] + + if info_dict.get('upload_date') is None and info_dict.get('timestamp') is not None: + upload_date = datetime.datetime.utcfromtimestamp( + info_dict['timestamp']) + info_dict['upload_date'] = upload_date.strftime('%Y%m%d') + # This extractors handle format selection themselves if info_dict['extractor'] in ['Youku']: if download: @@ -688,8 +749,14 @@ class YoutubeDL(object): else: formats = info_dict['formats'] + if not formats: + raise ExtractorError('No video formats found!') + # We check that all the formats have the format and format_id fields - for (i, format) in enumerate(formats): + for i, format in enumerate(formats): + if 'url' not in format: + raise ExtractorError('Missing "url" key in result (index %d)' % i) + if format.get('format_id') is None: format['format_id'] = compat_str(i) if format.get('format') is None: @@ -700,7 +767,7 @@ class YoutubeDL(object): ) # Automatically determine file extension if missing if 'ext' not in format: - format['ext'] = determine_ext(format['url']) + format['ext'] = determine_ext(format['url']).lower() format_limit = self.params.get('format_limit', None) if format_limit: @@ -825,7 +892,7 @@ class YoutubeDL(object): try: dn = os.path.dirname(encodeFilename(filename)) - if dn != '' and not os.path.exists(dn): + if dn and not os.path.exists(dn): os.makedirs(dn) except (OSError, IOError) as err: self.report_error('unable to create directory ' + compat_str(err)) @@ -882,7 +949,7 @@ class YoutubeDL(object): with io.open(encodeFilename(sub_filename), 'w', encoding='utf-8') as subfile: subfile.write(sub) except (OSError, IOError): - self.report_error('Cannot write subtitles file ' + descfn) + self.report_error('Cannot write subtitles file ' + sub_filename) return if self.params.get('writeinfojson', False): @@ -908,7 +975,7 @@ class YoutubeDL(object): self.to_screen('[%s] %s: Downloading thumbnail ...' % (info_dict['extractor'], info_dict['id'])) try: - uf = compat_urllib_request.urlopen(info_dict['thumbnail']) + uf = self.urlopen(info_dict['thumbnail']) with open(thumb_filename, 'wb') as thumbf: shutil.copyfileobj(uf, thumbf) self.to_screen('[%s] %s: Writing thumbnail to: %s' % @@ -971,10 +1038,11 @@ class YoutubeDL(object): def download(self, url_list): """Download a given list of URLs.""" + outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL) if (len(url_list) > 1 and - '%' not in self.params['outtmpl'] + '%' not in outtmpl and self.params.get('max_downloads') != 1): - raise SameFileError(self.params['outtmpl']) + raise SameFileError(outtmpl) for url in url_list: try: @@ -1085,57 +1153,57 @@ class YoutubeDL(object): res = default return res - def list_formats(self, info_dict): - def format_note(fdict): - res = '' - if fdict.get('ext') in ['f4f', 'f4m']: - res += '(unsupported) ' - if fdict.get('format_note') is not None: - res += fdict['format_note'] + ' ' - if fdict.get('tbr') is not None: - res += '%4dk ' % fdict['tbr'] - if fdict.get('container') is not None: - if res: - res += ', ' - res += '%s container' % fdict['container'] - if (fdict.get('vcodec') is not None and - fdict.get('vcodec') != 'none'): - if res: - res += ', ' - res += fdict['vcodec'] - if fdict.get('vbr') is not None: - res += '@' - elif fdict.get('vbr') is not None and fdict.get('abr') is not None: - res += 'video@' + def _format_note(self, fdict): + res = '' + if fdict.get('ext') in ['f4f', 'f4m']: + res += '(unsupported) ' + if fdict.get('format_note') is not None: + res += fdict['format_note'] + ' ' + if fdict.get('tbr') is not None: + res += '%4dk ' % fdict['tbr'] + if fdict.get('container') is not None: + if res: + res += ', ' + res += '%s container' % fdict['container'] + if (fdict.get('vcodec') is not None and + fdict.get('vcodec') != 'none'): + if res: + res += ', ' + res += fdict['vcodec'] if fdict.get('vbr') is not None: - res += '%4dk' % fdict['vbr'] - if fdict.get('acodec') is not None: - if res: - res += ', ' - if fdict['acodec'] == 'none': - res += 'video only' - else: - res += '%-5s' % fdict['acodec'] - elif fdict.get('abr') is not None: - if res: - res += ', ' - res += 'audio' - if fdict.get('abr') is not None: - res += '@%3dk' % fdict['abr'] - if fdict.get('asr') is not None: - res += ' (%5dHz)' % fdict['asr'] - if fdict.get('filesize') is not None: - if res: - res += ', ' - res += format_bytes(fdict['filesize']) - return res + res += '@' + elif fdict.get('vbr') is not None and fdict.get('abr') is not None: + res += 'video@' + if fdict.get('vbr') is not None: + res += '%4dk' % fdict['vbr'] + if fdict.get('acodec') is not None: + if res: + res += ', ' + if fdict['acodec'] == 'none': + res += 'video only' + else: + res += '%-5s' % fdict['acodec'] + elif fdict.get('abr') is not None: + if res: + res += ', ' + res += 'audio' + if fdict.get('abr') is not None: + res += '@%3dk' % fdict['abr'] + if fdict.get('asr') is not None: + res += ' (%5dHz)' % fdict['asr'] + if fdict.get('filesize') is not None: + if res: + res += ', ' + res += format_bytes(fdict['filesize']) + return res + def list_formats(self, info_dict): def line(format, idlen=20): return (('%-' + compat_str(idlen + 1) + 's%-10s%-12s%s') % ( format['format_id'], format['ext'], self.format_resolution(format), - format_note(format), + self._format_note(format), )) formats = info_dict.get('formats', [info_dict]) @@ -1143,8 +1211,8 @@ class YoutubeDL(object): max(len(f['format_id']) for f in formats)) formats_s = [line(f, idlen) for f in formats] if len(formats) > 1: - formats_s[0] += (' ' if format_note(formats[0]) else '') + '(worst)' - formats_s[-1] += (' ' if format_note(formats[-1]) else '') + '(best)' + formats_s[0] += (' ' if self._format_note(formats[0]) else '') + '(worst)' + formats_s[-1] += (' ' if self._format_note(formats[-1]) else '') + '(best)' header_line = line({ 'format_id': 'format code', 'ext': 'extension', @@ -1154,12 +1222,22 @@ class YoutubeDL(object): def urlopen(self, req): """ Start an HTTP download """ - return self._opener.open(req) + return self._opener.open(req, timeout=self._socket_timeout) def print_debug_header(self): if not self.params.get('verbose'): return - write_string('[debug] youtube-dl version ' + __version__ + '\n') + + write_string( + '[debug] Encodings: locale %s, fs %s, out %s, pref %s\n' % ( + locale.getpreferredencoding(), + sys.getfilesystemencoding(), + sys.stdout.encoding, + self.get_encoding()), + encoding=None + ) + + self._write_string('[debug] youtube-dl version ' + __version__ + '\n') try: sp = subprocess.Popen( ['git', 'rev-parse', '--short', 'HEAD'], @@ -1168,24 +1246,24 @@ class YoutubeDL(object): out, err = sp.communicate() out = out.decode().strip() if re.match('[0-9a-f]+', out): - write_string('[debug] Git HEAD: ' + out + '\n') + self._write_string('[debug] Git HEAD: ' + out + '\n') except: try: sys.exc_clear() except: pass - write_string('[debug] Python version %s - %s' % + self._write_string('[debug] Python version %s - %s' % (platform.python_version(), platform_name()) + '\n') proxy_map = {} for handler in self._opener.handlers: if hasattr(handler, 'proxies'): proxy_map.update(handler.proxies) - write_string('[debug] Proxy map: ' + compat_str(proxy_map) + '\n') + self._write_string('[debug] Proxy map: ' + compat_str(proxy_map) + '\n') def _setup_opener(self): timeout_val = self.params.get('socket_timeout') - timeout = 600 if timeout_val is None else float(timeout_val) + self._socket_timeout = 600 if timeout_val is None else float(timeout_val) opts_cookiefile = self.params.get('cookiefile') opts_proxy = self.params.get('proxy') @@ -1224,6 +1302,18 @@ class YoutubeDL(object): opener.addheaders = [] self._opener = opener - # TODO remove this global modification - compat_urllib_request.install_opener(opener) - socket.setdefaulttimeout(timeout) + def encode(self, s): + if isinstance(s, bytes): + return s # Already encoded + + try: + return s.encode(self.get_encoding()) + except UnicodeEncodeError as err: + err.reason = err.reason + '. Check your system encoding configuration or use the --encoding option.' + raise + + def get_encoding(self): + encoding = self.params.get('encoding') + if encoding is None: + encoding = preferredencoding() + return encoding diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index f843036..1e01432 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -46,12 +46,25 @@ __authors__ = ( 'Andreas Schmitz', 'Michael Kaiser', 'Niklas Laxström', + 'David Triendl', + 'Anthony Weems', + 'David Wagner', + 'Juan C. Olivares', + 'Mattias Harrysson', + 'phaer', + 'Sainyam Kapoor', + 'Nicolas Évrard', + 'Jason Normore', + 'Hoje Lee', + 'Adam Thalhammer', + 'Georg Jähnig', + 'Ralf Haring', ) __license__ = 'Public Domain' import codecs -import getpass +import io import locale import optparse import os @@ -62,14 +75,17 @@ import sys from .utils import ( + compat_getpass, compat_print, DateRange, + DEFAULT_OUTTMPL, decodeOption, get_term_width, DownloadError, get_cachedir, MaxDownloadsReached, preferredencoding, + read_batch_urls, SameFileError, setproctitle, std_headers, @@ -83,6 +99,8 @@ from .extractor import gen_extractors from .version import __version__ from .YoutubeDL import YoutubeDL from .postprocessor import ( + AtomicParsleyPP, + FFmpegAudioFixPP, FFmpegMetadataPP, FFmpegVideoConvertor, FFmpegExtractAudioPP, @@ -208,7 +226,7 @@ def parseOpts(overrideArguments=None): general.add_option('-U', '--update', action='store_true', dest='update_self', help='update this program to latest version. Make sure that you have sufficient permissions (run with sudo if needed)') general.add_option('-i', '--ignore-errors', - action='store_true', dest='ignoreerrors', help='continue on download errors, for example to to skip unavailable videos in a playlist', default=False) + action='store_true', dest='ignoreerrors', help='continue on download errors, for example to skip unavailable videos in a playlist', default=False) general.add_option('--abort-on-error', action='store_false', dest='ignoreerrors', help='Abort downloading of further videos (in the playlist or the command line) if an error occurs') @@ -220,6 +238,9 @@ def parseOpts(overrideArguments=None): general.add_option('--referer', dest='referer', help='specify a custom referer, use if the video access is restricted to one domain', metavar='REF', default=None) + general.add_option('--add-header', + dest='headers', help='specify a custom HTTP header and its value, separated by a colon \':\'. You can use this option multiple times', action="append", + metavar='FIELD:VALUE') general.add_option('--list-extractors', action='store_true', dest='list_extractors', help='List all supported extractors and the URLs they would handle', default=False) @@ -230,6 +251,9 @@ def parseOpts(overrideArguments=None): '--proxy', dest='proxy', default=None, metavar='URL', help='Use the specified HTTP/HTTPS proxy. Pass in an empty string (--proxy "") for direct connection') general.add_option('--no-check-certificate', action='store_true', dest='no_check_certificate', default=False, help='Suppress HTTPS certificate validation.') + general.add_option( + '--prefer-insecure', '--prefer-unsecure', action='store_true', dest='prefer_insecure', + help='Use an unencrypted connection to retrieve information about the video. (Currently supported only for YouTube)') general.add_option( '--cache-dir', dest='cachedir', default=get_cachedir(), metavar='DIR', help='Location in the filesystem where youtube-dl can store some downloaded information permanently. By default $XDG_CACHE_HOME/youtube-dl or ~/.cache/youtube-dl . At the moment, only YouTube player files (for videos with obfuscated signatures) are cached, but that may change.') @@ -242,14 +266,17 @@ def parseOpts(overrideArguments=None): general.add_option( '--bidi-workaround', dest='bidi_workaround', action='store_true', help=u'Work around terminals that lack bidirectional text support. Requires bidiv or fribidi executable in PATH') - general.add_option('--default-search', - dest='default_search', metavar='PREFIX', - help='Use this prefix for unqualified URLs. For example "gvsearch2:" downloads two videos from google videos for youtube-dl "large apple". By default (with value "auto") youtube-dl guesses.') + general.add_option( + '--default-search', + dest='default_search', metavar='PREFIX', + help='Use this prefix for unqualified URLs. For example "gvsearch2:" downloads two videos from google videos for youtube-dl "large apple". By default (with value "auto") youtube-dl guesses.') general.add_option( '--ignore-config', action='store_true', help='Do not read configuration files. When given in the global configuration file /etc/youtube-dl.conf: do not read the user configuration in ~/.config/youtube-dl.conf (%APPDATA%/youtube-dl/config.txt on Windows)') - + general.add_option( + '--encoding', dest='encoding', metavar='ENCODING', + help='Force the specified encoding (experimental)') selection.add_option( '--playlist-start', @@ -309,7 +336,7 @@ def parseOpts(overrideArguments=None): video_format.add_option('-f', '--format', action='store', dest='format', metavar='FORMAT', default=None, - help='video format code, specify the order of preference using slashes: "-f 22/17/18". "-f mp4" and "-f flv" are also supported. You can also use the special names "best", "bestaudio", "worst", and "worstaudio". By default, youtube-dl will pick the best quality.') + help='video format code, specify the order of preference using slashes: "-f 22/17/18". "-f mp4" and "-f flv" are also supported. You can also use the special names "best", "bestvideo", "bestaudio", "worst", "worstvideo" and "worstaudio". By default, youtube-dl will pick the best quality.') video_format.add_option('--all-formats', action='store_const', dest='format', help='download all available video formats', const='all') video_format.add_option('--prefer-free-formats', @@ -352,6 +379,10 @@ def parseOpts(overrideArguments=None): verbosity.add_option('-q', '--quiet', action='store_true', dest='quiet', help='activates quiet mode', default=False) + verbosity.add_option( + '--no-warnings', + dest='no_warnings', action='store_true', default=False, + help='Ignore warnings') verbosity.add_option('-s', '--simulate', action='store_true', dest='simulate', help='do not download the video and do not write anything to disk', default=False) verbosity.add_option('--skip-download', @@ -379,7 +410,7 @@ def parseOpts(overrideArguments=None): help='simulate, quiet but print output format', default=False) verbosity.add_option('-j', '--dump-json', action='store_true', dest='dumpjson', - help='simulate, quiet but print JSON information', default=False) + help='simulate, quiet but print JSON information. See --output for a description of available keys.', default=False) verbosity.add_option('--newline', action='store_true', dest='progress_with_newline', help='output progress bar as new lines', default=False) verbosity.add_option('--no-progress', @@ -424,6 +455,8 @@ def parseOpts(overrideArguments=None): '%(extractor)s for the provider (youtube, metacafe, etc), ' '%(id)s for the video id, %(playlist)s for the playlist the video is in, ' '%(playlist_index)s for the position in the playlist and %% for a literal percent. ' + '%(height)s and %(width)s for the width and height of the video format. ' + '%(resolution)s for a textual description of the resolution of the video format. ' 'Use - to output to stdout. Can also be used to download to a different directory, ' 'for example with -o \'/my/downloads/%(uploader)s/%(title)s-%(id)s.%(ext)s\' .')) filesystem.add_option('--autonumber-size', @@ -479,6 +512,8 @@ def parseOpts(overrideArguments=None): help='do not overwrite post-processed files; the post-processed files are overwritten by default') postproc.add_option('--embed-subs', action='store_true', dest='embedsubtitles', default=False, help='embed subtitles in the video (only for mp4 videos)') + postproc.add_option('--embed-thumbnail', action='store_true', dest='embedthumbnail', default=False, + help='embed thumbnail in the audio as cover art') postproc.add_option('--add-metadata', action='store_true', dest='addmetadata', default=False, help='write metadata to the video file') postproc.add_option('--xattrs', action='store_true', dest='xattrs', default=False, @@ -521,8 +556,6 @@ def parseOpts(overrideArguments=None): write_string(u'[debug] System config: ' + repr(_hide_login_info(systemConf)) + '\n') write_string(u'[debug] User config: ' + repr(_hide_login_info(userConf)) + '\n') write_string(u'[debug] Command-line args: ' + repr(_hide_login_info(commandLineConf)) + '\n') - write_string(u'[debug] Encodings: locale %r, fs %r, out %r, pref: %r\n' % - (locale.getpreferredencoding(), sys.getfilesystemencoding(), sys.stdout.encoding, preferredencoding())) return parser, opts, args @@ -545,27 +578,35 @@ def _real_main(argv=None): if opts.referer is not None: std_headers['Referer'] = opts.referer + # Custom HTTP headers + if opts.headers is not None: + for h in opts.headers: + if h.find(':', 1) < 0: + parser.error(u'wrong header formatting, it should be key:value, not "%s"'%h) + key, value = h.split(':', 2) + if opts.verbose: + write_string(u'[debug] Adding header from command line option %s:%s\n'%(key, value)) + std_headers[key] = value + # Dump user agent if opts.dump_user_agent: compat_print(std_headers['User-Agent']) sys.exit(0) # Batch file verification - batchurls = [] + batch_urls = [] if opts.batchfile is not None: try: if opts.batchfile == '-': batchfd = sys.stdin else: - batchfd = open(opts.batchfile, 'r') - batchurls = batchfd.readlines() - batchurls = [x.strip() for x in batchurls] - batchurls = [x for x in batchurls if len(x) > 0 and not re.search(r'^[#/;]', x)] + batchfd = io.open(opts.batchfile, 'r', encoding='utf-8', errors='ignore') + batch_urls = read_batch_urls(batchfd) if opts.verbose: - write_string(u'[debug] Batch file urls: ' + repr(batchurls) + u'\n') + write_string(u'[debug] Batch file urls: ' + repr(batch_urls) + u'\n') except IOError: sys.exit(u'ERROR: batch file could not be read') - all_urls = batchurls + args + all_urls = batch_urls + args all_urls = [url.strip() for url in all_urls] _enc = preferredencoding() all_urls = [url.decode(_enc, 'ignore') if isinstance(url, bytes) else url for url in all_urls] @@ -604,7 +645,7 @@ def _real_main(argv=None): if opts.usetitle and opts.useid: parser.error(u'using title conflicts with using video ID') if opts.username is not None and opts.password is None: - opts.password = getpass.getpass(u'Type account password and press return:') + opts.password = compat_getpass(u'Type account password and press [Return]: ') if opts.ratelimit is not None: numeric_limit = FileDownloader.parse_bytes(opts.ratelimit) if numeric_limit is None: @@ -642,13 +683,13 @@ def _real_main(argv=None): if not opts.audioquality.isdigit(): parser.error(u'invalid audio quality specified') if opts.recodevideo is not None: - if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg']: + if opts.recodevideo not in ['mp4', 'flv', 'webm', 'ogg', 'mkv']: parser.error(u'invalid video recode format specified') if opts.date is not None: date = DateRange.day(opts.date) else: date = DateRange(opts.dateafter, opts.datebefore) - if opts.default_search not in ('auto', None) and ':' not in opts.default_search: + if opts.default_search not in ('auto', 'auto_warning', None) and ':' not in opts.default_search: parser.error(u'--default-search invalid; did you forget a colon (:) at the end?') # Do not download videos when there are audio-only formats @@ -671,7 +712,7 @@ def _real_main(argv=None): or (opts.usetitle and u'%(title)s-%(id)s.%(ext)s') or (opts.useid and u'%(id)s.%(ext)s') or (opts.autonumber and u'%(autonumber)s-%(id)s.%(ext)s') - or u'%(title)s-%(id)s.%(ext)s') + or DEFAULT_OUTTMPL) if not os.path.splitext(outtmpl)[1] and opts.extractaudio: parser.error(u'Cannot download a video and extract audio into the same' u' file! Use "{0}.%(ext)s" instead of "{0}" as the output' @@ -686,6 +727,7 @@ def _real_main(argv=None): 'password': opts.password, 'videopassword': opts.videopassword, 'quiet': (opts.quiet or any_printing), + 'no_warnings': opts.no_warnings, 'forceurl': opts.geturl, 'forcetitle': opts.gettitle, 'forceid': opts.getid, @@ -749,6 +791,7 @@ def _real_main(argv=None): 'download_archive': download_archive_fn, 'cookiefile': opts.cookiefile, 'nocheckcertificate': opts.no_check_certificate, + 'prefer_insecure': opts.prefer_insecure, 'proxy': opts.proxy, 'socket_timeout': opts.socket_timeout, 'bidi_workaround': opts.bidi_workaround, @@ -757,6 +800,7 @@ def _real_main(argv=None): 'include_ads': opts.include_ads, 'default_search': opts.default_search, 'youtube_include_dash_manifest': opts.youtube_include_dash_manifest, + 'encoding': opts.encoding, } with YoutubeDL(ydl_opts) as ydl: @@ -775,6 +819,10 @@ def _real_main(argv=None): ydl.add_post_processor(FFmpegEmbedSubtitlePP(subtitlesformat=opts.subtitlesformat)) if opts.xattrs: ydl.add_post_processor(XAttrMetadataPP()) + if opts.embedthumbnail: + if not opts.addmetadata: + ydl.add_post_processor(FFmpegAudioFixPP()) + ydl.add_post_processor(AtomicParsleyPP()) # Update version if opts.update_self: diff --git a/youtube_dl/downloader/common.py b/youtube_dl/downloader/common.py index 5a068aa..917f345 100644 --- a/youtube_dl/downloader/common.py +++ b/youtube_dl/downloader/common.py @@ -4,9 +4,10 @@ import sys import time from ..utils import ( + compat_str, encodeFilename, - timeconvert, format_bytes, + timeconvert, ) @@ -173,7 +174,7 @@ class FileDownloader(object): return os.rename(encodeFilename(old_filename), encodeFilename(new_filename)) except (IOError, OSError) as err: - self.report_error(u'unable to rename file: %s' % str(err)) + self.report_error(u'unable to rename file: %s' % compat_str(err)) def try_utime(self, filename, last_modified_hdr): """Try to set the last-modified time of the given file.""" diff --git a/youtube_dl/downloader/f4m.py b/youtube_dl/downloader/f4m.py index 2a870a7..e6be6ae 100644 --- a/youtube_dl/downloader/f4m.py +++ b/youtube_dl/downloader/f4m.py @@ -12,7 +12,6 @@ from .http import HttpFD from ..utils import ( struct_pack, struct_unpack, - compat_urllib_request, compat_urlparse, format_bytes, encodeFilename, @@ -117,8 +116,8 @@ class FlvReader(io.BytesIO): self.read_unsigned_char() # flags self.read(3) - # BootstrapinfoVersion - bootstrap_info_version = self.read_unsigned_int() + + self.read_unsigned_int() # BootstrapinfoVersion # Profile,Live,Update,Reserved self.read(1) # time scale @@ -127,15 +126,15 @@ class FlvReader(io.BytesIO): self.read_unsigned_long_long() # SmpteTimeCodeOffset self.read_unsigned_long_long() - # MovieIdentifier - movie_identifier = self.read_string() + + self.read_string() # MovieIdentifier server_count = self.read_unsigned_char() # ServerEntryTable for i in range(server_count): self.read_string() quality_count = self.read_unsigned_char() # QualityEntryTable - for i in range(server_count): + for i in range(quality_count): self.read_string() # DrmData self.read_string() @@ -298,6 +297,7 @@ class F4mFD(FileDownloader): break frags_filenames.append(frag_filename) + dest_stream.close() self.report_finish(format_bytes(state['downloaded_bytes']), time.time() - start) self.try_rename(tmpfilename, filename) diff --git a/youtube_dl/downloader/hls.py b/youtube_dl/downloader/hls.py index fa98346..9d407fe 100644 --- a/youtube_dl/downloader/hls.py +++ b/youtube_dl/downloader/hls.py @@ -13,8 +13,10 @@ class HlsFD(FileDownloader): self.report_destination(filename) tmpfilename = self.temp_name(filename) - args = ['-y', '-i', url, '-f', 'mp4', '-c', 'copy', - '-bsf:a', 'aac_adtstoasc', tmpfilename] + args = [ + '-y', '-i', url, '-f', 'mp4', '-c', 'copy', + '-bsf:a', 'aac_adtstoasc', + encodeFilename(tmpfilename, for_subprocess=True)] for program in ['avconv', 'ffmpeg']: try: diff --git a/youtube_dl/downloader/http.py b/youtube_dl/downloader/http.py index 748f9f3..f79e6a9 100644 --- a/youtube_dl/downloader/http.py +++ b/youtube_dl/downloader/http.py @@ -14,6 +14,8 @@ from ..utils import ( class HttpFD(FileDownloader): + _TEST_FILE_SIZE = 10241 + def real_download(self, filename, info_dict): url = info_dict['url'] tmpfilename = self.temp_name(filename) @@ -23,11 +25,15 @@ class HttpFD(FileDownloader): headers = {'Youtubedl-no-compression': 'True'} if 'user_agent' in info_dict: headers['Youtubedl-user-agent'] = info_dict['user_agent'] + if 'http_referer' in info_dict: + headers['Referer'] = info_dict['http_referer'] basic_request = compat_urllib_request.Request(url, None, headers) request = compat_urllib_request.Request(url, None, headers) - if self.params.get('test', False): - request.add_header('Range', 'bytes=0-10240') + is_test = self.params.get('test', False) + + if is_test: + request.add_header('Range', 'bytes=0-%s' % str(self._TEST_FILE_SIZE - 1)) # Establish possible resume length if os.path.isfile(encodeFilename(tmpfilename)): @@ -49,7 +55,7 @@ class HttpFD(FileDownloader): while count <= retries: # Establish connection try: - data = compat_urllib_request.urlopen(request) + data = self.ydl.urlopen(request) break except (compat_urllib_error.HTTPError, ) as err: if (err.code < 500 or err.code >= 600) and err.code != 416: @@ -59,7 +65,7 @@ class HttpFD(FileDownloader): # Unable to resume (requested range not satisfiable) try: # Open the connection again without the range header - data = compat_urllib_request.urlopen(basic_request) + data = self.ydl.urlopen(basic_request) content_length = data.info()['Content-Length'] except (compat_urllib_error.HTTPError, ) as err: if err.code < 500 or err.code >= 600: @@ -85,6 +91,7 @@ class HttpFD(FileDownloader): else: # The length does not match, we start the download over self.report_unable_to_resume() + resume_len = 0 open_mode = 'wb' break # Retry @@ -97,6 +104,15 @@ class HttpFD(FileDownloader): return False data_len = data.info().get('Content-length', None) + + # Range HTTP header may be ignored/unsupported by a webserver + # (e.g. extractor/scivee.py, extractor/bambuser.py). + # However, for a test we still would like to download just a piece of a file. + # To achieve this we limit data_len to _TEST_FILE_SIZE and manually control + # block size when downloading a file. + if is_test and (data_len is None or int(data_len) > self._TEST_FILE_SIZE): + data_len = self._TEST_FILE_SIZE + if data_len is not None: data_len = int(data_len) + resume_len min_data_len = self.params.get("min_filesize", None) @@ -115,7 +131,7 @@ class HttpFD(FileDownloader): while True: # Download and write before = time.time() - data_block = data.read(block_size) + data_block = data.read(block_size if not is_test else min(block_size, data_len - byte_counter)) after = time.time() if len(data_block) == 0: break @@ -159,6 +175,9 @@ class HttpFD(FileDownloader): 'speed': speed, }) + if is_test and byte_counter == data_len: + break + # Apply rate limit self.slow_down(start, byte_counter - resume_len) diff --git a/youtube_dl/downloader/rtmp.py b/youtube_dl/downloader/rtmp.py index e93c28d..cc6a841 100644 --- a/youtube_dl/downloader/rtmp.py +++ b/youtube_dl/downloader/rtmp.py @@ -1,3 +1,5 @@ +from __future__ import unicode_literals + import os import re import subprocess @@ -8,6 +10,7 @@ from .common import FileDownloader from ..utils import ( encodeFilename, format_bytes, + compat_str, ) @@ -22,7 +25,7 @@ class RtmpFD(FileDownloader): proc_stderr_closed = False while not proc_stderr_closed: # read line from stderr - line = u'' + line = '' while True: char = proc.stderr.read(1) if not char: @@ -46,7 +49,7 @@ class RtmpFD(FileDownloader): data_len = None if percent > 0: data_len = int(downloaded_data_len * 100 / percent) - data_len_str = u'~' + format_bytes(data_len) + data_len_str = '~' + format_bytes(data_len) self.report_progress(percent, data_len_str, speed, eta) cursor_in_new_line = False self._hook_progress({ @@ -76,12 +79,12 @@ class RtmpFD(FileDownloader): }) elif self.params.get('verbose', False): if not cursor_in_new_line: - self.to_screen(u'') + self.to_screen('') cursor_in_new_line = True - self.to_screen(u'[rtmpdump] '+line) + self.to_screen('[rtmpdump] '+line) proc.wait() if not cursor_in_new_line: - self.to_screen(u'') + self.to_screen('') return proc.returncode url = info_dict['url'] @@ -93,6 +96,7 @@ class RtmpFD(FileDownloader): flash_version = info_dict.get('flash_version', None) live = info_dict.get('rtmp_live', False) conn = info_dict.get('rtmp_conn', None) + protocol = info_dict.get('rtmp_protocol', None) self.report_destination(filename) tmpfilename = self.temp_name(filename) @@ -102,7 +106,7 @@ class RtmpFD(FileDownloader): try: subprocess.call(['rtmpdump', '-h'], stdout=(open(os.path.devnull, 'w')), stderr=subprocess.STDOUT) except (OSError, IOError): - self.report_error(u'RTMP download detected but "rtmpdump" could not be run') + self.report_error('RTMP download detected but "rtmpdump" could not be run') return False # Download using rtmpdump. rtmpdump returns exit code 2 when @@ -125,9 +129,14 @@ class RtmpFD(FileDownloader): basic_args += ['--flashVer', flash_version] if live: basic_args += ['--live'] - if conn: + if isinstance(conn, list): + for entry in conn: + basic_args += ['--conn', entry] + elif isinstance(conn, compat_str): basic_args += ['--conn', conn] - args = basic_args + [[], ['--resume', '--skip', '1']][self.params.get('continuedl', False)] + if protocol is not None: + basic_args += ['--protocol', protocol] + args = basic_args + [[], ['--resume', '--skip', '1']][not live and self.params.get('continuedl', False)] if sys.platform == 'win32' and sys.version_info < (3, 0): # Windows subprocess module does not actually support Unicode @@ -150,26 +159,35 @@ class RtmpFD(FileDownloader): shell_quote = lambda args: ' '.join(map(pipes.quote, str_args)) except ImportError: shell_quote = repr - self.to_screen(u'[debug] rtmpdump command line: ' + shell_quote(str_args)) + self.to_screen('[debug] rtmpdump command line: ' + shell_quote(str_args)) + + RD_SUCCESS = 0 + RD_FAILED = 1 + RD_INCOMPLETE = 2 + RD_NO_CONNECT = 3 retval = run_rtmpdump(args) - while (retval == 2 or retval == 1) and not test: + if retval == RD_NO_CONNECT: + self.report_error('[rtmpdump] Could not connect to RTMP server.') + return False + + while (retval == RD_INCOMPLETE or retval == RD_FAILED) and not test and not live: prevsize = os.path.getsize(encodeFilename(tmpfilename)) - self.to_screen(u'[rtmpdump] %s bytes' % prevsize) + self.to_screen('[rtmpdump] %s bytes' % prevsize) time.sleep(5.0) # This seems to be needed - retval = run_rtmpdump(basic_args + ['-e'] + [[], ['-k', '1']][retval == 1]) + retval = run_rtmpdump(basic_args + ['-e'] + [[], ['-k', '1']][retval == RD_FAILED]) cursize = os.path.getsize(encodeFilename(tmpfilename)) - if prevsize == cursize and retval == 1: + if prevsize == cursize and retval == RD_FAILED: break # Some rtmp streams seem abort after ~ 99.8%. Don't complain for those - if prevsize == cursize and retval == 2 and cursize > 1024: - self.to_screen(u'[rtmpdump] Could not download the whole video. This can happen for some advertisements.') - retval = 0 + if prevsize == cursize and retval == RD_INCOMPLETE and cursize > 1024: + self.to_screen('[rtmpdump] Could not download the whole video. This can happen for some advertisements.') + retval = RD_SUCCESS break - if retval == 0 or (test and retval == 2): + if retval == RD_SUCCESS or (test and retval == RD_INCOMPLETE): fsize = os.path.getsize(encodeFilename(tmpfilename)) - self.to_screen(u'[rtmpdump] %s bytes' % fsize) + self.to_screen('[rtmpdump] %s bytes' % fsize) self.try_rename(tmpfilename, filename) self._hook_progress({ 'downloaded_bytes': fsize, @@ -179,6 +197,6 @@ class RtmpFD(FileDownloader): }) return True else: - self.to_stderr(u"\n") - self.report_error(u'rtmpdump exited with code %d' % retval) + self.to_stderr('\n') + self.report_error('rtmpdump exited with code %d' % retval) return False diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index 7253718..15a42ce 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -1,6 +1,8 @@ from .academicearth import AcademicEarthCourseIE from .addanime import AddAnimeIE +from .aftonbladet import AftonbladetIE from .anitube import AnitubeIE +from .aol import AolIE from .aparat import AparatIE from .appletrailers import AppleTrailersIE from .archiveorg import ArchiveOrgIE @@ -9,29 +11,39 @@ from .arte import ( ArteTvIE, ArteTVPlus7IE, ArteTVCreativeIE, + ArteTVConcertIE, ArteTVFutureIE, ArteTVDDCIE, + ArteTVEmbedIE, ) from .auengine import AUEngineIE from .bambuser import BambuserIE, BambuserChannelIE from .bandcamp import BandcampIE, BandcampAlbumIE from .bbccouk import BBCCoUkIE +from .bilibili import BiliBiliIE from .blinkx import BlinkxIE from .bliptv import BlipTVIE, BlipTVUserIE from .bloomberg import BloombergIE +from .br import BRIE from .breakcom import BreakIE from .brightcove import BrightcoveIE +from .byutv import BYUtvIE from .c56 import C56IE +from .canal13cl import Canal13clIE from .canalplus import CanalplusIE from .canalc2 import Canalc2IE from .cbs import CBSIE +from .cbsnews import CBSNewsIE +from .ceskatelevize import CeskaTelevizeIE from .channel9 import Channel9IE from .chilloutzone import ChilloutzoneIE from .cinemassacre import CinemassacreIE from .clipfish import ClipfishIE from .cliphunter import CliphunterIE from .clipsyndicate import ClipsyndicateIE +from .clubic import ClubicIE from .cmt import CMTIE +from .cnet import CNETIE from .cnn import ( CNNIE, CNNBlogsIE, @@ -49,31 +61,36 @@ from .dailymotion import ( DailymotionUserIE, ) from .daum import DaumIE -from .depositfiles import DepositFilesIE from .dotsub import DotsubIE from .dreisat import DreiSatIE from .defense import DefenseGouvFrIE from .discovery import DiscoveryIE +from .divxstage import DivxStageIE from .dropbox import DropboxIE from .ebaumsworld import EbaumsWorldIE from .ehow import EHowIE from .eighttracks import EightTracksIE from .eitb import EitbIE from .elpais import ElPaisIE +from .empflix import EmpflixIE +from .engadget import EngadgetIE from .escapist import EscapistIE from .everyonesmixtape import EveryonesMixtapeIE from .exfm import ExfmIE from .extremetube import ExtremeTubeIE from .facebook import FacebookIE from .faz import FazIE +from .fc2 import FC2IE from .firstpost import FirstpostIE from .firsttv import FirstTVIE +from .fivemin import FiveMinIE from .fktv import ( FKTVIE, FKTVPosteckeIE, ) from .flickr import FlickrIE from .fourtube import FourTubeIE +from .franceculture import FranceCultureIE from .franceinter import FranceInterIE from .francetv import ( PluzzIE, @@ -88,15 +105,18 @@ from .funnyordie import FunnyOrDieIE from .gamekings import GamekingsIE from .gamespot import GameSpotIE from .gametrailers import GametrailersIE +from .gdcvault import GDCVaultIE from .generic import GenericIE from .googleplus import GooglePlusIE from .googlesearch import GoogleSearchIE from .hark import HarkIE from .helsinki import HelsinkiIE +from .hentaistigma import HentaiStigmaIE from .hotnewhiphop import HotNewHipHopIE from .howcast import HowcastIE from .huffpost import HuffPostIE from .hypem import HypemIE +from .iconosquare import IconosquareIE from .ign import IGNIE, OneUPIE from .imdb import ( ImdbIE, @@ -104,7 +124,7 @@ from .imdb import ( ) from .ina import InaIE from .infoq import InfoQIE -from .instagram import InstagramIE +from .instagram import InstagramIE, InstagramUserIE from .internetvideoarchive import InternetVideoArchiveIE from .iprima import IPrimaIE from .ivi import ( @@ -122,6 +142,7 @@ from .khanacademy import KhanAcademyIE from .kickstarter import KickStarterIE from .keek import KeekIE from .kontrtube import KontrTubeIE +from .ku6 import Ku6IE from .la7 import LA7IE from .lifenews import LifeNewsIE from .liveleak import LiveLeakIE @@ -132,45 +153,67 @@ from .lynda import ( ) from .m6 import M6IE from .macgamestore import MacGameStoreIE +from .mailru import MailRuIE from .malemotion import MalemotionIE from .mdr import MDRIE from .metacafe import MetacafeIE from .metacritic import MetacriticIE -from .mit import TechTVMITIE, MITIE +from .mit import TechTVMITIE, MITIE, OCWMITIE from .mixcloud import MixcloudIE from .mpora import MporaIE from .mofosex import MofosexIE from .mooshare import MooshareIE +from .morningstar import MorningstarIE +from .motorsport import MotorsportIE +from .moviezine import MoviezineIE +from .movshare import MovShareIE from .mtv import ( MTVIE, MTVIggyIE, ) +from .musicplayon import MusicPlayOnIE from .muzu import MuzuTVIE from .myspace import MySpaceIE from .myspass import MySpassIE from .myvideo import MyVideoIE from .naver import NaverIE from .nba import NBAIE -from .nbc import NBCNewsIE +from .nbc import ( + NBCIE, + NBCNewsIE, +) from .ndr import NDRIE from .ndtv import NDTVIE from .newgrounds import NewgroundsIE +from .newstube import NewstubeIE from .nfb import NFBIE from .nhl import NHLIE, NHLVideocenterIE from .niconico import NiconicoIE from .ninegag import NineGagIE +from .noco import NocoIE from .normalboots import NormalbootsIE -from .novamov import NovamovIE +from .novamov import NovaMovIE from .nowness import NownessIE from .nowvideo import NowVideoIE +from .nrk import ( + NRKIE, + NRKTVIE, +) +from .ntv import NTVIE +from .nytimes import NYTimesIE +from .nuvid import NuvidIE +from .oe1 import OE1IE from .ooyala import OoyalaIE from .orf import ORFIE +from .parliamentliveuk import ParliamentLiveUKIE from .pbs import PBSIE from .photobucket import PhotobucketIE +from .playvid import PlayvidIE from .podomatic import PodomaticIE from .pornhd import PornHdIE from .pornhub import PornHubIE from .pornotube import PornotubeIE +from .prosiebensat1 import ProSiebenSat1IE from .pyvideo import PyvideoIE from .radiofrance import RadioFranceIE from .rbmaradio import RBMARadioIE @@ -179,17 +222,23 @@ from .ringtv import RingTVIE from .ro220 import Ro220IE from .rottentomatoes import RottenTomatoesIE from .roxwel import RoxwelIE +from .rtbf import RTBFIE from .rtlnow import RTLnowIE +from .rts import RTSIE +from .rtve import RTVEALaCartaIE from .rutube import ( RutubeIE, RutubeChannelIE, RutubeMovieIE, RutubePersonIE, ) +from .rutv import RUTVIE +from .savefrom import SaveFromIE +from .scivee import SciVeeIE from .servingsys import ServingSysIE from .sina import SinaIE -from .slashdot import SlashdotIE from .slideshare import SlideshareIE +from .slutload import SlutloadIE from .smotri import ( SmotriIE, SmotriCommunityIE, @@ -197,7 +246,12 @@ from .smotri import ( SmotriBroadcastIE, ) from .sohu import SohuIE -from .soundcloud import SoundcloudIE, SoundcloudSetIE, SoundcloudUserIE +from .soundcloud import ( + SoundcloudIE, + SoundcloudSetIE, + SoundcloudUserIE, + SoundcloudPlaylistIE +) from .southparkstudios import ( SouthParkStudiosIE, SouthparkDeIE, @@ -205,41 +259,62 @@ from .southparkstudios import ( from .space import SpaceIE from .spankwire import SpankwireIE from .spiegel import SpiegelIE +from .spiegeltv import SpiegeltvIE from .spike import SpikeIE from .stanfordoc import StanfordOpenClassroomIE -from .statigram import StatigramIE from .steam import SteamIE from .streamcloud import StreamcloudIE from .streamcz import StreamCZIE +from .swrmediathek import SWRMediathekIE from .syfy import SyfyIE from .sztvhu import SztvHuIE +from .tagesschau import TagesschauIE +from .teachertube import ( + TeacherTubeIE, + TeacherTubeClassroomIE, +) +from .teachingchannel import TeachingChannelIE from .teamcoco import TeamcocoIE from .techtalks import TechTalksIE from .ted import TEDIE +from .testurl import TestURLIE from .tf1 import TF1IE from .theplatform import ThePlatformIE from .thisav import ThisAVIE from .tinypic import TinyPicIE +from .tlc import TlcIE, TlcDeIE from .toutv import TouTvIE +from .toypics import ToypicsUserIE, ToypicsIE from .traileraddict import TrailerAddictIE from .trilulilu import TriluliluIE +from .trutube import TruTubeIE from .tube8 import Tube8IE from .tudou import TudouIE from .tumblr import TumblrIE from .tutv import TutvIE +from .tvigle import TvigleIE from .tvp import TvpIE +from .udemy import ( + UdemyIE, + UdemyCourseIE +) from .unistra import UnistraIE +from .urort import UrortIE from .ustream import UstreamIE, UstreamChannelIE from .vbox7 import Vbox7IE from .veehd import VeeHDIE from .veoh import VeohIE from .vesti import VestiIE from .vevo import VevoIE -from .vice import ViceIE +from .vh1 import VH1IE from .viddler import ViddlerIE +from .videobam import VideoBamIE from .videodetective import VideoDetectiveIE +from .videolecturesnet import VideoLecturesNetIE from .videofyme import VideofyMeIE from .videopremium import VideoPremiumIE +from .videott import VideoTtIE +from .videoweed import VideoWeedIE from .vimeo import ( VimeoIE, VimeoChannelIE, @@ -247,20 +322,32 @@ from .vimeo import ( VimeoAlbumIE, VimeoGroupsIE, VimeoReviewIE, + VimeoWatchLaterIE, +) +from .vine import ( + VineIE, + VineUserIE, ) -from .vine import VineIE from .viki import VikiIE from .vk import VKIE from .vube import VubeIE +from .vuclip import VuClipIE +from .washingtonpost import WashingtonPostIE from .wat import WatIE +from .wdr import ( + WDRIE, + WDRMobileIE, + WDRMausIE, +) from .weibo import WeiboIE from .wimp import WimpIE from .wistia import WistiaIE from .worldstarhiphop import WorldStarHipHopIE +from .xbef import XBefIE from .xhamster import XHamsterIE from .xnxx import XNXXIE from .xvideos import XVideosIE -from .xtube import XTubeIE +from .xtube import XTubeUserIE, XTubeIE from .yahoo import ( YahooIE, YahooNewsIE, @@ -271,19 +358,20 @@ from .youku import YoukuIE from .youporn import YouPornIE from .youtube import ( YoutubeIE, + YoutubeChannelIE, + YoutubeFavouritesIE, + YoutubeHistoryIE, YoutubePlaylistIE, - YoutubeSearchIE, + YoutubeRecommendedIE, YoutubeSearchDateIE, - YoutubeUserIE, - YoutubeChannelIE, + YoutubeSearchIE, + YoutubeSearchURLIE, YoutubeShowIE, YoutubeSubscriptionsIE, - YoutubeRecommendedIE, + YoutubeTopListIE, YoutubeTruncatedURLIE, + YoutubeUserIE, YoutubeWatchLaterIE, - YoutubeFavouritesIE, - YoutubeHistoryIE, - YoutubeTopListIE, ) from .zdf import ZDFIE diff --git a/youtube_dl/extractor/academicearth.py b/youtube_dl/extractor/academicearth.py index 72f81d0..59d3bbb 100644 --- a/youtube_dl/extractor/academicearth.py +++ b/youtube_dl/extractor/academicearth.py @@ -5,7 +5,7 @@ from .common import InfoExtractor class AcademicEarthCourseIE(InfoExtractor): - _VALID_URL = r'^https?://(?:www\.)?academicearth\.org/(?:courses|playlists)/(?P[^?#/]+)' + _VALID_URL = r'^https?://(?:www\.)?academicearth\.org/playlists/(?P[^?#/]+)' IE_NAME = 'AcademicEarth:Course' def _real_extract(self, url): @@ -14,12 +14,12 @@ class AcademicEarthCourseIE(InfoExtractor): webpage = self._download_webpage(url, playlist_id) title = self._html_search_regex( - r'

    (.*?)

    ', webpage, u'title') + r'

    ]*?>(.*?)

    ', webpage, u'title') description = self._html_search_regex( - r'

    (.*?)

    ', + r'

    ]*?>(.*?)

    ', webpage, u'description', fatal=False) urls = re.findall( - r'

    ', + r'
  • \s*?', webpage) entries = [self.url_result(u) for u in urls] diff --git a/youtube_dl/extractor/addanime.py b/youtube_dl/extractor/addanime.py index a3a1b99..fcf2960 100644 --- a/youtube_dl/extractor/addanime.py +++ b/youtube_dl/extractor/addanime.py @@ -1,3 +1,5 @@ +from __future__ import unicode_literals + import re from .common import InfoExtractor @@ -14,14 +16,14 @@ from ..utils import ( class AddAnimeIE(InfoExtractor): _VALID_URL = r'^http://(?:\w+\.)?add-anime\.net/watch_video\.php\?(?:.*?)v=(?P[\w_]+)(?:.*)' - IE_NAME = u'AddAnime' _TEST = { - u'url': u'http://www.add-anime.net/watch_video.php?v=24MR3YO5SAS9', - u'file': u'24MR3YO5SAS9.mp4', - u'md5': u'72954ea10bc979ab5e2eb288b21425a0', - u'info_dict': { - u"description": u"One Piece 606", - u"title": u"One Piece 606" + 'url': 'http://www.add-anime.net/watch_video.php?v=24MR3YO5SAS9', + 'md5': '72954ea10bc979ab5e2eb288b21425a0', + 'info_dict': { + 'id': '24MR3YO5SAS9', + 'ext': 'mp4', + 'description': 'One Piece 606', + 'title': 'One Piece 606', } } @@ -38,10 +40,10 @@ class AddAnimeIE(InfoExtractor): redir_webpage = ee.cause.read().decode('utf-8') action = self._search_regex( r'
    ', - redir_webpage, u'redirect vc value') + redir_webpage, 'redirect vc value') av = re.search( r'a\.value = ([0-9]+)[+]([0-9]+)[*]([0-9]+);', redir_webpage) @@ -52,19 +54,19 @@ class AddAnimeIE(InfoExtractor): parsed_url = compat_urllib_parse_urlparse(url) av_val = av_res + len(parsed_url.netloc) confirm_url = ( - parsed_url.scheme + u'://' + parsed_url.netloc + + parsed_url.scheme + '://' + parsed_url.netloc + action + '?' + compat_urllib_parse.urlencode({ 'jschl_vc': vc, 'jschl_answer': compat_str(av_val)})) self._download_webpage( confirm_url, video_id, - note=u'Confirming after redirect') + note='Confirming after redirect') webpage = self._download_webpage(url, video_id) formats = [] for format_id in ('normal', 'hq'): rex = r"var %s_video_file = '(.*?)';" % re.escape(format_id) - video_url = self._search_regex(rex, webpage, u'video file URLx', + video_url = self._search_regex(rex, webpage, 'video file URLx', fatal=False) if not video_url: continue @@ -72,14 +74,13 @@ class AddAnimeIE(InfoExtractor): 'format_id': format_id, 'url': video_url, }) - if not formats: - raise ExtractorError(u'Cannot find any video format!') + self._sort_formats(formats) video_title = self._og_search_title(webpage) video_description = self._og_search_description(webpage) return { '_type': 'video', - 'id': video_id, + 'id': video_id, 'formats': formats, 'title': video_title, 'description': video_description diff --git a/youtube_dl/extractor/aftonbladet.py b/youtube_dl/extractor/aftonbladet.py new file mode 100644 index 0000000..cfc7370 --- /dev/null +++ b/youtube_dl/extractor/aftonbladet.py @@ -0,0 +1,66 @@ +# encoding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor + + +class AftonbladetIE(InfoExtractor): + _VALID_URL = r'^http://tv\.aftonbladet\.se/webbtv.+?(?Particle[0-9]+)\.ab(?:$|[?#])' + _TEST = { + 'url': 'http://tv.aftonbladet.se/webbtv/nyheter/vetenskap/rymden/article36015.ab', + 'info_dict': { + 'id': 'article36015', + 'ext': 'mp4', + 'title': 'Vulkanutbrott i rymden - nu släpper NASA bilderna', + 'description': 'Jupiters måne mest aktiv av alla himlakroppar', + 'timestamp': 1394142732, + 'upload_date': '20140306', + }, + } + + def _real_extract(self, url): + mobj = re.search(self._VALID_URL, url) + + video_id = mobj.group('video_id') + webpage = self._download_webpage(url, video_id) + + # find internal video meta data + meta_url = 'http://aftonbladet-play.drlib.aptoma.no/video/%s.json' + internal_meta_id = self._html_search_regex( + r'data-aptomaId="([\w\d]+)"', webpage, 'internal_meta_id') + internal_meta_url = meta_url % internal_meta_id + internal_meta_json = self._download_json( + internal_meta_url, video_id, 'Downloading video meta data') + + # find internal video formats + format_url = 'http://aftonbladet-play.videodata.drvideo.aptoma.no/actions/video/?id=%s' + internal_video_id = internal_meta_json['videoId'] + internal_formats_url = format_url % internal_video_id + internal_formats_json = self._download_json( + internal_formats_url, video_id, 'Downloading video formats') + + formats = [] + for fmt in internal_formats_json['formats']['http']['pseudostreaming']['mp4']: + p = fmt['paths'][0] + formats.append({ + 'url': 'http://%s:%d/%s/%s' % (p['address'], p['port'], p['path'], p['filename']), + 'ext': 'mp4', + 'width': fmt['width'], + 'height': fmt['height'], + 'tbr': fmt['bitrate'], + 'protocol': 'http', + }) + self._sort_formats(formats) + + return { + 'id': video_id, + 'title': internal_meta_json['title'], + 'formats': formats, + 'thumbnail': internal_meta_json['imageUrl'], + 'description': internal_meta_json['shortPreamble'], + 'timestamp': internal_meta_json['timePublished'], + 'duration': internal_meta_json['duration'], + 'view_count': internal_meta_json['views'], + } diff --git a/youtube_dl/extractor/aol.py b/youtube_dl/extractor/aol.py new file mode 100644 index 0000000..a7bfe5a --- /dev/null +++ b/youtube_dl/extractor/aol.py @@ -0,0 +1,65 @@ +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from .fivemin import FiveMinIE + + +class AolIE(InfoExtractor): + IE_NAME = 'on.aol.com' + _VALID_URL = r'''(?x) + (?: + aol-video:| + http://on\.aol\.com/ + (?: + video/.*-| + playlist/(?P[^/?#]+?)-(?P[0-9]+)[?#].*_videoid= + ) + ) + (?P[0-9]+) + (?:$|\?) + ''' + + _TEST = { + 'url': 'http://on.aol.com/video/u-s--official-warns-of-largest-ever-irs-phone-scam-518167793?icid=OnHomepageC2Wide_MustSee_Img', + 'md5': '18ef68f48740e86ae94b98da815eec42', + 'info_dict': { + 'id': '518167793', + 'ext': 'mp4', + 'title': 'U.S. Official Warns Of \'Largest Ever\' IRS Phone Scam', + }, + 'add_ie': ['FiveMin'], + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + playlist_id = mobj.group('playlist_id') + if playlist_id and not self._downloader.params.get('noplaylist'): + self.to_screen('Downloading playlist %s - add --no-playlist to just download video %s' % (playlist_id, video_id)) + + webpage = self._download_webpage(url, playlist_id) + title = self._html_search_regex( + r'

    (.+?)

    ', webpage, 'title') + playlist_html = self._search_regex( + r"(?s)(.*?)", webpage, + 'playlist HTML') + entries = [{ + '_type': 'url', + 'url': 'aol-video:%s' % m.group('id'), + 'ie_key': 'Aol', + } for m in re.finditer( + r"[0-9]+)'\s+class='video-thumb'>", + playlist_html)] + + return { + '_type': 'playlist', + 'id': playlist_id, + 'display_id': mobj.group('playlist_display_id'), + 'title': title, + 'entries': entries, + } + + return FiveMinIE._build_result(video_id) diff --git a/youtube_dl/extractor/appletrailers.py b/youtube_dl/extractor/appletrailers.py index 922cede..dc8657b 100644 --- a/youtube_dl/extractor/appletrailers.py +++ b/youtube_dl/extractor/appletrailers.py @@ -6,7 +6,6 @@ import json from .common import InfoExtractor from ..utils import ( compat_urlparse, - determine_ext, ) @@ -16,9 +15,10 @@ class AppleTrailersIE(InfoExtractor): "url": "http://trailers.apple.com/trailers/wb/manofsteel/", "playlist": [ { - "file": "manofsteel-trailer4.mov", "md5": "d97a8e575432dbcb81b7c3acb741f8a8", "info_dict": { + "id": "manofsteel-trailer4", + "ext": "mov", "duration": 111, "title": "Trailer 4", "upload_date": "20130523", @@ -26,9 +26,10 @@ class AppleTrailersIE(InfoExtractor): }, }, { - "file": "manofsteel-trailer3.mov", "md5": "b8017b7131b721fb4e8d6f49e1df908c", "info_dict": { + "id": "manofsteel-trailer3", + "ext": "mov", "duration": 182, "title": "Trailer 3", "upload_date": "20130417", @@ -36,9 +37,10 @@ class AppleTrailersIE(InfoExtractor): }, }, { - "file": "manofsteel-trailer.mov", "md5": "d0f1e1150989b9924679b441f3404d48", "info_dict": { + "id": "manofsteel-trailer", + "ext": "mov", "duration": 148, "title": "Trailer", "upload_date": "20121212", @@ -46,15 +48,16 @@ class AppleTrailersIE(InfoExtractor): }, }, { - "file": "manofsteel-teaser.mov", "md5": "5fe08795b943eb2e757fa95cb6def1cb", "info_dict": { + "id": "manofsteel-teaser", + "ext": "mov", "duration": 93, "title": "Teaser", "upload_date": "20120721", "uploader_id": "wb", }, - } + }, ] } @@ -65,16 +68,16 @@ class AppleTrailersIE(InfoExtractor): movie = mobj.group('movie') uploader_id = mobj.group('company') - playlist_url = compat_urlparse.urljoin(url, u'includes/playlists/itunes.inc') + playlist_url = compat_urlparse.urljoin(url, 'includes/playlists/itunes.inc') def fix_html(s): - s = re.sub(r'(?s).*?', u'', s) + s = re.sub(r'(?s).*?', '', s) s = re.sub(r'', r'', s) # The ' in the onClick attributes are not escaped, it couldn't be parsed # like: http://trailers.apple.com/trailers/wb/gravity/ def _clean_json(m): - return u'iTunes.playURL(%s);' % m.group(1).replace('\'', ''') + return 'iTunes.playURL(%s);' % m.group(1).replace('\'', ''') s = re.sub(self._JSON_RE, _clean_json, s) - s = u'' + s + u'' + s = '' + s + u'' return s doc = self._download_xml(playlist_url, movie, transform_source=fix_html) @@ -82,7 +85,7 @@ class AppleTrailersIE(InfoExtractor): for li in doc.findall('./div/ul/li'): on_click = li.find('.//a').attrib['onClick'] trailer_info_json = self._search_regex(self._JSON_RE, - on_click, u'trailer info') + on_click, 'trailer info') trailer_info = json.loads(trailer_info_json) title = trailer_info['title'] video_id = movie + '-' + re.sub(r'[^a-zA-Z0-9]', '', title).lower() @@ -98,8 +101,7 @@ class AppleTrailersIE(InfoExtractor): first_url = trailer_info['url'] trailer_id = first_url.split('/')[-1].rpartition('_')[0].lower() settings_json_url = compat_urlparse.urljoin(url, 'includes/settings/%s.json' % trailer_id) - settings_json = self._download_webpage(settings_json_url, trailer_id, u'Downloading settings json') - settings = json.loads(settings_json) + settings = self._download_json(settings_json_url, trailer_id, 'Downloading settings json') formats = [] for format in settings['metadata']['sizes']: @@ -107,7 +109,6 @@ class AppleTrailersIE(InfoExtractor): format_url = re.sub(r'_(\d*p.mov)', r'_h\1', format['src']) formats.append({ 'url': format_url, - 'ext': determine_ext(format_url), 'format': format['type'], 'width': format['width'], 'height': int(format['height']), diff --git a/youtube_dl/extractor/ard.py b/youtube_dl/extractor/ard.py index b88f71b..c6d22c0 100644 --- a/youtube_dl/extractor/ard.py +++ b/youtube_dl/extractor/ard.py @@ -38,15 +38,19 @@ class ARDIE(InfoExtractor): webpage = self._download_webpage(url, video_id) title = self._html_search_regex( - r'(.*?)
  • ', webpage, 'title') + [r'(.*?)', + r'', + r'

    (.*?)

    '], + webpage, 'title') description = self._html_search_meta( 'dcterms.abstract', webpage, 'description') thumbnail = self._og_search_thumbnail(webpage) - streams = [ - mo.groupdict() - for mo in re.finditer( - r'mediaCollection\.addMediaStream\((?P\d+), (?P\d+), "(?P[^"]*)", "(?P[^"]*)", "[^"]*"\)', webpage)] + + media_info = self._download_json( + 'http://www.ardmediathek.de/play/media/%s' % video_id, video_id) + # The second element of the _mediaArray contains the standard http urls + streams = media_info['_mediaArray'][1]['_mediaStreamArray'] if not streams: if '"fsk"' in webpage: raise ExtractorError('This video is only available after 20:00') @@ -54,21 +58,12 @@ class ARDIE(InfoExtractor): formats = [] for s in streams: format = { - 'quality': int(s['quality']), + 'quality': s['_quality'], + 'url': s['_stream'], } - if s.get('rtmp_url'): - format['protocol'] = 'rtmp' - format['url'] = s['rtmp_url'] - format['playpath'] = s['video_url'] - else: - format['url'] = s['video_url'] - - quality_name = self._search_regex( - r'[,.]([a-zA-Z0-9_-]+),?\.mp4', format['url'], - 'quality name', default='NA') - format['format_id'] = '%s-%s-%s-%s' % ( - determine_ext(format['url']), quality_name, s['media_type'], - s['quality']) + + format['format_id'] = '%s-%s' % ( + determine_ext(format['url']), format['quality']) formats.append(format) diff --git a/youtube_dl/extractor/arte.py b/youtube_dl/extractor/arte.py index 7cf3785..b528a9e 100644 --- a/youtube_dl/extractor/arte.py +++ b/youtube_dl/extractor/arte.py @@ -2,7 +2,6 @@ from __future__ import unicode_literals import re -import json from .common import InfoExtractor from ..utils import ( @@ -19,115 +18,46 @@ from ..utils import ( # is different for each one. The videos usually expire in 7 days, so we can't # add tests. -class ArteTvIE(InfoExtractor): - _VIDEOS_URL = r'(?:http://)?videos\.arte\.tv/(?Pfr|de)/.*-(?P.*?)\.html' - _LIVEWEB_URL = r'(?:http://)?liveweb\.arte\.tv/(?Pfr|de)/(?P.+?)/(?P.+)' - _LIVE_URL = r'index-[0-9]+\.html$' +class ArteTvIE(InfoExtractor): + _VALID_URL = r'http://videos\.arte\.tv/(?Pfr|de)/.*-(?P.*?)\.html' IE_NAME = 'arte.tv' - @classmethod - def suitable(cls, url): - return any(re.match(regex, url) for regex in (cls._VIDEOS_URL, cls._LIVEWEB_URL)) - - # TODO implement Live Stream - # from ..utils import compat_urllib_parse - # def extractLiveStream(self, url): - # video_lang = url.split('/')[-4] - # info = self.grep_webpage( - # url, - # r'src="(.*?/videothek_js.*?\.js)', - # 0, - # [ - # (1, 'url', 'Invalid URL: %s' % url) - # ] - # ) - # http_host = url.split('/')[2] - # next_url = 'http://%s%s' % (http_host, compat_urllib_parse.unquote(info.get('url'))) - # info = self.grep_webpage( - # next_url, - # r'(s_artestras_scst_geoFRDE_' + video_lang + '.*?)\'.*?' + - # '(http://.*?\.swf).*?' + - # '(rtmp://.*?)\'', - # re.DOTALL, - # [ - # (1, 'path', 'could not extract video path: %s' % url), - # (2, 'player', 'could not extract video player: %s' % url), - # (3, 'url', 'could not extract video url: %s' % url) - # ] - # ) - # video_url = '%s/%s' % (info.get('url'), info.get('path')) - def _real_extract(self, url): - mobj = re.match(self._VIDEOS_URL, url) - if mobj is not None: - id = mobj.group('id') - lang = mobj.group('lang') - return self._extract_video(url, id, lang) - - mobj = re.match(self._LIVEWEB_URL, url) - if mobj is not None: - name = mobj.group('name') - lang = mobj.group('lang') - return self._extract_liveweb(url, name, lang) - - if re.search(self._LIVE_URL, url) is not None: - raise ExtractorError(u'Arte live streams are not yet supported, sorry') - # self.extractLiveStream(url) - # return - - def _extract_video(self, url, video_id, lang): - """Extract from videos.arte.tv""" + mobj = re.match(self._VALID_URL, url) + lang = mobj.group('lang') + video_id = mobj.group('id') + ref_xml_url = url.replace('/videos/', '/do_delegate/videos/') ref_xml_url = ref_xml_url.replace('.html', ',view,asPlayerXml.xml') - ref_xml_doc = self._download_xml(ref_xml_url, video_id, note=u'Downloading metadata') + ref_xml_doc = self._download_xml( + ref_xml_url, video_id, note='Downloading metadata') config_node = find_xpath_attr(ref_xml_doc, './/video', 'lang', lang) config_xml_url = config_node.attrib['ref'] - config_xml = self._download_webpage(config_xml_url, video_id, note=u'Downloading configuration') - - video_urls = list(re.finditer(r'(?P.*?)', config_xml)) - def _key(m): - quality = m.group('quality') - if quality == 'hd': - return 2 - else: - return 1 - # We pick the best quality - video_urls = sorted(video_urls, key=_key) - video_url = list(video_urls)[-1].group('url') - - title = self._html_search_regex(r'(.*?)', config_xml, 'title') - thumbnail = self._html_search_regex(r'(.*?)', - config_xml, 'thumbnail') - return {'id': video_id, - 'title': title, - 'thumbnail': thumbnail, - 'url': video_url, - 'ext': 'flv', - } - - def _extract_liveweb(self, url, name, lang): - """Extract form http://liveweb.arte.tv/""" - webpage = self._download_webpage(url, name) - video_id = self._search_regex(r'eventId=(\d+?)("|&)', webpage, 'event id') - config_doc = self._download_xml('http://download.liveweb.arte.tv/o21/liveweb/events/event-%s.xml' % video_id, - video_id, 'Downloading information') - event_doc = config_doc.find('event') - url_node = event_doc.find('video').find('urlHd') - if url_node is None: - url_node = event_doc.find('urlSd') - - return {'id': video_id, - 'title': event_doc.find('name%s' % lang.capitalize()).text, - 'url': url_node.text.replace('MP4', 'mp4'), - 'ext': 'flv', - 'thumbnail': self._og_search_thumbnail(webpage), - } + config = self._download_xml( + config_xml_url, video_id, note='Downloading configuration') + + formats = [{ + 'forma_id': q.attrib['quality'], + 'url': q.text, + 'ext': 'flv', + 'quality': 2 if q.attrib['quality'] == 'hd' else 1, + } for q in config.findall('./urls/url')] + self._sort_formats(formats) + + title = config.find('.//name').text + thumbnail = config.find('.//firstThumbnailUrl').text + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'formats': formats, + } class ArteTVPlus7IE(InfoExtractor): IE_NAME = 'arte.tv:+7' - _VALID_URL = r'https?://www\.arte.tv/guide/(?Pfr|de)/(?:(?:sendungen|emissions)/)?(?P.*?)/(?P.*?)(\?.*)?' + _VALID_URL = r'https?://(?:www\.)?arte\.tv/guide/(?Pfr|de)/(?:(?:sendungen|emissions)/)?(?P.*?)/(?P.*?)(\?.*)?' @classmethod def _extract_url_info(cls, url): @@ -144,13 +74,12 @@ class ArteTVPlus7IE(InfoExtractor): return self._extract_from_webpage(webpage, video_id, lang) def _extract_from_webpage(self, webpage, video_id, lang): - json_url = self._html_search_regex(r'arte_vp_url="(.*?)"', webpage, 'json url') + json_url = self._html_search_regex( + r'arte_vp_url="(.*?)"', webpage, 'json vp url') return self._extract_from_json_url(json_url, video_id, lang) def _extract_from_json_url(self, json_url, video_id, lang): - json_info = self._download_webpage(json_url, video_id, 'Downloading info json') - self.report_extraction(video_id) - info = json.loads(json_info) + info = self._download_json(json_url, video_id) player_info = info['videoJsonPlayer'] info_dict = { @@ -172,6 +101,8 @@ class ArteTVPlus7IE(InfoExtractor): l = 'F' elif lang == 'de': l = 'A' + else: + l = lang regexes = [r'VO?%s' % l, r'VO?.-ST%s' % l] return any(re.match(r, f['versionCode']) for r in regexes) # Some formats may not be in the same language as the url @@ -190,14 +121,19 @@ class ArteTVPlus7IE(InfoExtractor): return ['HQ', 'MQ', 'EQ', 'SQ'].index(f['quality']) else: def sort_key(f): + versionCode = f.get('versionCode') + if versionCode is None: + versionCode = '' return ( # Sort first by quality - int(f.get('height',-1)), - int(f.get('bitrate',-1)), + int(f.get('height', -1)), + int(f.get('bitrate', -1)), # The original version with subtitles has lower relevance - re.match(r'VO-ST(F|A)', f.get('versionCode', '')) is None, + re.match(r'VO-ST(F|A)', versionCode) is None, # The version with sourds/mal subtitles has also lower relevance - re.match(r'VO?(F|A)-STM\1', f.get('versionCode', '')) is None, + re.match(r'VO?(F|A)-STM\1', versionCode) is None, + # Prefer http downloads over m3u8 + 0 if f['url'].endswith('m3u8') else 1, ) formats = sorted(formats, key=sort_key) def _format(format_info): @@ -238,8 +174,9 @@ class ArteTVCreativeIE(ArteTVPlus7IE): _TEST = { 'url': 'http://creative.arte.tv/de/magazin/agentur-amateur-corporate-design', - 'file': '050489-002.mp4', 'info_dict': { + 'id': '050489-002', + 'ext': 'mp4', 'title': 'Agentur Amateur / Agence Amateur #2 : Corporate Design', }, } @@ -251,8 +188,9 @@ class ArteTVFutureIE(ArteTVPlus7IE): _TEST = { 'url': 'http://future.arte.tv/fr/sujet/info-sciences#article-anchor-7081', - 'file': '050940-003.mp4', 'info_dict': { + 'id': '050940-003', + 'ext': 'mp4', 'title': 'Les champignons au secours de la planète', }, } @@ -266,7 +204,7 @@ class ArteTVFutureIE(ArteTVPlus7IE): class ArteTVDDCIE(ArteTVPlus7IE): IE_NAME = 'arte.tv:ddc' - _VALID_URL = r'http?://ddc\.arte\.tv/(?Pemission|folge)/(?P.+)' + _VALID_URL = r'https?://ddc\.arte\.tv/(?Pemission|folge)/(?P.+)' def _real_extract(self, url): video_id, lang = self._extract_url_info(url) @@ -280,3 +218,39 @@ class ArteTVDDCIE(ArteTVPlus7IE): javascriptPlayerGenerator = self._download_webpage(script_url, video_id, 'Download javascript player generator') json_url = self._search_regex(r"json_url=(.*)&rendering_place.*", javascriptPlayerGenerator, 'json url') return self._extract_from_json_url(json_url, video_id, lang) + + +class ArteTVConcertIE(ArteTVPlus7IE): + IE_NAME = 'arte.tv:concert' + _VALID_URL = r'https?://concert\.arte\.tv/(?Pde|fr)/(?P.+)' + + _TEST = { + 'url': 'http://concert.arte.tv/de/notwist-im-pariser-konzertclub-divan-du-monde', + 'md5': '9ea035b7bd69696b67aa2ccaaa218161', + 'info_dict': { + 'id': '186', + 'ext': 'mp4', + 'title': 'The Notwist im Pariser Konzertclub "Divan du Monde"', + 'upload_date': '20140128', + 'description': 'md5:486eb08f991552ade77439fe6d82c305', + }, + } + + +class ArteTVEmbedIE(ArteTVPlus7IE): + IE_NAME = 'arte.tv:embed' + _VALID_URL = r'''(?x) + http://www\.arte\.tv + /playerv2/embed\.php\?json_url= + (?P + http://arte\.tv/papi/tvguide/videos/stream/player/ + (?P[^/]+)/(?P[^/]+)[^&]* + ) + ''' + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + lang = mobj.group('lang') + json_url = mobj.group('json_url') + return self._extract_from_json_url(json_url, video_id, lang) diff --git a/youtube_dl/extractor/auengine.py b/youtube_dl/extractor/auengine.py index c6f30e6..20bf125 100644 --- a/youtube_dl/extractor/auengine.py +++ b/youtube_dl/extractor/auengine.py @@ -11,22 +11,24 @@ from ..utils import ( class AUEngineIE(InfoExtractor): + _VALID_URL = r'http://(?:www\.)?auengine\.com/embed\.php\?.*?file=(?P[^&]+).*?' + _TEST = { 'url': 'http://auengine.com/embed.php?file=lfvlytY6&w=650&h=370', - 'file': 'lfvlytY6.mp4', 'md5': '48972bdbcf1a3a2f5533e62425b41d4f', 'info_dict': { + 'id': 'lfvlytY6', + 'ext': 'mp4', 'title': '[Commie]The Legend of the Legendary Heroes - 03 - Replication Eye (Alpha Stigma)[F9410F5A]' } } - _VALID_URL = r'(?:http://)?(?:www\.)?auengine\.com/embed\.php\?.*?file=([^&]+).*?' def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - video_id = mobj.group(1) + video_id = mobj.group('id') + webpage = self._download_webpage(url, video_id) - title = self._html_search_regex(r'(?P<title>.+?)', - webpage, 'title') + title = self._html_search_regex(r'(?P<title>.+?)', webpage, 'title') title = title.strip() links = re.findall(r'\s(?:file|url):\s*["\']([^\'"]+)["\']', webpage) links = map(compat_urllib_parse.unquote, links) @@ -39,14 +41,15 @@ class AUEngineIE(InfoExtractor): elif '/videos/' in link: video_url = link if not video_url: - raise ExtractorError(u'Could not find video URL') + raise ExtractorError('Could not find video URL') ext = '.' + determine_ext(video_url) if ext == title[-len(ext):]: title = title[:-len(ext)] return { - 'id': video_id, - 'url': video_url, - 'title': title, + 'id': video_id, + 'url': video_url, + 'title': title, 'thumbnail': thumbnail, + 'http_referer': 'http://www.auengine.com/flowplayer/flowplayer.commercial-3.2.14.swf', } diff --git a/youtube_dl/extractor/bandcamp.py b/youtube_dl/extractor/bandcamp.py index 886b0df..dcbbdef 100644 --- a/youtube_dl/extractor/bandcamp.py +++ b/youtube_dl/extractor/bandcamp.py @@ -12,14 +12,14 @@ from ..utils import ( class BandcampIE(InfoExtractor): - _VALID_URL = r'http://.*?\.bandcamp\.com/track/(?P.*)' + _VALID_URL = r'https?://.*?\.bandcamp\.com/track/(?P<title>.*)' _TESTS = [{ 'url': 'http://youtube-dl.bandcamp.com/track/youtube-dl-test-song', 'file': '1812978515.mp3', 'md5': 'c557841d5e50261777a6585648adf439', 'info_dict': { "title": "youtube-dl \"'/\\\u00e4\u21ad - youtube-dl test song \"'/\\\u00e4\u21ad", - "duration": 10, + "duration": 9.8485, }, '_skip': 'There is a limit of 200 free downloads / month for the test song' }] @@ -28,36 +28,32 @@ class BandcampIE(InfoExtractor): mobj = re.match(self._VALID_URL, url) title = mobj.group('title') webpage = self._download_webpage(url, title) - # We get the link to the free download page m_download = re.search(r'freeDownloadPage: "(.*?)"', webpage) - if m_download is None: + if not m_download: m_trackinfo = re.search(r'trackinfo: (.+),\s*?\n', webpage) if m_trackinfo: json_code = m_trackinfo.group(1) - data = json.loads(json_code) - d = data[0] + data = json.loads(json_code)[0] - duration = int(round(d['duration'])) formats = [] - for format_id, format_url in d['file'].items(): - ext, _, abr_str = format_id.partition('-') - + for format_id, format_url in data['file'].items(): + ext, abr_str = format_id.split('-', 1) formats.append({ 'format_id': format_id, 'url': format_url, - 'ext': format_id.partition('-')[0], + 'ext': ext, 'vcodec': 'none', - 'acodec': format_id.partition('-')[0], - 'abr': int(format_id.partition('-')[2]), + 'acodec': ext, + 'abr': int(abr_str), }) self._sort_formats(formats) return { - 'id': compat_str(d['id']), - 'title': d['title'], + 'id': compat_str(data['id']), + 'title': data['title'], 'formats': formats, - 'duration': duration, + 'duration': float(data['duration']), } else: raise ExtractorError('No free songs found') @@ -67,11 +63,9 @@ class BandcampIE(InfoExtractor): r'var TralbumData = {(.*?)id: (?P<id>\d*?)$', webpage, re.MULTILINE | re.DOTALL).group('id') - download_webpage = self._download_webpage(download_link, video_id, - 'Downloading free downloads page') - # We get the dictionary of the track from some javascrip code - info = re.search(r'items: (.*?),$', - download_webpage, re.MULTILINE).group(1) + download_webpage = self._download_webpage(download_link, video_id, 'Downloading free downloads page') + # We get the dictionary of the track from some javascript code + info = re.search(r'items: (.*?),$', download_webpage, re.MULTILINE).group(1) info = json.loads(info)[0] # We pick mp3-320 for now, until format selection can be easily implemented. mp3_info = info['downloads']['mp3-320'] @@ -100,7 +94,7 @@ class BandcampIE(InfoExtractor): class BandcampAlbumIE(InfoExtractor): IE_NAME = 'Bandcamp:album' - _VALID_URL = r'http://.*?\.bandcamp\.com/album/(?P<title>.*)' + _VALID_URL = r'https?://(?:(?P<subdomain>[^.]+)\.)?bandcamp\.com(?:/album/(?P<title>[^?#]+))' _TEST = { 'url': 'http://blazo.bandcamp.com/album/jazz-format-mixtape-vol-1', @@ -123,13 +117,15 @@ class BandcampAlbumIE(InfoExtractor): 'params': { 'playlistend': 2 }, - 'skip': 'Bancamp imposes download limits. See test_playlists:test_bandcamp_album for the playlist test' + 'skip': 'Bandcamp imposes download limits. See test_playlists:test_bandcamp_album for the playlist test' } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) + playlist_id = mobj.group('subdomain') title = mobj.group('title') - webpage = self._download_webpage(url, title) + display_id = title or playlist_id + webpage = self._download_webpage(url, display_id) tracks_paths = re.findall(r'<a href="(.*?)" itemprop="url">', webpage) if not tracks_paths: raise ExtractorError('The page doesn\'t contain any tracks') @@ -139,6 +135,8 @@ class BandcampAlbumIE(InfoExtractor): title = self._search_regex(r'album_title : "(.*?)"', webpage, 'title') return { '_type': 'playlist', + 'id': playlist_id, + 'display_id': display_id, 'title': title, 'entries': entries, } diff --git a/youtube_dl/extractor/bbccouk.py b/youtube_dl/extractor/bbccouk.py index 6d785c0..75e608f 100644 --- a/youtube_dl/extractor/bbccouk.py +++ b/youtube_dl/extractor/bbccouk.py @@ -13,13 +13,13 @@ class BBCCoUkIE(SubtitlesInfoExtractor): _TESTS = [ { - 'url': 'http://www.bbc.co.uk/programmes/p01q7wz1', + 'url': 'http://www.bbc.co.uk/programmes/b039g8p7', 'info_dict': { - 'id': 'p01q7wz4', + 'id': 'b039d07m', 'ext': 'flv', - 'title': 'Friction: Blu Mar Ten guest mix: Blu Mar Ten - Guest Mix', - 'description': 'Blu Mar Ten deliver a Guest Mix for Friction.', - 'duration': 1936, + 'title': 'Kaleidoscope: Leonard Cohen', + 'description': 'md5:db4755d7a665ae72343779f7dacb402c', + 'duration': 1740, }, 'params': { # rtmp download @@ -38,7 +38,8 @@ class BBCCoUkIE(SubtitlesInfoExtractor): 'params': { # rtmp download 'skip_download': True, - } + }, + 'skip': 'Episode is no longer available on BBC iPlayer Radio', }, { 'url': 'http://www.bbc.co.uk/iplayer/episode/b03vhd1f/The_Voice_UK_Series_3_Blind_Auditions_5/', @@ -161,6 +162,11 @@ class BBCCoUkIE(SubtitlesInfoExtractor): mobj = re.match(self._VALID_URL, url) group_id = mobj.group('id') + webpage = self._download_webpage(url, group_id, 'Downloading video page') + if re.search(r'id="emp-error" class="notinuk">', webpage): + raise ExtractorError('Currently BBC iPlayer TV programmes are available to play in the UK only', + expected=True) + playlist = self._download_xml('http://www.bbc.co.uk/iplayer/playlist/%s' % group_id, group_id, 'Downloading playlist XML') diff --git a/youtube_dl/extractor/bilibili.py b/youtube_dl/extractor/bilibili.py new file mode 100644 index 0000000..45067b9 --- /dev/null +++ b/youtube_dl/extractor/bilibili.py @@ -0,0 +1,106 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + compat_parse_qs, + ExtractorError, + int_or_none, + unified_strdate, +) + + +class BiliBiliIE(InfoExtractor): + _VALID_URL = r'http://www\.bilibili\.tv/video/av(?P<id>[0-9]+)/' + + _TEST = { + 'url': 'http://www.bilibili.tv/video/av1074402/', + 'md5': '2c301e4dab317596e837c3e7633e7d86', + 'info_dict': { + 'id': '1074402', + 'ext': 'flv', + 'title': '【金坷垃】金泡沫', + 'duration': 308, + 'upload_date': '20140420', + 'thumbnail': 're:^https?://.+\.jpg', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + webpage = self._download_webpage(url, video_id) + video_code = self._search_regex( + r'(?s)<div itemprop="video".*?>(.*?)</div>', webpage, 'video code') + + title = self._html_search_meta( + 'media:title', video_code, 'title', fatal=True) + duration_str = self._html_search_meta( + 'duration', video_code, 'duration') + if duration_str is None: + duration = None + else: + duration_mobj = re.match( + r'^T(?:(?P<hours>[0-9]+)H)?(?P<minutes>[0-9]+)M(?P<seconds>[0-9]+)S$', + duration_str) + duration = ( + int_or_none(duration_mobj.group('hours'), default=0) * 3600 + + int(duration_mobj.group('minutes')) * 60 + + int(duration_mobj.group('seconds'))) + upload_date = unified_strdate(self._html_search_meta( + 'uploadDate', video_code, fatal=False)) + thumbnail = self._html_search_meta( + 'thumbnailUrl', video_code, 'thumbnail', fatal=False) + + player_params = compat_parse_qs(self._html_search_regex( + r'<iframe .*?class="player" src="https://secure.bilibili.tv/secure,([^"]+)"', + webpage, 'player params')) + + if 'cid' in player_params: + cid = player_params['cid'][0] + + lq_doc = self._download_xml( + 'http://interface.bilibili.cn/v_cdn_play?cid=%s' % cid, + video_id, + note='Downloading LQ video info' + ) + lq_durl = lq_doc.find('.//durl') + formats = [{ + 'format_id': 'lq', + 'quality': 1, + 'url': lq_durl.find('./url').text, + 'filesize': int_or_none( + lq_durl.find('./size'), get_attr='text'), + }] + + hq_doc = self._download_xml( + 'http://interface.bilibili.cn/playurl?cid=%s' % cid, + video_id, + note='Downloading HQ video info', + fatal=False, + ) + if hq_doc is not False: + hq_durl = hq_doc.find('.//durl') + formats.append({ + 'format_id': 'hq', + 'quality': 2, + 'ext': 'flv', + 'url': hq_durl.find('./url').text, + 'filesize': int_or_none( + hq_durl.find('./size'), get_attr='text'), + }) + else: + raise ExtractorError('Unsupported player parameters: %r' % (player_params,)) + + self._sort_formats(formats) + return { + 'id': video_id, + 'title': title, + 'formats': formats, + 'duration': duration, + 'upload_date': upload_date, + 'thumbnail': thumbnail, + } diff --git a/youtube_dl/extractor/blinkx.py b/youtube_dl/extractor/blinkx.py index 96408e4..38ccd95 100644 --- a/youtube_dl/extractor/blinkx.py +++ b/youtube_dl/extractor/blinkx.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals -import datetime import json import re @@ -19,15 +18,16 @@ class BlinkxIE(InfoExtractor): 'file': '8aQUy7GV.mp4', 'md5': '2e9a07364af40163a908edbf10bb2492', 'info_dict': { - "title": "Police Car Rolls Away", - "uploader": "stupidvideos.com", - "upload_date": "20131215", - "description": "A police car gently rolls away from a fight. Maybe it felt weird being around a confrontation and just had to get out of there!", - "duration": 14.886, - "thumbnails": [{ - "width": 100, - "height": 76, - "url": "http://cdn.blinkx.com/stream/b/41/StupidVideos/20131215/1873969261/1873969261_tn_0.jpg", + 'title': 'Police Car Rolls Away', + 'uploader': 'stupidvideos.com', + 'upload_date': '20131215', + 'timestamp': 1387068000, + 'description': 'A police car gently rolls away from a fight. Maybe it felt weird being around a confrontation and just had to get out of there!', + 'duration': 14.886, + 'thumbnails': [{ + 'width': 100, + 'height': 76, + 'url': 'http://cdn.blinkx.com/stream/b/41/StupidVideos/20131215/1873969261/1873969261_tn_0.jpg', }], }, } @@ -41,9 +41,6 @@ class BlinkxIE(InfoExtractor): 'video=%s' % video_id) data_json = self._download_webpage(api_url, display_id) data = json.loads(data_json)['api']['results'][0] - dt = datetime.datetime.fromtimestamp(data['pubdate_epoch']) - pload_date = dt.strftime('%Y%m%d') - duration = None thumbnails = [] formats = [] @@ -64,10 +61,7 @@ class BlinkxIE(InfoExtractor): vcodec = remove_start(m['vcodec'], 'ff') acodec = remove_start(m['acodec'], 'ff') tbr = (int(m['vbr']) + int(m['abr'])) // 1000 - format_id = (u'%s-%sk-%s' % - (vcodec, - tbr, - m['w'])) + format_id = u'%s-%sk-%s' % (vcodec, tbr, m['w']) formats.append({ 'format_id': format_id, 'url': m['link'], @@ -88,7 +82,7 @@ class BlinkxIE(InfoExtractor): 'title': data['title'], 'formats': formats, 'uploader': data['channel_name'], - 'upload_date': pload_date, + 'timestamp': data['pubdate_epoch'], 'description': data.get('description'), 'thumbnails': thumbnails, 'duration': duration, diff --git a/youtube_dl/extractor/bliptv.py b/youtube_dl/extractor/bliptv.py index a26001b..d4da089 100644 --- a/youtube_dl/extractor/bliptv.py +++ b/youtube_dl/extractor/bliptv.py @@ -1,102 +1,124 @@ from __future__ import unicode_literals -import datetime import re from .common import InfoExtractor from .subtitles import SubtitlesInfoExtractor from ..utils import ( - compat_str, compat_urllib_request, - unescapeHTML, + parse_iso8601, + compat_urlparse, + clean_html, + compat_str, ) class BlipTVIE(SubtitlesInfoExtractor): - """Information extractor for blip.tv""" - - _VALID_URL = r'https?://(?:\w+\.)?blip\.tv/((.+/)|(play/)|(api\.swf#))(?P<presumptive_id>.+)$' - - _TESTS = [{ - 'url': 'http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352', - 'md5': 'c6934ad0b6acf2bd920720ec888eb812', - 'info_dict': { - 'id': '5779306', - 'ext': 'mov', - 'upload_date': '20111205', - 'description': 'md5:9bc31f227219cde65e47eeec8d2dc596', - 'uploader': 'Comic Book Resources - CBR TV', - 'title': 'CBR EXCLUSIVE: "Gotham City Imposters" Bats VS Jokerz Short 3', - } - }, { - # https://github.com/rg3/youtube-dl/pull/2274 - 'note': 'Video with subtitles', - 'url': 'http://blip.tv/play/h6Uag5OEVgI.html', - 'md5': '309f9d25b820b086ca163ffac8031806', - 'info_dict': { - 'id': '6586561', - 'ext': 'mp4', - 'uploader': 'Red vs. Blue', - 'description': 'One-Zero-One', - 'upload_date': '20130614', - 'title': 'Red vs. Blue Season 11 Episode 1', + _VALID_URL = r'https?://(?:\w+\.)?blip\.tv/(?:(?:.+-|rss/flash/)(?P<id>\d+)|((?:play/|api\.swf#)(?P<lookup_id>[\da-zA-Z]+)))' + + _TESTS = [ + { + 'url': 'http://blip.tv/cbr/cbr-exclusive-gotham-city-imposters-bats-vs-jokerz-short-3-5796352', + 'md5': 'c6934ad0b6acf2bd920720ec888eb812', + 'info_dict': { + 'id': '5779306', + 'ext': 'mov', + 'title': 'CBR EXCLUSIVE: "Gotham City Imposters" Bats VS Jokerz Short 3', + 'description': 'md5:9bc31f227219cde65e47eeec8d2dc596', + 'timestamp': 1323138843, + 'upload_date': '20111206', + 'uploader': 'cbr', + 'uploader_id': '679425', + 'duration': 81, + } + }, + { + # https://github.com/rg3/youtube-dl/pull/2274 + 'note': 'Video with subtitles', + 'url': 'http://blip.tv/play/h6Uag5OEVgI.html', + 'md5': '309f9d25b820b086ca163ffac8031806', + 'info_dict': { + 'id': '6586561', + 'ext': 'mp4', + 'title': 'Red vs. Blue Season 11 Episode 1', + 'description': 'One-Zero-One', + 'timestamp': 1371261608, + 'upload_date': '20130615', + 'uploader': 'redvsblue', + 'uploader_id': '792887', + 'duration': 279, + } } - }] + ] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - presumptive_id = mobj.group('presumptive_id') + lookup_id = mobj.group('lookup_id') # See https://github.com/rg3/youtube-dl/issues/857 - embed_mobj = re.match(r'https?://(?:\w+\.)?blip\.tv/(?:play/|api\.swf#)([a-zA-Z0-9]+)', url) - if embed_mobj: - info_url = 'http://blip.tv/play/%s.x?p=1' % embed_mobj.group(1) - info_page = self._download_webpage(info_url, embed_mobj.group(1)) - video_id = self._search_regex( - r'data-episode-id="([0-9]+)', info_page, 'video_id') - return self.url_result('http://blip.tv/a/a-' + video_id, 'BlipTV') - - cchar = '&' if '?' in url else '?' - json_url = url + cchar + 'skin=json&version=2&no_wrap=1' - request = compat_urllib_request.Request(json_url) - request.add_header('User-Agent', 'iTunes/10.6.1') - - json_data = self._download_json(request, video_id=presumptive_id) - - if 'Post' in json_data: - data = json_data['Post'] + if lookup_id: + info_page = self._download_webpage( + 'http://blip.tv/play/%s.x?p=1' % lookup_id, lookup_id, 'Resolving lookup id') + video_id = self._search_regex(r'data-episode-id="([0-9]+)', info_page, 'video_id') else: - data = json_data + video_id = mobj.group('id') + + rss = self._download_xml('http://blip.tv/rss/flash/%s' % video_id, video_id, 'Downloading video RSS') + + def blip(s): + return '{http://blip.tv/dtd/blip/1.0}%s' % s + + def media(s): + return '{http://search.yahoo.com/mrss/}%s' % s + + def itunes(s): + return '{http://www.itunes.com/dtds/podcast-1.0.dtd}%s' % s + + item = rss.find('channel/item') + + video_id = item.find(blip('item_id')).text + title = item.find('./title').text + description = clean_html(compat_str(item.find(blip('puredescription')).text)) + timestamp = parse_iso8601(item.find(blip('datestamp')).text) + uploader = item.find(blip('user')).text + uploader_id = item.find(blip('userid')).text + duration = int(item.find(blip('runtime')).text) + media_thumbnail = item.find(media('thumbnail')) + thumbnail = media_thumbnail.get('url') if media_thumbnail is not None else item.find(itunes('image')).text + categories = [category.text for category in item.findall('category')] - video_id = compat_str(data['item_id']) - upload_date = datetime.datetime.strptime(data['datestamp'], '%m-%d-%y %H:%M%p').strftime('%Y%m%d') - subtitles = {} formats = [] - if 'additionalMedia' in data: - for f in data['additionalMedia']: - if f.get('file_type_srt') == 1: - LANGS = { - 'english': 'en', - } - lang = f['role'].rpartition('-')[-1].strip().lower() - langcode = LANGS.get(lang, lang) - subtitles[langcode] = f['url'] - continue - if not int(f['media_width']): # filter m3u8 - continue + subtitles = {} + + media_group = item.find(media('group')) + for media_content in media_group.findall(media('content')): + url = media_content.get('url') + role = media_content.get(blip('role')) + msg = self._download_webpage( + url + '?showplayer=20140425131715&referrer=http://blip.tv&mask=7&skin=flashvars&view=url', + video_id, 'Resolving URL for %s' % role) + real_url = compat_urlparse.parse_qs(msg)['message'][0] + + media_type = media_content.get('type') + if media_type == 'text/srt' or url.endswith('.srt'): + LANGS = { + 'english': 'en', + } + lang = role.rpartition('-')[-1].strip().lower() + langcode = LANGS.get(lang, lang) + subtitles[langcode] = url + elif media_type.startswith('video/'): formats.append({ - 'url': f['url'], - 'format_id': f['role'], - 'width': int(f['media_width']), - 'height': int(f['media_height']), + 'url': real_url, + 'format_id': role, + 'format_note': media_type, + 'vcodec': media_content.get(blip('vcodec')), + 'acodec': media_content.get(blip('acodec')), + 'filesize': media_content.get('filesize'), + 'width': int(media_content.get('width')), + 'height': int(media_content.get('height')), }) - else: - formats.append({ - 'url': data['media']['url'], - 'width': int(data['media']['width']), - 'height': int(data['media']['height']), - }) self._sort_formats(formats) # subtitles @@ -107,12 +129,14 @@ class BlipTVIE(SubtitlesInfoExtractor): return { 'id': video_id, - 'uploader': data['display_name'], - 'upload_date': upload_date, - 'title': data['title'], - 'thumbnail': data['thumbnailUrl'], - 'description': data['description'], - 'user_agent': 'iTunes/10.6.1', + 'title': title, + 'description': description, + 'timestamp': timestamp, + 'uploader': uploader, + 'uploader_id': uploader_id, + 'duration': duration, + 'thumbnail': thumbnail, + 'categories': categories, 'formats': formats, 'subtitles': video_subtitles, } diff --git a/youtube_dl/extractor/bloomberg.py b/youtube_dl/extractor/bloomberg.py index 2415ce4..25fb79e 100644 --- a/youtube_dl/extractor/bloomberg.py +++ b/youtube_dl/extractor/bloomberg.py @@ -1,22 +1,21 @@ +from __future__ import unicode_literals + import re from .common import InfoExtractor -from .ooyala import OoyalaIE class BloombergIE(InfoExtractor): _VALID_URL = r'https?://www\.bloomberg\.com/video/(?P<name>.+?)\.html' _TEST = { - u'url': u'http://www.bloomberg.com/video/shah-s-presentation-on-foreign-exchange-strategies-qurhIVlJSB6hzkVi229d8g.html', - u'file': u'12bzhqZTqQHmmlA8I-i0NpzJgcG5NNYX.mp4', - u'info_dict': { - u'title': u'Shah\'s Presentation on Foreign-Exchange Strategies', - u'description': u'md5:abc86e5236f9f0e4866c59ad36736686', - }, - u'params': { - # Requires ffmpeg (m3u8 manifest) - u'skip_download': True, + 'url': 'http://www.bloomberg.com/video/shah-s-presentation-on-foreign-exchange-strategies-qurhIVlJSB6hzkVi229d8g.html', + 'md5': '7bf08858ff7c203c870e8a6190e221e5', + 'info_dict': { + 'id': 'qurhIVlJSB6hzkVi229d8g', + 'ext': 'flv', + 'title': 'Shah\'s Presentation on Foreign-Exchange Strategies', + 'description': 'md5:0681e0d30dcdfc6abf34594961d8ea88', }, } @@ -24,7 +23,16 @@ class BloombergIE(InfoExtractor): mobj = re.match(self._VALID_URL, url) name = mobj.group('name') webpage = self._download_webpage(url, name) - embed_code = self._search_regex( - r'<source src="https?://[^/]+/[^/]+/[^/]+/([^/]+)', webpage, - 'embed code') - return OoyalaIE._build_url_result(embed_code) + f4m_url = self._search_regex( + r'<source src="(https?://[^"]+\.f4m.*?)"', webpage, + 'f4m url') + title = re.sub(': Video$', '', self._og_search_title(webpage)) + + return { + 'id': name.split('-')[-1], + 'title': title, + 'url': f4m_url, + 'ext': 'flv', + 'description': self._og_search_description(webpage), + 'thumbnail': self._og_search_thumbnail(webpage), + } diff --git a/youtube_dl/extractor/br.py b/youtube_dl/extractor/br.py new file mode 100644 index 0000000..b5b56ff --- /dev/null +++ b/youtube_dl/extractor/br.py @@ -0,0 +1,139 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, +) + + +class BRIE(InfoExtractor): + IE_DESC = 'Bayerischer Rundfunk Mediathek' + _VALID_URL = r'https?://(?:www\.)?br\.de/(?:[a-z0-9\-]+/)+(?P<id>[a-z0-9\-]+)\.html' + _BASE_URL = 'http://www.br.de' + + _TESTS = [ + { + 'url': 'http://www.br.de/mediathek/video/anselm-gruen-114.html', + 'md5': 'c4f83cf0f023ba5875aba0bf46860df2', + 'info_dict': { + 'id': '2c8d81c5-6fb7-4a74-88d4-e768e5856532', + 'ext': 'mp4', + 'title': 'Feiern und Verzichten', + 'description': 'Anselm Grün: Feiern und Verzichten', + 'uploader': 'BR/Birgit Baier', + 'upload_date': '20140301', + } + }, + { + 'url': 'http://www.br.de/mediathek/video/sendungen/unter-unserem-himmel/unter-unserem-himmel-alpen-ueber-den-pass-100.html', + 'md5': 'ab451b09d861dbed7d7cc9ab0be19ebe', + 'info_dict': { + 'id': '2c060e69-3a27-4e13-b0f0-668fac17d812', + 'ext': 'mp4', + 'title': 'Über den Pass', + 'description': 'Die Eroberung der Alpen: Über den Pass', + } + }, + { + 'url': 'http://www.br.de/nachrichten/schaeuble-haushaltsentwurf-bundestag-100.html', + 'md5': '3db0df1a9a9cd9fa0c70e6ea8aa8e820', + 'info_dict': { + 'id': 'c6aae3de-2cf9-43f2-957f-f17fef9afaab', + 'ext': 'aac', + 'title': '"Keine neuen Schulden im nächsten Jahr"', + 'description': 'Haushaltsentwurf: "Keine neuen Schulden im nächsten Jahr"', + } + }, + { + 'url': 'http://www.br.de/radio/bayern1/service/team/videos/team-video-erdelt100.html', + 'md5': 'dbab0aef2e047060ea7a21fc1ce1078a', + 'info_dict': { + 'id': '6ba73750-d405-45d3-861d-1ce8c524e059', + 'ext': 'mp4', + 'title': 'Umweltbewusster Häuslebauer', + 'description': 'Uwe Erdelt: Umweltbewusster Häuslebauer', + } + }, + { + 'url': 'http://www.br.de/fernsehen/br-alpha/sendungen/kant-fuer-anfaenger/kritik-der-reinen-vernunft/kant-kritik-01-metaphysik100.html', + 'md5': '23bca295f1650d698f94fc570977dae3', + 'info_dict': { + 'id': 'd982c9ce-8648-4753-b358-98abb8aec43d', + 'ext': 'mp4', + 'title': 'Folge 1 - Metaphysik', + 'description': 'Kant für Anfänger: Folge 1 - Metaphysik', + 'uploader': 'Eva Maria Steimle', + 'upload_date': '20140117', + } + }, + ] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + display_id = mobj.group('id') + page = self._download_webpage(url, display_id) + xml_url = self._search_regex( + r"return BRavFramework\.register\(BRavFramework\('avPlayer_(?:[a-f0-9-]{36})'\)\.setup\({dataURL:'(/(?:[a-z0-9\-]+/)+[a-z0-9/~_.-]+)'}\)\);", page, 'XMLURL') + xml = self._download_xml(self._BASE_URL + xml_url, None) + + medias = [] + + for xml_media in xml.findall('video') + xml.findall('audio'): + media = { + 'id': xml_media.get('externalId'), + 'title': xml_media.find('title').text, + 'formats': self._extract_formats(xml_media.find('assets')), + 'thumbnails': self._extract_thumbnails(xml_media.find('teaserImage/variants')), + 'description': ' '.join(xml_media.find('shareTitle').text.splitlines()), + 'webpage_url': xml_media.find('permalink').text + } + if xml_media.find('author').text: + media['uploader'] = xml_media.find('author').text + if xml_media.find('broadcastDate').text: + media['upload_date'] = ''.join(reversed(xml_media.find('broadcastDate').text.split('.'))) + medias.append(media) + + if len(medias) > 1: + self._downloader.report_warning( + 'found multiple medias; please ' + 'report this with the video URL to http://yt-dl.org/bug') + if not medias: + raise ExtractorError('No media entries found') + return medias[0] + + def _extract_formats(self, assets): + + def text_or_none(asset, tag): + elem = asset.find(tag) + return None if elem is None else elem.text + + formats = [{ + 'url': text_or_none(asset, 'downloadUrl'), + 'ext': text_or_none(asset, 'mediaType'), + 'format_id': asset.get('type'), + 'width': int_or_none(text_or_none(asset, 'frameWidth')), + 'height': int_or_none(text_or_none(asset, 'frameHeight')), + 'tbr': int_or_none(text_or_none(asset, 'bitrateVideo')), + 'abr': int_or_none(text_or_none(asset, 'bitrateAudio')), + 'vcodec': text_or_none(asset, 'codecVideo'), + 'acodec': text_or_none(asset, 'codecAudio'), + 'container': text_or_none(asset, 'mediaType'), + 'filesize': int_or_none(text_or_none(asset, 'size')), + } for asset in assets.findall('asset') + if asset.find('downloadUrl') is not None] + + self._sort_formats(formats) + return formats + + def _extract_thumbnails(self, variants): + thumbnails = [{ + 'url': self._BASE_URL + variant.find('url').text, + 'width': int_or_none(variant.find('width').text), + 'height': int_or_none(variant.find('height').text), + } for variant in variants.findall('variant')] + thumbnails.sort(key=lambda x: x['width'] * x['height'], reverse=True) + return thumbnails diff --git a/youtube_dl/extractor/breakcom.py b/youtube_dl/extractor/breakcom.py index 8ec6dda..1bfc9f3 100644 --- a/youtube_dl/extractor/breakcom.py +++ b/youtube_dl/extractor/breakcom.py @@ -23,13 +23,14 @@ class BreakIE(InfoExtractor): video_id = mobj.group(1).split("-")[-1] embed_url = 'http://www.break.com/embed/%s' % video_id webpage = self._download_webpage(embed_url, video_id) - info_json = self._search_regex(r'var embedVars = ({.*?});', webpage, - 'info json', flags=re.DOTALL) + info_json = self._search_regex(r'var embedVars = ({.*})\s*?</script>', + webpage, 'info json', flags=re.DOTALL) info = json.loads(info_json) video_url = info['videoUri'] - m_youtube = re.search(r'(https?://www\.youtube\.com/watch\?v=.*)', video_url) - if m_youtube is not None: - return self.url_result(m_youtube.group(1), 'Youtube') + youtube_id = info.get('youtubeId') + if youtube_id: + return self.url_result(youtube_id, 'Youtube') + final_url = video_url + '?' + info['AuthToken'] return { 'id': video_id, diff --git a/youtube_dl/extractor/brightcove.py b/youtube_dl/extractor/brightcove.py index 83eec84..3c02c29 100644 --- a/youtube_dl/extractor/brightcove.py +++ b/youtube_dl/extractor/brightcove.py @@ -87,7 +87,7 @@ class BrightcoveIE(InfoExtractor): object_str = object_str.replace('<--', '<!--') object_str = fix_xml_ampersands(object_str) - object_doc = xml.etree.ElementTree.fromstring(object_str) + object_doc = xml.etree.ElementTree.fromstring(object_str.encode('utf-8')) fv_el = find_xpath_attr(object_doc, './param', 'name', 'flashVars') if fv_el is not None: @@ -140,7 +140,11 @@ class BrightcoveIE(InfoExtractor): url_m = re.search(r'<meta\s+property="og:video"\s+content="(http://c.brightcove.com/[^"]+)"', webpage) if url_m: - return [unescapeHTML(url_m.group(1))] + url = unescapeHTML(url_m.group(1)) + # Some sites don't add it, we can't download with this url, for example: + # http://www.ktvu.com/videos/news/raw-video-caltrain-releases-video-of-man-almost/vCTZdY/ + if 'playerKey' in url: + return [url] matches = re.findall( r'''(?sx)<object diff --git a/youtube_dl/extractor/byutv.py b/youtube_dl/extractor/byutv.py new file mode 100644 index 0000000..cf19b7b --- /dev/null +++ b/youtube_dl/extractor/byutv.py @@ -0,0 +1,48 @@ +from __future__ import unicode_literals + +import json +import re + +from .common import InfoExtractor +from ..utils import ExtractorError + + +class BYUtvIE(InfoExtractor): + _VALID_URL = r'^https?://(?:www\.)?byutv.org/watch/[0-9a-f-]+/(?P<video_id>[^/?#]+)' + _TEST = { + 'url': 'http://www.byutv.org/watch/44e80f7b-e3ba-43ba-8c51-b1fd96c94a79/granite-flats-talking', + 'info_dict': { + 'id': 'granite-flats-talking', + 'ext': 'mp4', + 'description': 'md5:4e9a7ce60f209a33eca0ac65b4918e1c', + 'title': 'Talking', + 'thumbnail': 're:^https?://.*promo.*' + }, + 'params': { + 'skip_download': True, + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('video_id') + + webpage = self._download_webpage(url, video_id) + episode_code = self._search_regex( + r'(?s)episode:(.*?\}),\s*\n', webpage, 'episode information') + episode_json = re.sub( + r'(\n\s+)([a-zA-Z]+):\s+\'(.*?)\'', r'\1"\2": "\3"', episode_code) + ep = json.loads(episode_json) + + if ep['providerType'] == 'Ooyala': + return { + '_type': 'url_transparent', + 'ie_key': 'Ooyala', + 'url': 'ooyala:%s' % ep['providerId'], + 'id': video_id, + 'title': ep['title'], + 'description': ep.get('description'), + 'thumbnail': ep.get('imageThumbnail'), + } + else: + raise ExtractorError('Unsupported provider %s' % ep['provider']) diff --git a/youtube_dl/extractor/c56.py b/youtube_dl/extractor/c56.py index 690bc7c..cb96c38 100644 --- a/youtube_dl/extractor/c56.py +++ b/youtube_dl/extractor/c56.py @@ -2,39 +2,46 @@ from __future__ import unicode_literals import re -import json from .common import InfoExtractor class C56IE(InfoExtractor): - _VALID_URL = r'https?://((www|player)\.)?56\.com/(.+?/)?(v_|(play_album.+-))(?P<textid>.+?)\.(html|swf)' + _VALID_URL = r'https?://(?:(?:www|player)\.)?56\.com/(?:.+?/)?(?:v_|(?:play_album.+-))(?P<textid>.+?)\.(?:html|swf)' IE_NAME = '56.com' _TEST = { 'url': 'http://www.56.com/u39/v_OTM0NDA3MTY.html', - 'file': '93440716.flv', 'md5': 'e59995ac63d0457783ea05f93f12a866', 'info_dict': { + 'id': '93440716', + 'ext': 'flv', 'title': '网事知多少 第32期:车怒', + 'duration': 283.813, }, } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url, flags=re.VERBOSE) text_id = mobj.group('textid') - info_page = self._download_webpage('http://vxml.56.com/json/%s/' % text_id, - text_id, 'Downloading video info') - info = json.loads(info_page)['info'] - formats = [{ - 'format_id': f['type'], - 'filesize': int(f['filesize']), - 'url': f['url'] - } for f in info['rfiles']] + + page = self._download_json( + 'http://vxml.56.com/json/%s/' % text_id, text_id, 'Downloading video info') + + info = page['info'] + + formats = [ + { + 'format_id': f['type'], + 'filesize': int(f['filesize']), + 'url': f['url'] + } for f in info['rfiles'] + ] self._sort_formats(formats) return { 'id': info['vid'], 'title': info['Subject'], + 'duration': int(info['duration']) / 1000.0, 'formats': formats, 'thumbnail': info.get('bimg') or info.get('img'), } diff --git a/youtube_dl/extractor/canal13cl.py b/youtube_dl/extractor/canal13cl.py new file mode 100644 index 0000000..93241fe --- /dev/null +++ b/youtube_dl/extractor/canal13cl.py @@ -0,0 +1,48 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor + + +class Canal13clIE(InfoExtractor): + _VALID_URL = r'^http://(?:www\.)?13\.cl/(?:[^/?#]+/)*(?P<id>[^/?#]+)' + _TEST = { + 'url': 'http://www.13.cl/t13/nacional/el-circulo-de-hierro-de-michelle-bachelet-en-su-regreso-a-la-moneda', + 'md5': '4cb1fa38adcad8fea88487a078831755', + 'info_dict': { + 'id': '1403022125', + 'display_id': 'el-circulo-de-hierro-de-michelle-bachelet-en-su-regreso-a-la-moneda', + 'ext': 'mp4', + 'title': 'El "círculo de hierro" de Michelle Bachelet en su regreso a La Moneda', + 'description': '(Foto: Agencia Uno) En nueve días más, Michelle Bachelet va a asumir por segunda vez como presidenta de la República. Entre aquellos que la acompañarán hay caras que se repiten y otras que se consolidan en su entorno de colaboradores más cercanos.', + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + display_id = mobj.group('id') + + webpage = self._download_webpage(url, display_id) + + title = self._html_search_meta( + 'twitter:title', webpage, 'title', fatal=True) + description = self._html_search_meta( + 'twitter:description', webpage, 'description') + url = self._html_search_regex( + r'articuloVideo = \"(.*?)\"', webpage, 'url') + real_id = self._search_regex( + r'[^0-9]([0-9]{7,})[^0-9]', url, 'id', default=display_id) + thumbnail = self._html_search_regex( + r'articuloImagen = \"(.*?)\"', webpage, 'thumbnail') + + return { + 'id': real_id, + 'display_id': display_id, + 'url': url, + 'title': title, + 'description': description, + 'ext': 'mp4', + 'thumbnail': thumbnail, + } diff --git a/youtube_dl/extractor/canalc2.py b/youtube_dl/extractor/canalc2.py index 3d8d7f9..c4fefef 100644 --- a/youtube_dl/extractor/canalc2.py +++ b/youtube_dl/extractor/canalc2.py @@ -1,4 +1,6 @@ # coding: utf-8 +from __future__ import unicode_literals + import re from .common import InfoExtractor @@ -9,11 +11,12 @@ class Canalc2IE(InfoExtractor): _VALID_URL = r'http://.*?\.canalc2\.tv/video\.asp\?.*?idVideo=(?P<id>\d+)' _TEST = { - u'url': u'http://www.canalc2.tv/video.asp?idVideo=12163&voir=oui', - u'file': u'12163.mp4', - u'md5': u'060158428b650f896c542dfbb3d6487f', - u'info_dict': { - u'title': u'Terrasses du Numérique' + 'url': 'http://www.canalc2.tv/video.asp?idVideo=12163&voir=oui', + 'md5': '060158428b650f896c542dfbb3d6487f', + 'info_dict': { + 'id': '12163', + 'ext': 'mp4', + 'title': 'Terrasses du Numérique' } } @@ -28,10 +31,11 @@ class Canalc2IE(InfoExtractor): video_url = 'http://vod-flash.u-strasbg.fr:8080/' + file_name title = self._html_search_regex( - r'class="evenement8">(.*?)</a>', webpage, u'title') - - return {'id': video_id, - 'ext': 'mp4', - 'url': video_url, - 'title': title, - } + r'class="evenement8">(.*?)</a>', webpage, 'title') + + return { + 'id': video_id, + 'ext': 'mp4', + 'url': video_url, + 'title': title, + } diff --git a/youtube_dl/extractor/canalplus.py b/youtube_dl/extractor/canalplus.py index 7cdcd83..0202078 100644 --- a/youtube_dl/extractor/canalplus.py +++ b/youtube_dl/extractor/canalplus.py @@ -1,53 +1,72 @@ # encoding: utf-8 +from __future__ import unicode_literals + import re from .common import InfoExtractor -from ..utils import unified_strdate +from ..utils import ( + unified_strdate, + url_basename, +) class CanalplusIE(InfoExtractor): - _VALID_URL = r'https?://(www\.canalplus\.fr/.*?/(?P<path>.*)|player\.canalplus\.fr/#/(?P<id>\d+))' + _VALID_URL = r'https?://(?:www\.canalplus\.fr/.*?/(?P<path>.*)|player\.canalplus\.fr/#/(?P<id>[0-9]+))' _VIDEO_INFO_TEMPLATE = 'http://service.canal-plus.com/video/rest/getVideosLiees/cplus/%s' - IE_NAME = u'canalplus.fr' + IE_NAME = 'canalplus.fr' _TEST = { - u'url': u'http://www.canalplus.fr/c-infos-documentaires/pid1830-c-zapping.html?vid=922470', - u'file': u'922470.flv', - u'info_dict': { - u'title': u'Zapping - 26/08/13', - u'description': u'Le meilleur de toutes les chaînes, tous les jours.\nEmission du 26 août 2013', - u'upload_date': u'20130826', - }, - u'params': { - u'skip_download': True, + 'url': 'http://www.canalplus.fr/c-infos-documentaires/pid1830-c-zapping.html?vid=922470', + 'md5': '3db39fb48b9685438ecf33a1078023e4', + 'info_dict': { + 'id': '922470', + 'ext': 'flv', + 'title': 'Zapping - 26/08/13', + 'description': 'Le meilleur de toutes les chaînes, tous les jours.\nEmission du 26 août 2013', + 'upload_date': '20130826', }, } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id = mobj.groupdict().get('id') + + # Beware, some subclasses do not define an id group + display_id = url_basename(mobj.group('path')) + if video_id is None: - webpage = self._download_webpage(url, mobj.group('path')) - video_id = self._search_regex(r'videoId = "(\d+)";', webpage, u'video id') + webpage = self._download_webpage(url, display_id) + video_id = self._search_regex(r'<canal:player videoId="(\d+)"', webpage, 'video id') + info_url = self._VIDEO_INFO_TEMPLATE % video_id - doc = self._download_xml(info_url,video_id, - u'Downloading video info') + doc = self._download_xml(info_url, video_id, 'Downloading video XML') - self.report_extraction(video_id) video_info = [video for video in doc if video.find('ID').text == video_id][0] - infos = video_info.find('INFOS') media = video_info.find('MEDIA') - formats = [media.find('VIDEOS/%s' % format) - for format in ['BAS_DEBIT', 'HAUT_DEBIT', 'HD']] - video_url = [format.text for format in formats if format is not None][-1] - - return {'id': video_id, - 'title': u'%s - %s' % (infos.find('TITRAGE/TITRE').text, - infos.find('TITRAGE/SOUS_TITRE').text), - 'url': video_url, - 'ext': 'flv', - 'upload_date': unified_strdate(infos.find('PUBLICATION/DATE').text), - 'thumbnail': media.find('IMAGES/GRAND').text, - 'description': infos.find('DESCRIPTION').text, - 'view_count': int(infos.find('NB_VUES').text), - } + infos = video_info.find('INFOS') + + preferences = ['MOBILE', 'BAS_DEBIT', 'HAUT_DEBIT', 'HD', 'HLS', 'HDS'] + + formats = [ + { + 'url': fmt.text + '?hdcore=2.11.3' if fmt.tag == 'HDS' else fmt.text, + 'format_id': fmt.tag, + 'ext': 'mp4' if fmt.tag == 'HLS' else 'flv', + 'preference': preferences.index(fmt.tag) if fmt.tag in preferences else -1, + } for fmt in media.find('VIDEOS') if fmt.text + ] + self._sort_formats(formats) + + return { + 'id': video_id, + 'display_id': display_id, + 'title': '%s - %s' % (infos.find('TITRAGE/TITRE').text, + infos.find('TITRAGE/SOUS_TITRE').text), + 'upload_date': unified_strdate(infos.find('PUBLICATION/DATE').text), + 'thumbnail': media.find('IMAGES/GRAND').text, + 'description': infos.find('DESCRIPTION').text, + 'view_count': int(infos.find('NB_VUES').text), + 'like_count': int(infos.find('NB_LIKES').text), + 'comment_count': int(infos.find('NB_COMMENTS').text), + 'formats': formats, + } \ No newline at end of file diff --git a/youtube_dl/extractor/cbsnews.py b/youtube_dl/extractor/cbsnews.py new file mode 100644 index 0000000..0bce793 --- /dev/null +++ b/youtube_dl/extractor/cbsnews.py @@ -0,0 +1,87 @@ +# encoding: utf-8 +from __future__ import unicode_literals + +import re +import json + +from .common import InfoExtractor + + +class CBSNewsIE(InfoExtractor): + IE_DESC = 'CBS News' + _VALID_URL = r'http://(?:www\.)?cbsnews\.com/(?:[^/]+/)+(?P<id>[\da-z_-]+)' + + _TESTS = [ + { + 'url': 'http://www.cbsnews.com/news/tesla-and-spacex-elon-musks-industrial-empire/', + 'info_dict': { + 'id': 'tesla-and-spacex-elon-musks-industrial-empire', + 'ext': 'flv', + 'title': 'Tesla and SpaceX: Elon Musk\'s industrial empire', + 'thumbnail': 'http://beta.img.cbsnews.com/i/2014/03/30/60147937-2f53-4565-ad64-1bdd6eb64679/60-0330-pelley-640x360.jpg', + 'duration': 791, + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + }, + { + 'url': 'http://www.cbsnews.com/videos/fort-hood-shooting-army-downplays-mental-illness-as-cause-of-attack/', + 'info_dict': { + 'id': 'fort-hood-shooting-army-downplays-mental-illness-as-cause-of-attack', + 'ext': 'flv', + 'title': 'Fort Hood shooting: Army downplays mental illness as cause of attack', + 'thumbnail': 'http://cbsnews2.cbsistatic.com/hub/i/r/2014/04/04/0c9fbc66-576b-41ca-8069-02d122060dd2/thumbnail/140x90/6dad7a502f88875ceac38202984b6d58/en-0404-werner-replace-640x360.jpg', + 'duration': 205, + }, + 'params': { + # rtmp download + 'skip_download': True, + }, + }, + ] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + webpage = self._download_webpage(url, video_id) + + video_info = json.loads(self._html_search_regex( + r'(?:<ul class="media-list items" id="media-related-items"><li data-video-info|<div id="cbsNewsVideoPlayer" data-video-player-options)=\'({.+?})\'', + webpage, 'video JSON info')) + + item = video_info['item'] if 'item' in video_info else video_info + title = item.get('articleTitle') or item.get('hed') + duration = item.get('duration') + thumbnail = item.get('mediaImage') or item.get('thumbnail') + + formats = [] + for format_id in ['RtmpMobileLow', 'RtmpMobileHigh', 'Hls', 'RtmpDesktop']: + uri = item.get('media' + format_id + 'URI') + if not uri: + continue + fmt = { + 'url': uri, + 'format_id': format_id, + } + if uri.startswith('rtmp'): + fmt.update({ + 'app': 'ondemand?auth=cbs', + 'play_path': 'mp4:' + uri.split('<break>')[-1], + 'player_url': 'http://www.cbsnews.com/[[IMPORT]]/vidtech.cbsinteractive.com/player/3_3_0/CBSI_PLAYER_HD.swf', + 'page_url': 'http://www.cbsnews.com', + 'ext': 'flv', + }) + elif uri.endswith('.m3u8'): + fmt['ext'] = 'mp4' + formats.append(fmt) + + return { + 'id': video_id, + 'title': title, + 'thumbnail': thumbnail, + 'duration': duration, + 'formats': formats, + } \ No newline at end of file diff --git a/youtube_dl/extractor/ceskatelevize.py b/youtube_dl/extractor/ceskatelevize.py new file mode 100644 index 0000000..90a3ddd --- /dev/null +++ b/youtube_dl/extractor/ceskatelevize.py @@ -0,0 +1,126 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + compat_urllib_request, + compat_urllib_parse, + compat_urllib_parse_urlparse, + ExtractorError, +) + + +class CeskaTelevizeIE(InfoExtractor): + _VALID_URL = r'https?://www\.ceskatelevize\.cz/(porady|ivysilani)/(.+/)?(?P<id>[^?#]+)' + + _TESTS = [ + { + 'url': 'http://www.ceskatelevize.cz/ivysilani/10532695142-prvni-republika/213512120230004-spanelska-chripka', + 'info_dict': { + 'id': '213512120230004', + 'ext': 'flv', + 'title': 'První republika: Španělská chřipka', + 'duration': 3107.4, + }, + 'params': { + 'skip_download': True, # requires rtmpdump + }, + 'skip': 'Works only from Czech Republic.', + }, + { + 'url': 'http://www.ceskatelevize.cz/ivysilani/1030584952-tsatsiki-maminka-a-policajt', + 'info_dict': { + 'id': '20138143440', + 'ext': 'flv', + 'title': 'Tsatsiki, maminka a policajt', + 'duration': 6754.1, + }, + 'params': { + 'skip_download': True, # requires rtmpdump + }, + 'skip': 'Works only from Czech Republic.', + }, + { + 'url': 'http://www.ceskatelevize.cz/ivysilani/10532695142-prvni-republika/bonus/14716-zpevacka-z-duparny-bobina', + 'info_dict': { + 'id': '14716', + 'ext': 'flv', + 'title': 'První republika: Zpěvačka z Dupárny Bobina', + 'duration': 90, + }, + 'params': { + 'skip_download': True, # requires rtmpdump + }, + }, + ] + + def _real_extract(self, url): + url = url.replace('/porady/', '/ivysilani/').replace('/video/', '') + + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + webpage = self._download_webpage(url, video_id) + + NOT_AVAILABLE_STRING = 'This content is not available at your territory due to limited copyright.' + if '%s</p>' % NOT_AVAILABLE_STRING in webpage: + raise ExtractorError(NOT_AVAILABLE_STRING, expected=True) + + typ = self._html_search_regex(r'getPlaylistUrl\(\[\{"type":"(.+?)","id":".+?"\}\],', webpage, 'type') + episode_id = self._html_search_regex(r'getPlaylistUrl\(\[\{"type":".+?","id":"(.+?)"\}\],', webpage, 'episode_id') + + data = { + 'playlist[0][type]': typ, + 'playlist[0][id]': episode_id, + 'requestUrl': compat_urllib_parse_urlparse(url).path, + 'requestSource': 'iVysilani', + } + + req = compat_urllib_request.Request('http://www.ceskatelevize.cz/ivysilani/ajax/get-playlist-url', + data=compat_urllib_parse.urlencode(data)) + + req.add_header('Content-type', 'application/x-www-form-urlencoded') + req.add_header('x-addr', '127.0.0.1') + req.add_header('X-Requested-With', 'XMLHttpRequest') + req.add_header('Referer', url) + + playlistpage = self._download_json(req, video_id) + + req = compat_urllib_request.Request(compat_urllib_parse.unquote(playlistpage['url'])) + req.add_header('Referer', url) + + playlist = self._download_xml(req, video_id) + + formats = [] + for i in playlist.find('smilRoot/body'): + if 'AD' not in i.attrib['id']: + base_url = i.attrib['base'] + parsedurl = compat_urllib_parse_urlparse(base_url) + duration = i.attrib['duration'] + + for video in i.findall('video'): + if video.attrib['label'] != 'AD': + format_id = video.attrib['label'] + play_path = video.attrib['src'] + vbr = int(video.attrib['system-bitrate']) + + formats.append({ + 'format_id': format_id, + 'url': base_url, + 'vbr': vbr, + 'play_path': play_path, + 'app': parsedurl.path[1:] + '?' + parsedurl.query, + 'rtmp_live': True, + 'ext': 'flv', + }) + + self._sort_formats(formats) + + return { + 'id': episode_id, + 'title': self._html_search_regex(r'<title>(.+?) — iVysílání — Česká televize', webpage, 'title'), + 'duration': float(duration), + 'formats': formats, + } diff --git a/youtube_dl/extractor/cinemassacre.py b/youtube_dl/extractor/cinemassacre.py index f0d08ce..496271b 100644 --- a/youtube_dl/extractor/cinemassacre.py +++ b/youtube_dl/extractor/cinemassacre.py @@ -1,84 +1,94 @@ # encoding: utf-8 +from __future__ import unicode_literals + import re from .common import InfoExtractor from ..utils import ( ExtractorError, + int_or_none, ) class CinemassacreIE(InfoExtractor): - _VALID_URL = r'(?:http://)?(?:www\.)?(?Pcinemassacre\.com/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/.+?)(?:[/?].*)?' - _TESTS = [{ - u'url': u'http://cinemassacre.com/2012/11/10/avgn-the-movie-trailer/', - u'file': u'19911.flv', - u'info_dict': { - u'upload_date': u'20121110', - u'title': u'“Angry Video Game Nerd: The Movie” – Trailer', - u'description': u'md5:fb87405fcb42a331742a0dce2708560b', - }, - u'params': { - # rtmp download - u'skip_download': True, - }, - }, - { - u'url': u'http://cinemassacre.com/2013/10/02/the-mummys-hand-1940', - u'file': u'521be8ef82b16.flv', - u'info_dict': { - u'upload_date': u'20131002', - u'title': u'The Mummy’s Hand (1940)', - }, - u'params': { - # rtmp download - u'skip_download': True, + _VALID_URL = r'http://(?:www\.)?cinemassacre\.com/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/(?P[^?#/]+)' + _TESTS = [ + { + 'url': 'http://cinemassacre.com/2012/11/10/avgn-the-movie-trailer/', + 'md5': 'fde81fbafaee331785f58cd6c0d46190', + 'info_dict': { + 'id': '19911', + 'ext': 'mp4', + 'upload_date': '20121110', + 'title': '“Angry Video Game Nerd: The Movie” – Trailer', + 'description': 'md5:fb87405fcb42a331742a0dce2708560b', + }, }, - }] + { + 'url': 'http://cinemassacre.com/2013/10/02/the-mummys-hand-1940', + 'md5': 'd72f10cd39eac4215048f62ab477a511', + 'info_dict': { + 'id': '521be8ef82b16', + 'ext': 'mp4', + 'upload_date': '20131002', + 'title': 'The Mummy’s Hand (1940)', + }, + } + ] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) + display_id = mobj.group('display_id') - webpage_url = u'http://' + mobj.group('url') - webpage = self._download_webpage(webpage_url, None) # Don't know video id yet + webpage = self._download_webpage(url, display_id) video_date = mobj.group('date_Y') + mobj.group('date_m') + mobj.group('date_d') mobj = re.search(r'src="(?Phttp://player\.screenwavemedia\.com/play/[a-zA-Z]+\.php\?id=(?:Cinemassacre-)?(?P.+?))"', webpage) if not mobj: - raise ExtractorError(u'Can\'t extract embed url and video id') - playerdata_url = mobj.group(u'embed_url') - video_id = mobj.group(u'video_id') + raise ExtractorError('Can\'t extract embed url and video id') + playerdata_url = mobj.group('embed_url') + video_id = mobj.group('video_id') - video_title = self._html_search_regex(r'(?P<title>.+?)\|', - webpage, u'title') - video_description = self._html_search_regex(r'<div class="entry-content">(?P<description>.+?)</div>', - webpage, u'description', flags=re.DOTALL, fatal=False) - if len(video_description) == 0: - video_description = None + video_title = self._html_search_regex( + r'<title>(?P<title>.+?)\|', webpage, 'title') + video_description = self._html_search_regex( + r'<div class="entry-content">(?P<description>.+?)</div>', + webpage, 'description', flags=re.DOTALL, fatal=False) - playerdata = self._download_webpage(playerdata_url, video_id) - url = self._html_search_regex(r'\'streamer\': \'(?P<url>[^\']+)\'', playerdata, u'url') + playerdata = self._download_webpage(playerdata_url, video_id, 'Downloading player webpage') + video_thumbnail = self._search_regex( + r'image: \'(?P<thumbnail>[^\']+)\'', playerdata, 'thumbnail', fatal=False) + sd_url = self._search_regex(r'file: \'([^\']+)\', label: \'SD\'', playerdata, 'sd_file') + videolist_url = self._search_regex(r'file: \'([^\']+\.smil)\'}', playerdata, 'videolist_url') - sd_file = self._html_search_regex(r'\'file\': \'(?P<sd_file>[^\']+)\'', playerdata, u'sd_file') - hd_file = self._html_search_regex(r'\'?file\'?: "(?P<hd_file>[^"]+)"', playerdata, u'hd_file') - video_thumbnail = self._html_search_regex(r'\'image\': \'(?P<thumbnail>[^\']+)\'', playerdata, u'thumbnail', fatal=False) + videolist = self._download_xml(videolist_url, video_id, 'Downloading videolist XML') - formats = [ - { - 'url': url, - 'play_path': 'mp4:' + sd_file, - 'rtmp_live': True, # workaround - 'ext': 'flv', - 'format': 'sd', - 'format_id': 'sd', - }, - { - 'url': url, - 'play_path': 'mp4:' + hd_file, - 'rtmp_live': True, # workaround - 'ext': 'flv', - 'format': 'hd', - 'format_id': 'hd', - }, - ] + formats = [] + baseurl = sd_url[:sd_url.rfind('/')+1] + for video in videolist.findall('.//video'): + src = video.get('src') + if not src: + continue + file_ = src.partition(':')[-1] + width = int_or_none(video.get('width')) + height = int_or_none(video.get('height')) + bitrate = int_or_none(video.get('system-bitrate')) + format = { + 'url': baseurl + file_, + 'format_id': src.rpartition('.')[0].rpartition('_')[-1], + } + if width or height: + format.update({ + 'tbr': bitrate // 1000 if bitrate else None, + 'width': width, + 'height': height, + }) + else: + format.update({ + 'abr': bitrate // 1000 if bitrate else None, + 'vcodec': 'none', + }) + formats.append(format) + self._sort_formats(formats) return { 'id': video_id, diff --git a/youtube_dl/extractor/clipfish.py b/youtube_dl/extractor/clipfish.py index 43efb08..669919a 100644 --- a/youtube_dl/extractor/clipfish.py +++ b/youtube_dl/extractor/clipfish.py @@ -1,22 +1,28 @@ +from __future__ import unicode_literals + import re import time import xml.etree.ElementTree from .common import InfoExtractor -from ..utils import ExtractorError +from ..utils import ( + ExtractorError, + parse_duration, +) class ClipfishIE(InfoExtractor): - IE_NAME = u'clipfish' + IE_NAME = 'clipfish' _VALID_URL = r'^https?://(?:www\.)?clipfish\.de/.*?/video/(?P<id>[0-9]+)/' _TEST = { - u'url': u'http://www.clipfish.de/special/game-trailer/video/3966754/fifa-14-e3-2013-trailer/', - u'file': u'3966754.mp4', - u'md5': u'2521cd644e862936cf2e698206e47385', - u'info_dict': { - u'title': u'FIFA 14 - E3 2013 Trailer', - u'duration': 82, + 'url': 'http://www.clipfish.de/special/game-trailer/video/3966754/fifa-14-e3-2013-trailer/', + 'md5': '2521cd644e862936cf2e698206e47385', + 'info_dict': { + 'id': '3966754', + 'ext': 'mp4', + 'title': 'FIFA 14 - E3 2013 Trailer', + 'duration': 82, }, u'skip': 'Blocked in the US' } @@ -33,21 +39,10 @@ class ClipfishIE(InfoExtractor): video_url = doc.find('filename').text if video_url is None: xml_bytes = xml.etree.ElementTree.tostring(doc) - raise ExtractorError(u'Cannot find video URL in document %r' % + raise ExtractorError('Cannot find video URL in document %r' % xml_bytes) thumbnail = doc.find('imageurl').text - duration_str = doc.find('duration').text - m = re.match( - r'^(?P<hours>[0-9]+):(?P<minutes>[0-9]{2}):(?P<seconds>[0-9]{2}):(?P<ms>[0-9]*)$', - duration_str) - if m: - duration = ( - (int(m.group('hours')) * 60 * 60) + - (int(m.group('minutes')) * 60) + - (int(m.group('seconds'))) - ) - else: - duration = None + duration = parse_duration(doc.find('duration').text) return { 'id': video_id, diff --git a/youtube_dl/extractor/clipsyndicate.py b/youtube_dl/extractor/clipsyndicate.py index 9ab6a4a..02a1667 100644 --- a/youtube_dl/extractor/clipsyndicate.py +++ b/youtube_dl/extractor/clipsyndicate.py @@ -1,3 +1,5 @@ +from __future__ import unicode_literals + import re from .common import InfoExtractor @@ -11,13 +13,14 @@ class ClipsyndicateIE(InfoExtractor): _VALID_URL = r'http://www\.clipsyndicate\.com/video/play(list/\d+)?/(?P<id>\d+)' _TEST = { - u'url': u'http://www.clipsyndicate.com/video/play/4629301/brick_briscoe', - u'md5': u'4d7d549451bad625e0ff3d7bd56d776c', - u'info_dict': { - u'id': u'4629301', - u'ext': u'mp4', - u'title': u'Brick Briscoe', - u'duration': 612, + 'url': 'http://www.clipsyndicate.com/video/play/4629301/brick_briscoe', + 'md5': '4d7d549451bad625e0ff3d7bd56d776c', + 'info_dict': { + 'id': '4629301', + 'ext': 'mp4', + 'title': 'Brick Briscoe', + 'duration': 612, + 'thumbnail': 're:^https?://.+\.jpg', }, } @@ -26,13 +29,13 @@ class ClipsyndicateIE(InfoExtractor): video_id = mobj.group('id') js_player = self._download_webpage( 'http://eplayer.clipsyndicate.com/embed/player.js?va_id=%s' % video_id, - video_id, u'Downlaoding player') + video_id, 'Downlaoding player') # it includes a required token - flvars = self._search_regex(r'flvars: "(.*?)"', js_player, u'flvars') + flvars = self._search_regex(r'flvars: "(.*?)"', js_player, 'flvars') pdoc = self._download_xml( 'http://eplayer.clipsyndicate.com/osmf/playlist?%s' % flvars, - video_id, u'Downloading video info', + video_id, 'Downloading video info', transform_source=fix_xml_ampersands) track_doc = pdoc.find('trackList/track') diff --git a/youtube_dl/extractor/clubic.py b/youtube_dl/extractor/clubic.py new file mode 100644 index 0000000..14f215c --- /dev/null +++ b/youtube_dl/extractor/clubic.py @@ -0,0 +1,58 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import json +import re + +from .common import InfoExtractor +from ..utils import ( + clean_html, + qualities, +) + + +class ClubicIE(InfoExtractor): + _VALID_URL = r'http://(?:www\.)?clubic\.com/video/[^/]+/video.*-(?P<id>[0-9]+)\.html' + + _TEST = { + 'url': 'http://www.clubic.com/video/clubic-week/video-clubic-week-2-0-le-fbi-se-lance-dans-la-photo-d-identite-448474.html', + 'md5': '1592b694ba586036efac1776b0b43cd3', + 'info_dict': { + 'id': '448474', + 'ext': 'mp4', + 'title': 'Clubic Week 2.0 : le FBI se lance dans la photo d\u0092identité', + 'description': 're:Gueule de bois chez Nokia. Le constructeur a indiqué cette.*', + 'thumbnail': 're:^http://img\.clubic\.com/.*\.jpg$', + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + player_url = 'http://player.m6web.fr/v1/player/clubic/%s.html' % video_id + player_page = self._download_webpage(player_url, video_id) + + config_json = self._search_regex( + r'(?m)M6\.Player\.config\s*=\s*(\{.+?\});$', player_page, + 'configuration') + config = json.loads(config_json) + + video_info = config['videoInfo'] + sources = config['sources'] + quality_order = qualities(['sd', 'hq']) + + formats = [{ + 'format_id': src['streamQuality'], + 'url': src['src'], + 'quality': quality_order(src['streamQuality']), + } for src in sources] + self._sort_formats(formats) + + return { + 'id': video_id, + 'title': video_info['title'], + 'formats': formats, + 'description': clean_html(video_info.get('description')), + 'thumbnail': config.get('poster'), + } diff --git a/youtube_dl/extractor/cmt.py b/youtube_dl/extractor/cmt.py index 88e0e9a..e96c59f 100644 --- a/youtube_dl/extractor/cmt.py +++ b/youtube_dl/extractor/cmt.py @@ -1,19 +1,19 @@ +from __future__ import unicode_literals from .mtv import MTVIE + class CMTIE(MTVIE): - IE_NAME = u'cmt.com' + IE_NAME = 'cmt.com' _VALID_URL = r'https?://www\.cmt\.com/videos/.+?/(?P<videoid>[^/]+)\.jhtml' _FEED_URL = 'http://www.cmt.com/sitewide/apps/player/embed/rss/' - _TESTS = [ - { - u'url': u'http://www.cmt.com/videos/garth-brooks/989124/the-call-featuring-trisha-yearwood.jhtml#artist=30061', - u'md5': u'e6b7ef3c4c45bbfae88061799bbba6c2', - u'info_dict': { - u'id': u'989124', - u'ext': u'mp4', - u'title': u'Garth Brooks - "The Call (featuring Trisha Yearwood)"', - u'description': u'Blame It All On My Roots', - }, + _TESTS = [{ + 'url': 'http://www.cmt.com/videos/garth-brooks/989124/the-call-featuring-trisha-yearwood.jhtml#artist=30061', + 'md5': 'e6b7ef3c4c45bbfae88061799bbba6c2', + 'info_dict': { + 'id': '989124', + 'ext': 'mp4', + 'title': 'Garth Brooks - "The Call (featuring Trisha Yearwood)"', + 'description': 'Blame It All On My Roots', }, - ] + }] diff --git a/youtube_dl/extractor/cnet.py b/youtube_dl/extractor/cnet.py new file mode 100644 index 0000000..a94f425 --- /dev/null +++ b/youtube_dl/extractor/cnet.py @@ -0,0 +1,75 @@ +# coding: utf-8 +from __future__ import unicode_literals + +import json +import re + +from .common import InfoExtractor +from ..utils import ( + ExtractorError, + int_or_none, +) + + +class CNETIE(InfoExtractor): + _VALID_URL = r'https?://(?:www\.)?cnet\.com/videos/(?P<id>[^/]+)/' + _TEST = { + 'url': 'http://www.cnet.com/videos/hands-on-with-microsofts-windows-8-1-update/', + 'md5': '041233212a0d06b179c87cbcca1577b8', + 'info_dict': { + 'id': '56f4ea68-bd21-4852-b08c-4de5b8354c60', + 'ext': 'mp4', + 'title': 'Hands-on with Microsoft Windows 8.1 Update', + 'description': 'The new update to the Windows 8 OS brings improved performance for mouse and keyboard users.', + 'thumbnail': 're:^http://.*/flmswindows8.jpg$', + 'uploader_id': 'sarah.mitroff@cbsinteractive.com', + 'uploader': 'Sarah Mitroff', + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + display_id = mobj.group('id') + + webpage = self._download_webpage(url, display_id) + data_json = self._html_search_regex( + r"<div class=\"cnetVideoPlayer\"\s+.*?data-cnet-video-options='([^']+)'", + webpage, 'data json') + data = json.loads(data_json) + vdata = data['video'] + if not vdata: + vdata = data['videos'][0] + if not vdata: + raise ExtractorError('Cannot find video data') + + video_id = vdata['id'] + title = vdata['headline'] + description = vdata.get('dek') + thumbnail = vdata.get('image', {}).get('path') + author = vdata.get('author') + if author: + uploader = '%s %s' % (author['firstName'], author['lastName']) + uploader_id = author.get('email') + else: + uploader = None + uploader_id = None + + formats = [{ + 'format_id': '%s-%s-%s' % ( + f['type'], f['format'], + int_or_none(f.get('bitrate'), 1000, default='')), + 'url': f['uri'], + 'tbr': int_or_none(f.get('bitrate'), 1000), + } for f in vdata['files']['data']] + self._sort_formats(formats) + + return { + 'id': video_id, + 'display_id': display_id, + 'title': title, + 'formats': formats, + 'description': description, + 'uploader': uploader, + 'uploader_id': uploader_id, + 'thumbnail': thumbnail, + } diff --git a/youtube_dl/extractor/cnn.py b/youtube_dl/extractor/cnn.py index b32cb89..dae40c1 100644 --- a/youtube_dl/extractor/cnn.py +++ b/youtube_dl/extractor/cnn.py @@ -79,8 +79,11 @@ class CNNIE(InfoExtractor): self._sort_formats(formats) - thumbnails = sorted([((int(t.attrib['height']),int(t.attrib['width'])), t.text) for t in info.findall('images/image')]) - thumbs_dict = [{'resolution': res, 'url': t_url} for (res, t_url) in thumbnails] + thumbnails = [{ + 'height': int(t.attrib['height']), + 'width': int(t.attrib['width']), + 'url': t.text, + } for t in info.findall('images/image')] metas_el = info.find('metas') upload_date = ( @@ -93,8 +96,7 @@ class CNNIE(InfoExtractor): 'id': info.attrib['id'], 'title': info.find('headline').text, 'formats': formats, - 'thumbnail': thumbnails[-1][1], - 'thumbnails': thumbs_dict, + 'thumbnails': thumbnails, 'description': info.find('description').text, 'duration': duration, 'upload_date': upload_date, diff --git a/youtube_dl/extractor/collegehumor.py b/youtube_dl/extractor/collegehumor.py index 10c925d..6f866e7 100644 --- a/youtube_dl/extractor/collegehumor.py +++ b/youtube_dl/extractor/collegehumor.py @@ -17,8 +17,9 @@ class CollegeHumorIE(InfoExtractor): 'id': '6902724', 'ext': 'mp4', 'title': 'Comic-Con Cosplay Catastrophe', - 'description': 'Fans get creative this year', + 'description': "Fans get creative this year at San Diego. Too creative. And yes, that's really Joss Whedon.", 'age_limit': 13, + 'duration': 187, }, }, { @@ -28,22 +29,22 @@ class CollegeHumorIE(InfoExtractor): 'id': '3505939', 'ext': 'mp4', 'title': 'Font Conference', - 'description': 'This video wasn\'t long enough,', + 'description': "This video wasn't long enough, so we made it double-spaced.", 'age_limit': 10, 'duration': 179, }, }, # embedded youtube video { - 'url': 'http://www.collegehumor.com/embed/6950457', + 'url': 'http://www.collegehumor.com/embed/6950306', 'info_dict': { - 'id': 'W5gMp3ZjYg4', + 'id': 'Z-bao9fg6Yc', 'ext': 'mp4', - 'title': 'Funny Dogs Protecting Babies Compilation 2014 [NEW HD]', - 'uploader': 'Funnyplox TV', - 'uploader_id': 'funnyploxtv', - 'description': 'md5:7ded37421526d54afdf005e25bc2b7a3', - 'upload_date': '20140128', + 'title': 'Young Americans Think President John F. Kennedy Died THIS MORNING IN A CAR ACCIDENT!!!', + 'uploader': 'Mark Dice', + 'uploader_id': 'MarkDice', + 'description': 'md5:62c3dab9351fac7bb44b53b69511d87f', + 'upload_date': '20140127', }, 'params': { 'skip_download': True, @@ -87,6 +88,7 @@ class CollegeHumorIE(InfoExtractor): self._sort_formats(formats) duration = int_or_none(vdata.get('duration'), 1000) + like_count = int_or_none(vdata.get('likes')) return { 'id': video_id, @@ -96,4 +98,5 @@ class CollegeHumorIE(InfoExtractor): 'formats': formats, 'age_limit': age_limit, 'duration': duration, + 'like_count': like_count, } diff --git a/youtube_dl/extractor/comedycentral.py b/youtube_dl/extractor/comedycentral.py index ed3986f..ba4d73a 100644 --- a/youtube_dl/extractor/comedycentral.py +++ b/youtube_dl/extractor/comedycentral.py @@ -7,21 +7,21 @@ from .mtv import MTVServicesInfoExtractor from ..utils import ( compat_str, compat_urllib_parse, - ExtractorError, + float_or_none, unified_strdate, ) class ComedyCentralIE(MTVServicesInfoExtractor): - _VALID_URL = r'''(?x)https?://(?:www\.)?comedycentral\.com/ + _VALID_URL = r'''(?x)https?://(?:www\.)?(comedycentral|cc)\.com/ (video-clips|episodes|cc-studios|video-collections) /(?P<title>.*)''' _FEED_URL = 'http://comedycentral.com/feeds/mrss/' _TEST = { 'url': 'http://www.comedycentral.com/video-clips/kllhuv/stand-up-greg-fitzsimmons--uncensored---too-good-of-a-mother', - 'md5': '4167875aae411f903b751a21f357f1ee', + 'md5': 'c4f48e9eda1b16dd10add0744344b6d8', 'info_dict': { 'id': 'cef0cbb3-e776-4bc9-b62e-8016deccb354', 'ext': 'mp4', @@ -32,31 +32,34 @@ class ComedyCentralIE(MTVServicesInfoExtractor): class ComedyCentralShowsIE(InfoExtractor): - IE_DESC = 'The Daily Show / Colbert Report' + IE_DESC = 'The Daily Show / The Colbert Report' # urls can be abbreviations like :thedailyshow or :colbert # urls for episodes like: # or urls for clips like: http://www.thedailyshow.com/watch/mon-december-10-2012/any-given-gun-day # or: http://www.colbertnation.com/the-colbert-report-videos/421667/november-29-2012/moon-shattering-news # or: http://www.colbertnation.com/the-colbert-report-collections/422008/festival-of-lights/79524 - _VALID_URL = r"""^(:(?P<shortname>tds|thedailyshow|cr|colbert|colbertnation|colbertreport) - |(https?://)?(www\.)? - (?P<showname>thedailyshow|colbertnation)\.com/ - (full-episodes/(?P<episode>.*)| + _VALID_URL = r'''(?x)^(:(?P<shortname>tds|thedailyshow|cr|colbert|colbertnation|colbertreport) + |https?://(:www\.)? + (?P<showname>thedailyshow|thecolbertreport)\.(?:cc\.)?com/ + ((?:full-)?episodes/(?:[0-9a-z]{6}/)?(?P<episode>.*)| (?P<clip> - (the-colbert-report-(videos|collections)/(?P<clipID>[0-9]+)/[^/]*/(?P<cntitle>.*?)) - |(watch/(?P<date>[^/]*)/(?P<tdstitle>.*)))| + (?:(?:guests/[^/]+|videos|video-playlists|special-editions)/[^/]+/(?P<videotitle>[^/?#]+)) + |(the-colbert-report-(videos|collections)/(?P<clipID>[0-9]+)/[^/]*/(?P<cntitle>.*?)) + |(watch/(?P<date>[^/]*)/(?P<tdstitle>.*)) + )| (?P<interview> - extended-interviews/(?P<interID>[0-9]+)/playlist_tds_extended_(?P<interview_title>.*?)/.*?))) - $""" + extended-interviews/(?P<interID>[0-9a-z]+)/(?:playlist_tds_extended_)?(?P<interview_title>.*?)(/.*?)?))) + (?:[?#].*|$)''' _TEST = { - 'url': 'http://www.thedailyshow.com/watch/thu-december-13-2012/kristen-stewart', - 'file': '422212.mp4', + 'url': 'http://thedailyshow.cc.com/watch/thu-december-13-2012/kristen-stewart', 'md5': '4e2f5cb088a83cd8cdb7756132f9739d', 'info_dict': { - "upload_date": "20121214", - "description": "Kristen Stewart", - "uploader": "thedailyshow", - "title": "thedailyshow-kristen-stewart part 1" + 'id': 'ab9ab3e7-5a98-4dbe-8b21-551dc0523d55', + 'ext': 'mp4', + 'upload_date': '20121213', + 'description': 'Kristen Stewart learns to let loose in "On the Road."', + 'uploader': 'thedailyshow', + 'title': 'thedailyshow kristen-stewart part 1', } } @@ -79,11 +82,6 @@ class ComedyCentralShowsIE(InfoExtractor): '400': (384, 216), } - @classmethod - def suitable(cls, url): - """Receives a URL and returns True if suitable for this IE.""" - return re.match(cls._VALID_URL, url, re.VERBOSE) is not None - @staticmethod def _transform_rtmp_url(rtmp_video_url): m = re.match(r'^rtmpe?://.*?/(?P<finalid>gsp\.comedystor/.*)$', rtmp_video_url) @@ -99,14 +97,16 @@ class ComedyCentralShowsIE(InfoExtractor): if mobj.group('shortname'): if mobj.group('shortname') in ('tds', 'thedailyshow'): - url = 'http://www.thedailyshow.com/full-episodes/' + url = 'http://thedailyshow.cc.com/full-episodes/' else: - url = 'http://www.colbertnation.com/full-episodes/' + url = 'http://thecolbertreport.cc.com/full-episodes/' mobj = re.match(self._VALID_URL, url, re.VERBOSE) assert mobj is not None if mobj.group('clip'): - if mobj.group('showname') == 'thedailyshow': + if mobj.group('videotitle'): + epTitle = mobj.group('videotitle') + elif mobj.group('showname') == 'thedailyshow': epTitle = mobj.group('tdstitle') else: epTitle = mobj.group('cntitle') @@ -120,9 +120,9 @@ class ComedyCentralShowsIE(InfoExtractor): epTitle = mobj.group('showname') else: epTitle = mobj.group('episode') + show_name = mobj.group('showname') - self.report_extraction(epTitle) - webpage,htmlHandle = self._download_webpage_handle(url, epTitle) + webpage, htmlHandle = self._download_webpage_handle(url, epTitle) if dlNewest: url = htmlHandle.geturl() mobj = re.match(self._VALID_URL, url, re.VERBOSE) @@ -130,71 +130,86 @@ class ComedyCentralShowsIE(InfoExtractor): raise ExtractorError('Invalid redirected URL: ' + url) if mobj.group('episode') == '': raise ExtractorError('Redirected URL is still not specific: ' + url) - epTitle = mobj.group('episode') + epTitle = mobj.group('episode').rpartition('/')[-1] mMovieParams = re.findall('(?:<param name="movie" value="|var url = ")(http://media.mtvnservices.com/([^"]*(?:episode|video).*?:.*?))"', webpage) - if len(mMovieParams) == 0: # The Colbert Report embeds the information in a without # a URL prefix; so extract the alternate reference # and then add the URL prefix manually. - altMovieParams = re.findall('data-mgid="([^"]*(?:episode|video).*?:.*?)"', webpage) + altMovieParams = re.findall('data-mgid="([^"]*(?:episode|video|playlist).*?:.*?)"', webpage) if len(altMovieParams) == 0: raise ExtractorError('unable to find Flash URL in webpage ' + url) else: mMovieParams = [("http://media.mtvnservices.com/" + altMovieParams[0], altMovieParams[0])] uri = mMovieParams[0][1] - indexUrl = 'http://shadow.comedycentral.com/feeds/video_player/mrss/?' + compat_urllib_parse.urlencode({'uri': uri}) - idoc = self._download_xml(indexUrl, epTitle, - 'Downloading show index', - 'unable to download episode index') - - results = [] - - itemEls = idoc.findall('.//item') - for partNum,itemEl in enumerate(itemEls): - mediaId = itemEl.findall('./guid')[0].text - shortMediaId = mediaId.split(':')[-1] - showId = mediaId.split(':')[-2].replace('.com', '') - officialTitle = itemEl.findall('./title')[0].text - officialDate = unified_strdate(itemEl.findall('./pubDate')[0].text) - - configUrl = ('http://www.comedycentral.com/global/feeds/entertainment/media/mediaGenEntertainment.jhtml?' + - compat_urllib_parse.urlencode({'uri': mediaId})) - cdoc = self._download_xml(configUrl, epTitle, - 'Downloading configuration for %s' % shortMediaId) + # Correct cc.com in uri + uri = re.sub(r'(episode:[^.]+)(\.cc)?\.com', r'\1.cc.com', uri) + + index_url = 'http://%s.cc.com/feeds/mrss?%s' % (show_name, compat_urllib_parse.urlencode({'uri': uri})) + idoc = self._download_xml( + index_url, epTitle, + 'Downloading show index', 'Unable to download episode index') + + title = idoc.find('./channel/title').text + description = idoc.find('./channel/description').text + + entries = [] + item_els = idoc.findall('.//item') + for part_num, itemEl in enumerate(item_els): + upload_date = unified_strdate(itemEl.findall('./pubDate')[0].text) + thumbnail = itemEl.find('.//{http://search.yahoo.com/mrss/}thumbnail').attrib.get('url') + + content = itemEl.find('.//{http://search.yahoo.com/mrss/}content') + duration = float_or_none(content.attrib.get('duration')) + mediagen_url = content.attrib['url'] + guid = itemEl.find('./guid').text.rpartition(':')[-1] + + cdoc = self._download_xml( + mediagen_url, epTitle, + 'Downloading configuration for segment %d / %d' % (part_num + 1, len(item_els))) turls = [] for rendition in cdoc.findall('.//rendition'): finfo = (rendition.attrib['bitrate'], rendition.findall('./src')[0].text) turls.append(finfo) - if len(turls) == 0: - self._downloader.report_error('unable to download ' + mediaId + ': No videos found') - continue - formats = [] for format, rtmp_video_url in turls: w, h = self._video_dimensions.get(format, (None, None)) formats.append({ + 'format_id': 'vhttp-%s' % format, 'url': self._transform_rtmp_url(rtmp_video_url), 'ext': self._video_extensions.get(format, 'mp4'), - 'format_id': format, 'height': h, 'width': w, }) + formats.append({ + 'format_id': 'rtmp-%s' % format, + 'url': rtmp_video_url.replace('viacomccstrm', 'viacommtvstrm'), + 'ext': self._video_extensions.get(format, 'mp4'), + 'height': h, + 'width': w, + }) + self._sort_formats(formats) - effTitle = showId + '-' + epTitle + ' part ' + compat_str(partNum+1) - results.append({ - 'id': shortMediaId, + virtual_id = show_name + ' ' + epTitle + ' part ' + compat_str(part_num + 1) + entries.append({ + 'id': guid, + 'title': virtual_id, 'formats': formats, - 'uploader': showId, - 'upload_date': officialDate, - 'title': effTitle, - 'thumbnail': None, - 'description': compat_str(officialTitle), + 'uploader': show_name, + 'upload_date': upload_date, + 'duration': duration, + 'thumbnail': thumbnail, + 'description': description, }) - return results + return { + '_type': 'playlist', + 'entries': entries, + 'title': show_name + ' ' + title, + 'description': description, + } diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index 84fca8b..49e7540 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -74,7 +74,7 @@ class InfoExtractor(object): "http", "https", "rtsp", "rtmp", "m3u8" or so. * preference Order number of this format. If this field is present and not None, the formats get sorted - by this field. + by this field, regardless of all other values. -1 for default (order by other properties), -2 or smaller for less than default. * quality Order number of the video quality of this @@ -88,12 +88,22 @@ class InfoExtractor(object): The following fields are optional: - thumbnails: A list of dictionaries (with the entries "resolution" and - "url") for the varying thumbnails + display_id An alternative identifier for the video, not necessarily + unique, but available before title. Typically, id is + something like "4234987", title "Dancing naked mole rats", + and display_id "dancing-naked-mole-rats" + thumbnails: A list of dictionaries, with the following entries: + * "url" + * "width" (optional, int) + * "height" (optional, int) + * "resolution" (optional, string "{width}x{height"}, + deprecated) thumbnail: Full URL to a video thumbnail image. description: One-line video description. uploader: Full name of the video uploader. + timestamp: UNIX timestamp of the moment the video became available. upload_date: Video upload date (YYYYMMDD). + If not explicitly set, calculated from timestamp. uploader_id: Nickname or id of the video uploader. location: Physical location of the video. subtitles: The subtitle file contents as a dictionary in the format @@ -107,6 +117,8 @@ class InfoExtractor(object): webpage_url: The url to the video webpage, if given to youtube-dl it should allow to get the same result again. (It will be set by YoutubeDL if it's missing) + categories: A list of categories that the video falls in, for example + ["Sports", "Berlin"] Unless mentioned otherwise, the fields should be Unicode strings. @@ -114,9 +126,6 @@ class InfoExtractor(object): _real_extract() methods and define a _VALID_URL regexp. Probably, they should also be added to the list of extractors. - _real_extract() must return a *list* of information dictionaries as - described above. - Finally, the _WORKING attribute should be set to False for broken IEs in order to warn the users and skip the tests. """ @@ -239,16 +248,31 @@ class InfoExtractor(object): url = url_or_request.get_full_url() except AttributeError: url = url_or_request - if len(url) > 200: - h = u'___' + hashlib.md5(url.encode('utf-8')).hexdigest() - url = url[:200 - len(h)] + h - raw_filename = ('%s_%s.dump' % (video_id, url)) + basen = '%s_%s' % (video_id, url) + if len(basen) > 240: + h = u'___' + hashlib.md5(basen.encode('utf-8')).hexdigest() + basen = basen[:240 - len(h)] + h + raw_filename = basen + '.dump' filename = sanitize_filename(raw_filename, restricted=True) self.to_screen(u'Saving request to ' + filename) with open(filename, 'wb') as outf: outf.write(webpage_bytes) - content = webpage_bytes.decode(encoding, 'replace') + try: + content = webpage_bytes.decode(encoding, 'replace') + except LookupError: + content = webpage_bytes.decode('utf-8', 'replace') + + if (u'<title>Access to this site is blocked' in content and + u'Websense' in content[:512]): + msg = u'Access to this webpage has been blocked by Websense filtering software in your network.' + blocked_iframe = self._html_search_regex( + r'', start_page, 'xml root', None, False) + + if xml_root is None: + # Probably need to authenticate + start_page = self._login(webpage_url, video_id) + if start_page is None: + self.report_warning('Could not login.') + else: + # Grab the url from the authenticated page + xml_root = self._html_search_regex(r'', start_page, 'xml filename', None, False) + if xml_name is None: + # Fallback to the older format + xml_name = self._html_search_regex(r'', page) - - if not mobj: - raise ExtractorError('No media found') - - video_type = mobj.group('type') video_id = mobj.group('id') + page = self._download_webpage('http://www.vesti.ru/only_video.html?vid=%s' % video_id, video_id, + 'Downloading video page') - json_data = self._download_json( - 'http://player.rutv.ru/iframe/%splay/id/%s' % ('live-' if video_type == 'live' else '', video_id), - video_id, 'Downloading JSON') - - if json_data['errors']: - raise ExtractorError('vesti returned error: %s' % json_data['errors'], expected=True) - - playlist = json_data['data']['playlist'] - medialist = playlist['medialist'] - media = medialist[0] - - if media['errors']: - raise ExtractorError('vesti returned error: %s' % media['errors'], expected=True) - - view_count = playlist.get('count_views') - priority_transport = playlist['priority_transport'] - - thumbnail = media['picture'] - width = media['width'] - height = media['height'] - description = media['anons'] - title = media['title'] - duration = int_or_none(media.get('duration')) - - formats = [] - - for transport, links in media['sources'].items(): - for quality, url in links.items(): - if transport == 'rtmp': - mobj = re.search(r'^(?Prtmp://[^/]+/(?P.+))/(?P.+)$', url) - if not mobj: - continue - fmt = { - 'url': mobj.group('url'), - 'play_path': mobj.group('playpath'), - 'app': mobj.group('app'), - 'page_url': 'http://player.rutv.ru', - 'player_url': 'http://player.rutv.ru/flash2v/osmf.swf?i=22', - 'rtmp_live': True, - 'ext': 'flv', - 'vbr': int(quality), - } - elif transport == 'm3u8': - fmt = { - 'url': url, - 'ext': 'mp4', - } - else: - fmt = { - 'url': url - } - fmt.update({ - 'width': width, - 'height': height, - 'format_id': '%s-%s' % (transport, quality), - 'preference': -1 if priority_transport == transport else -2, - }) - formats.append(fmt) - - if not formats: - raise ExtractorError('No media links available for %s' % video_id) - - self._sort_formats(formats) + rutv_url = RUTVIE._extract_url(page) + if rutv_url: + return self.url_result(rutv_url, 'RUTV') - return { - 'id': video_id, - 'title': title, - 'description': description, - 'thumbnail': thumbnail, - 'view_count': view_count, - 'duration': duration, - 'formats': formats, - } \ No newline at end of file + raise ExtractorError('No video found', expected=True) \ No newline at end of file diff --git a/youtube_dl/extractor/vevo.py b/youtube_dl/extractor/vevo.py index e458ac9..eada13c 100644 --- a/youtube_dl/extractor/vevo.py +++ b/youtube_dl/extractor/vevo.py @@ -2,7 +2,6 @@ from __future__ import unicode_literals import re import xml.etree.ElementTree -import datetime from .common import InfoExtractor from ..utils import ( @@ -17,22 +16,55 @@ class VevoIE(InfoExtractor): (currently used by MTVIE) """ _VALID_URL = r'''(?x) - (?:https?://www\.vevo\.com/watch/(?:[^/]+/[^/]+/)?| + (?:https?://www\.vevo\.com/watch/(?:[^/]+/(?:[^/]+/)?)?| https?://cache\.vevo\.com/m/html/embed\.html\?video=| https?://videoplayer\.vevo\.com/embed/embedded\?videoId=| vevo:) (?P[^&?#]+)''' + _TESTS = [{ 'url': 'http://www.vevo.com/watch/hurts/somebody-to-die-for/GB1101300280', - 'file': 'GB1101300280.mp4', "md5": "06bea460acb744eab74a9d7dcb4bfd61", 'info_dict': { + 'id': 'GB1101300280', + 'ext': 'mp4', "upload_date": "20130624", "uploader": "Hurts", "title": "Somebody to Die For", "duration": 230.12, "width": 1920, "height": 1080, + # timestamp and upload_date are often incorrect; seem to change randomly + 'timestamp': int, + } + }, { + 'note': 'v3 SMIL format', + 'url': 'http://www.vevo.com/watch/cassadee-pope/i-wish-i-could-break-your-heart/USUV71302923', + 'md5': '893ec0e0d4426a1d96c01de8f2bdff58', + 'info_dict': { + 'id': 'USUV71302923', + 'ext': 'mp4', + 'upload_date': '20140219', + 'uploader': 'Cassadee Pope', + 'title': 'I Wish I Could Break Your Heart', + 'duration': 226.101, + 'age_limit': 0, + 'timestamp': int, + } + }, { + 'note': 'Age-limited video', + 'url': 'https://www.vevo.com/watch/justin-timberlake/tunnel-vision-explicit/USRV81300282', + 'info_dict': { + 'id': 'USRV81300282', + 'ext': 'mp4', + 'age_limit': 18, + 'title': 'Tunnel Vision (Explicit)', + 'uploader': 'Justin Timberlake', + 'upload_date': 're:2013070[34]', + 'timestamp': int, + }, + 'params': { + 'skip_download': 'true', } }] _SMIL_BASE_URL = 'http://smil.lvl3.vevo.com/' @@ -102,12 +134,40 @@ class VevoIE(InfoExtractor): video_id = mobj.group('id') json_url = 'http://videoplayer.vevo.com/VideoService/AuthenticateVideo?isrc=%s' % video_id - video_info = self._download_json(json_url, video_id)['video'] + response = self._download_json(json_url, video_id) + video_info = response['video'] + + if not video_info: + if 'statusMessage' in response: + raise ExtractorError('%s said: %s' % (self.IE_NAME, response['statusMessage']), expected=True) + raise ExtractorError('Unable to extract videos') formats = self._formats_from_json(video_info) + + is_explicit = video_info.get('isExplicit') + if is_explicit is True: + age_limit = 18 + elif is_explicit is False: + age_limit = 0 + else: + age_limit = None + + # Download SMIL + smil_blocks = sorted(( + f for f in video_info['videoVersions'] + if f['sourceType'] == 13), + key=lambda f: f['version']) + + smil_url = '%s/Video/V2/VFILE/%s/%sr.smil' % ( + self._SMIL_BASE_URL, video_id, video_id.lower()) + if smil_blocks: + smil_url_m = self._search_regex( + r'url="([^"]+)"', smil_blocks[-1]['data'], 'SMIL URL', + fatal=False) + if smil_url_m is not None: + smil_url = smil_url_m + try: - smil_url = '%s/Video/V2/VFILE/%s/%sr.smil' % ( - self._SMIL_BASE_URL, video_id, video_id.lower()) smil_xml = self._download_webpage(smil_url, video_id, 'Downloading SMIL info') formats.extend(self._formats_from_smil(smil_xml)) @@ -119,13 +179,14 @@ class VevoIE(InfoExtractor): timestamp_ms = int(self._search_regex( r'/Date\((\d+)\)/', video_info['launchDate'], 'launch date')) - upload_date = datetime.datetime.fromtimestamp(timestamp_ms // 1000) + return { 'id': video_id, 'title': video_info['title'], 'formats': formats, 'thumbnail': video_info['imageUrl'], - 'upload_date': upload_date.strftime('%Y%m%d'), + 'timestamp': timestamp_ms // 1000, 'uploader': video_info['mainArtists'][0]['artistName'], 'duration': video_info['duration'], + 'age_limit': age_limit, } diff --git a/youtube_dl/extractor/vh1.py b/youtube_dl/extractor/vh1.py new file mode 100644 index 0000000..2f77e38 --- /dev/null +++ b/youtube_dl/extractor/vh1.py @@ -0,0 +1,124 @@ +from __future__ import unicode_literals + +from .mtv import MTVIE + +import re +from ..utils import fix_xml_ampersands + + +class VH1IE(MTVIE): + IE_NAME = 'vh1.com' + _FEED_URL = 'http://www.vh1.com/player/embed/AS3/fullepisode/rss/' + _TESTS = [{ + 'url': 'http://www.vh1.com/video/metal-evolution/full-episodes/progressive-metal/1678612/playlist.jhtml', + 'playlist': [ + { + 'md5': '7827a7505f59633983165bbd2c119b52', + 'info_dict': { + 'id': '731565', + 'ext': 'mp4', + 'title': 'Metal Evolution: Ep. 11 Act 1', + 'description': 'Many rock academics have proclaimed that the truly progressive musicianship of the last 20 years has been found right here in the world of heavy metal, rather than obvious locales such as jazz, fusion or progressive rock. It stands to reason then, that much of this jaw-dropping virtuosity occurs within what\'s known as progressive metal, a genre that takes root with the likes of Rush in the \'70s, Queensryche and Fates Warning in the \'80s, and Dream Theater in the \'90s. Since then, the genre has exploded with creativity, spawning mind-bending, genre-defying acts such as Tool, Mastodon, Coheed And Cambria, Porcupine Tree, Meshuggah, A Perfect Circle and Opeth. Episode 12 looks at the extreme musicianship of these bands, as well as their often extreme literary prowess and conceptual strength, the end result being a rich level of respect and attention such challenging acts have brought upon the world of heavy metal, from a critical community usually dismissive of the form.' + } + }, + { + 'md5': '34fb4b7321c546b54deda2102a61821f', + 'info_dict': { + 'id': '731567', + 'ext': 'mp4', + 'title': 'Metal Evolution: Ep. 11 Act 2', + 'description': 'Many rock academics have proclaimed that the truly progressive musicianship of the last 20 years has been found right here in the world of heavy metal, rather than obvious locales such as jazz, fusion or progressive rock. It stands to reason then, that much of this jaw-dropping virtuosity occurs within what\'s known as progressive metal, a genre that takes root with the likes of Rush in the \'70s, Queensryche and Fates Warning in the \'80s, and Dream Theater in the \'90s. Since then, the genre has exploded with creativity, spawning mind-bending, genre-defying acts such as Tool, Mastodon, Coheed And Cambria, Porcupine Tree, Meshuggah, A Perfect Circle and Opeth. Episode 11 looks at the extreme musicianship of these bands, as well as their often extreme literary prowess and conceptual strength, the end result being a rich level of respect and attention such challenging acts have brought upon the world of heavy metal, from a critical community usually dismissive of the form.' + } + }, + { + 'md5': '813f38dba4c1b8647196135ebbf7e048', + 'info_dict': { + 'id': '731568', + 'ext': 'mp4', + 'title': 'Metal Evolution: Ep. 11 Act 3', + 'description': 'Many rock academics have proclaimed that the truly progressive musicianship of the last 20 years has been found right here in the world of heavy metal, rather than obvious locales such as jazz, fusion or progressive rock. It stands to reason then, that much of this jaw-dropping virtuosity occurs within what\'s known as progressive metal, a genre that takes root with the likes of Rush in the \'70s, Queensryche and Fates Warning in the \'80s, and Dream Theater in the \'90s. Since then, the genre has exploded with creativity, spawning mind-bending, genre-defying acts such as Tool, Mastodon, Coheed And Cambria, Porcupine Tree, Meshuggah, A Perfect Circle and Opeth. Episode 11 looks at the extreme musicianship of these bands, as well as their often extreme literary prowess and conceptual strength, the end result being a rich level of respect and attention such challenging acts have brought upon the world of heavy metal, from a critical community usually dismissive of the form.' + } + }, + { + 'md5': '51adb72439dfaed11c799115d76e497f', + 'info_dict': { + 'id': '731569', + 'ext': 'mp4', + 'title': 'Metal Evolution: Ep. 11 Act 4', + 'description': 'Many rock academics have proclaimed that the truly progressive musicianship of the last 20 years has been found right here in the world of heavy metal, rather than obvious locales such as jazz, fusion or progressive rock. It stands to reason then, that much of this jaw-dropping virtuosity occurs within what\'s known as progressive metal, a genre that takes root with the likes of Rush in the \'70s, Queensryche and Fates Warning in the \'80s, and Dream Theater in the \'90s. Since then, the genre has exploded with creativity, spawning mind-bending, genre-defying acts such as Tool, Mastodon, Coheed And Cambria, Porcupine Tree, Meshuggah, A Perfect Circle and Opeth. Episode 11 looks at the extreme musicianship of these bands, as well as their often extreme literary prowess and conceptual strength, the end result being a rich level of respect and attention such challenging acts have brought upon the world of heavy metal, from a critical community usually dismissive of the form.' + } + }, + { + 'md5': '93d554aaf79320703b73a95288c76a6e', + 'info_dict': { + 'id': '731570', + 'ext': 'mp4', + 'title': 'Metal Evolution: Ep. 11 Act 5', + 'description': 'Many rock academics have proclaimed that the truly progressive musicianship of the last 20 years has been found right here in the world of heavy metal, rather than obvious locales such as jazz, fusion or progressive rock. It stands to reason then, that much of this jaw-dropping virtuosity occurs within what\'s known as progressive metal, a genre that takes root with the likes of Rush in the \'70s, Queensryche and Fates Warning in the \'80s, and Dream Theater in the \'90s. Since then, the genre has exploded with creativity, spawning mind-bending, genre-defying acts such as Tool, Mastodon, Coheed And Cambria, Porcupine Tree, Meshuggah, A Perfect Circle and Opeth. Episode 11 looks at the extreme musicianship of these bands, as well as their often extreme literary prowess and conceptual strength, the end result being a rich level of respect and attention such challenging acts have brought upon the world of heavy metal, from a critical community usually dismissive of the form.' + } + } + ], + 'skip': 'Blocked outside the US', + }, { + # Clip + 'url': 'http://www.vh1.com/video/misc/706675/metal-evolution-episode-1-pre-metal-show-clip.jhtml#id=1674118', + 'md5': '7d67cf6d9cdc6b4f3d3ac97a55403844', + 'info_dict': { + 'id': '706675', + 'ext': 'mp4', + 'title': 'Metal Evolution: Episode 1 Pre-Metal Show Clip', + 'description': 'The greatest documentary ever made about Heavy Metal begins as our host Sam Dunn travels the globe to seek out the origins and influences that helped create Heavy Metal. Sam speaks to legends like Kirk Hammett, Alice Cooper, Slash, Bill Ward, Geezer Butler, Tom Morello, Ace Frehley, Lemmy Kilmister, Dave Davies, and many many more. This episode is the prologue for the 11 hour series, and Sam goes back to the very beginning to reveal how Heavy Metal was created.' + }, + 'skip': 'Blocked outside the US', + }, { + # Short link + 'url': 'http://www.vh1.com/video/play.jhtml?id=1678353', + 'md5': '853192b87ad978732b67dd8e549b266a', + 'info_dict': { + 'id': '730355', + 'ext': 'mp4', + 'title': 'Metal Evolution: Episode 11 Progressive Metal Sneak', + 'description': 'In Metal Evolution\'s finale sneak, Sam sits with Michael Giles of King Crimson and gets feedback from Metallica guitarist Kirk Hammett on why the group was influential.' + }, + 'skip': 'Blocked outside the US', + }, { + 'url': 'http://www.vh1.com/video/macklemore-ryan-lewis/900535/cant-hold-us-ft-ray-dalton.jhtml', + 'md5': 'b1bcb5b4380c9d7f544065589432dee7', + 'info_dict': { + 'id': '900535', + 'ext': 'mp4', + 'title': 'Macklemore & Ryan Lewis - "Can\'t Hold Us ft. Ray Dalton"', + 'description': 'The Heist' + }, + 'skip': 'Blocked outside the US', + }] + + _VALID_URL = r'''(?x) + https?://www\.vh1\.com/video/ + (?: + .+?/full-episodes/.+?/(?P[^/]+)/playlist\.jhtml + | + (?: + play.jhtml\?id=| + misc/.+?/.+?\.jhtml\#id= + ) + (?P[0-9]+)$ + | + [^/]+/(?P[0-9]+)/[^/]+? + ) + ''' + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + if mobj.group('music_id'): + id_field = 'vid' + video_id = mobj.group('music_id') + else: + video_id = mobj.group('playlist_id') or mobj.group('video_id') + id_field = 'id' + doc_url = '%s?%s=%s' % (self._FEED_URL, id_field, video_id) + + idoc = self._download_xml( + doc_url, video_id, + 'Downloading info', transform_source=fix_xml_ampersands) + return [self._get_video_info(item) for item in idoc.findall('.//item')] diff --git a/youtube_dl/extractor/vice.py b/youtube_dl/extractor/vice.py deleted file mode 100644 index 87812d6..0000000 --- a/youtube_dl/extractor/vice.py +++ /dev/null @@ -1,38 +0,0 @@ -import re - -from .common import InfoExtractor -from .ooyala import OoyalaIE -from ..utils import ExtractorError - - -class ViceIE(InfoExtractor): - _VALID_URL = r'http://www\.vice\.com/.*?/(?P.+)' - - _TEST = { - u'url': u'http://www.vice.com/Fringes/cowboy-capitalists-part-1', - u'file': u'43cW1mYzpia9IlestBjVpd23Yu3afAfp.mp4', - u'info_dict': { - u'title': u'VICE_COWBOYCAPITALISTS_PART01_v1_VICE_WM_1080p.mov', - }, - u'params': { - # Requires ffmpeg (m3u8 manifest) - u'skip_download': True, - }, - } - - def _real_extract(self, url): - mobj = re.match(self._VALID_URL, url) - name = mobj.group('name') - webpage = self._download_webpage(url, name) - try: - ooyala_url = self._og_search_video_url(webpage) - except ExtractorError: - try: - embed_code = self._search_regex( - r'OO.Player.create\(\'ooyalaplayer\', \'(.+?)\'', webpage, - u'ooyala embed code') - ooyala_url = OoyalaIE._url_for_embed_code(embed_code) - except ExtractorError: - raise ExtractorError(u'The page doesn\'t contain a video', expected=True) - return self.url_result(ooyala_url, ie='Ooyala') - diff --git a/youtube_dl/extractor/videobam.py b/youtube_dl/extractor/videobam.py new file mode 100644 index 0000000..fed95ef --- /dev/null +++ b/youtube_dl/extractor/videobam.py @@ -0,0 +1,81 @@ +from __future__ import unicode_literals + +import re +import json + +from .common import InfoExtractor +from ..utils import int_or_none + + +class VideoBamIE(InfoExtractor): + _VALID_URL = r'http://(?:www\.)?videobam\.com/(?:videos/download/)?(?P[a-zA-Z]+)' + + _TESTS = [ + { + 'url': 'http://videobam.com/OiJQM', + 'md5': 'db471f27763a531f10416a0c58b5a1e0', + 'info_dict': { + 'id': 'OiJQM', + 'ext': 'mp4', + 'title': 'Is Alcohol Worse Than Ecstasy?', + 'description': 'md5:d25b96151515c91debc42bfbb3eb2683', + 'uploader': 'frihetsvinge', + }, + }, + { + 'url': 'http://videobam.com/pqLvq', + 'md5': 'd9a565b5379a99126ef94e1d7f9a383e', + 'note': 'HD video', + 'info_dict': { + 'id': 'pqLvq', + 'ext': 'mp4', + 'title': '_', + } + }, + ] + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + page = self._download_webpage('http://videobam.com/%s' % video_id, video_id, 'Downloading page') + + formats = [] + + for preference, format_id in enumerate(['low', 'high']): + mobj = re.search(r"%s: '(?P[^']+)'" % format_id, page) + if not mobj: + continue + formats.append({ + 'url': mobj.group('url'), + 'ext': 'mp4', + 'format_id': format_id, + 'preference': preference, + }) + + if not formats: + player_config = json.loads(self._html_search_regex(r'var player_config = ({.+?});', page, 'player config')) + formats = [{ + 'url': item['url'], + 'ext': 'mp4', + } for item in player_config['playlist'] if 'autoPlay' in item] + + self._sort_formats(formats) + + title = self._og_search_title(page, default='_', fatal=False) + description = self._og_search_description(page, default=None) + thumbnail = self._og_search_thumbnail(page) + uploader = self._html_search_regex(r'Upload by ([^<]+)
    ', page, 'uploader', fatal=False, default=None) + view_count = int_or_none( + self._html_search_regex(r'Views: (\d+) ', page, 'view count', fatal=False)) + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'thumbnail': thumbnail, + 'uploader': uploader, + 'view_count': view_count, + 'formats': formats, + 'age_limit': 18, + } \ No newline at end of file diff --git a/youtube_dl/extractor/videodetective.py b/youtube_dl/extractor/videodetective.py index 265dd5b..ac6c255 100644 --- a/youtube_dl/extractor/videodetective.py +++ b/youtube_dl/extractor/videodetective.py @@ -1,22 +1,23 @@ +from __future__ import unicode_literals + import re from .common import InfoExtractor from .internetvideoarchive import InternetVideoArchiveIE -from ..utils import ( - compat_urlparse, -) +from ..utils import compat_urlparse class VideoDetectiveIE(InfoExtractor): _VALID_URL = r'https?://www\.videodetective\.com/[^/]+/[^/]+/(?P\d+)' _TEST = { - u'url': u'http://www.videodetective.com/movies/kick-ass-2/194487', - u'file': u'194487.mp4', - u'info_dict': { - u'title': u'KICK-ASS 2', - u'description': u'md5:65ba37ad619165afac7d432eaded6013', - u'duration': 135, + 'url': 'http://www.videodetective.com/movies/kick-ass-2/194487', + 'info_dict': { + 'id': '194487', + 'ext': 'mp4', + 'title': 'KICK-ASS 2', + 'description': 'md5:65ba37ad619165afac7d432eaded6013', + 'duration': 135, }, } @@ -26,5 +27,4 @@ class VideoDetectiveIE(InfoExtractor): webpage = self._download_webpage(url, video_id) og_video = self._og_search_video_url(webpage) query = compat_urlparse.urlparse(og_video).query - return self.url_result(InternetVideoArchiveIE._build_url(query), - ie=InternetVideoArchiveIE.ie_key()) + return self.url_result(InternetVideoArchiveIE._build_url(query), ie=InternetVideoArchiveIE.ie_key()) diff --git a/youtube_dl/extractor/videolecturesnet.py b/youtube_dl/extractor/videolecturesnet.py new file mode 100644 index 0000000..ebd2a3d --- /dev/null +++ b/youtube_dl/extractor/videolecturesnet.py @@ -0,0 +1,70 @@ +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + find_xpath_attr, + int_or_none, + parse_duration, + unified_strdate, +) + + +class VideoLecturesNetIE(InfoExtractor): + _VALID_URL = r'http://(?:www\.)?videolectures\.net/(?P[^/#?]+)/' + IE_NAME = 'videolectures.net' + + _TEST = { + 'url': 'http://videolectures.net/promogram_igor_mekjavic_eng/', + 'info_dict': { + 'id': 'promogram_igor_mekjavic_eng', + 'ext': 'mp4', + 'title': 'Automatics, robotics and biocybernetics', + 'description': 'md5:815fc1deb6b3a2bff99de2d5325be482', + 'upload_date': '20130627', + 'duration': 565, + 'thumbnail': 're:http://.*\.jpg', + }, + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + smil_url = 'http://videolectures.net/%s/video/1/smil.xml' % video_id + smil = self._download_xml(smil_url, video_id) + + title = find_xpath_attr(smil, './/meta', 'name', 'title').attrib['content'] + description_el = find_xpath_attr(smil, './/meta', 'name', 'abstract') + description = ( + None if description_el is None + else description_el.attrib['content']) + upload_date = unified_strdate( + find_xpath_attr(smil, './/meta', 'name', 'date').attrib['content']) + + switch = smil.find('.//switch') + duration = parse_duration(switch.attrib.get('dur')) + thumbnail_el = find_xpath_attr(switch, './image', 'type', 'thumbnail') + thumbnail = ( + None if thumbnail_el is None else thumbnail_el.attrib.get('src')) + + formats = [{ + 'url': v.attrib['src'], + 'width': int_or_none(v.attrib.get('width')), + 'height': int_or_none(v.attrib.get('height')), + 'filesize': int_or_none(v.attrib.get('size')), + 'tbr': int_or_none(v.attrib.get('systemBitrate')) / 1000.0, + 'ext': v.attrib.get('ext'), + } for v in switch.findall('./video') + if v.attrib.get('proto') == 'http'] + + return { + 'id': video_id, + 'title': title, + 'description': description, + 'upload_date': upload_date, + 'duration': duration, + 'thumbnail': thumbnail, + 'formats': formats, + } diff --git a/youtube_dl/extractor/videott.py b/youtube_dl/extractor/videott.py new file mode 100644 index 0000000..b5034b0 --- /dev/null +++ b/youtube_dl/extractor/videott.py @@ -0,0 +1,58 @@ +from __future__ import unicode_literals + +import re +import base64 + +from .common import InfoExtractor +from ..utils import unified_strdate + + +class VideoTtIE(InfoExtractor): + ID_NAME = 'video.tt' + IE_DESC = 'video.tt - Your True Tube' + _VALID_URL = r'http://(?:www\.)?video\.tt/(?:video/|watch_video\.php\?v=)(?P[\da-zA-Z]{9})' + + _TEST = { + 'url': 'http://www.video.tt/watch_video.php?v=amd5YujV8', + 'md5': 'b13aa9e2f267effb5d1094443dff65ba', + 'info_dict': { + 'id': 'amd5YujV8', + 'ext': 'flv', + 'title': 'Motivational video Change your mind in just 2.50 mins', + 'description': '', + 'upload_date': '20130827', + 'uploader': 'joseph313', + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + settings = self._download_json( + 'http://www.video.tt/player_control/settings.php?v=%s' % video_id, video_id, + 'Downloading video JSON')['settings'] + + video = settings['video_details']['video'] + + formats = [ + { + 'url': base64.b64decode(res['u']).decode('utf-8'), + 'ext': 'flv', + 'format_id': res['l'], + } for res in settings['res'] if res['u'] + ] + + return { + 'id': video_id, + 'title': video['title'], + 'description': video['description'], + 'thumbnail': settings['config']['thumbnail'], + 'upload_date': unified_strdate(video['added']), + 'uploader': video['owner'], + 'view_count': int(video['view_count']), + 'comment_count': int(video['comment_count']), + 'like_count': int(video['liked']), + 'dislike_count': int(video['disliked']), + 'formats': formats, + } \ No newline at end of file diff --git a/youtube_dl/extractor/videoweed.py b/youtube_dl/extractor/videoweed.py new file mode 100644 index 0000000..4a08ddd --- /dev/null +++ b/youtube_dl/extractor/videoweed.py @@ -0,0 +1,26 @@ +from __future__ import unicode_literals + +from .novamov import NovaMovIE + + +class VideoWeedIE(NovaMovIE): + IE_NAME = 'videoweed' + IE_DESC = 'VideoWeed' + + _VALID_URL = NovaMovIE._VALID_URL_TEMPLATE % {'host': 'videoweed\.(?:es|com)'} + + _HOST = 'www.videoweed.es' + + _FILE_DELETED_REGEX = r'>This file no longer exists on our servers.<' + _TITLE_REGEX = r'

    ([^<]+)

    ' + + _TEST = { + 'url': 'http://www.videoweed.es/file/b42178afbea14', + 'md5': 'abd31a2132947262c50429e1d16c1bfd', + 'info_dict': { + 'id': 'b42178afbea14', + 'ext': 'flv', + 'title': 'optical illusion dissapeared image magic illusion', + 'description': '' + }, + } \ No newline at end of file diff --git a/youtube_dl/extractor/viki.py b/youtube_dl/extractor/viki.py index 2206a06..15f3152 100644 --- a/youtube_dl/extractor/viki.py +++ b/youtube_dl/extractor/viki.py @@ -1,29 +1,33 @@ +from __future__ import unicode_literals + import re from ..utils import ( ExtractorError, unescapeHTML, unified_strdate, + US_RATINGS, ) from .subtitles import SubtitlesInfoExtractor class VikiIE(SubtitlesInfoExtractor): - IE_NAME = u'viki' + IE_NAME = 'viki' _VALID_URL = r'^https?://(?:www\.)?viki\.com/videos/(?P[0-9]+v)' _TEST = { - u'url': u'http://www.viki.com/videos/1023585v-heirs-episode-14', - u'file': u'1023585v.mp4', - u'md5': u'a21454021c2646f5433514177e2caa5f', - u'info_dict': { - u'title': u'Heirs Episode 14', - u'uploader': u'SBS', - u'description': u'md5:c4b17b9626dd4b143dcc4d855ba3474e', - u'upload_date': u'20131121', - u'age_limit': 13, + 'url': 'http://www.viki.com/videos/1023585v-heirs-episode-14', + 'md5': 'a21454021c2646f5433514177e2caa5f', + 'info_dict': { + 'id': '1023585v', + 'ext': 'mp4', + 'title': 'Heirs Episode 14', + 'uploader': 'SBS', + 'description': 'md5:c4b17b9626dd4b143dcc4d855ba3474e', + 'upload_date': '20131121', + 'age_limit': 13, }, - u'skip': u'Blocked in the US', + 'skip': 'Blocked in the US', } def _real_extract(self, url): @@ -44,28 +48,21 @@ class VikiIE(SubtitlesInfoExtractor): rating_str = self._html_search_regex( r'Rating: \s*([^<]*)<', webpage, - u'rating information', default='').strip() - RATINGS = { - 'G': 0, - 'PG': 10, - 'PG-13': 13, - 'R': 16, - 'NC': 18, - } - age_limit = RATINGS.get(rating_str) + 'rating information', default='').strip() + age_limit = US_RATINGS.get(rating_str) info_url = 'http://www.viki.com/player5_fragment/%s?action=show&controller=videos' % video_id info_webpage = self._download_webpage( - info_url, video_id, note=u'Downloading info page') + info_url, video_id, note='Downloading info page') if re.match(r'\s*]+src="([^"]+)"', info_webpage, u'video URL') + r']+src="([^"]+)"', info_webpage, 'video URL') upload_date_str = self._html_search_regex( - r'"created_at":"([^"]+)"', info_webpage, u'upload date') + r'"created_at":"([^"]+)"', info_webpage, 'upload date') upload_date = ( unified_strdate(upload_date_str) if upload_date_str is not None diff --git a/youtube_dl/extractor/vimeo.py b/youtube_dl/extractor/vimeo.py index 4bc2620..2558555 100644 --- a/youtube_dl/extractor/vimeo.py +++ b/youtube_dl/extractor/vimeo.py @@ -8,6 +8,7 @@ import itertools from .common import InfoExtractor from .subtitles import SubtitlesInfoExtractor from ..utils import ( + compat_HTTPError, compat_urllib_parse, compat_urllib_request, clean_html, @@ -16,10 +17,39 @@ from ..utils import ( RegexNotFoundError, std_headers, unsmuggle_url, + urlencode_postdata, + int_or_none, ) -class VimeoIE(SubtitlesInfoExtractor): +class VimeoBaseInfoExtractor(InfoExtractor): + _NETRC_MACHINE = 'vimeo' + _LOGIN_REQUIRED = False + + def _login(self): + (username, password) = self._get_login_info() + if username is None: + if self._LOGIN_REQUIRED: + raise ExtractorError('No login info available, needed for using %s.' % self.IE_NAME, expected=True) + return + self.report_login() + login_url = 'https://vimeo.com/log_in' + webpage = self._download_webpage(login_url, None, False) + token = self._search_regex(r'xsrft: \'(.*?)\'', webpage, 'login token') + data = urlencode_postdata({ + 'email': username, + 'password': password, + 'action': 'login', + 'service': 'vimeo', + 'token': token, + }) + login_request = compat_urllib_request.Request(login_url, data) + login_request.add_header('Content-Type', 'application/x-www-form-urlencoded') + login_request.add_header('Cookie', 'xsrft=%s' % token) + self._download_webpage(login_request, None, False, 'Wrong login info') + + +class VimeoIE(VimeoBaseInfoExtractor, SubtitlesInfoExtractor): """Information extractor for vimeo.com.""" # _VALID_URL matches Vimeo URLs @@ -32,53 +62,60 @@ class VimeoIE(SubtitlesInfoExtractor): (?:videos?/)? (?P[0-9]+) /?(?:[?&].*)?(?:[#].*)?$''' - _NETRC_MACHINE = 'vimeo' IE_NAME = 'vimeo' _TESTS = [ { 'url': 'http://vimeo.com/56015672#at=0', - 'file': '56015672.mp4', 'md5': '8879b6cc097e987f02484baf890129e5', 'info_dict': { - "upload_date": "20121220", - "description": "This is a test case for youtube-dl.\nFor more information, see github.com/rg3/youtube-dl\nTest chars: \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550", - "uploader_id": "user7108434", - "uploader": "Filippo Valsorda", + 'id': '56015672', + 'ext': 'mp4', + "upload_date": "20121220", + "description": "This is a test case for youtube-dl.\nFor more information, see github.com/rg3/youtube-dl\nTest chars: \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550", + "uploader_id": "user7108434", + "uploader": "Filippo Valsorda", "title": "youtube-dl test video - \u2605 \" ' \u5e78 / \\ \u00e4 \u21ad \U0001d550", + "duration": 10, }, }, { 'url': 'http://vimeopro.com/openstreetmapus/state-of-the-map-us-2013/video/68093876', - 'file': '68093876.mp4', 'md5': '3b5ca6aa22b60dfeeadf50b72e44ed82', 'note': 'Vimeo Pro video (#1197)', 'info_dict': { + 'id': '68093876', + 'ext': 'mp4', 'uploader_id': 'openstreetmapus', 'uploader': 'OpenStreetMap US', 'title': 'Andy Allan - Putting the Carto into OpenStreetMap Cartography', + 'duration': 1595, }, }, { 'url': 'http://player.vimeo.com/video/54469442', - 'file': '54469442.mp4', 'md5': '619b811a4417aa4abe78dc653becf511', 'note': 'Videos that embed the url in the player page', 'info_dict': { + 'id': '54469442', + 'ext': 'mp4', 'title': 'Kathy Sierra: Building the minimum Badass User, Business of Software', 'uploader': 'The BLN & Business of Software', 'uploader_id': 'theblnbusinessofsoftware', + 'duration': 3610, }, }, { 'url': 'http://vimeo.com/68375962', - 'file': '68375962.mp4', 'md5': 'aaf896bdb7ddd6476df50007a0ac0ae7', 'note': 'Video protected with password', 'info_dict': { + 'id': '68375962', + 'ext': 'mp4', 'title': 'youtube-dl password protected test video', 'upload_date': '20130614', 'uploader_id': 'user18948128', 'uploader': 'Jaime Marquínez Ferrándiz', + 'duration': 10, }, 'params': { 'videopassword': 'youtube-dl', @@ -96,42 +133,35 @@ class VimeoIE(SubtitlesInfoExtractor): 'upload_date': '20131015', 'uploader_id': 'staff', 'uploader': 'Vimeo Staff', + 'duration': 62, } }, ] - def _login(self): - (username, password) = self._get_login_info() - if username is None: - return - self.report_login() - login_url = 'https://vimeo.com/log_in' - webpage = self._download_webpage(login_url, None, False) - token = self._search_regex(r'xsrft: \'(.*?)\'', webpage, 'login token') - data = compat_urllib_parse.urlencode({'email': username, - 'password': password, - 'action': 'login', - 'service': 'vimeo', - 'token': token, - }) - login_request = compat_urllib_request.Request(login_url, data) - login_request.add_header('Content-Type', 'application/x-www-form-urlencoded') - login_request.add_header('Cookie', 'xsrft=%s' % token) - self._download_webpage(login_request, None, False, 'Wrong login info') + @classmethod + def suitable(cls, url): + if VimeoChannelIE.suitable(url): + # Otherwise channel urls like http://vimeo.com/channels/31259 would + # match + return False + else: + return super(VimeoIE, cls).suitable(url) def _verify_video_password(self, url, video_id, webpage): password = self._downloader.params.get('videopassword', None) if password is None: raise ExtractorError('This video is protected by a password, use the --video-password option') token = self._search_regex(r'xsrft: \'(.*?)\'', webpage, 'login token') - data = compat_urllib_parse.urlencode({'password': password, - 'token': token}) + data = compat_urllib_parse.urlencode({ + 'password': password, + 'token': token, + }) # I didn't manage to use the password with https if url.startswith('https'): - pass_url = url.replace('https','http') + pass_url = url.replace('https', 'http') else: pass_url = url - password_request = compat_urllib_request.Request(pass_url+'/password', data) + password_request = compat_urllib_request.Request(pass_url + '/password', data) password_request.add_header('Content-Type', 'application/x-www-form-urlencoded') password_request.add_header('Cookie', 'xsrft=%s' % token) self._download_webpage(password_request, video_id, @@ -171,7 +201,18 @@ class VimeoIE(SubtitlesInfoExtractor): # Retrieve video webpage to extract further information request = compat_urllib_request.Request(url, None, headers) - webpage = self._download_webpage(request, video_id) + try: + webpage = self._download_webpage(request, video_id) + except ExtractorError as ee: + if isinstance(ee.cause, compat_HTTPError) and ee.cause.code == 403: + errmsg = ee.cause.read() + if b'Because of its privacy settings, this video cannot be played here' in errmsg: + raise ExtractorError( + 'Cannot download embed-only video without embedding ' + 'URL. Please call youtube-dl with the URL of the page ' + 'that embeds this video.', + expected=True) + raise # Now we begin extracting as much information as we can from what we # retrieved. First we extract the information common to all extractors, @@ -220,13 +261,16 @@ class VimeoIE(SubtitlesInfoExtractor): # Extract video thumbnail video_thumbnail = config["video"].get("thumbnail") if video_thumbnail is None: - _, video_thumbnail = sorted((int(width), t_url) for (width, t_url) in config["video"]["thumbs"].items())[-1] + video_thumbs = config["video"].get("thumbs") + if video_thumbs and isinstance(video_thumbs, dict): + _, video_thumbnail = sorted((int(width), t_url) for (width, t_url) in video_thumbs.items())[-1] # Extract video description video_description = None try: - video_description = get_element_by_attribute("itemprop", "description", webpage) - if video_description: video_description = clean_html(video_description) + video_description = get_element_by_attribute("class", "description_wrapper", webpage) + if video_description: + video_description = clean_html(video_description) except AssertionError as err: # On some pages like (http://player.vimeo.com/video/54469442) the # html tags are not closed, python 2.6 cannot handle it @@ -235,6 +279,9 @@ class VimeoIE(SubtitlesInfoExtractor): else: raise + # Extract video duration + video_duration = int_or_none(config["video"].get("duration")) + # Extract upload date video_upload_date = None mobj = re.search(r'[^/]+)' + _VALID_URL = r'(?:https?://)?vimeo\.com/channels/(?P[^/]+)/?(\?.*)?$' _MORE_PAGES_INDICATOR = r']+?title="(.*?)"' @@ -331,7 +379,7 @@ class VimeoChannelIE(InfoExtractor): video_ids = [] for pagenum in itertools.count(1): webpage = self._download_webpage( - self._page_url(base_url, pagenum) ,list_id, + self._page_url(base_url, pagenum), list_id, 'Downloading page %s' % pagenum) video_ids.extend(re.findall(r'id="clip_(\d+?)"', webpage)) if re.search(self._MORE_PAGES_INDICATOR, webpage, re.DOTALL) is None: @@ -347,7 +395,7 @@ class VimeoChannelIE(InfoExtractor): def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - channel_id = mobj.group('id') + channel_id = mobj.group('id') return self._extract_videos(channel_id, 'http://vimeo.com/channels/%s' % channel_id) @@ -414,3 +462,25 @@ class VimeoReviewIE(InfoExtractor): video_id = mobj.group('id') player_url = 'https://player.vimeo.com/player/' + video_id return self.url_result(player_url, 'Vimeo', video_id) + + +class VimeoWatchLaterIE(VimeoBaseInfoExtractor, VimeoChannelIE): + IE_NAME = 'vimeo:watchlater' + IE_DESC = 'Vimeo watch later list, "vimeowatchlater" keyword (requires authentication)' + _VALID_URL = r'https?://vimeo\.com/home/watchlater|:vimeowatchlater' + _LOGIN_REQUIRED = True + _TITLE_RE = r'href="/home/watchlater".*?>(.*?)<' + + def _real_initialize(self): + self._login() + + def _page_url(self, base_url, pagenum): + url = '%s/page:%d/' % (base_url, pagenum) + request = compat_urllib_request.Request(url) + # Set the header to get a partial html page with the ids, + # the normal page doesn't contain them. + request.add_header('X-Requested-With', 'XMLHttpRequest') + return request + + def _real_extract(self, url): + return self._extract_videos('watchlater', 'https://vimeo.com/home/watchlater') diff --git a/youtube_dl/extractor/vine.py b/youtube_dl/extractor/vine.py index e14ff91..076c871 100644 --- a/youtube_dl/extractor/vine.py +++ b/youtube_dl/extractor/vine.py @@ -1,8 +1,11 @@ from __future__ import unicode_literals import re +import json +import itertools from .common import InfoExtractor +from ..utils import unified_strdate class VineIE(InfoExtractor): @@ -13,31 +16,76 @@ class VineIE(InfoExtractor): 'info_dict': { 'id': 'b9KOOWX7HUx', 'ext': 'mp4', - 'uploader': 'Jack Dorsey', 'title': 'Chicken.', + 'description': 'Chicken.', + 'upload_date': '20130519', + 'uploader': 'Jack Dorsey', + 'uploader_id': '76', }, } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - video_id = mobj.group('id') - webpage_url = 'https://vine.co/v/' + video_id - webpage = self._download_webpage(webpage_url, video_id) - self.report_extraction(video_id) + webpage = self._download_webpage('https://vine.co/v/' + video_id, video_id) - video_url = self._html_search_meta('twitter:player:stream', webpage, - 'video URL') + data = json.loads(self._html_search_regex( + r'window\.POST_DATA = { %s: ({.+?}) }' % video_id, webpage, 'vine data')) - uploader = self._html_search_regex(r'

    (.*?)

    ', - webpage, 'uploader', fatal=False, flags=re.DOTALL) + formats = [ + { + 'url': data['videoLowURL'], + 'ext': 'mp4', + 'format_id': 'low', + }, + { + 'url': data['videoUrl'], + 'ext': 'mp4', + 'format_id': 'standard', + } + ] return { 'id': video_id, - 'url': video_url, - 'ext': 'mp4', 'title': self._og_search_title(webpage), - 'thumbnail': self._og_search_thumbnail(webpage), - 'uploader': uploader, + 'description': data['description'], + 'thumbnail': data['thumbnailUrl'], + 'upload_date': unified_strdate(data['created']), + 'uploader': data['username'], + 'uploader_id': data['userIdStr'], + 'like_count': data['likes']['count'], + 'comment_count': data['comments']['count'], + 'repost_count': data['reposts']['count'], + 'formats': formats, } + + +class VineUserIE(InfoExtractor): + IE_NAME = 'vine:user' + _VALID_URL = r'(?:https?://)?vine\.co/(?P[^/]+)/?(\?.*)?$' + _VINE_BASE_URL = "https://vine.co/" + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + user = mobj.group('user') + + profile_url = "%sapi/users/profiles/vanity/%s" % ( + self._VINE_BASE_URL, user) + profile_data = self._download_json( + profile_url, user, note='Downloading user profile data') + + user_id = profile_data['data']['userId'] + timeline_data = [] + for pagenum in itertools.count(1): + timeline_url = "%sapi/timelines/users/%s?page=%s" % ( + self._VINE_BASE_URL, user_id, pagenum) + timeline_page = self._download_json( + timeline_url, user, note='Downloading page %d' % pagenum) + timeline_data.extend(timeline_page['data']['records']) + if timeline_page['data']['nextPage'] is None: + break + + entries = [ + self.url_result(e['permalinkUrl'], 'Vine') for e in timeline_data] + return self.playlist_result(entries, user) diff --git a/youtube_dl/extractor/vk.py b/youtube_dl/extractor/vk.py index a293b88..fb082f3 100644 --- a/youtube_dl/extractor/vk.py +++ b/youtube_dl/extractor/vk.py @@ -16,7 +16,7 @@ from ..utils import ( class VKIE(InfoExtractor): IE_NAME = 'vk.com' - _VALID_URL = r'https?://vk\.com/(?:videos.*?\?.*?z=)?video(?P.*?)(?:\?|%2F|$)' + _VALID_URL = r'https?://vk\.com/(?:video_ext\.php\?.*?\boid=(?P-?\d+).*?\bid=(?P\d+)|(?:videos.*?\?.*?z=)?video(?P.*?)(?:\?|%2F|$))' _NETRC_MACHINE = 'vk' _TESTS = [ @@ -37,11 +37,23 @@ class VKIE(InfoExtractor): 'info_dict': { 'id': '163339118', 'ext': 'mp4', - 'uploader': 'Elvira Dzhonik', + 'uploader': 'Elya Iskhakova', 'title': 'Dream Theater - Hollow Years Live at Budokan 720*', 'duration': 558, } }, + { + 'note': 'Embedded video', + 'url': 'http://vk.com/video_ext.php?oid=32194266&id=162925554&hash=7d8c2e0d5e05aeaa&hd=1', + 'md5': 'c7ce8f1f87bec05b3de07fdeafe21a0a', + 'info_dict': { + 'id': '162925554', + 'ext': 'mp4', + 'uploader': 'Vladimir Gavrin', + 'title': 'Lin Dan', + 'duration': 101, + } + }, { 'url': 'http://vk.com/video-8871596_164049491', 'md5': 'a590bcaf3d543576c9bd162812387666', @@ -54,7 +66,7 @@ class VKIE(InfoExtractor): 'duration': 8352, }, 'skip': 'Requires vk account credentials', - } + }, ] def _login(self): @@ -82,7 +94,10 @@ class VKIE(InfoExtractor): def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - video_id = mobj.group('id') + video_id = mobj.group('videoid') + + if not video_id: + video_id = '%s_%s' % (mobj.group('oid'), mobj.group('id')) info_url = 'http://vk.com/al_video.php?act=show&al=1&video=%s' % video_id info_page = self._download_webpage(info_url, video_id) @@ -93,7 +108,7 @@ class VKIE(InfoExtractor): m_yt = re.search(r'src="(http://www.youtube.com/.*?)"', info_page) if m_yt is not None: - self.to_screen(u'Youtube video detected') + self.to_screen('Youtube video detected') return self.url_result(m_yt.group(1), 'Youtube') data_json = self._search_regex(r'var vars = ({.*?});', info_page, 'vars') data = json.loads(data_json) diff --git a/youtube_dl/extractor/vube.py b/youtube_dl/extractor/vube.py index fbdff47..7b77865 100644 --- a/youtube_dl/extractor/vube.py +++ b/youtube_dl/extractor/vube.py @@ -1,47 +1,69 @@ from __future__ import unicode_literals import re -import datetime from .common import InfoExtractor +from ..utils import int_or_none class VubeIE(InfoExtractor): IE_NAME = 'vube' IE_DESC = 'Vube.com' - _VALID_URL = r'http://vube\.com/[^/]+/(?P[\da-zA-Z]{10})' + _VALID_URL = r'http://vube\.com/(?:[^/]+/)+(?P[\da-zA-Z]{10})\b' - _TEST = { - 'url': 'http://vube.com/Chiara+Grispo+Video+Channel/YL2qNPkqon', - 'md5': 'f81dcf6d0448e3291f54380181695821', - 'info_dict': { - 'id': 'YL2qNPkqon', - 'ext': 'mp4', - 'title': 'Chiara Grispo - Price Tag by Jessie J', - 'description': 'md5:8ea652a1f36818352428cb5134933313', - 'thumbnail': 'http://frame.thestaticvube.com/snap/228x128/102e7e63057-5ebc-4f5c-4065-6ce4ebde131f.jpg', - 'uploader': 'Chiara.Grispo', - 'uploader_id': '1u3hX0znhP', - 'upload_date': '20140103', - 'duration': 170.56 + _TESTS = [ + { + 'url': 'http://vube.com/Chiara+Grispo+Video+Channel/YL2qNPkqon', + 'md5': 'db7aba89d4603dadd627e9d1973946fe', + 'info_dict': { + 'id': 'YL2qNPkqon', + 'ext': 'mp4', + 'title': 'Chiara Grispo - Price Tag by Jessie J', + 'description': 'md5:8ea652a1f36818352428cb5134933313', + 'thumbnail': 'http://frame.thestaticvube.com/snap/228x128/102e7e63057-5ebc-4f5c-4065-6ce4ebde131f.jpg', + 'uploader': 'Chiara.Grispo', + 'uploader_id': '1u3hX0znhP', + 'timestamp': 1388743358, + 'upload_date': '20140103', + 'duration': 170.56 + } + }, + { + 'url': 'http://vube.com/SerainaMusic/my-7-year-old-sister-and-i-singing-alive-by-krewella/UeBhTudbfS?t=s&n=1', + 'md5': '5d4a52492d76f72712117ce6b0d98d08', + 'info_dict': { + 'id': 'UeBhTudbfS', + 'ext': 'mp4', + 'title': 'My 7 year old Sister and I singing "Alive" by Krewella', + 'description': 'md5:40bcacb97796339f1690642c21d56f4a', + 'thumbnail': 'http://frame.thestaticvube.com/snap/228x128/102265d5a9f-0f17-4f6b-5753-adf08484ee1e.jpg', + 'uploader': 'Seraina', + 'uploader_id': 'XU9VE2BQ2q', + 'timestamp': 1396492438, + 'upload_date': '20140403', + 'duration': 240.107 + } } - } + ] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id = mobj.group('id') - video = self._download_json('http://vube.com/api/v2/video/%s' % video_id, - video_id, 'Downloading video JSON') + video = self._download_json( + 'http://vube.com/api/v2/video/%s' % video_id, video_id, 'Downloading video JSON') public_id = video['public_id'] - formats = [{'url': 'http://video.thestaticvube.com/video/%s/%s.mp4' % (fmt['media_resolution_id'], public_id), - 'height': int(fmt['height']), - 'abr': int(fmt['audio_bitrate']), - 'vbr': int(fmt['video_bitrate']), - 'format_id': fmt['media_resolution_id'] - } for fmt in video['mtm'] if fmt['transcoding_status'] == 'processed'] + formats = [ + { + 'url': 'http://video.thestaticvube.com/video/%s/%s.mp4' % (fmt['media_resolution_id'], public_id), + 'height': int(fmt['height']), + 'abr': int(fmt['audio_bitrate']), + 'vbr': int(fmt['video_bitrate']), + 'format_id': fmt['media_resolution_id'] + } for fmt in video['mtm'] if fmt['transcoding_status'] == 'processed' + ] self._sort_formats(formats) @@ -52,16 +74,16 @@ class VubeIE(InfoExtractor): thumbnail = 'http:' + thumbnail uploader = video['user_alias'] uploader_id = video['user_url_id'] - upload_date = datetime.datetime.fromtimestamp(int(video['upload_time'])).strftime('%Y%m%d') + timestamp = int(video['upload_time']) duration = video['duration'] - view_count = video['raw_view_count'] - like_count = video['total_likes'] - dislike_count= video['total_hates'] + view_count = video.get('raw_view_count') + like_count = video.get('total_likes') + dislike_count= video.get('total_hates') - comment = self._download_json('http://vube.com/api/video/%s/comment' % video_id, - video_id, 'Downloading video comment JSON') + comment = self._download_json( + 'http://vube.com/api/video/%s/comment' % video_id, video_id, 'Downloading video comment JSON') - comment_count = comment['total'] + comment_count = int_or_none(comment.get('total')) return { 'id': video_id, @@ -71,10 +93,10 @@ class VubeIE(InfoExtractor): 'thumbnail': thumbnail, 'uploader': uploader, 'uploader_id': uploader_id, - 'upload_date': upload_date, + 'timestamp': timestamp, 'duration': duration, 'view_count': view_count, 'like_count': like_count, 'dislike_count': dislike_count, 'comment_count': comment_count, - } \ No newline at end of file + } diff --git a/youtube_dl/extractor/vuclip.py b/youtube_dl/extractor/vuclip.py new file mode 100644 index 0000000..fb0600f --- /dev/null +++ b/youtube_dl/extractor/vuclip.py @@ -0,0 +1,66 @@ +from __future__ import unicode_literals + +import re + +from .common import InfoExtractor +from ..utils import ( + compat_urllib_parse_urlparse, + parse_duration, + qualities, +) + + +class VuClipIE(InfoExtractor): + _VALID_URL = r'http://(?:m\.)?vuclip\.com/w\?.*?cid=(?P[0-9]+)' + + _TEST = { + 'url': 'http://m.vuclip.com/w?cid=843902317&fid=63532&z=1007&nvar&frm=index.html&bu=4757321434', + 'md5': '92ac9d1ccefec4f0bb474661ab144fcf', + 'info_dict': { + 'id': '843902317', + 'ext': '3gp', + 'title': 'Movie Trailer: Noah', + 'duration': 139, + } + } + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + video_id = mobj.group('id') + + webpage = self._download_webpage(url, video_id) + ad_m = re.search( + r'''value="No.*?" onClick="location.href='([^"']+)'"''', webpage) + if ad_m: + urlr = compat_urllib_parse_urlparse(url) + adfree_url = urlr.scheme + '://' + urlr.netloc + ad_m.group(1) + webpage = self._download_webpage( + adfree_url, video_id, note='Download post-ad page') + + links_code = self._search_regex( + r'(?s)', + webpage, 'duration', fatal=False)) + + view_count = self._html_search_regex(r'Views: ([^<]+)', webpage, 'view count', fatal=False) + if view_count: + view_count = str_to_int(view_count) + + mobj = re.search(r"hint='(?P\d+) Likes / (?P\d+) Dislikes'", webpage) + (like_count, dislike_count) = (mobj.group('likecount'), mobj.group('dislikecount')) if mobj else (None, None) + + mobj = re.search(r'Comments \((?P\d+)\)', webpage) + comment_count = mobj.group('commentcount') if mobj else 0 age_limit = self._rta_search(webpage) hd = is_hd(webpage) + video_url = extract_video_url(webpage) formats = [{ 'url': video_url, 'format_id': 'hd' if hd else 'sd', - 'preference': 0, + 'preference': 1, }] - video_mp4_url = extract_mp4_video_url(webpage) - if video_mp4_url is not None: - formats.append({ - 'url': video_mp4_url, - 'ext': 'mp4', - 'format_id': 'mp4-hd' if hd else 'mp4-sd', - 'preference': 1, - }) - if not hd: - webpage = self._download_webpage( - mrss_url + '?hd', video_id, note='Downloading HD webpage') + mrss_url = self._search_regex(r'(.*?)\s+-\s+XNXX.COM' - VIDEO_THUMB_RE = r'url_bigthumb=(.*?)&' + _VALID_URL = r'^https?://(?:video|www)\.xnxx\.com/video(?P[0-9]+)/(.*)' _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)", - u"age_limit": 18, + 'url': 'http://video.xnxx.com/video1135332/lida_naked_funny_actress_5_', + 'md5': '0831677e2b4761795f68d417e0b7b445', + 'info_dict': { + 'id': '1135332', + 'ext': 'flv', + 'title': 'lida » Naked Funny Actress (5)', + 'age_limit': 18, } } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) - if mobj is None: - raise ExtractorError(u'Invalid URL: %s' % url) - video_id = mobj.group(1) + video_id = mobj.group('id') # Get webpage content webpage = self._download_webpage(url, video_id) - video_url = self._search_regex(self.VIDEO_URL_RE, - webpage, u'video URL') + video_url = self._search_regex(r'flv_url=(.*?)&', + webpage, 'video URL') video_url = compat_urllib_parse.unquote(video_url) - video_title = self._html_search_regex(self.VIDEO_TITLE_RE, - webpage, u'title') + video_title = self._html_search_regex(r'(.*?)\s+-\s+XNXX.COM', + webpage, 'title') - video_thumbnail = self._search_regex(self.VIDEO_THUMB_RE, - webpage, u'thumbnail', fatal=False) + video_thumbnail = self._search_regex(r'url_bigthumb=(.*?)&', + webpage, 'thumbnail', fatal=False) - return [{ + return { 'id': video_id, 'url': video_url, - 'uploader': None, - 'upload_date': None, 'title': video_title, 'ext': 'flv', 'thumbnail': video_thumbnail, - 'description': None, 'age_limit': 18, - }] + } diff --git a/youtube_dl/extractor/xtube.py b/youtube_dl/extractor/xtube.py index 9826199..b293e26 100644 --- a/youtube_dl/extractor/xtube.py +++ b/youtube_dl/extractor/xtube.py @@ -1,25 +1,29 @@ from __future__ import unicode_literals -import os import re +import json from .common import InfoExtractor from ..utils import ( - compat_urllib_parse_urlparse, compat_urllib_request, + parse_duration, + str_to_int, ) + class XTubeIE(InfoExtractor): - _VALID_URL = r'^(?:https?://)?(?:www\.)?(?P<url>xtube\.com/watch\.php\?v=(?P<videoid>[^/?&]+))' + _VALID_URL = r'https?://(?:www\.)?(?P<url>xtube\.com/watch\.php\?v=(?P<videoid>[^/?&]+))' _TEST = { 'url': 'http://www.xtube.com/watch.php?v=kVTUy_G222_', - 'file': 'kVTUy_G222_.mp4', 'md5': '092fbdd3cbe292c920ef6fc6a8a9cdab', 'info_dict': { - "title": "strange erotica", - "description": "surreal gay themed erotica...almost an ET kind of thing", - "uploader": "greenshowers", - "age_limit": 18, + 'id': 'kVTUy_G222_', + 'ext': 'mp4', + 'title': 'strange erotica', + 'description': 'surreal gay themed erotica...almost an ET kind of thing', + 'uploader': 'greenshowers', + 'duration': 450, + 'age_limit': 18, } } @@ -32,25 +36,79 @@ class XTubeIE(InfoExtractor): req.add_header('Cookie', 'age_verified=1') webpage = self._download_webpage(req, video_id) - video_title = self._html_search_regex(r'<div class="p_5px[^>]*>([^<]+)', webpage, 'title') - video_uploader = self._html_search_regex(r'so_s\.addVariable\("owner_u", "([^"]+)', webpage, 'uploader', fatal=False) - video_description = self._html_search_regex(r'<p class="video_description">([^<]+)', webpage, 'description', fatal=False) - video_url= self._html_search_regex(r'var videoMp4 = "([^"]+)', webpage, 'video_url').replace('\\/', '/') - path = compat_urllib_parse_urlparse(video_url).path - extension = os.path.splitext(path)[1][1:] - format = path.split('/')[5].split('_')[:2] - format[0] += 'p' - format[1] += 'k' - format = "-".join(format) + video_title = self._html_search_regex(r'<p class="title">([^<]+)', webpage, 'title') + video_uploader = self._html_search_regex( + r'so_s\.addVariable\("owner_u", "([^"]+)', webpage, 'uploader', fatal=False) + video_description = self._html_search_regex( + r'<p class="fieldsDesc">([^<]+)', webpage, 'description', fatal=False) + duration = parse_duration(self._html_search_regex( + r'<span class="bold">Runtime:</span> ([^<]+)</p>', webpage, 'duration', fatal=False)) + view_count = self._html_search_regex( + r'<span class="bold">Views:</span> ([\d,\.]+)</p>', webpage, 'view count', fatal=False) + if view_count: + view_count = str_to_int(view_count) + comment_count = self._html_search_regex( + r'<div id="commentBar">([\d,\.]+) Comments</div>', webpage, 'comment count', fatal=False) + if comment_count: + comment_count = str_to_int(comment_count) + + player_quality_option = json.loads(self._html_search_regex( + r'playerQualityOption = ({.+?});', webpage, 'player quality option')) + + QUALITIES = ['3gp', 'mp4_normal', 'mp4_high', 'flv', 'mp4_ultra', 'mp4_720', 'mp4_1080'] + formats = [ + { + 'url': furl, + 'format_id': format_id, + 'preference': QUALITIES.index(format_id) if format_id in QUALITIES else -1, + } for format_id, furl in player_quality_option.items() + ] + self._sort_formats(formats) return { 'id': video_id, 'title': video_title, 'uploader': video_uploader, 'description': video_description, - 'url': video_url, - 'ext': extension, - 'format': format, - 'format_id': format, + 'duration': duration, + 'view_count': view_count, + 'comment_count': comment_count, + 'formats': formats, 'age_limit': 18, } + +class XTubeUserIE(InfoExtractor): + IE_DESC = 'XTube user profile' + _VALID_URL = r'https?://(?:www\.)?xtube\.com/community/profile\.php\?(.*?)user=(?P<username>[^&#]+)(?:$|[&#])' + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + username = mobj.group('username') + + profile_page = self._download_webpage( + url, username, note='Retrieving profile page') + + video_count = int(self._search_regex( + r'<strong>%s\'s Videos \(([0-9]+)\)</strong>'%username, profile_page, + 'video count')) + + PAGE_SIZE = 25 + urls = [] + page_count = (video_count + PAGE_SIZE + 1) // PAGE_SIZE + for n in range(1, page_count + 1): + lpage_url = 'http://www.xtube.com/user_videos.php?page=%d&u=%s' % (n, username) + lpage = self._download_webpage( + lpage_url, username, + note='Downloading page %d/%d' % (n, page_count)) + urls.extend( + re.findall(r'addthis:url="([^"]+)"', lpage)) + + return { + '_type': 'playlist', + 'id': username, + 'entries': [{ + '_type': 'url', + 'url': eurl, + 'ie_key': 'XTube', + } for eurl in urls] + } diff --git a/youtube_dl/extractor/xvideos.py b/youtube_dl/extractor/xvideos.py index 85e99e1..7e00448 100644 --- a/youtube_dl/extractor/xvideos.py +++ b/youtube_dl/extractor/xvideos.py @@ -5,18 +5,21 @@ import re from .common import InfoExtractor from ..utils import ( compat_urllib_parse, + ExtractorError, + clean_html, ) class XVideosIE(InfoExtractor): _VALID_URL = r'^(?:https?://)?(?:www\.)?xvideos\.com/video([0-9]+)(?:.*)' _TEST = { - 'url': 'http://www.xvideos.com/video939581/funny_porns_by_s_-1', - 'file': '939581.flv', - 'md5': '1d0c835822f0a71a7bf011855db929d0', + 'url': 'http://www.xvideos.com/video4588838/biker_takes_his_girl', + 'md5': '4b46ae6ea5e6e9086e714d883313c0c9', 'info_dict': { - "title": "Funny Porns By >>>>S<<<<<< -1", - "age_limit": 18, + 'id': '4588838', + 'ext': 'flv', + 'title': 'Biker Takes his Girl', + 'age_limit': 18, } } @@ -28,6 +31,10 @@ class XVideosIE(InfoExtractor): self.report_extraction(video_id) + mobj = re.search(r'<h1 class="inlineError">(.+?)</h1>', webpage) + if mobj: + raise ExtractorError('%s said: %s' % (self.IE_NAME, clean_html(mobj.group(1))), expected=True) + # Extract video URL video_url = compat_urllib_parse.unquote( self._search_regex(r'flv_url=(.+?)&', webpage, 'video URL')) diff --git a/youtube_dl/extractor/yahoo.py b/youtube_dl/extractor/yahoo.py index d92d14f..d84be25 100644 --- a/youtube_dl/extractor/yahoo.py +++ b/youtube_dl/extractor/yahoo.py @@ -14,27 +14,39 @@ from ..utils import ( class YahooIE(InfoExtractor): - IE_DESC = 'Yahoo screen' - _VALID_URL = r'http://screen\.yahoo\.com/.*?-(?P<id>\d*?)\.html' + IE_DESC = 'Yahoo screen and movies' + _VALID_URL = r'https?://(?:screen|movies)\.yahoo\.com/.*?-(?P<id>[0-9]+)(?:-[a-z]+)?\.html' _TESTS = [ { 'url': 'http://screen.yahoo.com/julian-smith-travis-legg-watch-214727115.html', - 'file': '214727115.mp4', 'md5': '4962b075c08be8690a922ee026d05e69', 'info_dict': { + 'id': '2d25e626-2378-391f-ada0-ddaf1417e588', + 'ext': 'mp4', 'title': 'Julian Smith & Travis Legg Watch Julian Smith', 'description': 'Julian and Travis watch Julian Smith', }, }, { 'url': 'http://screen.yahoo.com/wired/codefellas-s1-ep12-cougar-lies-103000935.html', - 'file': '103000935.mp4', 'md5': 'd6e6fc6e1313c608f316ddad7b82b306', 'info_dict': { + 'id': 'd1dedf8c-d58c-38c3-8963-e899929ae0a9', + 'ext': 'mp4', 'title': 'Codefellas - The Cougar Lies with Spanish Moss', 'description': 'Agent Topple\'s mustache does its dirty work, and Nicole brokers a deal for peace. But why is the NSA collecting millions of Instagram brunch photos? And if your waffles have nothing to hide, what are they so worried about?', }, }, + { + 'url': 'https://movies.yahoo.com/video/world-loves-spider-man-190819223.html', + 'md5': '410b7104aa9893b765bc22787a22f3d9', + 'info_dict': { + 'id': '516ed8e2-2c4f-339f-a211-7a8b49d30845', + 'ext': 'mp4', + 'title': 'The World Loves Spider-Man', + 'description': '''People all over the world are celebrating the release of \"The Amazing Spider-Man 2.\" We're taking a look at the enthusiastic response Spider-Man has received from viewers all over the world.''', + } + } ] def _real_extract(self, url): @@ -42,16 +54,25 @@ class YahooIE(InfoExtractor): video_id = mobj.group('id') webpage = self._download_webpage(url, video_id) - items_json = self._search_regex(r'mediaItems: ({.*?})$', - webpage, 'items', flags=re.MULTILINE) - items = json.loads(items_json) - info = items['mediaItems']['query']['results']['mediaObj'][0] - # The 'meta' field is not always in the video webpage, we request it - # from another page - long_id = info['id'] - return self._get_info(long_id, video_id) - - def _get_info(self, long_id, video_id): + items_json = self._search_regex( + r'mediaItems: ({.*?})$', webpage, 'items', flags=re.MULTILINE, + default=None) + if items_json is None: + CONTENT_ID_REGEXES = [ + r'YUI\.namespace\("Media"\)\.CONTENT_ID\s*=\s*"([^"]+)"', + r'root\.App\.Cache\.context\.videoCache\.curVideo = \{"([^"]+)"' + ] + long_id = self._search_regex(CONTENT_ID_REGEXES, webpage, 'content ID') + video_id = long_id + else: + items = json.loads(items_json) + info = items['mediaItems']['query']['results']['mediaObj'][0] + # The 'meta' field is not always in the video webpage, we request it + # from another page + long_id = info['id'] + return self._get_info(long_id, video_id, webpage) + + def _get_info(self, long_id, video_id, webpage): query = ('SELECT * FROM yahoo.media.video.streams WHERE id="%s"' ' AND plrs="86Gj0vCaSzV_Iuf6hNylf2" AND region="US"' ' AND protocol="http"' % long_id) @@ -60,10 +81,9 @@ class YahooIE(InfoExtractor): 'env': 'prod', 'format': 'json', }) - query_result_json = self._download_webpage( + query_result = self._download_json( 'http://video.query.yahoo.com/v1/public/yql?' + data, video_id, 'Downloading video info') - query_result = json.loads(query_result_json) info = query_result['query']['results']['mediaObj'][0] meta = info['meta'] @@ -86,7 +106,6 @@ class YahooIE(InfoExtractor): else: format_url = compat_urlparse.urljoin(host, path) format_info['url'] = format_url - formats.append(format_info) self._sort_formats(formats) @@ -96,7 +115,7 @@ class YahooIE(InfoExtractor): 'title': meta['title'], 'formats': formats, 'description': clean_html(meta['description']), - 'thumbnail': meta['thumbnail'], + 'thumbnail': meta['thumbnail'] if meta.get('thumbnail') else self._og_search_thumbnail(webpage), } @@ -104,7 +123,7 @@ class YahooNewsIE(YahooIE): IE_NAME = 'yahoo:news' _VALID_URL = r'http://news\.yahoo\.com/video/.*?-(?P<id>\d*?)\.html' - _TEST = { + _TESTS = [{ 'url': 'http://news.yahoo.com/video/china-moses-crazy-blues-104538833.html', 'md5': '67010fdf3a08d290e060a4dd96baa07b', 'info_dict': { @@ -113,17 +132,14 @@ class YahooNewsIE(YahooIE): 'title': 'China Moses Is Crazy About the Blues', 'description': 'md5:9900ab8cd5808175c7b3fe55b979bed0', }, - } - - # Overwrite YahooIE properties we don't want - _TESTS = [] + }] def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id = mobj.group('id') webpage = self._download_webpage(url, video_id) long_id = self._search_regex(r'contentId: \'(.+?)\',', webpage, 'long id') - return self._get_info(long_id, video_id) + return self._get_info(long_id, video_id, webpage) class YahooSearchIE(SearchInfoExtractor): @@ -134,27 +150,25 @@ class YahooSearchIE(SearchInfoExtractor): def _get_n_results(self, query, n): """Get a specified number of results for a query""" - - res = { - '_type': 'playlist', - 'id': query, - 'entries': [] - } - for pagenum in itertools.count(0): + entries = [] + for pagenum in itertools.count(0): result_url = 'http://video.search.yahoo.com/search/?p=%s&fr=screen&o=js&gs=0&b=%d' % (compat_urllib_parse.quote_plus(query), pagenum * 30) - webpage = self._download_webpage(result_url, query, - note='Downloading results page '+str(pagenum+1)) - info = json.loads(webpage) + info = self._download_json(result_url, query, + note='Downloading results page '+str(pagenum+1)) m = info['m'] results = info['results'] for (i, r) in enumerate(results): - if (pagenum * 30) +i >= n: + if (pagenum * 30) + i >= n: break mobj = re.search(r'(?P<url>screen\.yahoo\.com/.*?-\d*?\.html)"', r) e = self.url_result('http://' + mobj.group('url'), 'Yahoo') - res['entries'].append(e) - if (pagenum * 30 +i >= n) or (m['last'] >= (m['total'] -1)): + entries.append(e) + if (pagenum * 30 + i >= n) or (m['last'] >= (m['total'] - 1)): break - return res + return { + '_type': 'playlist', + 'id': query, + 'entries': entries, + } diff --git a/youtube_dl/extractor/youporn.py b/youtube_dl/extractor/youporn.py index 77ad423..d456c4d 100644 --- a/youtube_dl/extractor/youporn.py +++ b/youtube_dl/extractor/youporn.py @@ -1,3 +1,6 @@ +from __future__ import unicode_literals + + import json import re import sys @@ -17,24 +20,25 @@ from ..aes import ( class YouPornIE(InfoExtractor): - _VALID_URL = r'^(?:https?://)?(?:www\.)?(?P<url>youporn\.com/watch/(?P<videoid>[0-9]+)/(?P<title>[^/]+))' + _VALID_URL = r'^(?P<proto>https?://)(?:www\.)?(?P<url>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'71ec5fcfddacf80f495efa8b6a8d9a89', - 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?", - u"age_limit": 18, + 'url': 'http://www.youporn.com/watch/505835/sex-ed-is-it-safe-to-masturbate-daily/', + 'md5': '71ec5fcfddacf80f495efa8b6a8d9a89', + 'info_dict': { + 'id': '505835', + 'ext': 'mp4', + '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?', + 'age_limit': 18, } } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id = mobj.group('videoid') - url = 'http://www.' + mobj.group('url') + url = mobj.group('proto') + 'www.' + mobj.group('url') req = compat_urllib_request.Request(url) req.add_header('Cookie', 'age_verified=1') @@ -42,7 +46,7 @@ class YouPornIE(InfoExtractor): age_limit = self._rta_search(webpage) # Get JSON parameters - json_params = self._search_regex(r'var currentVideo = new Video\((.*)\);', webpage, u'JSON parameters') + json_params = self._search_regex(r'var currentVideo = new Video\((.*)\);', webpage, 'JSON parameters') try: params = json.loads(json_params) except: @@ -61,7 +65,7 @@ class YouPornIE(InfoExtractor): # Get all of the links from the page DOWNLOAD_LIST_RE = r'(?s)<ul class="downloadList">(?P<download_list>.*?)</ul>' download_list_html = self._search_regex(DOWNLOAD_LIST_RE, - webpage, u'download list').strip() + webpage, 'download list').strip() LINK_RE = r'<a href="([^"]+)">' links = re.findall(LINK_RE, download_list_html) @@ -86,7 +90,7 @@ class YouPornIE(InfoExtractor): resolution = format_parts[0] height = int(resolution[:-len('p')]) bitrate = int(format_parts[1][:-len('k')]) - format = u'-'.join(format_parts) + u'-' + dn + format = '-'.join(format_parts) + '-' + dn formats.append({ 'url': video_url, diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index a810368..7c50881 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -7,13 +7,13 @@ import itertools import json import os.path import re -import string import struct import traceback import zlib from .common import InfoExtractor, SearchInfoExtractor from .subtitles import SubtitlesInfoExtractor +from ..jsinterp import JSInterpreter from ..utils import ( compat_chr, compat_parse_qs, @@ -29,7 +29,6 @@ from ..utils import ( ExtractorError, int_or_none, PagedList, - RegexNotFoundError, unescapeHTML, unified_strdate, orderedSet, @@ -138,19 +137,21 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): (?:(?:(?:(?:\w+\.)?[yY][oO][uU][tT][uU][bB][eE](?:-nocookie)?\.com/| (?:www\.)?deturl\.com/www\.youtube\.com/| (?:www\.)?pwnyoutube\.com/| + (?:www\.)?yourepeat\.com/| tube\.majestyc\.net/| youtube\.googleapis\.com/) # the various hostnames, with wildcard subdomains (?:.*?\#/)? # handle anchor (#/) redirect urls (?: # the various things that can precede the ID: (?:(?:v|embed|e)/) # v/ or embed/ or e/ |(?: # or the v= param in all its forms - (?:(?:watch|movie)(?:_popup)?(?:\.php)?)? # preceding watch(_popup|.php) or nothing (like /?v=xxxx) + (?:(?:watch|movie)(?:_popup)?(?:\.php)?/?)? # preceding watch(_popup|.php) or nothing (like /?v=xxxx) (?:\?|\#!?) # the params delimiter ? or # or #! (?:.*?&)? # any other preceding param (like /?s=tuff&v=xxxx) v= ) )) |youtu\.be/ # just youtu.be/xxxx + |https?://(?:www\.)?cleanvideosearch\.com/media/action/yt/watch\?videoId= ) )? # all until now is optional -> you can pass the naked ID ([0-9A-Za-z_-]{11}) # here is it! the YouTube video ID @@ -176,32 +177,32 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): # 3d videos - '82': {'ext': 'mp4', 'height': 360, 'resolution': '360p', 'format_note': '3D', 'preference': -20}, - '83': {'ext': 'mp4', 'height': 480, 'resolution': '480p', 'format_note': '3D', 'preference': -20}, - '84': {'ext': 'mp4', 'height': 720, 'resolution': '720p', 'format_note': '3D', 'preference': -20}, - '85': {'ext': 'mp4', 'height': 1080, 'resolution': '1080p', 'format_note': '3D', 'preference': -20}, - '100': {'ext': 'webm', 'height': 360, 'resolution': '360p', 'format_note': '3D', 'preference': -20}, - '101': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': '3D', 'preference': -20}, - '102': {'ext': 'webm', 'height': 720, 'resolution': '720p', 'format_note': '3D', 'preference': -20}, + '82': {'ext': 'mp4', 'height': 360, 'format_note': '3D', 'preference': -20}, + '83': {'ext': 'mp4', 'height': 480, 'format_note': '3D', 'preference': -20}, + '84': {'ext': 'mp4', 'height': 720, 'format_note': '3D', 'preference': -20}, + '85': {'ext': 'mp4', 'height': 1080, 'format_note': '3D', 'preference': -20}, + '100': {'ext': 'webm', 'height': 360, 'format_note': '3D', 'preference': -20}, + '101': {'ext': 'webm', 'height': 480, 'format_note': '3D', 'preference': -20}, + '102': {'ext': 'webm', 'height': 720, 'format_note': '3D', 'preference': -20}, # Apple HTTP Live Streaming - '92': {'ext': 'mp4', 'height': 240, 'resolution': '240p', 'format_note': 'HLS', 'preference': -10}, - '93': {'ext': 'mp4', 'height': 360, 'resolution': '360p', 'format_note': 'HLS', 'preference': -10}, - '94': {'ext': 'mp4', 'height': 480, 'resolution': '480p', 'format_note': 'HLS', 'preference': -10}, - '95': {'ext': 'mp4', 'height': 720, 'resolution': '720p', 'format_note': 'HLS', 'preference': -10}, - '96': {'ext': 'mp4', 'height': 1080, 'resolution': '1080p', 'format_note': 'HLS', 'preference': -10}, - '132': {'ext': 'mp4', 'height': 240, 'resolution': '240p', 'format_note': 'HLS', 'preference': -10}, - '151': {'ext': 'mp4', 'height': 72, 'resolution': '72p', 'format_note': 'HLS', 'preference': -10}, + '92': {'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'preference': -10}, + '93': {'ext': 'mp4', 'height': 360, 'format_note': 'HLS', 'preference': -10}, + '94': {'ext': 'mp4', 'height': 480, 'format_note': 'HLS', 'preference': -10}, + '95': {'ext': 'mp4', 'height': 720, 'format_note': 'HLS', 'preference': -10}, + '96': {'ext': 'mp4', 'height': 1080, 'format_note': 'HLS', 'preference': -10}, + '132': {'ext': 'mp4', 'height': 240, 'format_note': 'HLS', 'preference': -10}, + '151': {'ext': 'mp4', 'height': 72, 'format_note': 'HLS', 'preference': -10}, # DASH mp4 video - '133': {'ext': 'mp4', 'height': 240, 'resolution': '240p', 'format_note': 'DASH video', 'preference': -40}, - '134': {'ext': 'mp4', 'height': 360, 'resolution': '360p', 'format_note': 'DASH video', 'preference': -40}, - '135': {'ext': 'mp4', 'height': 480, 'resolution': '480p', 'format_note': 'DASH video', 'preference': -40}, - '136': {'ext': 'mp4', 'height': 720, 'resolution': '720p', 'format_note': 'DASH video', 'preference': -40}, - '137': {'ext': 'mp4', 'height': 1080, 'resolution': '1080p', 'format_note': 'DASH video', 'preference': -40}, - '138': {'ext': 'mp4', 'height': 1081, 'resolution': '>1080p', 'format_note': 'DASH video', 'preference': -40}, - '160': {'ext': 'mp4', 'height': 192, 'resolution': '192p', 'format_note': 'DASH video', 'preference': -40}, - '264': {'ext': 'mp4', 'height': 1080, 'resolution': '1080p', 'format_note': 'DASH video', 'preference': -40}, + '133': {'ext': 'mp4', 'height': 240, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '134': {'ext': 'mp4', 'height': 360, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '135': {'ext': 'mp4', 'height': 480, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '136': {'ext': 'mp4', 'height': 720, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '137': {'ext': 'mp4', 'height': 1080, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '138': {'ext': 'mp4', 'height': 2160, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '160': {'ext': 'mp4', 'height': 144, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '264': {'ext': 'mp4', 'height': 1440, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, # Dash mp4 audio '139': {'ext': 'm4a', 'format_note': 'DASH audio', 'vcodec': 'none', 'abr': 48, 'preference': -50}, @@ -209,23 +210,24 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): '141': {'ext': 'm4a', 'format_note': 'DASH audio', 'vcodec': 'none', 'abr': 256, 'preference': -50}, # Dash webm - '167': {'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'VP8', 'acodec': 'none', 'preference': -40}, - '168': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'VP8', 'acodec': 'none', 'preference': -40}, - '169': {'ext': 'webm', 'height': 720, 'width': 1280, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'VP8', 'acodec': 'none', 'preference': -40}, - '170': {'ext': 'webm', 'height': 1080, 'width': 1920, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'VP8', 'acodec': 'none', 'preference': -40}, - '218': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'VP8', 'acodec': 'none', 'preference': -40}, - '219': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'container': 'webm', 'vcodec': 'VP8', 'acodec': 'none', 'preference': -40}, - '242': {'ext': 'webm', 'height': 240, 'resolution': '240p', 'format_note': 'DASH webm', 'preference': -40}, - '243': {'ext': 'webm', 'height': 360, 'resolution': '360p', 'format_note': 'DASH webm', 'preference': -40}, - '244': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': 'DASH webm', 'preference': -40}, - '245': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': 'DASH webm', 'preference': -40}, - '246': {'ext': 'webm', 'height': 480, 'resolution': '480p', 'format_note': 'DASH webm', 'preference': -40}, - '247': {'ext': 'webm', 'height': 720, 'resolution': '720p', 'format_note': 'DASH webm', 'preference': -40}, - '248': {'ext': 'webm', 'height': 1080, 'resolution': '1080p', 'format_note': 'DASH webm', 'preference': -40}, + '167': {'ext': 'webm', 'height': 360, 'width': 640, 'format_note': 'DASH video', 'acodec': 'none', 'container': 'webm', 'vcodec': 'VP8', 'preference': -40}, + '168': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'acodec': 'none', 'container': 'webm', 'vcodec': 'VP8', 'preference': -40}, + '169': {'ext': 'webm', 'height': 720, 'width': 1280, 'format_note': 'DASH video', 'acodec': 'none', 'container': 'webm', 'vcodec': 'VP8', 'preference': -40}, + '170': {'ext': 'webm', 'height': 1080, 'width': 1920, 'format_note': 'DASH video', 'acodec': 'none', 'container': 'webm', 'vcodec': 'VP8', 'preference': -40}, + '218': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'acodec': 'none', 'container': 'webm', 'vcodec': 'VP8', 'preference': -40}, + '219': {'ext': 'webm', 'height': 480, 'width': 854, 'format_note': 'DASH video', 'acodec': 'none', 'container': 'webm', 'vcodec': 'VP8', 'preference': -40}, + '242': {'ext': 'webm', 'height': 240, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '243': {'ext': 'webm', 'height': 360, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '244': {'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '245': {'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '246': {'ext': 'webm', 'height': 480, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '247': {'ext': 'webm', 'height': 720, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '248': {'ext': 'webm', 'height': 1080, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, + '271': {'ext': 'webm', 'height': 1440, 'format_note': 'DASH video', 'acodec': 'none', 'preference': -40}, # Dash webm audio - '171': {'ext': 'webm', 'vcodec': 'none', 'format_note': 'DASH webm audio', 'abr': 48, 'preference': -50}, - '172': {'ext': 'webm', 'vcodec': 'none', 'format_note': 'DASH webm audio', 'abr': 256, 'preference': -50}, + '171': {'ext': 'webm', 'vcodec': 'none', 'format_note': 'DASH audio', 'abr': 48, 'preference': -50}, + '172': {'ext': 'webm', 'vcodec': 'none', 'format_note': 'DASH audio', 'abr': 256, 'preference': -50}, # RTMP (unnamed) '_rtmp': {'protocol': 'rtmp'}, @@ -241,7 +243,8 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): u"uploader": u"Philipp Hagemeister", u"uploader_id": u"phihag", u"upload_date": u"20121002", - u"description": u"test chars: \"'/\\ä↭𝕐\ntest URL: https://github.com/rg3/youtube-dl/issues/1892\n\nThis is a test video for youtube-dl.\n\nFor more information, contact phihag@phihag.de ." + u"description": u"test chars: \"'/\\ä↭𝕐\ntest URL: https://github.com/rg3/youtube-dl/issues/1892\n\nThis is a test video for youtube-dl.\n\nFor more information, contact phihag@phihag.de .", + u"categories": [u'Science & Technology'], } }, { @@ -251,7 +254,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): u"info_dict": { u"upload_date": u"20120506", u"title": u"Icona Pop - I Love It (feat. Charli XCX) [OFFICIAL VIDEO]", - u"description": u"md5:5b292926389560516e384ac437c0ec07", + u"description": u"md5:fea86fda2d5a5784273df5c7cc994d9f", u"uploader": u"Icona Pop", u"uploader_id": u"IconaPop" } @@ -296,6 +299,23 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): u"format": "141", }, }, + # DASH manifest with encrypted signature + { + u'url': u'https://www.youtube.com/watch?v=IB3lcPjvWLA', + u'info_dict': { + u'id': u'IB3lcPjvWLA', + u'ext': u'm4a', + u'title': u'Afrojack - The Spark ft. Spree Wilson', + u'description': u'md5:9717375db5a9a3992be4668bbf3bc0a8', + u'uploader': u'AfrojackVEVO', + u'uploader_id': u'AfrojackVEVO', + u'upload_date': u'20131011', + }, + u"params": { + u'youtube_include_dash_manifest': True, + u'format': '141', + }, + }, ] @@ -421,113 +441,10 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): def _parse_sig_js(self, jscode): funcname = self._search_regex( r'signature=([a-zA-Z]+)', jscode, - u'Initial JS player signature function name') - - functions = {} - - def argidx(varname): - return string.lowercase.index(varname) - - def interpret_statement(stmt, local_vars, allow_recursion=20): - if allow_recursion < 0: - raise ExtractorError(u'Recursion limit reached') - - if stmt.startswith(u'var '): - stmt = stmt[len(u'var '):] - ass_m = re.match(r'^(?P<out>[a-z]+)(?:\[(?P<index>[^\]]+)\])?' + - r'=(?P<expr>.*)$', stmt) - if ass_m: - if ass_m.groupdict().get('index'): - def assign(val): - lvar = local_vars[ass_m.group('out')] - idx = interpret_expression(ass_m.group('index'), - local_vars, allow_recursion) - assert isinstance(idx, int) - lvar[idx] = val - return val - expr = ass_m.group('expr') - else: - def assign(val): - local_vars[ass_m.group('out')] = val - return val - expr = ass_m.group('expr') - elif stmt.startswith(u'return '): - assign = lambda v: v - expr = stmt[len(u'return '):] - else: - raise ExtractorError( - u'Cannot determine left side of statement in %r' % stmt) - - v = interpret_expression(expr, local_vars, allow_recursion) - return assign(v) - - def interpret_expression(expr, local_vars, allow_recursion): - if expr.isdigit(): - return int(expr) - - if expr.isalpha(): - return local_vars[expr] - - m = re.match(r'^(?P<in>[a-z]+)\.(?P<member>.*)$', expr) - if m: - member = m.group('member') - val = local_vars[m.group('in')] - if member == 'split("")': - return list(val) - if member == 'join("")': - return u''.join(val) - if member == 'length': - return len(val) - if member == 'reverse()': - return val[::-1] - slice_m = re.match(r'slice\((?P<idx>.*)\)', member) - if slice_m: - idx = interpret_expression( - slice_m.group('idx'), local_vars, allow_recursion-1) - return val[idx:] - - m = re.match( - r'^(?P<in>[a-z]+)\[(?P<idx>.+)\]$', expr) - if m: - val = local_vars[m.group('in')] - idx = interpret_expression(m.group('idx'), local_vars, - allow_recursion-1) - return val[idx] - - m = re.match(r'^(?P<a>.+?)(?P<op>[%])(?P<b>.+?)$', expr) - if m: - a = interpret_expression(m.group('a'), - local_vars, allow_recursion) - b = interpret_expression(m.group('b'), - local_vars, allow_recursion) - return a % b - - m = re.match( - r'^(?P<func>[a-zA-Z$]+)\((?P<args>[a-z0-9,]+)\)$', expr) - if m: - fname = m.group('func') - if fname not in functions: - functions[fname] = extract_function(fname) - argvals = [int(v) if v.isdigit() else local_vars[v] - for v in m.group('args').split(',')] - return functions[fname](argvals) - raise ExtractorError(u'Unsupported JS expression %r' % expr) - - def extract_function(funcname): - func_m = re.search( - r'function ' + re.escape(funcname) + - r'\((?P<args>[a-z,]+)\){(?P<code>[^}]+)}', - jscode) - argnames = func_m.group('args').split(',') - - def resf(args): - local_vars = dict(zip(argnames, args)) - for stmt in func_m.group('code').split(';'): - res = interpret_statement(stmt, local_vars) - return res - return resf - - initial_function = extract_function(funcname) + u'Initial JS player signature function name') + + jsi = JSInterpreter(jscode) + initial_function = jsi.extract_function(funcname) return lambda s: initial_function([s]) def _parse_sig_swf(self, file_contents): @@ -1113,14 +1030,18 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): return self._download_webpage(url, video_id, note=u'Searching for annotations.', errnote=u'Unable to download video annotations.') def _real_extract(self, url): + proto = ( + u'http' if self._downloader.params.get('prefer_insecure', False) + else u'https') + # Extract original video URL from URL with redirection, like age verification, using next_url parameter mobj = re.search(self._NEXT_URL_RE, url) if mobj: - url = 'https://www.youtube.com/' + compat_urllib_parse.unquote(mobj.group(1)).lstrip('/') + url = proto + '://www.youtube.com/' + compat_urllib_parse.unquote(mobj.group(1)).lstrip('/') video_id = self.extract_id(url) # Get video webpage - url = 'https://www.youtube.com/watch?v=%s&gl=US&hl=en&has_verified=1' % video_id + url = proto + '://www.youtube.com/watch?v=%s&gl=US&hl=en&has_verified=1' % video_id video_webpage = self._download_webpage(url, video_id) # Attempt to extract SWF player URL @@ -1145,7 +1066,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): 'asv': 3, 'sts':'1588', }) - video_info_url = 'https://www.youtube.com/get_video_info?' + data + video_info_url = proto + '://www.youtube.com/get_video_info?' + data video_info_webpage = self._download_webpage(video_info_url, video_id, note=False, errnote='unable to download video info webpage') @@ -1153,7 +1074,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): else: age_gate = False for el_type in ['&el=embedded', '&el=detailpage', '&el=vevo', '']: - video_info_url = ('https://www.youtube.com/get_video_info?&video_id=%s%s&ps=default&eurl=&gl=US&hl=en' + video_info_url = (proto + '://www.youtube.com/get_video_info?&video_id=%s%s&ps=default&eurl=&gl=US&hl=en' % (video_id, el_type)) video_info_webpage = self._download_webpage(video_info_url, video_id, note=False, @@ -1163,9 +1084,13 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): break if 'token' not in video_info: if 'reason' in video_info: - raise ExtractorError(u'YouTube said: %s' % video_info['reason'][0], expected=True) + raise ExtractorError( + u'YouTube said: %s' % video_info['reason'][0], + expected=True, video_id=video_id) else: - raise ExtractorError(u'"token" parameter not in video info for unknown reason') + raise ExtractorError( + u'"token" parameter not in video info for unknown reason', + video_id=video_id) if 'view_count' in video_info: view_count = int(video_info['view_count'][0]) @@ -1194,7 +1119,7 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): # title if 'title' in video_info: - video_title = compat_urllib_parse.unquote_plus(video_info['title'][0]) + video_title = video_info['title'][0] else: self._downloader.report_warning(u'Unable to extract video title') video_title = u'_' @@ -1213,11 +1138,24 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): # upload date upload_date = None - mobj = re.search(r'id="eow-date.*?>(.*?)</span>', video_webpage, re.DOTALL) + mobj = re.search(r'(?s)id="eow-date.*?>(.*?)</span>', video_webpage) + if mobj is None: + mobj = re.search( + r'(?s)id="watch-uploader-info".*?>.*?(?:Published|Uploaded|Streamed live) on (.*?)</strong>', + video_webpage) if mobj is not None: upload_date = ' '.join(re.sub(r'[/,-]', r' ', mobj.group(1)).split()) upload_date = unified_strdate(upload_date) + m_cat_container = get_element_by_id("eow-category", video_webpage) + if m_cat_container: + category = self._html_search_regex( + r'(?s)<a[^<]+>(.*?)</a>', m_cat_container, 'category', + default=None) + video_categories = None if category is None else [category] + else: + video_categories = None + # description video_description = get_element_by_id("eow-description", video_webpage) if video_description: @@ -1268,11 +1206,12 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): # Decide which formats to download try: - mobj = re.search(r';ytplayer.config = ({.*?});', video_webpage) + mobj = re.search(r';ytplayer\.config\s*=\s*({.*?});', video_webpage) if not mobj: raise ValueError('Could not find vevo ID') - info = json.loads(mobj.group(1)) - args = info['args'] + json_code = uppercase_escape(mobj.group(1)) + ytplayer_config = json.loads(json_code) + args = ytplayer_config['args'] # Easy way to know if the 's' value is in url_encoded_fmt_stream_map # this signatures are encrypted if 'url_encoded_fmt_stream_map' not in args: @@ -1365,12 +1304,24 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): raise ExtractorError(u'no conn, hlsvp or url_encoded_fmt_stream_map information found in video info') # Look for the DASH manifest - dash_manifest_url_lst = video_info.get('dashmpd') - if (dash_manifest_url_lst and dash_manifest_url_lst[0] and - self._downloader.params.get('youtube_include_dash_manifest', False)): + if (self._downloader.params.get('youtube_include_dash_manifest', False)): try: + # The DASH manifest used needs to be the one from the original video_webpage. + # The one found in get_video_info seems to be using different signatures. + # However, in the case of an age restriction there won't be any embedded dashmpd in the video_webpage. + # Luckily, it seems, this case uses some kind of default signature (len == 86), so the + # combination of get_video_info and the _static_decrypt_signature() decryption fallback will work here. + if age_gate: + dash_manifest_url = video_info.get('dashmpd')[0] + else: + dash_manifest_url = ytplayer_config['args']['dashmpd'] + def decrypt_sig(mobj): + s = mobj.group(1) + dec_s = self._decrypt_signature(s, video_id, player_url, age_gate) + return '/signature/%s' % dec_s + dash_manifest_url = re.sub(r'/s/([\w\.]+)', decrypt_sig, dash_manifest_url) dash_doc = self._download_xml( - dash_manifest_url_lst[0], video_id, + dash_manifest_url, video_id, note=u'Downloading DASH manifest', errnote=u'Could not download DASH manifest') for r in dash_doc.findall(u'.//{urn:mpeg:DASH:schema:MPD:2011}Representation'): @@ -1411,11 +1362,12 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): 'title': video_title, 'thumbnail': video_thumbnail, 'description': video_description, + 'categories': video_categories, 'subtitles': video_subtitles, 'duration': video_duration, 'age_limit': 18 if age_gate else 0, 'annotations': video_annotations, - 'webpage_url': 'https://www.youtube.com/watch?v=%s' % video_id, + 'webpage_url': proto + '://www.youtube.com/watch?v=%s' % video_id, 'view_count': view_count, 'like_count': like_count, 'dislike_count': dislike_count, @@ -1442,9 +1394,9 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): | ((?:PL|EC|UU|FL|RD)[0-9A-Za-z-_]{10,}) )""" - _TEMPLATE_URL = 'https://www.youtube.com/playlist?list=%s&page=%s' + _TEMPLATE_URL = 'https://www.youtube.com/playlist?list=%s' _MORE_PAGES_INDICATOR = r'data-link-type="next"' - _VIDEO_RE = r'href="/watch\?v=(?P<id>[0-9A-Za-z_-]{11})&[^"]*?index=(?P<index>\d+)' + _VIDEO_RE = r'href="\s*/watch\?v=(?P<id>[0-9A-Za-z_-]{11})&[^"]*?index=(?P<index>\d+)' IE_NAME = u'youtube:playlist' def _real_initialize(self): @@ -1459,11 +1411,13 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): # the id of the playlist is just 'RD' + video_id url = 'https://youtube.com/watch?v=%s&list=%s' % (playlist_id[-11:], playlist_id) webpage = self._download_webpage(url, playlist_id, u'Downloading Youtube mix') - title_span = (get_element_by_attribute('class', 'title long-title', webpage) or - get_element_by_attribute('class', 'title ', webpage)) + search_title = lambda class_name: get_element_by_attribute('class', class_name, webpage) + title_span = (search_title('playlist-title') or + search_title('title long-title') or search_title('title')) title = clean_html(title_span) - video_re = r'data-index="\d+".*?href="/watch\?v=([0-9A-Za-z_-]{11})&[^"]*?list=%s' % re.escape(playlist_id) - ids = orderedSet(re.findall(video_re, webpage)) + video_re = r'''(?x)data-video-username=".*?".*? + href="/watch\?v=([0-9A-Za-z_-]{11})&[^"]*?list=%s''' % re.escape(playlist_id) + ids = orderedSet(re.findall(video_re, webpage, flags=re.DOTALL)) url_results = self._ids_to_results(ids) return self.playlist_result(url_results, playlist_id, title) @@ -1483,7 +1437,7 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): self.to_screen(u'Downloading just video %s because of --no-playlist' % video_id) return self.url_result(video_id, 'Youtube', video_id=video_id) else: - self.to_screen(u'Downloading playlist PL%s - add --no-playlist to just download video %s' % (playlist_id, video_id)) + self.to_screen(u'Downloading playlist %s - add --no-playlist to just download video %s' % (playlist_id, video_id)) if playlist_id.startswith('RD'): # Mixes require a custom extraction process @@ -1492,29 +1446,41 @@ class YoutubePlaylistIE(YoutubeBaseInfoExtractor): raise ExtractorError(u'For downloading YouTube.com top lists, use ' u'the "yttoplist" keyword, for example "youtube-dl \'yttoplist:music:Top Tracks\'"', expected=True) + url = self._TEMPLATE_URL % playlist_id + page = self._download_webpage(url, playlist_id) + more_widget_html = content_html = page + + # Check if the playlist exists or is private + if re.search(r'<div class="yt-alert-message">[^<]*?(The|This) playlist (does not exist|is private)[^<]*?</div>', page) is not None: + raise ExtractorError( + u'The playlist doesn\'t exist or is private, use --username or ' + '--netrc to access it.', + expected=True) + # Extract the video ids from the playlist pages ids = [] for page_num in itertools.count(1): - url = self._TEMPLATE_URL % (playlist_id, page_num) - page = self._download_webpage(url, playlist_id, u'Downloading page #%s' % page_num) - matches = re.finditer(self._VIDEO_RE, page) + matches = re.finditer(self._VIDEO_RE, content_html) # We remove the duplicates and the link with index 0 # (it's not the first video of the playlist) new_ids = orderedSet(m.group('id') for m in matches if m.group('index') != '0') ids.extend(new_ids) - if re.search(self._MORE_PAGES_INDICATOR, page) is None: + mobj = re.search(r'data-uix-load-more-href="/?(?P<more>[^"]+)"', more_widget_html) + if not mobj: break - try: - playlist_title = self._og_search_title(page) - except RegexNotFoundError: - self.report_warning( - u'Playlist page is missing OpenGraph title, falling back ...', - playlist_id) - playlist_title = self._html_search_regex( - r'<h1 class="pl-header-title">(.*?)</h1>', page, u'title') + more = self._download_json( + 'https://youtube.com/%s' % mobj.group('more'), playlist_id, + 'Downloading page #%s' % page_num, + transform_source=uppercase_escape) + content_html = more['content_html'] + more_widget_html = more['load_more_widget_html'] + + playlist_title = self._html_search_regex( + r'(?s)<h1 class="pl-header-title[^"]*">\s*(.*?)\s*</h1>', + page, u'title') url_results = self._ids_to_results(ids) return self.playlist_result(url_results, playlist_id, playlist_title) @@ -1610,7 +1576,7 @@ class YoutubeChannelIE(InfoExtractor): class YoutubeUserIE(InfoExtractor): IE_DESC = u'YouTube.com user videos (URL or "ytuser" keyword)' - _VALID_URL = r'(?:(?:(?:https?://)?(?:\w+\.)?youtube\.com/(?:user/)?(?!(?:attribution_link|watch)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)([A-Za-z0-9_-]+)' + _VALID_URL = r'(?:(?:(?:https?://)?(?:\w+\.)?youtube\.com/(?:user/)?(?!(?:attribution_link|watch|results)(?:$|[^a-z_A-Z0-9-])))|ytuser:)(?!feed/)([A-Za-z0-9_-]+)' _TEMPLATE_URL = 'https://gdata.youtube.com/feeds/api/users/%s' _GDATA_PAGE_SIZE = 50 _GDATA_URL = 'https://gdata.youtube.com/feeds/api/users/%s/uploads?max-results=%d&start-index=%d&alt=json' @@ -1672,7 +1638,7 @@ class YoutubeUserIE(InfoExtractor): class YoutubeSearchIE(SearchInfoExtractor): IE_DESC = u'YouTube.com searches' - _API_URL = 'https://gdata.youtube.com/feeds/api/videos?q=%s&start-index=%i&max-results=50&v=2&alt=jsonc' + _API_URL = u'https://gdata.youtube.com/feeds/api/videos?q=%s&start-index=%i&max-results=50&v=2&alt=jsonc' _MAX_RESULTS = 1000 IE_NAME = u'youtube:search' _SEARCH_KEY = 'ytsearch' @@ -1683,9 +1649,12 @@ class YoutubeSearchIE(SearchInfoExtractor): video_ids = [] pagenum = 0 limit = n + PAGE_SIZE = 50 - while (50 * pagenum) < limit: - result_url = self._API_URL % (compat_urllib_parse.quote_plus(query), (50*pagenum)+1) + while (PAGE_SIZE * pagenum) < limit: + result_url = self._API_URL % ( + compat_urllib_parse.quote_plus(query.encode('utf-8')), + (PAGE_SIZE * pagenum) + 1) data_json = self._download_webpage( result_url, video_id=u'query "%s"' % query, note=u'Downloading page %s' % (pagenum + 1), @@ -1709,12 +1678,50 @@ class YoutubeSearchIE(SearchInfoExtractor): for video_id in video_ids] return self.playlist_result(videos, query) + class YoutubeSearchDateIE(YoutubeSearchIE): IE_NAME = YoutubeSearchIE.IE_NAME + ':date' _API_URL = 'https://gdata.youtube.com/feeds/api/videos?q=%s&start-index=%i&max-results=50&v=2&alt=jsonc&orderby=published' _SEARCH_KEY = 'ytsearchdate' IE_DESC = u'YouTube.com searches, newest videos first' + +class YoutubeSearchURLIE(InfoExtractor): + IE_DESC = u'YouTube.com search URLs' + IE_NAME = u'youtube:search_url' + _VALID_URL = r'https?://(?:www\.)?youtube\.com/results\?(.*?&)?search_query=(?P<query>[^&]+)(?:[&]|$)' + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + query = compat_urllib_parse.unquote_plus(mobj.group('query')) + + webpage = self._download_webpage(url, query) + result_code = self._search_regex( + r'(?s)<ol id="search-results"(.*?)</ol>', webpage, u'result HTML') + + part_codes = re.findall( + r'(?s)<h3 class="yt-lockup-title">(.*?)</h3>', result_code) + entries = [] + for part_code in part_codes: + part_title = self._html_search_regex( + r'(?s)title="([^"]+)"', part_code, 'item title', fatal=False) + part_url_snippet = self._html_search_regex( + r'(?s)href="([^"]+)"', part_code, 'item URL') + part_url = compat_urlparse.urljoin( + 'https://www.youtube.com/', part_url_snippet) + entries.append({ + '_type': 'url', + 'url': part_url, + 'title': part_title, + }) + + return { + '_type': 'playlist', + 'entries': entries, + 'title': query, + } + + class YoutubeShowIE(InfoExtractor): IE_DESC = u'YouTube.com (multi-season) shows' _VALID_URL = r'https?://www\.youtube\.com/show/(.*)' @@ -1758,23 +1765,25 @@ class YoutubeFeedsInfoExtractor(YoutubeBaseInfoExtractor): feed_entries = [] paging = 0 for i in itertools.count(1): - info = self._download_webpage(self._FEED_TEMPLATE % paging, + info = self._download_json(self._FEED_TEMPLATE % paging, u'%s feed' % self._FEED_NAME, u'Downloading page %s' % i) - info = json.loads(info) - feed_html = info['feed_html'] + feed_html = info.get('feed_html') or info.get('content_html') m_ids = re.finditer(r'"/watch\?v=(.*?)["&]', feed_html) ids = orderedSet(m.group(1) for m in m_ids) feed_entries.extend( self.url_result(video_id, 'Youtube', video_id=video_id) for video_id in ids) - if info['paging'] is None: + mobj = re.search( + r'data-uix-load-more-href="/?[^"]+paging=(?P<paging>\d+)', + feed_html) + if mobj is None: break - paging = info['paging'] + paging = mobj.group('paging') return self.playlist_result(feed_entries, playlist_title=self._PLAYLIST_TITLE) class YoutubeSubscriptionsIE(YoutubeFeedsInfoExtractor): - IE_DESC = u'YouTube.com subscriptions feed, "ytsubs" keyword(requires authentication)' + IE_DESC = u'YouTube.com subscriptions feed, "ytsubs" keyword (requires authentication)' _VALID_URL = r'https?://www\.youtube\.com/feed/subscriptions|:ytsubs(?:criptions)?' _FEED_NAME = 'subscriptions' _PLAYLIST_TITLE = u'Youtube Subscriptions' @@ -1815,7 +1824,7 @@ class YoutubeTruncatedURLIE(InfoExtractor): IE_NAME = 'youtube:truncated_url' IE_DESC = False # Do not list _VALID_URL = r'''(?x) - (?:https?://)?[^/]+/watch\?feature=[a-z_]+$| + (?:https?://)?[^/]+/watch\?(?:feature=[a-z_]+)?$| (?:https?://)?(?:www\.)?youtube\.com/attribution_link\?a=[^&]+$ ''' diff --git a/youtube_dl/extractor/zdf.py b/youtube_dl/extractor/zdf.py index 829f002..3b1ac4e 100644 --- a/youtube_dl/extractor/zdf.py +++ b/youtube_dl/extractor/zdf.py @@ -1,4 +1,5 @@ # coding: utf-8 +from __future__ import unicode_literals import re @@ -13,52 +14,42 @@ class ZDFIE(InfoExtractor): _VALID_URL = r'^https?://www\.zdf\.de/ZDFmediathek(?P<hash>#)?/(.*beitrag/(?:video/)?)(?P<video_id>[0-9]+)(?:/[^/?]+)?(?:\?.*)?' _TEST = { - u"url": u"http://www.zdf.de/ZDFmediathek/beitrag/video/2037704/ZDFspezial---Ende-des-Machtpokers--?bc=sts;stt", - u"file": u"2037704.webm", - u"info_dict": { - u"upload_date": u"20131127", - u"description": u"Union und SPD haben sich auf einen Koalitionsvertrag geeinigt. Aber was bedeutet das für die Bürger? Sehen Sie hierzu das ZDFspezial \"Ende des Machtpokers - Große Koalition für Deutschland\".", - u"uploader": u"spezial", - u"title": u"ZDFspezial - Ende des Machtpokers" + 'url': 'http://www.zdf.de/ZDFmediathek/beitrag/video/2037704/ZDFspezial---Ende-des-Machtpokers--?bc=sts;stt', + 'info_dict': { + 'id': '2037704', + 'ext': 'webm', + 'title': 'ZDFspezial - Ende des Machtpokers', + 'description': 'Union und SPD haben sich auf einen Koalitionsvertrag geeinigt. Aber was bedeutet das für die Bürger? Sehen Sie hierzu das ZDFspezial "Ende des Machtpokers - Große Koalition für Deutschland".', + 'duration': 1022, + 'uploader': 'spezial', + 'uploader_id': '225948', + 'upload_date': '20131127', }, - u"skip": u"Videos on ZDF.de are depublicised in short order", + 'skip': 'Videos on ZDF.de are depublicised in short order', } def _real_extract(self, url): mobj = re.match(self._VALID_URL, url) video_id = mobj.group('video_id') - xml_url = u'http://www.zdf.de/ZDFmediathek/xmlservice/web/beitragsDetails?ak=web&id=%s' % video_id + xml_url = 'http://www.zdf.de/ZDFmediathek/xmlservice/web/beitragsDetails?ak=web&id=%s' % video_id doc = self._download_xml( xml_url, video_id, - note=u'Downloading video info', - errnote=u'Failed to download video info') + note='Downloading video info', + errnote='Failed to download video info') title = doc.find('.//information/title').text description = doc.find('.//information/detail').text + duration = int(doc.find('.//details/lengthSec').text) uploader_node = doc.find('.//details/originChannelTitle') uploader = None if uploader_node is None else uploader_node.text - duration_str = doc.find('.//details/length').text - duration_m = re.match(r'''(?x)^ - (?P<hours>[0-9]{2}) - :(?P<minutes>[0-9]{2}) - :(?P<seconds>[0-9]{2}) - (?:\.(?P<ms>[0-9]+)?) - ''', duration_str) - duration = ( - ( - (int(duration_m.group('hours')) * 60 * 60) + - (int(duration_m.group('minutes')) * 60) + - int(duration_m.group('seconds')) - ) - if duration_m - else None - ) + uploader_id_node = doc.find('.//details/originChannelId') + uploader_id = None if uploader_id_node is None else uploader_id_node.text upload_date = unified_strdate(doc.find('.//details/airtime').text) def xml_to_format(fnode): video_url = fnode.find('url').text - is_available = u'http://www.metafilegenerator' not in video_url + is_available = 'http://www.metafilegenerator' not in video_url format_id = fnode.attrib['basetype'] format_m = re.match(r'''(?x) @@ -71,22 +62,28 @@ class ZDFIE(InfoExtractor): quality = fnode.find('./quality').text abr = int(fnode.find('./audioBitrate').text) // 1000 - vbr = int(fnode.find('./videoBitrate').text) // 1000 + vbr_node = fnode.find('./videoBitrate') + vbr = None if vbr_node is None else int(vbr_node.text) // 1000 - format_note = u'' + width_node = fnode.find('./width') + width = None if width_node is None else int_or_none(width_node.text) + height_node = fnode.find('./height') + height = None if height_node is None else int_or_none(height_node.text) + + format_note = '' if not format_note: format_note = None return { - 'format_id': format_id + u'-' + quality, + 'format_id': format_id + '-' + quality, 'url': video_url, 'ext': ext, 'acodec': format_m.group('acodec'), 'vcodec': format_m.group('vcodec'), 'abr': abr, 'vbr': vbr, - 'width': int_or_none(fnode.find('./width').text), - 'height': int_or_none(fnode.find('./height').text), + 'width': width, + 'height': height, 'filesize': int_or_none(fnode.find('./filesize').text), 'format_note': format_note, 'protocol': proto, @@ -103,9 +100,10 @@ class ZDFIE(InfoExtractor): return { 'id': video_id, 'title': title, - 'formats': formats, 'description': description, - 'uploader': uploader, 'duration': duration, + 'uploader': uploader, + 'uploader_id': uploader_id, 'upload_date': upload_date, - } + 'formats': formats, + } \ No newline at end of file diff --git a/youtube_dl/jsinterp.py b/youtube_dl/jsinterp.py new file mode 100644 index 0000000..449482d --- /dev/null +++ b/youtube_dl/jsinterp.py @@ -0,0 +1,116 @@ +from __future__ import unicode_literals + +import re + +from .utils import ( + ExtractorError, +) + + +class JSInterpreter(object): + def __init__(self, code): + self.code = code + self._functions = {} + + def interpret_statement(self, stmt, local_vars, allow_recursion=20): + if allow_recursion < 0: + raise ExtractorError('Recursion limit reached') + + if stmt.startswith('var '): + stmt = stmt[len('var '):] + ass_m = re.match(r'^(?P<out>[a-z]+)(?:\[(?P<index>[^\]]+)\])?' + + r'=(?P<expr>.*)$', stmt) + if ass_m: + if ass_m.groupdict().get('index'): + def assign(val): + lvar = local_vars[ass_m.group('out')] + idx = self.interpret_expression( + ass_m.group('index'), local_vars, allow_recursion) + assert isinstance(idx, int) + lvar[idx] = val + return val + expr = ass_m.group('expr') + else: + def assign(val): + local_vars[ass_m.group('out')] = val + return val + expr = ass_m.group('expr') + elif stmt.startswith('return '): + assign = lambda v: v + expr = stmt[len('return '):] + else: + raise ExtractorError( + 'Cannot determine left side of statement in %r' % stmt) + + v = self.interpret_expression(expr, local_vars, allow_recursion) + return assign(v) + + def interpret_expression(self, expr, local_vars, allow_recursion): + if expr.isdigit(): + return int(expr) + + if expr.isalpha(): + return local_vars[expr] + + m = re.match(r'^(?P<in>[a-z]+)\.(?P<member>.*)$', expr) + if m: + member = m.group('member') + val = local_vars[m.group('in')] + if member == 'split("")': + return list(val) + if member == 'join("")': + return u''.join(val) + if member == 'length': + return len(val) + if member == 'reverse()': + return val[::-1] + slice_m = re.match(r'slice\((?P<idx>.*)\)', member) + if slice_m: + idx = self.interpret_expression( + slice_m.group('idx'), local_vars, allow_recursion - 1) + return val[idx:] + + m = re.match( + r'^(?P<in>[a-z]+)\[(?P<idx>.+)\]$', expr) + if m: + val = local_vars[m.group('in')] + idx = self.interpret_expression( + m.group('idx'), local_vars, allow_recursion - 1) + return val[idx] + + m = re.match(r'^(?P<a>.+?)(?P<op>[%])(?P<b>.+?)$', expr) + if m: + a = self.interpret_expression( + m.group('a'), local_vars, allow_recursion) + b = self.interpret_expression( + m.group('b'), local_vars, allow_recursion) + return a % b + + m = re.match( + r'^(?P<func>[a-zA-Z$]+)\((?P<args>[a-z0-9,]+)\)$', expr) + if m: + fname = m.group('func') + if fname not in self._functions: + self._functions[fname] = self.extract_function(fname) + argvals = [int(v) if v.isdigit() else local_vars[v] + for v in m.group('args').split(',')] + return self._functions[fname](argvals) + raise ExtractorError('Unsupported JS expression %r' % expr) + + def extract_function(self, funcname): + func_m = re.search( + (r'(?:function %s|%s\s*=\s*function)' % ( + re.escape(funcname), re.escape(funcname))) + + r'\((?P<args>[a-z,]+)\){(?P<code>[^}]+)}', + self.code) + if func_m is None: + raise ExtractorError('Could not find JS function %r' % funcname) + argnames = func_m.group('args').split(',') + + def resf(args): + local_vars = dict(zip(argnames, args)) + for stmt in func_m.group('code').split(';'): + res = self.interpret_statement(stmt, local_vars) + return res + return resf + diff --git a/youtube_dl/postprocessor/__init__.py b/youtube_dl/postprocessor/__init__.py index 7f19f71..08e6ddd 100644 --- a/youtube_dl/postprocessor/__init__.py +++ b/youtube_dl/postprocessor/__init__.py @@ -1,5 +1,7 @@ +from .atomicparsley import AtomicParsleyPP from .ffmpeg import ( + FFmpegAudioFixPP, FFmpegMergerPP, FFmpegMetadataPP, FFmpegVideoConvertor, @@ -9,6 +11,8 @@ from .ffmpeg import ( from .xattrpp import XAttrMetadataPP __all__ = [ + 'AtomicParsleyPP', + 'FFmpegAudioFixPP', 'FFmpegMergerPP', 'FFmpegMetadataPP', 'FFmpegVideoConvertor', diff --git a/youtube_dl/postprocessor/atomicparsley.py b/youtube_dl/postprocessor/atomicparsley.py new file mode 100644 index 0000000..765b2d9 --- /dev/null +++ b/youtube_dl/postprocessor/atomicparsley.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + + +import os +import subprocess + +from .common import PostProcessor + +from ..utils import ( + check_executable, + compat_urlretrieve, + encodeFilename, + PostProcessingError, + prepend_extension, + shell_quote +) + + +class AtomicParsleyPPError(PostProcessingError): + pass + + +class AtomicParsleyPP(PostProcessor): + def run(self, info): + if not check_executable('AtomicParsley', ['-v']): + raise AtomicParsleyPPError('AtomicParsley was not found. Please install.') + + filename = info['filepath'] + temp_filename = prepend_extension(filename, 'temp') + temp_thumbnail = prepend_extension(filename, 'thumb') + + if not info.get('thumbnail'): + raise AtomicParsleyPPError('Thumbnail was not found. Nothing to do.') + + compat_urlretrieve(info['thumbnail'], temp_thumbnail) + + cmd = ['AtomicParsley', filename, '--artwork', temp_thumbnail, '-o', temp_filename] + + self._downloader.to_screen('[atomicparsley] Adding thumbnail to "%s"' % filename) + + if self._downloader.params.get('verbose', False): + self._downloader.to_screen('[debug] AtomicParsley command line: %s' % shell_quote(cmd)) + + p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = p.communicate() + + if p.returncode != 0: + msg = stderr.decode('utf-8', 'replace').strip() + raise AtomicParsleyPPError(msg) + + os.remove(encodeFilename(filename)) + os.remove(encodeFilename(temp_thumbnail)) + os.rename(encodeFilename(temp_filename), encodeFilename(filename)) + + return True, info diff --git a/youtube_dl/postprocessor/ffmpeg.py b/youtube_dl/postprocessor/ffmpeg.py index c22f2cd..45328ed 100644 --- a/youtube_dl/postprocessor/ffmpeg.py +++ b/youtube_dl/postprocessor/ffmpeg.py @@ -9,6 +9,7 @@ from .common import AudioConversionError, PostProcessor from ..utils import ( check_executable, compat_subprocess_get_DEVNULL, + encodeArgument, encodeFilename, PostProcessingError, prepend_extension, @@ -48,13 +49,13 @@ class FFmpegPostProcessor(PostProcessor): for path in input_paths: files_cmd.extend(['-i', encodeFilename(path, True)]) cmd = ([self._get_executable(), '-y'] + files_cmd - + opts + + + [encodeArgument(o) for o in opts] + [encodeFilename(self._ffmpeg_filename_argument(out_path), True)]) if self._downloader.params.get('verbose', False): self._downloader.to_screen(u'[debug] ffmpeg command line: %s' % shell_quote(cmd)) p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - stdout,stderr = p.communicate() + stdout, stderr = p.communicate() if p.returncode != 0: stderr = stderr.decode('utf-8', 'replace') msg = stderr.strip().split('\n')[-1] @@ -464,7 +465,11 @@ class FFmpegMetadataPP(FFmpegPostProcessor): filename = info['filepath'] temp_filename = prepend_extension(filename, 'temp') - options = ['-c', 'copy'] + if info['ext'] == u'm4a': + options = ['-vn', '-acodec', 'copy'] + else: + options = ['-c', 'copy'] + for (name, value) in metadata.items(): options.extend(['-metadata', '%s=%s' % (name, value)]) @@ -483,3 +488,17 @@ class FFmpegMergerPP(FFmpegPostProcessor): self.run_ffmpeg_multiple_files(info['__files_to_merge'], filename, args) return True, info + +class FFmpegAudioFixPP(FFmpegPostProcessor): + def run(self, info): + filename = info['filepath'] + temp_filename = prepend_extension(filename, 'temp') + + options = ['-vn', '-acodec', 'copy'] + self._downloader.to_screen(u'[ffmpeg] Fixing audio file "%s"' % filename) + self.run_ffmpeg(filename, temp_filename, options) + + os.remove(encodeFilename(filename)) + os.rename(encodeFilename(temp_filename), encodeFilename(filename)) + + return True, info diff --git a/youtube_dl/postprocessor/xattrpp.py b/youtube_dl/postprocessor/xattrpp.py index 1897924..f694094 100644 --- a/youtube_dl/postprocessor/xattrpp.py +++ b/youtube_dl/postprocessor/xattrpp.py @@ -6,6 +6,7 @@ from .common import PostProcessor from ..utils import ( check_executable, hyphenate_date, + subprocess_check_output ) @@ -57,7 +58,7 @@ class XAttrMetadataPP(PostProcessor): elif user_has_xattr: cmd = ['xattr', '-w', key, value, path] - subprocess.check_output(cmd) + subprocess_check_output(cmd) else: # On Unix, and can't find pyxattr, setfattr, or xattr. diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index 057cd20..b97e62a 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -1,10 +1,14 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import calendar +import codecs +import contextlib import ctypes import datetime import email.utils import errno +import getpass import gzip import itertools import io @@ -21,6 +25,7 @@ import struct import subprocess import sys import traceback +import xml.etree.ElementTree import zlib try: @@ -174,6 +179,11 @@ try: except NameError: compat_chr = chr +try: + from xml.etree.ElementTree import ParseError as compat_xml_parse_error +except ImportError: # Python 2.6 + from xml.parsers.expat import ExpatError as compat_xml_parse_error + def compat_ord(c): if type(c) is int: return c else: return ord(c) @@ -493,13 +503,13 @@ def orderedSet(iterable): res.append(el) return res + def unescapeHTML(s): - """ - @param s a string - """ - assert type(s) == type(u'') + if s is None: + return None + assert type(s) == compat_str - result = re.sub(u'(?u)&(.+?);', htmlentity_transform, s) + result = re.sub(r'(?u)&(.+?);', htmlentity_transform, s) return result @@ -531,6 +541,15 @@ def encodeFilename(s, for_subprocess=False): return s.encode(encoding, 'ignore') +def encodeArgument(s): + if not isinstance(s, compat_str): + # Legacy code that uses byte strings + # Uncomment the following line after fixing all post processors + #assert False, 'Internal error: %r should be of type %r, is %r' % (s, compat_str, type(s)) + s = s.decode('ascii') + return encodeFilename(s, True) + + def decodeOption(optval): if optval is None: return optval @@ -585,13 +604,15 @@ def make_HTTPS_handler(opts_no_check_certificate, **kwargs): class ExtractorError(Exception): """Error during info extraction.""" - def __init__(self, msg, tb=None, expected=False, cause=None): + def __init__(self, msg, tb=None, expected=False, cause=None, video_id=None): """ tb, if given, is the original traceback (so that it can be printed out). If expected is set, this is a normal error message and most likely not a bug in youtube-dl. """ if sys.exc_info()[0] in (compat_urllib_error.URLError, socket.timeout, UnavailableVideoError): expected = True + if video_id is not None: + msg = video_id + ': ' + msg if not expected: msg = msg + u'; please report this issue on https://yt-dl.org/bug . Be sure to call youtube-dl with the --verbose flag and include its complete output. Make sure you are using the latest version; type youtube-dl -U to update.' super(ExtractorError, self).__init__(msg) @@ -599,6 +620,7 @@ class ExtractorError(Exception): self.traceback = tb self.exc_info = sys.exc_info() # preserve original exception self.cause = cause + self.video_id = video_id def format_traceback(self): if self.traceback is None: @@ -753,8 +775,37 @@ class YoutubeDLHandler(compat_urllib_request.HTTPHandler): https_response = http_response +def parse_iso8601(date_str): + """ Return a UNIX timestamp from the given date """ + + if date_str is None: + return None + + m = re.search( + r'Z$| ?(?P<sign>\+|-)(?P<hours>[0-9]{2}):?(?P<minutes>[0-9]{2})$', + date_str) + if not m: + timezone = datetime.timedelta() + else: + date_str = date_str[:-len(m.group(0))] + if not m.group('sign'): + timezone = datetime.timedelta() + else: + sign = 1 if m.group('sign') == '+' else -1 + timezone = datetime.timedelta( + hours=sign * int(m.group('hours')), + minutes=sign * int(m.group('minutes'))) + + dt = datetime.datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S') - timezone + return calendar.timegm(dt.timetuple()) + + def unified_strdate(date_str): """Return a string with the date in the format YYYYMMDD""" + + if date_str is None: + return None + upload_date = None #Replace commas date_str = date_str.replace(',', ' ') @@ -766,14 +817,17 @@ def unified_strdate(date_str): '%B %d %Y', '%b %d %Y', '%Y-%m-%d', + '%d.%m.%Y', '%d/%m/%Y', '%Y/%m/%d %H:%M:%S', '%Y-%m-%d %H:%M:%S', '%d.%m.%Y %H:%M', + '%d.%m.%Y %H.%M', '%Y-%m-%dT%H:%M:%SZ', '%Y-%m-%dT%H:%M:%S.%fZ', '%Y-%m-%dT%H:%M:%S.%f0Z', '%Y-%m-%dT%H:%M:%S', + '%Y-%m-%dT%H:%M:%S.%f', '%Y-%m-%dT%H:%M', ] for expression in format_expressions: @@ -869,25 +923,97 @@ def platform_name(): return res -def write_string(s, out=None): +def _windows_write_string(s, out): + """ Returns True if the string was written using special methods, + False if it has yet to be written out.""" + # Adapted from http://stackoverflow.com/a/3259271/35070 + + import ctypes + import ctypes.wintypes + + WIN_OUTPUT_IDS = { + 1: -11, + 2: -12, + } + + try: + fileno = out.fileno() + except AttributeError: + # If the output stream doesn't have a fileno, it's virtual + return False + if fileno not in WIN_OUTPUT_IDS: + return False + + GetStdHandle = ctypes.WINFUNCTYPE( + ctypes.wintypes.HANDLE, ctypes.wintypes.DWORD)( + ("GetStdHandle", ctypes.windll.kernel32)) + h = GetStdHandle(WIN_OUTPUT_IDS[fileno]) + + WriteConsoleW = ctypes.WINFUNCTYPE( + ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, ctypes.wintypes.LPWSTR, + ctypes.wintypes.DWORD, ctypes.POINTER(ctypes.wintypes.DWORD), + ctypes.wintypes.LPVOID)(("WriteConsoleW", ctypes.windll.kernel32)) + written = ctypes.wintypes.DWORD(0) + + GetFileType = ctypes.WINFUNCTYPE(ctypes.wintypes.DWORD, ctypes.wintypes.DWORD)(("GetFileType", ctypes.windll.kernel32)) + FILE_TYPE_CHAR = 0x0002 + FILE_TYPE_REMOTE = 0x8000 + GetConsoleMode = ctypes.WINFUNCTYPE( + ctypes.wintypes.BOOL, ctypes.wintypes.HANDLE, + ctypes.POINTER(ctypes.wintypes.DWORD))( + ("GetConsoleMode", ctypes.windll.kernel32)) + INVALID_HANDLE_VALUE = ctypes.wintypes.DWORD(-1).value + + def not_a_console(handle): + if handle == INVALID_HANDLE_VALUE or handle is None: + return True + return ((GetFileType(handle) & ~FILE_TYPE_REMOTE) != FILE_TYPE_CHAR + or GetConsoleMode(handle, ctypes.byref(ctypes.wintypes.DWORD())) == 0) + + if not_a_console(h): + return False + + def next_nonbmp_pos(s): + try: + return next(i for i, c in enumerate(s) if ord(c) > 0xffff) + except StopIteration: + return len(s) + + while s: + count = min(next_nonbmp_pos(s), 1024) + + ret = WriteConsoleW( + h, s, count if count else 2, ctypes.byref(written), None) + if ret == 0: + raise OSError('Failed to write string') + if not count: # We just wrote a non-BMP character + assert written.value == 2 + s = s[1:] + else: + assert written.value > 0 + s = s[written.value:] + return True + + +def write_string(s, out=None, encoding=None): if out is None: out = sys.stderr assert type(s) == compat_str + if sys.platform == 'win32' and encoding is None and hasattr(out, 'fileno'): + if _windows_write_string(s, out): + return + if ('b' in getattr(out, 'mode', '') or sys.version_info[0] < 3): # Python 2 lies about mode of sys.stderr - s = s.encode(preferredencoding(), 'ignore') - try: + byt = s.encode(encoding or preferredencoding(), 'ignore') + out.write(byt) + elif hasattr(out, 'buffer'): + enc = encoding or getattr(out, 'encoding', None) or preferredencoding() + byt = s.encode(enc, 'ignore') + out.buffer.write(byt) + else: out.write(s) - except UnicodeEncodeError: - # In Windows shells, this can fail even when the codec is just charmap!? - # See https://wiki.python.org/moin/PrintFails#Issue - if sys.platform == 'win32' and hasattr(out, 'encoding'): - s = s.encode(out.encoding, 'ignore').decode(out.encoding) - out.write(s) - else: - raise - out.flush() @@ -1111,11 +1237,11 @@ def setproctitle(title): libc = ctypes.cdll.LoadLibrary("libc.so.6") except OSError: return - title = title - buf = ctypes.create_string_buffer(len(title) + 1) - buf.value = title.encode('utf-8') + title_bytes = title.encode('utf-8') + buf = ctypes.create_string_buffer(len(title_bytes)) + buf.value = title_bytes try: - libc.prctl(15, ctypes.byref(buf), 0, 0, 0) + libc.prctl(15, buf, 0, 0, 0) except AttributeError: return # Strange libc, just skip this @@ -1136,8 +1262,15 @@ class HEADRequest(compat_urllib_request.Request): return "HEAD" -def int_or_none(v, scale=1): - return v if v is None else (int(v) // scale) +def int_or_none(v, scale=1, default=None, get_attr=None): + if get_attr: + if v is not None: + v = getattr(v, get_attr, None) + return default if v is None else (int(v) // scale) + + +def float_or_none(v, scale=1, default=None): + return default if v is None else (float(v) / scale) def parse_duration(s): @@ -1145,7 +1278,7 @@ def parse_duration(s): return None m = re.match( - r'(?:(?:(?P<hours>[0-9]+)[:h])?(?P<mins>[0-9]+)[:m])?(?P<secs>[0-9]+)s?$', s) + r'(?:(?:(?P<hours>[0-9]+)[:h])?(?P<mins>[0-9]+)[:m])?(?P<secs>[0-9]+)s?(?::[0-9]+)?$', s) if not m: return None res = int(m.group('secs')) @@ -1219,9 +1352,11 @@ class PagedList(object): def uppercase_escape(s): + unicode_escape = codecs.getdecoder('unicode_escape') return re.sub( - r'\\U([0-9a-fA-F]{8})', - lambda m: compat_chr(int(m.group(1), base=16)), s) + r'\\U[0-9a-fA-F]{8}', + lambda m: unicode_escape(m.group(0))[0], + s) try: struct.pack(u'!I', 0) @@ -1239,3 +1374,80 @@ except TypeError: else: struct_pack = struct.pack struct_unpack = struct.unpack + + +def read_batch_urls(batch_fd): + def fixup(url): + if not isinstance(url, compat_str): + url = url.decode('utf-8', 'replace') + BOM_UTF8 = u'\xef\xbb\xbf' + if url.startswith(BOM_UTF8): + url = url[len(BOM_UTF8):] + url = url.strip() + if url.startswith(('#', ';', ']')): + return False + return url + + with contextlib.closing(batch_fd) as fd: + return [url for url in map(fixup, fd) if url] + + +def urlencode_postdata(*args, **kargs): + return compat_urllib_parse.urlencode(*args, **kargs).encode('ascii') + + +def parse_xml(s): + class TreeBuilder(xml.etree.ElementTree.TreeBuilder): + def doctype(self, name, pubid, system): + pass # Ignore doctypes + + parser = xml.etree.ElementTree.XMLParser(target=TreeBuilder()) + kwargs = {'parser': parser} if sys.version_info >= (2, 7) else {} + return xml.etree.ElementTree.XML(s.encode('utf-8'), **kwargs) + + +if sys.version_info < (3, 0) and sys.platform == 'win32': + def compat_getpass(prompt, *args, **kwargs): + if isinstance(prompt, compat_str): + prompt = prompt.encode(preferredencoding()) + return getpass.getpass(prompt, *args, **kwargs) +else: + compat_getpass = getpass.getpass + + +US_RATINGS = { + 'G': 0, + 'PG': 10, + 'PG-13': 13, + 'R': 16, + 'NC': 18, +} + + +def strip_jsonp(code): + return re.sub(r'(?s)^[a-zA-Z_]+\s*\(\s*(.*)\);\s*?\s*$', r'\1', code) + + +def qualities(quality_ids): + """ Get a numeric quality value out of a list of possible values """ + def q(qid): + try: + return quality_ids.index(qid) + except ValueError: + return -1 + return q + + +DEFAULT_OUTTMPL = '%(title)s-%(id)s.%(ext)s' + +try: + subprocess_check_output = subprocess.check_output +except AttributeError: + def subprocess_check_output(*args, **kwargs): + assert 'input' not in kwargs + p = subprocess.Popen(*args, stdout=subprocess.PIPE, **kwargs) + output, _ = p.communicate() + ret = p.poll() + if ret: + raise subprocess.CalledProcessError(ret, p.args, output=output) + return output diff --git a/youtube_dl/version.py b/youtube_dl/version.py index a9fead9..6fe7c7b 100644 --- a/youtube_dl/version.py +++ b/youtube_dl/version.py @@ -1,2 +1,2 @@ -__version__ = '2014.02.17' +__version__ = '2014.06.07' -- 2.41.1