Compare commits
9 Commits
2013.03.24
...
2014.03.24
Author | SHA1 | Date | |
---|---|---|---|
![]() |
510243ba58 | ||
![]() |
b540697a8a | ||
![]() |
0d3641e589 | ||
![]() |
72546c831e | ||
![]() |
d26db9269d | ||
![]() |
4c0941853a | ||
![]() |
c11726364e | ||
![]() |
c577d735c6 | ||
![]() |
410afb2003 |
@@ -28,6 +28,9 @@ which means you can modify it, redistribute it or use it however you like.
|
|||||||
--user-agent UA specify a custom user agent
|
--user-agent UA specify a custom user agent
|
||||||
--referer REF specify a custom referer, use if the video
|
--referer REF specify a custom referer, use if the video
|
||||||
access is restricted to one domain
|
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
|
--list-extractors List all supported extractors and the URLs
|
||||||
they would handle
|
they would handle
|
||||||
--extractor-descriptions Output descriptions of all supported
|
--extractor-descriptions Output descriptions of all supported
|
||||||
|
@@ -22,6 +22,12 @@ fi
|
|||||||
|
|
||||||
if [ -z "$1" ]; then echo "ERROR: specify version number like this: $0 1994.09.06"; exit 1; fi
|
if [ -z "$1" ]; then echo "ERROR: specify version number like this: $0 1994.09.06"; exit 1; fi
|
||||||
version="$1"
|
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 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
|
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')
|
useless_files=$(find youtube_dl -type f -not -name '*.py')
|
||||||
|
@@ -227,6 +227,9 @@ def parseOpts(overrideArguments=None):
|
|||||||
general.add_option('--referer',
|
general.add_option('--referer',
|
||||||
dest='referer', help='specify a custom referer, use if the video access is restricted to one domain',
|
dest='referer', help='specify a custom referer, use if the video access is restricted to one domain',
|
||||||
metavar='REF', default=None)
|
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',
|
general.add_option('--list-extractors',
|
||||||
action='store_true', dest='list_extractors',
|
action='store_true', dest='list_extractors',
|
||||||
help='List all supported extractors and the URLs they would handle', default=False)
|
help='List all supported extractors and the URLs they would handle', default=False)
|
||||||
@@ -556,6 +559,16 @@ def _real_main(argv=None):
|
|||||||
if opts.referer is not None:
|
if opts.referer is not None:
|
||||||
std_headers['Referer'] = opts.referer
|
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
|
# Dump user agent
|
||||||
if opts.dump_user_agent:
|
if opts.dump_user_agent:
|
||||||
compat_print(std_headers['User-Agent'])
|
compat_print(std_headers['User-Agent'])
|
||||||
|
@@ -9,12 +9,12 @@ from ..utils import (
|
|||||||
|
|
||||||
|
|
||||||
class CinemassacreIE(InfoExtractor):
|
class CinemassacreIE(InfoExtractor):
|
||||||
_VALID_URL = r'http://(?:www\.)?cinemassacre\.com/(?P<date_Y>[0-9]{4})/(?P<date_m>[0-9]{2})/(?P<date_d>[0-9]{2})/.+?'
|
_VALID_URL = r'http://(?:www\.)?cinemassacre\.com/(?P<date_Y>[0-9]{4})/(?P<date_m>[0-9]{2})/(?P<date_d>[0-9]{2})/(?P<display_id>[^?#/]+)'
|
||||||
_TESTS = [
|
_TESTS = [
|
||||||
{
|
{
|
||||||
'url': 'http://cinemassacre.com/2012/11/10/avgn-the-movie-trailer/',
|
'url': 'http://cinemassacre.com/2012/11/10/avgn-the-movie-trailer/',
|
||||||
'file': '19911.mp4',
|
'file': '19911.mp4',
|
||||||
'md5': 'fde81fbafaee331785f58cd6c0d46190',
|
'md5': '782f8504ca95a0eba8fc9177c373eec7',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'upload_date': '20121110',
|
'upload_date': '20121110',
|
||||||
'title': '“Angry Video Game Nerd: The Movie” – Trailer',
|
'title': '“Angry Video Game Nerd: The Movie” – Trailer',
|
||||||
@@ -24,7 +24,7 @@ class CinemassacreIE(InfoExtractor):
|
|||||||
{
|
{
|
||||||
'url': 'http://cinemassacre.com/2013/10/02/the-mummys-hand-1940',
|
'url': 'http://cinemassacre.com/2013/10/02/the-mummys-hand-1940',
|
||||||
'file': '521be8ef82b16.mp4',
|
'file': '521be8ef82b16.mp4',
|
||||||
'md5': 'd72f10cd39eac4215048f62ab477a511',
|
'md5': 'dec39ee5118f8d9cc067f45f9cbe3a35',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'upload_date': '20131002',
|
'upload_date': '20131002',
|
||||||
'title': 'The Mummy’s Hand (1940)',
|
'title': 'The Mummy’s Hand (1940)',
|
||||||
@@ -34,8 +34,9 @@ class CinemassacreIE(InfoExtractor):
|
|||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
mobj = re.match(self._VALID_URL, url)
|
mobj = re.match(self._VALID_URL, url)
|
||||||
|
display_id = mobj.group('display_id')
|
||||||
|
|
||||||
webpage = self._download_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')
|
video_date = mobj.group('date_Y') + mobj.group('date_m') + mobj.group('date_d')
|
||||||
mobj = re.search(r'src="(?P<embed_url>http://player\.screenwavemedia\.com/play/[a-zA-Z]+\.php\?id=(?:Cinemassacre-)?(?P<video_id>.+?))"', webpage)
|
mobj = re.search(r'src="(?P<embed_url>http://player\.screenwavemedia\.com/play/[a-zA-Z]+\.php\?id=(?:Cinemassacre-)?(?P<video_id>.+?))"', webpage)
|
||||||
if not mobj:
|
if not mobj:
|
||||||
@@ -43,33 +44,36 @@ class CinemassacreIE(InfoExtractor):
|
|||||||
playerdata_url = mobj.group('embed_url')
|
playerdata_url = mobj.group('embed_url')
|
||||||
video_id = mobj.group('video_id')
|
video_id = mobj.group('video_id')
|
||||||
|
|
||||||
video_title = self._html_search_regex(r'<title>(?P<title>.+?)\|',
|
video_title = self._html_search_regex(
|
||||||
webpage, 'title')
|
r'<title>(?P<title>.+?)\|', webpage, 'title')
|
||||||
video_description = self._html_search_regex(r'<div class="entry-content">(?P<description>.+?)</div>',
|
video_description = self._html_search_regex(
|
||||||
|
r'<div class="entry-content">(?P<description>.+?)</div>',
|
||||||
webpage, 'description', flags=re.DOTALL, fatal=False)
|
webpage, 'description', flags=re.DOTALL, fatal=False)
|
||||||
if len(video_description) == 0:
|
|
||||||
video_description = None
|
|
||||||
|
|
||||||
playerdata = self._download_webpage(playerdata_url, video_id)
|
playerdata = self._download_webpage(playerdata_url, video_id)
|
||||||
|
|
||||||
sd_url = self._html_search_regex(r'file: \'(?P<sd_file>[^\']+)\', label: \'SD\'', playerdata, 'sd_file')
|
sd_url = self._html_search_regex(r'file: \'([^\']+)\', label: \'SD\'', playerdata, 'sd_file')
|
||||||
hd_url = self._html_search_regex(r'file: \'(?P<hd_file>[^\']+)\', label: \'HD\'', playerdata, 'hd_file')
|
hd_url = self._html_search_regex(
|
||||||
|
r'file: \'([^\']+)\', label: \'HD\'', playerdata, 'hd_file',
|
||||||
|
default=None)
|
||||||
video_thumbnail = self._html_search_regex(r'image: \'(?P<thumbnail>[^\']+)\'', playerdata, 'thumbnail', fatal=False)
|
video_thumbnail = self._html_search_regex(r'image: \'(?P<thumbnail>[^\']+)\'', playerdata, 'thumbnail', fatal=False)
|
||||||
|
|
||||||
formats = [
|
formats = [{
|
||||||
{
|
'url': sd_url,
|
||||||
'url': sd_url,
|
'ext': 'mp4',
|
||||||
'ext': 'mp4',
|
'format': 'sd',
|
||||||
'format': 'sd',
|
'format_id': 'sd',
|
||||||
'format_id': 'sd',
|
'quality': 1,
|
||||||
},
|
}]
|
||||||
{
|
if hd_url:
|
||||||
|
formats.append({
|
||||||
'url': hd_url,
|
'url': hd_url,
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'format': 'hd',
|
'format': 'hd',
|
||||||
'format_id': 'hd',
|
'format_id': 'hd',
|
||||||
},
|
'quality': 2,
|
||||||
]
|
})
|
||||||
|
self._sort_formats(formats)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': video_id,
|
'id': video_id,
|
||||||
|
@@ -4,26 +4,99 @@ import re
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
from ..utils import compat_urllib_request
|
from ..utils import (
|
||||||
|
compat_urllib_request,
|
||||||
|
int_or_none,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class VeohIE(InfoExtractor):
|
class VeohIE(InfoExtractor):
|
||||||
_VALID_URL = r'http://(?:www\.)?veoh\.com/(?:watch|iphone/#_Watch)/v(?P<id>\d*)'
|
_VALID_URL = r'http://(?:www\.)?veoh\.com/(?:watch|iphone/#_Watch)/(?P<id>(?:v|yapi-)[\da-zA-Z]+)'
|
||||||
|
|
||||||
_TEST = {
|
_TESTS = [
|
||||||
'url': 'http://www.veoh.com/watch/v56314296nk7Zdmz3',
|
{
|
||||||
'file': '56314296.mp4',
|
'url': 'http://www.veoh.com/watch/v56314296nk7Zdmz3',
|
||||||
'md5': '620e68e6a3cff80086df3348426c9ca3',
|
'md5': '620e68e6a3cff80086df3348426c9ca3',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'title': 'Straight Backs Are Stronger',
|
'id': '56314296',
|
||||||
'uploader': 'LUMOback',
|
'ext': 'mp4',
|
||||||
'description': 'At LUMOback, we believe straight backs are stronger. The LUMOback Posture & Movement Sensor: It gently vibrates when you slouch, inspiring improved posture and mobility. Use the app to track your data and improve your posture over time. ',
|
'title': 'Straight Backs Are Stronger',
|
||||||
|
'uploader': 'LUMOback',
|
||||||
|
'description': 'At LUMOback, we believe straight backs are stronger. The LUMOback Posture & Movement Sensor: It gently vibrates when you slouch, inspiring improved posture and mobility. Use the app to track your data and improve your posture over time. ',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url': 'http://www.veoh.com/watch/v27701988pbTc4wzN?h1=Chile+workers+cover+up+to+avoid+skin+damage',
|
||||||
|
'md5': '4a6ff84b87d536a6a71e6aa6c0ad07fa',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '27701988',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'Chile workers cover up to avoid skin damage',
|
||||||
|
'description': 'md5:2bd151625a60a32822873efc246ba20d',
|
||||||
|
'uploader': 'afp-news',
|
||||||
|
'duration': 123,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url': 'http://www.veoh.com/watch/v69525809F6Nc4frX',
|
||||||
|
'md5': '4fde7b9e33577bab2f2f8f260e30e979',
|
||||||
|
'note': 'Embedded ooyala video',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '69525809',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'Doctors Alter Plan For Preteen\'s Weight Loss Surgery',
|
||||||
|
'description': 'md5:f5a11c51f8fb51d2315bca0937526891',
|
||||||
|
'uploader': 'newsy-videos',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
def _extract_formats(self, source):
|
||||||
|
formats = []
|
||||||
|
link = source.get('aowPermalink')
|
||||||
|
if link:
|
||||||
|
formats.append({
|
||||||
|
'url': link,
|
||||||
|
'ext': 'mp4',
|
||||||
|
'format_id': 'aow',
|
||||||
|
})
|
||||||
|
link = source.get('fullPreviewHashLowPath')
|
||||||
|
if link:
|
||||||
|
formats.append({
|
||||||
|
'url': link,
|
||||||
|
'format_id': 'low',
|
||||||
|
})
|
||||||
|
link = source.get('fullPreviewHashHighPath')
|
||||||
|
if link:
|
||||||
|
formats.append({
|
||||||
|
'url': link,
|
||||||
|
'format_id': 'high',
|
||||||
|
})
|
||||||
|
return formats
|
||||||
|
|
||||||
|
def _extract_video(self, source):
|
||||||
|
return {
|
||||||
|
'id': source.get('videoId'),
|
||||||
|
'title': source.get('title'),
|
||||||
|
'description': source.get('description'),
|
||||||
|
'thumbnail': source.get('highResImage') or source.get('medResImage'),
|
||||||
|
'uploader': source.get('username'),
|
||||||
|
'duration': int_or_none(source.get('length')),
|
||||||
|
'view_count': int_or_none(source.get('views')),
|
||||||
|
'age_limit': 18 if source.get('isMature') == 'true' or source.get('isSexy') == 'true' else 0,
|
||||||
|
'formats': self._extract_formats(source),
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
mobj = re.match(self._VALID_URL, url)
|
mobj = re.match(self._VALID_URL, url)
|
||||||
video_id = mobj.group('id')
|
video_id = mobj.group('id')
|
||||||
|
|
||||||
|
if video_id.startswith('v'):
|
||||||
|
rsp = self._download_xml(
|
||||||
|
r'http://www.veoh.com/api/findByPermalink?permalink=%s' % video_id, video_id, 'Downloading video XML')
|
||||||
|
if rsp.get('stat') == 'ok':
|
||||||
|
return self._extract_video(rsp.find('./videoList/video'))
|
||||||
|
|
||||||
webpage = self._download_webpage(url, video_id)
|
webpage = self._download_webpage(url, video_id)
|
||||||
age_limit = 0
|
age_limit = 0
|
||||||
if 'class="adultwarning-container"' in webpage:
|
if 'class="adultwarning-container"' in webpage:
|
||||||
@@ -33,24 +106,16 @@ class VeohIE(InfoExtractor):
|
|||||||
request.add_header('Cookie', 'confirmedAdult=true')
|
request.add_header('Cookie', 'confirmedAdult=true')
|
||||||
webpage = self._download_webpage(request, video_id)
|
webpage = self._download_webpage(request, video_id)
|
||||||
|
|
||||||
m_youtube = re.search(r'http://www\.youtube\.com/v/(.*?)(\&|")', webpage)
|
m_youtube = re.search(r'http://www\.youtube\.com/v/(.*?)(\&|"|\?)', webpage)
|
||||||
if m_youtube is not None:
|
if m_youtube is not None:
|
||||||
youtube_id = m_youtube.group(1)
|
youtube_id = m_youtube.group(1)
|
||||||
self.to_screen('%s: detected Youtube video.' % video_id)
|
self.to_screen('%s: detected Youtube video.' % video_id)
|
||||||
return self.url_result(youtube_id, 'Youtube')
|
return self.url_result(youtube_id, 'Youtube')
|
||||||
|
|
||||||
self.report_extraction(video_id)
|
info = json.loads(
|
||||||
info = self._search_regex(r'videoDetailsJSON = \'({.*?})\';', webpage, 'info')
|
self._search_regex(r'videoDetailsJSON = \'({.*?})\';', webpage, 'info').replace('\\\'', '\''))
|
||||||
info = json.loads(info)
|
|
||||||
video_url = info.get('fullPreviewHashHighPath') or info.get('fullPreviewHashLowPath')
|
|
||||||
|
|
||||||
return {
|
video = self._extract_video(info)
|
||||||
'id': info['videoId'],
|
video['age_limit'] = age_limit
|
||||||
'title': info['title'],
|
|
||||||
'url': video_url,
|
return video
|
||||||
'uploader': info['username'],
|
|
||||||
'thumbnail': info.get('highResImage') or info.get('medResImage'),
|
|
||||||
'description': info['description'],
|
|
||||||
'view_count': info['views'],
|
|
||||||
'age_limit': age_limit,
|
|
||||||
}
|
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
|
|
||||||
__version__ = '2013.03.24.1'
|
__version__ = '2014.03.24.2'
|
||||||
|
Reference in New Issue
Block a user