diff --git a/.gitignore b/.gitignore index e51512d4f2..12b25ba881 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,12 @@ *~ wine-py2exe/ py2exe.log + +#OS X +.DS_Store +.AppleDouble +.LSOverride +Icon +._* +.Spotlight-V100 +.Trashes diff --git a/LATEST_VERSION b/LATEST_VERSION deleted file mode 100644 index d070c6ea3d..0000000000 --- a/LATEST_VERSION +++ /dev/null @@ -1 +0,0 @@ -2012.10.09 diff --git a/youtube-dl b/youtube-dl deleted file mode 100755 index 4da0fcb964..0000000000 Binary files a/youtube-dl and /dev/null differ diff --git a/youtube-dl.1 b/youtube-dl.1 deleted file mode 100644 index d4883ad2f6..0000000000 --- a/youtube-dl.1 +++ /dev/null @@ -1,240 +0,0 @@ -.TH youtube-dl 1 "" -.SH NAME -.PP -youtube-dl -.SH SYNOPSIS -.PP -\f[B]youtube-dl\f[] [OPTIONS] URL [URL...] -.SH DESCRIPTION -.PP -\f[B]youtube-dl\f[] is a small command-line program to download videos -from YouTube.com and a few more sites. -It requires the Python interpreter, version 2.x (x being at least 6), -and it is not platform specific. -It should work in your Unix box, in Windows or in Mac OS X. -It is released to the public domain, which means you can modify it, -redistribute it or use it however you like. -.SH OPTIONS -.IP -.nf -\f[C] --h,\ --help\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ print\ this\ help\ text\ and\ exit ---version\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ print\ program\ version\ and\ exit --U,\ --update\ \ \ \ \ \ \ \ \ \ \ \ \ update\ this\ program\ to\ latest\ version --i,\ --ignore-errors\ \ \ \ \ \ continue\ on\ download\ errors --r,\ --rate-limit\ LIMIT\ \ \ download\ rate\ limit\ (e.g.\ 50k\ or\ 44.6m) --R,\ --retries\ RETRIES\ \ \ \ number\ of\ retries\ (default\ is\ 10) ---dump-user-agent\ \ \ \ \ \ \ \ display\ the\ current\ browser\ identification ---user-agent\ UA\ \ \ \ \ \ \ \ \ \ specify\ a\ custom\ user\ agent ---list-extractors\ \ \ \ \ \ \ \ List\ all\ supported\ extractors\ and\ the\ URLs\ they -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ would\ handle -\f[] -.fi -.SS Video Selection: -.IP -.nf -\f[C] ---playlist-start\ NUMBER\ \ playlist\ video\ to\ start\ at\ (default\ is\ 1) ---playlist-end\ NUMBER\ \ \ \ playlist\ video\ to\ end\ at\ (default\ is\ last) ---match-title\ REGEX\ \ \ \ \ \ download\ only\ matching\ titles\ (regex\ or\ caseless -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ sub-string) ---reject-title\ REGEX\ \ \ \ \ skip\ download\ for\ matching\ titles\ (regex\ or -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ caseless\ sub-string) ---max-downloads\ NUMBER\ \ \ Abort\ after\ downloading\ NUMBER\ files -\f[] -.fi -.SS Filesystem Options: -.IP -.nf -\f[C] --t,\ --title\ \ \ \ \ \ \ \ \ \ \ \ \ \ use\ title\ in\ file\ name ---id\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ use\ video\ ID\ in\ file\ name --l,\ --literal\ \ \ \ \ \ \ \ \ \ \ \ use\ literal\ title\ in\ file\ name --A,\ --auto-number\ \ \ \ \ \ \ \ number\ downloaded\ files\ starting\ from\ 00000 --o,\ --output\ TEMPLATE\ \ \ \ output\ filename\ template.\ Use\ %(stitle)s\ to\ get\ the -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ title,\ %(uploader)s\ for\ the\ uploader\ name, -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %(autonumber)s\ to\ get\ an\ automatically\ incremented -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ number,\ %(ext)s\ for\ the\ filename\ extension, -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %(upload_date)s\ for\ the\ upload\ date\ (YYYYMMDD), -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ %(extractor)s\ for\ the\ provider\ (youtube,\ metacafe, -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ etc),\ %(id)s\ for\ the\ video\ id\ and\ %%\ for\ a\ literal -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ percent.\ Use\ -\ to\ output\ to\ stdout. --a,\ --batch-file\ FILE\ \ \ \ file\ containing\ URLs\ to\ download\ (\[aq]-\[aq]\ for\ stdin) --w,\ --no-overwrites\ \ \ \ \ \ do\ not\ overwrite\ files --c,\ --continue\ \ \ \ \ \ \ \ \ \ \ resume\ partially\ downloaded\ files ---no-continue\ \ \ \ \ \ \ \ \ \ \ \ do\ not\ resume\ partially\ downloaded\ files\ (restart -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ from\ beginning) ---cookies\ FILE\ \ \ \ \ \ \ \ \ \ \ file\ to\ read\ cookies\ from\ and\ dump\ cookie\ jar\ in ---no-part\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ do\ not\ use\ .part\ files ---no-mtime\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ do\ not\ use\ the\ Last-modified\ header\ to\ set\ the\ file -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ modification\ time ---write-description\ \ \ \ \ \ write\ video\ description\ to\ a\ .description\ file ---write-info-json\ \ \ \ \ \ \ \ write\ video\ metadata\ to\ a\ .info.json\ file -\f[] -.fi -.SS Verbosity / Simulation Options: -.IP -.nf -\f[C] --q,\ --quiet\ \ \ \ \ \ \ \ \ \ \ \ \ \ activates\ quiet\ mode --s,\ --simulate\ \ \ \ \ \ \ \ \ \ \ do\ not\ download\ the\ video\ and\ do\ not\ write\ anything -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ to\ disk ---skip-download\ \ \ \ \ \ \ \ \ \ do\ not\ download\ the\ video --g,\ --get-url\ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ URL --e,\ --get-title\ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ title ---get-thumbnail\ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ thumbnail\ URL ---get-description\ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ video\ description ---get-filename\ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ filename ---get-format\ \ \ \ \ \ \ \ \ \ \ \ \ simulate,\ quiet\ but\ print\ output\ format ---no-progress\ \ \ \ \ \ \ \ \ \ \ \ do\ not\ print\ progress\ bar ---console-title\ \ \ \ \ \ \ \ \ \ display\ progress\ in\ console\ titlebar --v,\ --verbose\ \ \ \ \ \ \ \ \ \ \ \ print\ various\ debugging\ information -\f[] -.fi -.SS Video Format Options: -.IP -.nf -\f[C] --f,\ --format\ FORMAT\ \ \ \ \ \ video\ format\ code ---all-formats\ \ \ \ \ \ \ \ \ \ \ \ download\ all\ available\ video\ formats ---prefer-free-formats\ \ \ \ prefer\ free\ video\ formats\ unless\ a\ specific\ one\ is -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ requested ---max-quality\ FORMAT\ \ \ \ \ highest\ quality\ format\ to\ download --F,\ --list-formats\ \ \ \ \ \ \ list\ all\ available\ formats\ (currently\ youtube\ only) ---write-srt\ \ \ \ \ \ \ \ \ \ \ \ \ \ write\ video\ closed\ captions\ to\ a\ .srt\ file -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (currently\ youtube\ only) ---srt-lang\ LANG\ \ \ \ \ \ \ \ \ \ language\ of\ the\ closed\ captions\ to\ download -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (optional)\ use\ IETF\ language\ tags\ like\ \[aq]en\[aq] -\f[] -.fi -.SS Authentication Options: -.IP -.nf -\f[C] --u,\ --username\ USERNAME\ \ account\ username --p,\ --password\ PASSWORD\ \ account\ password --n,\ --netrc\ \ \ \ \ \ \ \ \ \ \ \ \ \ use\ .netrc\ authentication\ data -\f[] -.fi -.SS Post-processing Options: -.IP -.nf -\f[C] --x,\ --extract-audio\ \ \ \ \ \ convert\ video\ files\ to\ audio-only\ files\ (requires -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ffmpeg\ or\ avconv\ and\ ffprobe\ or\ avprobe) ---audio-format\ FORMAT\ \ \ \ "best",\ "aac",\ "vorbis",\ "mp3",\ "m4a",\ or\ "wav"; -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ best\ by\ default ---audio-quality\ QUALITY\ \ ffmpeg/avconv\ audio\ quality\ specification,\ insert\ a -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ value\ between\ 0\ (better)\ and\ 9\ (worse)\ for\ VBR\ or\ a -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ specific\ bitrate\ like\ 128K\ (default\ 5) --k,\ --keep-video\ \ \ \ \ \ \ \ \ keeps\ the\ video\ file\ on\ disk\ after\ the\ post- -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ processing;\ the\ video\ is\ erased\ by\ default -\f[] -.fi -.SH FAQ -.SS Can you please put the -b option back? -.PP -Most people asking this question are not aware that youtube-dl now -defaults to downloading the highest available quality as reported by -YouTube, which will be 1080p or 720p in some cases, so you no longer -need the -b option. -For some specific videos, maybe YouTube does not report them to be -available in a specific high quality format you\[aq]\[aq]re interested -in. -In that case, simply request it with the -f option and youtube-dl will -try to download it. -.SS I get HTTP error 402 when trying to download a video. What\[aq]s -this? -.PP -Apparently YouTube requires you to pass a CAPTCHA test if you download -too much. -We\[aq]\[aq]re considering to provide a way to let you solve the -CAPTCHA (https://github.com/rg3/youtube-dl/issues/154), but at the -moment, your best course of action is pointing a webbrowser to the -youtube URL, solving the CAPTCHA, and restart youtube-dl. -.SS I have downloaded a video but how can I play it? -.PP -Once the video is fully downloaded, use any video player, such as -vlc (http://www.videolan.org) or mplayer (http://www.mplayerhq.hu/). -.SS The links provided by youtube-dl -g are not working anymore -.PP -The URLs youtube-dl outputs require the downloader to have the correct -cookies. -Use the \f[C]--cookies\f[] option to write the required cookies into a -file, and advise your downloader to read cookies from that file. -Some sites also require a common user agent to be used, use -\f[C]--dump-user-agent\f[] to see the one in use by youtube-dl. -.SS ERROR: no fmt_url_map or conn information found in video info -.PP -youtube has switched to a new video info format in July 2011 which is -not supported by old versions of youtube-dl. -You can update youtube-dl with \f[C]sudo\ youtube-dl\ --update\f[]. -.SS ERROR: unable to download video -.PP -youtube requires an additional signature since September 2012 which is -not supported by old versions of youtube-dl. -You can update youtube-dl with \f[C]sudo\ youtube-dl\ --update\f[]. -.SS SyntaxError: Non-ASCII character -.PP -The error -.IP -.nf -\f[C] -File\ "youtube-dl",\ line\ 2 -SyntaxError:\ Non-ASCII\ character\ \[aq]\\x93\[aq]\ ... -\f[] -.fi -.PP -means you\[aq]re using an outdated version of Python. -Please update to Python 2.6 or 2.7. -.PP -To run youtube-dl under Python 2.5, you\[aq]ll have to manually check it -out like this: -.IP -.nf -\f[C] -git\ clone\ git://github.com/rg3/youtube-dl.git -cd\ youtube-dl -python\ -m\ youtube_dl\ --help -\f[] -.fi -.PP -Please note that Python 2.5 is not supported anymore. -.SS What is this binary file? Where has the code gone? -.PP -Since June 2012 (#342) youtube-dl is packed as an executable zipfile, -simply unzip it (might need renaming to \f[C]youtube-dl.zip\f[] first on -some systems) or clone the git repo to see the code. -If you modify the code, you can run it by executing the -\f[C]__main__.py\f[] file. -To recompile the executable, run \f[C]make\ compile\f[]. -.SS The exe throws a \f[I]Runtime error from Visual C++\f[] -.PP -To run the exe you need to install first the Microsoft Visual C++ 2008 -Redistributable -Package (http://www.microsoft.com/en-us/download/details.aspx?id=29). -.SH COPYRIGHT -.PP -youtube-dl is released into the public domain by the copyright holders. -.PP -This README file was originally written by Daniel Bolton -() and is likewise released into the public -domain. -.SH BUGS -.PP -Bugs and suggestions should be reported at: - -.PP -Please include: -.IP \[bu] 2 -Your exact command line, like -\f[C]youtube-dl\ -t\ "http://www.youtube.com/watch?v=uHlDtZ6Oc3s&feature=channel_video_title"\f[]. -A common mistake is not to escape the \f[C]&\f[]. -Putting URLs in quotes should solve this problem. -.IP \[bu] 2 -The output of \f[C]youtube-dl\ --version\f[] -.IP \[bu] 2 -The output of \f[C]python\ --version\f[] -.IP \[bu] 2 -The name and version of your Operating System ("Ubuntu 11.04 x64" or -"Windows 7 x64" is usually enough). diff --git a/youtube-dl.exe b/youtube-dl.exe deleted file mode 100755 index 9341e800ff..0000000000 Binary files a/youtube-dl.exe and /dev/null differ diff --git a/youtube_dl/InfoExtractors.py b/youtube_dl/InfoExtractors.py index cfaef29045..acbd3fceeb 100644 --- a/youtube_dl/InfoExtractors.py +++ b/youtube_dl/InfoExtractors.py @@ -94,6 +94,8 @@ class InfoExtractor(object): pass + + class YoutubeIE(InfoExtractor): """Information extractor for youtube.com.""" @@ -3368,3 +3370,82 @@ class GooglePlusIE(InfoExtractor): 'format': u'NA', 'player_url': None, }] + + +class PornotubeIE(InfoExtractor): + """Information extractor for pornotube.com.""" + + _VALID_URL = r'^(?:https?://)?(?:\w+\.)?pornotube\.com(/c/(?P[0-9]+))?(/m/(?P[0-9]+))(/(?P.+))$' + IE_NAME = u'pornotube' + VIDEO_URL_RE = r'url: "(?P<url>http://video[0-9].pornotube.com/.+\.flv)",' + VIDEO_UPLOADED_RE = r'<div class="video_added_by">Added (?P<date>[0-9\/]+) by' + + + def __init__(self, downloader=None): + InfoExtractor.__init__(self, downloader) + + def report_extract_entry(self, url): + """Report downloading extry""" + self._downloader.to_screen(u'[pornotube] Downloading entry: %s' % url.decode('utf-8')) + + def report_date(self, upload_date): + """Report finding uploaded date""" + self._downloader.to_screen(u'[pornotube] Entry date: %s' % upload_date) + + def report_webpage(self, url): + """Report downloading page""" + self._downloader.to_screen(u'[pornotube] Downloaded page: %s' % url) + + def report_title(self, video_title): + """Report downloading extry""" + self._downloader.to_screen(u'[pornotube] Title: %s' % video_title.decode('utf-8')) + + def _real_extract(self, url): + mobj = re.match(self._VALID_URL, url) + if mobj is None: + self._downloader.trouble(u'ERROR: invalid URL: %s' % url) + return + + video_id = mobj.group('videoid').decode('utf-8') + video_title = mobj.group('title').decode('utf-8') + self.report_title(video_title); + + # Get webpage content + try: + webpage = urllib2.urlopen(url).read() + except (urllib2.URLError, httplib.HTTPException, socket.error), err: + self._downloader.trouble(u'ERROR: unable to download video webpage: %s' % err) + return + self.report_webpage(url) + + # Get the video URL + result = re.search(self.VIDEO_URL_RE, webpage) + if result is None: + self._downloader.trouble(u'ERROR: unable to extract video url') + return + video_url = urllib.unquote(result.group('url').decode('utf-8')) + self.report_extract_entry(video_url) + + #Get the uploaded date + result = re.search(self.VIDEO_UPLOADED_RE, webpage) + if result is None: + self._downloader.trouble(u'ERROR: unable to extract video title') + return + upload_date = result.group('date').decode('utf-8') + self.report_date(upload_date); + + + info = {'id': video_id, + 'url': video_url, + 'uploader': None, + 'upload_date': upload_date, + 'title': video_title, + 'ext': 'flv', + 'format': 'flv', + 'thumbnail': None, + 'description': None, + 'player_url': None} + + return [info] + + diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 3aa7bde128..3b893c62f4 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -361,6 +361,7 @@ def gen_extractors(): YoukuIE(), XNXXIE(), GooglePlusIE(), + PornotubeIE(), GenericIE() ]