Compare commits
6 Commits
2014.01.23
...
2014.01.23
Author | SHA1 | Date | |
---|---|---|---|
![]() |
629be17af4 | ||
![]() |
fd28827864 | ||
![]() |
8c61d9a9b1 | ||
![]() |
975d35dbab | ||
![]() |
8b769664c4 | ||
![]() |
76f270a46a |
@@ -181,7 +181,9 @@ which means you can modify it, redistribute it or use it however you like.
|
|||||||
preference using slashes: "-f 22/17/18".
|
preference using slashes: "-f 22/17/18".
|
||||||
"-f mp4" and "-f flv" are also supported.
|
"-f mp4" and "-f flv" are also supported.
|
||||||
You can also use the special names "best",
|
You can also use the special names "best",
|
||||||
"bestaudio", "worst", and "worstaudio"
|
"bestaudio", "worst", and "worstaudio". By
|
||||||
|
default, youtube-dl will pick the best
|
||||||
|
quality.
|
||||||
--all-formats download all available video formats
|
--all-formats download all available video formats
|
||||||
--prefer-free-formats prefer free video formats unless a specific
|
--prefer-free-formats prefer free video formats unless a specific
|
||||||
one is requested
|
one is requested
|
||||||
|
@@ -396,10 +396,6 @@ class YoutubeDL(object):
|
|||||||
except UnicodeEncodeError:
|
except UnicodeEncodeError:
|
||||||
self.to_screen('[download] The file has already been downloaded')
|
self.to_screen('[download] The file has already been downloaded')
|
||||||
|
|
||||||
def increment_downloads(self):
|
|
||||||
"""Increment the ordinal that assigns a number to each file."""
|
|
||||||
self._num_downloads += 1
|
|
||||||
|
|
||||||
def prepare_filename(self, info_dict):
|
def prepare_filename(self, info_dict):
|
||||||
"""Generate the output filename."""
|
"""Generate the output filename."""
|
||||||
try:
|
try:
|
||||||
@@ -773,8 +769,11 @@ class YoutubeDL(object):
|
|||||||
"""Process a single resolved IE result."""
|
"""Process a single resolved IE result."""
|
||||||
|
|
||||||
assert info_dict.get('_type', 'video') == 'video'
|
assert info_dict.get('_type', 'video') == 'video'
|
||||||
#We increment the download the download count here to match the previous behaviour.
|
|
||||||
self.increment_downloads()
|
max_downloads = self.params.get('max_downloads')
|
||||||
|
if max_downloads is not None:
|
||||||
|
if self._num_downloads >= int(max_downloads):
|
||||||
|
raise MaxDownloadsReached()
|
||||||
|
|
||||||
info_dict['fulltitle'] = info_dict['title']
|
info_dict['fulltitle'] = info_dict['title']
|
||||||
if len(info_dict['title']) > 200:
|
if len(info_dict['title']) > 200:
|
||||||
@@ -791,10 +790,7 @@ class YoutubeDL(object):
|
|||||||
self.to_screen('[download] ' + reason)
|
self.to_screen('[download] ' + reason)
|
||||||
return
|
return
|
||||||
|
|
||||||
max_downloads = self.params.get('max_downloads')
|
self._num_downloads += 1
|
||||||
if max_downloads is not None:
|
|
||||||
if self._num_downloads > int(max_downloads):
|
|
||||||
raise MaxDownloadsReached()
|
|
||||||
|
|
||||||
filename = self.prepare_filename(info_dict)
|
filename = self.prepare_filename(info_dict)
|
||||||
|
|
||||||
|
@@ -261,7 +261,7 @@ def parseOpts(overrideArguments=None):
|
|||||||
|
|
||||||
video_format.add_option('-f', '--format',
|
video_format.add_option('-f', '--format',
|
||||||
action='store', dest='format', metavar='FORMAT', default=None,
|
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"')
|
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.')
|
||||||
video_format.add_option('--all-formats',
|
video_format.add_option('--all-formats',
|
||||||
action='store_const', dest='format', help='download all available video formats', const='all')
|
action='store_const', dest='format', help='download all available video formats', const='all')
|
||||||
video_format.add_option('--prefer-free-formats',
|
video_format.add_option('--prefer-free-formats',
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
# coding: utf-8
|
# coding: utf-8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
@@ -12,21 +13,31 @@ from ..utils import (
|
|||||||
class SinaIE(InfoExtractor):
|
class SinaIE(InfoExtractor):
|
||||||
_VALID_URL = r'''https?://(.*?\.)?video\.sina\.com\.cn/
|
_VALID_URL = r'''https?://(.*?\.)?video\.sina\.com\.cn/
|
||||||
(
|
(
|
||||||
(.+?/(((?P<pseudo_id>\d+).html)|(.*?(\#|(vid=))(?P<id>\d+?)($|&))))
|
(.+?/(((?P<pseudo_id>\d+).html)|(.*?(\#|(vid=)|b/)(?P<id>\d+?)($|&|\-))))
|
||||||
|
|
|
|
||||||
# This is used by external sites like Weibo
|
# This is used by external sites like Weibo
|
||||||
(api/sinawebApi/outplay.php/(?P<token>.+?)\.swf)
|
(api/sinawebApi/outplay.php/(?P<token>.+?)\.swf)
|
||||||
)
|
)
|
||||||
'''
|
'''
|
||||||
|
|
||||||
_TEST = {
|
_TESTS = [
|
||||||
u'url': u'http://video.sina.com.cn/news/vlist/zt/chczlj2013/?opsubject_id=top12#110028898',
|
{
|
||||||
u'file': u'110028898.flv',
|
'url': 'http://video.sina.com.cn/news/vlist/zt/chczlj2013/?opsubject_id=top12#110028898',
|
||||||
u'md5': u'd65dd22ddcf44e38ce2bf58a10c3e71f',
|
'file': '110028898.flv',
|
||||||
u'info_dict': {
|
'md5': 'd65dd22ddcf44e38ce2bf58a10c3e71f',
|
||||||
u'title': u'《中国新闻》 朝鲜要求巴拿马立即释放被扣船员',
|
'info_dict': {
|
||||||
}
|
'title': '《中国新闻》 朝鲜要求巴拿马立即释放被扣船员',
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url': 'http://video.sina.com.cn/v/b/101314253-1290078633.html',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '101314253',
|
||||||
|
'ext': 'flv',
|
||||||
|
'title': '军方提高对朝情报监视级别',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def suitable(cls, url):
|
def suitable(cls, url):
|
||||||
@@ -35,10 +46,10 @@ class SinaIE(InfoExtractor):
|
|||||||
def _extract_video(self, video_id):
|
def _extract_video(self, video_id):
|
||||||
data = compat_urllib_parse.urlencode({'vid': video_id})
|
data = compat_urllib_parse.urlencode({'vid': video_id})
|
||||||
url_doc = self._download_xml('http://v.iask.com/v_play.php?%s' % data,
|
url_doc = self._download_xml('http://v.iask.com/v_play.php?%s' % data,
|
||||||
video_id, u'Downloading video url')
|
video_id, 'Downloading video url')
|
||||||
image_page = self._download_webpage(
|
image_page = self._download_webpage(
|
||||||
'http://interface.video.sina.com.cn/interface/common/getVideoImage.php?%s' % data,
|
'http://interface.video.sina.com.cn/interface/common/getVideoImage.php?%s' % data,
|
||||||
video_id, u'Downloading thumbnail info')
|
video_id, 'Downloading thumbnail info')
|
||||||
|
|
||||||
return {'id': video_id,
|
return {'id': video_id,
|
||||||
'url': url_doc.find('./durl/url').text,
|
'url': url_doc.find('./durl/url').text,
|
||||||
@@ -52,7 +63,7 @@ class SinaIE(InfoExtractor):
|
|||||||
video_id = mobj.group('id')
|
video_id = mobj.group('id')
|
||||||
if mobj.group('token') is not None:
|
if mobj.group('token') is not None:
|
||||||
# The video id is in the redirected url
|
# The video id is in the redirected url
|
||||||
self.to_screen(u'Getting video id')
|
self.to_screen('Getting video id')
|
||||||
request = compat_urllib_request.Request(url)
|
request = compat_urllib_request.Request(url)
|
||||||
request.get_method = lambda: 'HEAD'
|
request.get_method = lambda: 'HEAD'
|
||||||
(_, urlh) = self._download_webpage_handle(request, 'NA', False)
|
(_, urlh) = self._download_webpage_handle(request, 'NA', False)
|
||||||
@@ -60,6 +71,6 @@ class SinaIE(InfoExtractor):
|
|||||||
elif video_id is None:
|
elif video_id is None:
|
||||||
pseudo_id = mobj.group('pseudo_id')
|
pseudo_id = mobj.group('pseudo_id')
|
||||||
webpage = self._download_webpage(url, pseudo_id)
|
webpage = self._download_webpage(url, pseudo_id)
|
||||||
video_id = self._search_regex(r'vid:\'(\d+?)\'', webpage, u'video id')
|
video_id = self._search_regex(r'vid:\'(\d+?)\'', webpage, 'video id')
|
||||||
|
|
||||||
return self._extract_video(video_id)
|
return self._extract_video(video_id)
|
||||||
|
@@ -1805,7 +1805,10 @@ class YoutubeFavouritesIE(YoutubeBaseInfoExtractor):
|
|||||||
class YoutubeTruncatedURLIE(InfoExtractor):
|
class YoutubeTruncatedURLIE(InfoExtractor):
|
||||||
IE_NAME = 'youtube:truncated_url'
|
IE_NAME = 'youtube:truncated_url'
|
||||||
IE_DESC = False # Do not list
|
IE_DESC = False # Do not list
|
||||||
_VALID_URL = r'(?:https?://)?[^/]+/watch\?feature=[a-z_]+$'
|
_VALID_URL = r'''(?x)
|
||||||
|
(?:https?://)?[^/]+/watch\?feature=[a-z_]+$|
|
||||||
|
(?:https?://)?(?:www\.)?youtube\.com/attribution_link\?a=[^&]+$
|
||||||
|
'''
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
raise ExtractorError(
|
raise ExtractorError(
|
||||||
|
@@ -1,2 +1,2 @@
|
|||||||
|
|
||||||
__version__ = '2014.01.23.1'
|
__version__ = '2014.01.23.2'
|
||||||
|
Reference in New Issue
Block a user