Added Pornotube support (for Laborers of Love)
authorJeff Crouse <jefftimesten@gmail.com>
Mon, 12 Nov 2012 21:17:55 +0000 (16:17 -0500)
committerJeff Crouse <jefftimesten@gmail.com>
Mon, 12 Nov 2012 21:17:55 +0000 (16:17 -0500)
.gitignore
LATEST_VERSION [deleted file]
youtube-dl [deleted file]
youtube-dl.1 [deleted file]
youtube-dl.exe [deleted file]
youtube_dl/InfoExtractors.py
youtube_dl/__init__.py

index e51512d4f2b19ea07bdbce4e15043f13797eaa2e..12b25ba881635792f30ff777877daa84e6f0e2f9 100644 (file)
@@ -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 (file)
index d070c6e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-2012.10.09
diff --git a/youtube-dl b/youtube-dl
deleted file mode 100755 (executable)
index 4da0fcb..0000000
Binary files a/youtube-dl and /dev/null differ
diff --git a/youtube-dl.1 b/youtube-dl.1
deleted file mode 100644 (file)
index d4883ad..0000000
+++ /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
-(<https://github.com/dbbolton>) and is likewise released into the public
-domain.
-.SH BUGS
-.PP
-Bugs and suggestions should be reported at:
-<https://github.com/rg3/youtube-dl/issues>
-.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 (executable)
index 9341e80..0000000
Binary files a/youtube-dl.exe and /dev/null differ
index cfaef29045d95d45fbf7a8baf0b70874e881d0d7..acbd3fceebda6bccacb601359d2100ab7a54f618 100644 (file)
@@ -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<channel>[0-9]+))?(/m/(?P<videoid>[0-9]+))(/(?P<title>.+))$'
+       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]
+
+
index 3aa7bde128b8dc6b19253ae1a5c472edce649560..3b893c62f4de3047c1a9683ae55ec94a217ddb9c 100644 (file)
@@ -361,6 +361,7 @@ def gen_extractors():
                YoukuIE(),
                XNXXIE(),
                GooglePlusIE(),
+               PornotubeIE(),
 
                GenericIE()
        ]