commit
fc590692c5
6
.github/ISSUE_TEMPLATE.md
vendored
6
.github/ISSUE_TEMPLATE.md
vendored
@ -6,8 +6,8 @@
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### Make sure you are using the *latest* version: run `youtube-dl --version` and ensure your version is *2016.04.24*. If it's not read [this FAQ entry](https://github.com/rg3/youtube-dl/blob/master/README.md#how-do-i-update-youtube-dl) and update. Issues with outdated version will be rejected.
|
### Make sure you are using the *latest* version: run `youtube-dl --version` and ensure your version is *2016.05.01*. If it's not read [this FAQ entry](https://github.com/rg3/youtube-dl/blob/master/README.md#how-do-i-update-youtube-dl) and update. Issues with outdated version will be rejected.
|
||||||
- [ ] I've **verified** and **I assure** that I'm running youtube-dl **2016.04.24**
|
- [ ] I've **verified** and **I assure** that I'm running youtube-dl **2016.05.01**
|
||||||
|
|
||||||
### Before submitting an *issue* make sure you have:
|
### Before submitting an *issue* make sure you have:
|
||||||
- [ ] At least skimmed through [README](https://github.com/rg3/youtube-dl/blob/master/README.md) and **most notably** [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections
|
- [ ] At least skimmed through [README](https://github.com/rg3/youtube-dl/blob/master/README.md) and **most notably** [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections
|
||||||
@ -35,7 +35,7 @@ $ youtube-dl -v <your command line>
|
|||||||
[debug] User config: []
|
[debug] User config: []
|
||||||
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
[debug] Command-line args: [u'-v', u'http://www.youtube.com/watch?v=BaW_jenozKcj']
|
||||||
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
[debug] Encodings: locale cp1251, fs mbcs, out cp866, pref cp1251
|
||||||
[debug] youtube-dl version 2016.04.24
|
[debug] youtube-dl version 2016.05.01
|
||||||
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
[debug] Python version 2.7.11 - Windows-2003Server-5.2.3790-SP2
|
||||||
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
[debug] exe versions: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
|
||||||
[debug] Proxy map: {}
|
[debug] Proxy map: {}
|
||||||
|
@ -465,7 +465,7 @@ The basic usage is not to set any template arguments when downloading a single f
|
|||||||
- `display_id`: An alternative identifier for the video
|
- `display_id`: An alternative identifier for the video
|
||||||
- `uploader`: Full name of the video uploader
|
- `uploader`: Full name of the video uploader
|
||||||
- `license`: License name the video is licensed under
|
- `license`: License name the video is licensed under
|
||||||
- `creator`: The main artist who created the video
|
- `creator`: The creator of the video
|
||||||
- `release_date`: The date (YYYYMMDD) when the video was released
|
- `release_date`: The date (YYYYMMDD) when the video was released
|
||||||
- `timestamp`: UNIX timestamp of the moment the video became available
|
- `timestamp`: UNIX timestamp of the moment the video became available
|
||||||
- `upload_date`: Video upload date (YYYYMMDD)
|
- `upload_date`: Video upload date (YYYYMMDD)
|
||||||
|
@ -338,7 +338,6 @@
|
|||||||
- **mailru**: Видео@Mail.Ru
|
- **mailru**: Видео@Mail.Ru
|
||||||
- **MakersChannel**
|
- **MakersChannel**
|
||||||
- **MakerTV**
|
- **MakerTV**
|
||||||
- **Malemotion**
|
|
||||||
- **MatchTV**
|
- **MatchTV**
|
||||||
- **MDR**: MDR.DE and KiKA
|
- **MDR**: MDR.DE and KiKA
|
||||||
- **media.ccc.de**
|
- **media.ccc.de**
|
||||||
@ -375,8 +374,8 @@
|
|||||||
- **mtvservices:embedded**
|
- **mtvservices:embedded**
|
||||||
- **MuenchenTV**: münchen.tv
|
- **MuenchenTV**: münchen.tv
|
||||||
- **MusicPlayOn**
|
- **MusicPlayOn**
|
||||||
- **muzu.tv**
|
|
||||||
- **Mwave**
|
- **Mwave**
|
||||||
|
- **MwaveMeetGreet**
|
||||||
- **MySpace**
|
- **MySpace**
|
||||||
- **MySpace:album**
|
- **MySpace:album**
|
||||||
- **MySpass**
|
- **MySpass**
|
||||||
@ -554,7 +553,6 @@
|
|||||||
- **SenateISVP**
|
- **SenateISVP**
|
||||||
- **ServingSys**
|
- **ServingSys**
|
||||||
- **Sexu**
|
- **Sexu**
|
||||||
- **SexyKarma**: Sexy Karma and Watch Indian Porn
|
|
||||||
- **Shahid**
|
- **Shahid**
|
||||||
- **Shared**: shared.sx and vivo.sx
|
- **Shared**: shared.sx and vivo.sx
|
||||||
- **ShareSix**
|
- **ShareSix**
|
||||||
@ -567,8 +565,6 @@
|
|||||||
- **smotri:broadcast**: Smotri.com broadcasts
|
- **smotri:broadcast**: Smotri.com broadcasts
|
||||||
- **smotri:community**: Smotri.com community videos
|
- **smotri:community**: Smotri.com community videos
|
||||||
- **smotri:user**: Smotri.com user videos
|
- **smotri:user**: Smotri.com user videos
|
||||||
- **SnagFilms**
|
|
||||||
- **SnagFilmsEmbed**
|
|
||||||
- **Snotr**
|
- **Snotr**
|
||||||
- **Sohu**
|
- **Sohu**
|
||||||
- **soundcloud**
|
- **soundcloud**
|
||||||
@ -610,6 +606,7 @@
|
|||||||
- **Syfy**
|
- **Syfy**
|
||||||
- **SztvHu**
|
- **SztvHu**
|
||||||
- **Tagesschau**
|
- **Tagesschau**
|
||||||
|
- **tagesschau:player**
|
||||||
- **Tapely**
|
- **Tapely**
|
||||||
- **Tass**
|
- **Tass**
|
||||||
- **TDSLifeway**
|
- **TDSLifeway**
|
||||||
@ -725,6 +722,8 @@
|
|||||||
- **Vidzi**
|
- **Vidzi**
|
||||||
- **vier**
|
- **vier**
|
||||||
- **vier:videos**
|
- **vier:videos**
|
||||||
|
- **ViewLift**
|
||||||
|
- **ViewLiftEmbed**
|
||||||
- **Viewster**
|
- **Viewster**
|
||||||
- **Viidea**
|
- **Viidea**
|
||||||
- **viki**
|
- **viki**
|
||||||
@ -756,6 +755,7 @@
|
|||||||
- **Walla**
|
- **Walla**
|
||||||
- **WashingtonPost**
|
- **WashingtonPost**
|
||||||
- **wat.tv**
|
- **wat.tv**
|
||||||
|
- **WatchIndianPorn**: Watch Indian Porn
|
||||||
- **WDR**
|
- **WDR**
|
||||||
- **wdr:mobile**
|
- **wdr:mobile**
|
||||||
- **WDRMaus**: Sendung mit der Maus
|
- **WDRMaus**: Sendung mit der Maus
|
||||||
@ -775,6 +775,10 @@
|
|||||||
- **XFileShare**: XFileShare based sites: GorillaVid.in, daclips.in, movpod.in, fastvideo.in, realvid.net, filehoot.com and vidto.me
|
- **XFileShare**: XFileShare based sites: GorillaVid.in, daclips.in, movpod.in, fastvideo.in, realvid.net, filehoot.com and vidto.me
|
||||||
- **XHamster**
|
- **XHamster**
|
||||||
- **XHamsterEmbed**
|
- **XHamsterEmbed**
|
||||||
|
- **xiami:album**: 虾米音乐 - 专辑
|
||||||
|
- **xiami:artist**: 虾米音乐 - 歌手
|
||||||
|
- **xiami:collection**: 虾米音乐 - 精选集
|
||||||
|
- **xiami:song**: 虾米音乐
|
||||||
- **XMinus**
|
- **XMinus**
|
||||||
- **XNXX**
|
- **XNXX**
|
||||||
- **Xstream**
|
- **Xstream**
|
||||||
|
@ -580,7 +580,7 @@ class YoutubeDL(object):
|
|||||||
is_id=(k == 'id'))
|
is_id=(k == 'id'))
|
||||||
template_dict = dict((k, sanitize(k, v))
|
template_dict = dict((k, sanitize(k, v))
|
||||||
for k, v in template_dict.items()
|
for k, v in template_dict.items()
|
||||||
if v is not None)
|
if v is not None and not isinstance(v, (list, tuple, dict)))
|
||||||
template_dict = collections.defaultdict(lambda: 'NA', template_dict)
|
template_dict = collections.defaultdict(lambda: 'NA', template_dict)
|
||||||
|
|
||||||
outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL)
|
outtmpl = self.params.get('outtmpl', DEFAULT_OUTTMPL)
|
||||||
@ -1639,7 +1639,7 @@ class YoutubeDL(object):
|
|||||||
# Just a single file
|
# Just a single file
|
||||||
success = dl(filename, info_dict)
|
success = dl(filename, info_dict)
|
||||||
except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err:
|
except (compat_urllib_error.URLError, compat_http_client.HTTPException, socket.error) as err:
|
||||||
self.report_error('unable to download video data: %s' % str(err))
|
self.report_error('unable to download video data: %s' % error_to_compat_str(err))
|
||||||
return
|
return
|
||||||
except (OSError, IOError) as err:
|
except (OSError, IOError) as err:
|
||||||
raise UnavailableVideoError(err)
|
raise UnavailableVideoError(err)
|
||||||
|
@ -12,7 +12,7 @@ from ..utils import (
|
|||||||
|
|
||||||
class AolIE(InfoExtractor):
|
class AolIE(InfoExtractor):
|
||||||
IE_NAME = 'on.aol.com'
|
IE_NAME = 'on.aol.com'
|
||||||
_VALID_URL = r'(?:aol-video:|https?://on\.aol\.com/.*-)(?P<id>[^/?-]+)'
|
_VALID_URL = r'(?:aol-video:|https?://on\.aol\.com/(?:[^/]+/)*(?:[^/?#&]+-)?)(?P<id>[^/?#&]+)'
|
||||||
|
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
# video with 5min ID
|
# video with 5min ID
|
||||||
@ -53,6 +53,12 @@ class AolIE(InfoExtractor):
|
|||||||
}, {
|
}, {
|
||||||
'url': 'http://on.aol.com/shows/park-bench-shw518173474-559a1b9be4b0c3bfad3357a7?context=SH:SHW518173474:PL4327:1460619712763',
|
'url': 'http://on.aol.com/shows/park-bench-shw518173474-559a1b9be4b0c3bfad3357a7?context=SH:SHW518173474:PL4327:1460619712763',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
|
}, {
|
||||||
|
'url': 'http://on.aol.com/video/519442220',
|
||||||
|
'only_matching': True,
|
||||||
|
}, {
|
||||||
|
'url': 'aol-video:5707d6b8e4b090497b04f706',
|
||||||
|
'only_matching': True,
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
|
@ -163,7 +163,7 @@ class InfoExtractor(object):
|
|||||||
description: Full video description.
|
description: Full video description.
|
||||||
uploader: Full name of the video uploader.
|
uploader: Full name of the video uploader.
|
||||||
license: License name the video is licensed under.
|
license: License name the video is licensed under.
|
||||||
creator: The main artist who created the video.
|
creator: The creator of the video.
|
||||||
release_date: The date (YYYYMMDD) when the video was released.
|
release_date: The date (YYYYMMDD) when the video was released.
|
||||||
timestamp: UNIX timestamp of the moment the video became available.
|
timestamp: UNIX timestamp of the moment the video became available.
|
||||||
upload_date: Video upload date (YYYYMMDD).
|
upload_date: Video upload date (YYYYMMDD).
|
||||||
|
@ -71,7 +71,7 @@ class DiscoveryIE(InfoExtractor):
|
|||||||
entries = []
|
entries = []
|
||||||
|
|
||||||
for idx, video_info in enumerate(info['playlist']):
|
for idx, video_info in enumerate(info['playlist']):
|
||||||
subtitles = []
|
subtitles = {}
|
||||||
caption_url = video_info.get('captionsUrl')
|
caption_url = video_info.get('captionsUrl')
|
||||||
if caption_url:
|
if caption_url:
|
||||||
subtitles = {
|
subtitles = {
|
||||||
|
@ -849,7 +849,10 @@ from .veehd import VeeHDIE
|
|||||||
from .veoh import VeohIE
|
from .veoh import VeohIE
|
||||||
from .vessel import VesselIE
|
from .vessel import VesselIE
|
||||||
from .vesti import VestiIE
|
from .vesti import VestiIE
|
||||||
from .vevo import VevoIE
|
from .vevo import (
|
||||||
|
VevoIE,
|
||||||
|
VevoPlaylistIE,
|
||||||
|
)
|
||||||
from .vgtv import (
|
from .vgtv import (
|
||||||
BTArticleIE,
|
BTArticleIE,
|
||||||
BTVestlendingenIE,
|
BTVestlendingenIE,
|
||||||
|
@ -266,7 +266,6 @@ class KuwoCategoryIE(InfoExtractor):
|
|||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': '86375',
|
'id': '86375',
|
||||||
'title': '八十年代精选',
|
'title': '八十年代精选',
|
||||||
'description': '这些都是属于八十年代的回忆!',
|
|
||||||
},
|
},
|
||||||
'playlist_mincount': 24,
|
'playlist_mincount': 24,
|
||||||
}
|
}
|
||||||
@ -283,6 +282,8 @@ class KuwoCategoryIE(InfoExtractor):
|
|||||||
category_desc = remove_start(
|
category_desc = remove_start(
|
||||||
get_element_by_id('intro', webpage).strip(),
|
get_element_by_id('intro', webpage).strip(),
|
||||||
'%s简介:' % category_name)
|
'%s简介:' % category_name)
|
||||||
|
if category_desc == '暂无':
|
||||||
|
category_desc = None
|
||||||
|
|
||||||
jsonm = self._parse_json(self._html_search_regex(
|
jsonm = self._parse_json(self._html_search_regex(
|
||||||
r'var\s+jsonm\s*=\s*([^;]+);', webpage, 'category songs'), category_id)
|
r'var\s+jsonm\s*=\s*([^;]+);', webpage, 'category songs'), category_id)
|
||||||
|
@ -3,7 +3,11 @@ from __future__ import unicode_literals
|
|||||||
import re
|
import re
|
||||||
|
|
||||||
from .common import InfoExtractor
|
from .common import InfoExtractor
|
||||||
from ..compat import compat_etree_fromstring
|
from ..compat import (
|
||||||
|
compat_etree_fromstring,
|
||||||
|
compat_str,
|
||||||
|
compat_urlparse,
|
||||||
|
)
|
||||||
from ..utils import (
|
from ..utils import (
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
int_or_none,
|
int_or_none,
|
||||||
@ -12,13 +16,22 @@ from ..utils import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
class VevoIE(InfoExtractor):
|
class VevoBaseIE(InfoExtractor):
|
||||||
|
def _extract_json(self, webpage, video_id, item):
|
||||||
|
return self._parse_json(
|
||||||
|
self._search_regex(
|
||||||
|
r'window\.__INITIAL_STORE__\s*=\s*({.+?});\s*</script>',
|
||||||
|
webpage, 'initial store'),
|
||||||
|
video_id)['default'][item]
|
||||||
|
|
||||||
|
|
||||||
|
class VevoIE(VevoBaseIE):
|
||||||
'''
|
'''
|
||||||
Accepts urls from vevo.com or in the format 'vevo:{id}'
|
Accepts urls from vevo.com or in the format 'vevo:{id}'
|
||||||
(currently used by MTVIE and MySpaceIE)
|
(currently used by MTVIE and MySpaceIE)
|
||||||
'''
|
'''
|
||||||
_VALID_URL = r'''(?x)
|
_VALID_URL = r'''(?x)
|
||||||
(?:https?://www\.vevo\.com/watch/(?:[^/]+/(?:[^/]+/)?)?|
|
(?:https?://www\.vevo\.com/watch/(?!playlist|genre)(?:[^/]+/(?:[^/]+/)?)?|
|
||||||
https?://cache\.vevo\.com/m/html/embed\.html\?video=|
|
https?://cache\.vevo\.com/m/html/embed\.html\?video=|
|
||||||
https?://videoplayer\.vevo\.com/embed/embedded\?videoId=|
|
https?://videoplayer\.vevo\.com/embed/embedded\?videoId=|
|
||||||
vevo:)
|
vevo:)
|
||||||
@ -30,11 +43,15 @@ class VevoIE(InfoExtractor):
|
|||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': 'GB1101300280',
|
'id': 'GB1101300280',
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'title': 'Somebody to Die For',
|
'title': 'Hurts - Somebody to Die For',
|
||||||
|
'timestamp': 1372057200,
|
||||||
'upload_date': '20130624',
|
'upload_date': '20130624',
|
||||||
'uploader': 'Hurts',
|
'uploader': 'Hurts',
|
||||||
'timestamp': 1372057200,
|
'track': 'Somebody to Die For',
|
||||||
|
'artist': 'Hurts',
|
||||||
|
'genre': 'Pop',
|
||||||
},
|
},
|
||||||
|
'expected_warnings': ['Unable to download SMIL file'],
|
||||||
}, {
|
}, {
|
||||||
'note': 'v3 SMIL format',
|
'note': 'v3 SMIL format',
|
||||||
'url': 'http://www.vevo.com/watch/cassadee-pope/i-wish-i-could-break-your-heart/USUV71302923',
|
'url': 'http://www.vevo.com/watch/cassadee-pope/i-wish-i-could-break-your-heart/USUV71302923',
|
||||||
@ -42,23 +59,31 @@ class VevoIE(InfoExtractor):
|
|||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': 'USUV71302923',
|
'id': 'USUV71302923',
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'title': 'I Wish I Could Break Your Heart',
|
'title': 'Cassadee Pope - I Wish I Could Break Your Heart',
|
||||||
|
'timestamp': 1392796919,
|
||||||
'upload_date': '20140219',
|
'upload_date': '20140219',
|
||||||
'uploader': 'Cassadee Pope',
|
'uploader': 'Cassadee Pope',
|
||||||
'timestamp': 1392796919,
|
'track': 'I Wish I Could Break Your Heart',
|
||||||
|
'artist': 'Cassadee Pope',
|
||||||
|
'genre': 'Country',
|
||||||
},
|
},
|
||||||
|
'expected_warnings': ['Unable to download SMIL file'],
|
||||||
}, {
|
}, {
|
||||||
'note': 'Age-limited video',
|
'note': 'Age-limited video',
|
||||||
'url': 'https://www.vevo.com/watch/justin-timberlake/tunnel-vision-explicit/USRV81300282',
|
'url': 'https://www.vevo.com/watch/justin-timberlake/tunnel-vision-explicit/USRV81300282',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': 'USRV81300282',
|
'id': 'USRV81300282',
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'title': 'Tunnel Vision (Explicit)',
|
'title': 'Justin Timberlake - Tunnel Vision (Explicit)',
|
||||||
'upload_date': '20130703',
|
|
||||||
'age_limit': 18,
|
'age_limit': 18,
|
||||||
'uploader': 'Justin Timberlake',
|
|
||||||
'timestamp': 1372888800,
|
'timestamp': 1372888800,
|
||||||
|
'upload_date': '20130703',
|
||||||
|
'uploader': 'Justin Timberlake',
|
||||||
|
'track': 'Tunnel Vision (Explicit)',
|
||||||
|
'artist': 'Justin Timberlake',
|
||||||
|
'genre': 'Pop',
|
||||||
},
|
},
|
||||||
|
'expected_warnings': ['Unable to download SMIL file'],
|
||||||
}, {
|
}, {
|
||||||
'note': 'No video_info',
|
'note': 'No video_info',
|
||||||
'url': 'http://www.vevo.com/watch/k-camp-1/Till-I-Die/USUV71503000',
|
'url': 'http://www.vevo.com/watch/k-camp-1/Till-I-Die/USUV71503000',
|
||||||
@ -66,12 +91,36 @@ class VevoIE(InfoExtractor):
|
|||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': 'USUV71503000',
|
'id': 'USUV71503000',
|
||||||
'ext': 'mp4',
|
'ext': 'mp4',
|
||||||
'title': 'Till I Die',
|
'title': 'K Camp - Till I Die',
|
||||||
'upload_date': '20151207',
|
|
||||||
'age_limit': 18,
|
'age_limit': 18,
|
||||||
'uploader': 'K Camp',
|
|
||||||
'timestamp': 1449468000,
|
'timestamp': 1449468000,
|
||||||
|
'upload_date': '20151207',
|
||||||
|
'uploader': 'K Camp',
|
||||||
|
'track': 'Till I Die',
|
||||||
|
'artist': 'K Camp',
|
||||||
|
'genre': 'Rap/Hip-Hop',
|
||||||
},
|
},
|
||||||
|
}, {
|
||||||
|
'note': 'Only available via webpage',
|
||||||
|
'url': 'http://www.vevo.com/watch/GBUV71600656',
|
||||||
|
'md5': '67e79210613865b66a47c33baa5e37fe',
|
||||||
|
'info_dict': {
|
||||||
|
'id': 'GBUV71600656',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'ABC - Viva Love',
|
||||||
|
'age_limit': 0,
|
||||||
|
'timestamp': 1461830400,
|
||||||
|
'upload_date': '20160428',
|
||||||
|
'uploader': 'ABC',
|
||||||
|
'track': 'Viva Love',
|
||||||
|
'artist': 'ABC',
|
||||||
|
'genre': 'Pop',
|
||||||
|
},
|
||||||
|
'expected_warnings': ['Failed to download video versions info'],
|
||||||
|
}, {
|
||||||
|
# no genres available
|
||||||
|
'url': 'http://www.vevo.com/watch/INS171400764',
|
||||||
|
'only_matching': True,
|
||||||
}]
|
}]
|
||||||
_SMIL_BASE_URL = 'http://smil.lvl3.vevo.com'
|
_SMIL_BASE_URL = 'http://smil.lvl3.vevo.com'
|
||||||
_SOURCE_TYPES = {
|
_SOURCE_TYPES = {
|
||||||
@ -140,14 +189,14 @@ class VevoIE(InfoExtractor):
|
|||||||
errnote='Unable to retrieve oauth token')
|
errnote='Unable to retrieve oauth token')
|
||||||
|
|
||||||
if 'THIS PAGE IS CURRENTLY UNAVAILABLE IN YOUR REGION' in webpage:
|
if 'THIS PAGE IS CURRENTLY UNAVAILABLE IN YOUR REGION' in webpage:
|
||||||
raise ExtractorError(
|
self.raise_geo_restricted(
|
||||||
'%s said: This page is currently unavailable in your region.' % self.IE_NAME, expected=True)
|
'%s said: This page is currently unavailable in your region' % self.IE_NAME)
|
||||||
|
|
||||||
auth_info = self._parse_json(webpage, video_id)
|
auth_info = self._parse_json(webpage, video_id)
|
||||||
self._api_url_template = self.http_scheme() + '//apiv2.vevo.com/%s?token=' + auth_info['access_token']
|
self._api_url_template = self.http_scheme() + '//apiv2.vevo.com/%s?token=' + auth_info['access_token']
|
||||||
|
|
||||||
def _call_api(self, path, video_id, note, errnote, fatal=True):
|
def _call_api(self, path, *args, **kwargs):
|
||||||
return self._download_json(self._api_url_template % path, video_id, note, errnote)
|
return self._download_json(self._api_url_template % path, *args, **kwargs)
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
video_id = self._match_id(url)
|
video_id = self._match_id(url)
|
||||||
@ -156,9 +205,9 @@ class VevoIE(InfoExtractor):
|
|||||||
response = self._download_json(
|
response = self._download_json(
|
||||||
json_url, video_id, 'Downloading video info', 'Unable to download info')
|
json_url, video_id, 'Downloading video info', 'Unable to download info')
|
||||||
video_info = response.get('video') or {}
|
video_info = response.get('video') or {}
|
||||||
video_versions = video_info.get('videoVersions')
|
artist = None
|
||||||
|
featured_artist = None
|
||||||
uploader = None
|
uploader = None
|
||||||
timestamp = None
|
|
||||||
view_count = None
|
view_count = None
|
||||||
formats = []
|
formats = []
|
||||||
|
|
||||||
@ -183,12 +232,19 @@ class VevoIE(InfoExtractor):
|
|||||||
video_versions = self._call_api(
|
video_versions = self._call_api(
|
||||||
'video/%s/streams' % video_id, video_id,
|
'video/%s/streams' % video_id, video_id,
|
||||||
'Downloading video versions info',
|
'Downloading video versions info',
|
||||||
'Failed to download video versions info')
|
'Failed to download video versions info',
|
||||||
|
fatal=False)
|
||||||
|
|
||||||
|
# Some videos are only available via webpage (e.g.
|
||||||
|
# https://github.com/rg3/youtube-dl/issues/9366)
|
||||||
|
if not video_versions:
|
||||||
|
webpage = self._download_webpage(url, video_id)
|
||||||
|
video_versions = self._extract_json(webpage, video_id, 'streams')[video_id][0]
|
||||||
|
|
||||||
timestamp = parse_iso8601(video_info.get('releaseDate'))
|
timestamp = parse_iso8601(video_info.get('releaseDate'))
|
||||||
artists = video_info.get('artists')
|
artists = video_info.get('artists')
|
||||||
if artists:
|
if artists:
|
||||||
uploader = artists[0]['name']
|
artist = uploader = artists[0]['name']
|
||||||
view_count = int_or_none(video_info.get('views', {}).get('total'))
|
view_count = int_or_none(video_info.get('views', {}).get('total'))
|
||||||
|
|
||||||
for video_version in video_versions:
|
for video_version in video_versions:
|
||||||
@ -241,7 +297,11 @@ class VevoIE(InfoExtractor):
|
|||||||
scale=1000)
|
scale=1000)
|
||||||
artists = video_info.get('mainArtists')
|
artists = video_info.get('mainArtists')
|
||||||
if artists:
|
if artists:
|
||||||
uploader = artists[0]['artistName']
|
artist = uploader = artists[0]['artistName']
|
||||||
|
|
||||||
|
featured_artists = video_info.get('featuredArtists')
|
||||||
|
if featured_artists:
|
||||||
|
featured_artist = featured_artists[0]['artistName']
|
||||||
|
|
||||||
smil_parsed = False
|
smil_parsed = False
|
||||||
for video_version in video_info['videoVersions']:
|
for video_version in video_info['videoVersions']:
|
||||||
@ -278,7 +338,15 @@ class VevoIE(InfoExtractor):
|
|||||||
smil_parsed = True
|
smil_parsed = True
|
||||||
self._sort_formats(formats)
|
self._sort_formats(formats)
|
||||||
|
|
||||||
title = video_info['title']
|
track = video_info['title']
|
||||||
|
if featured_artist:
|
||||||
|
artist = '%s ft. %s' % (artist, featured_artist)
|
||||||
|
title = '%s - %s' % (artist, track) if artist else track
|
||||||
|
|
||||||
|
genres = video_info.get('genres')
|
||||||
|
genre = (
|
||||||
|
genres[0] if genres and isinstance(genres, list) and
|
||||||
|
isinstance(genres[0], compat_str) else None)
|
||||||
|
|
||||||
is_explicit = video_info.get('isExplicit')
|
is_explicit = video_info.get('isExplicit')
|
||||||
if is_explicit is True:
|
if is_explicit is True:
|
||||||
@ -300,4 +368,75 @@ class VevoIE(InfoExtractor):
|
|||||||
'duration': duration,
|
'duration': duration,
|
||||||
'view_count': view_count,
|
'view_count': view_count,
|
||||||
'age_limit': age_limit,
|
'age_limit': age_limit,
|
||||||
|
'track': track,
|
||||||
|
'artist': uploader,
|
||||||
|
'genre': genre,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class VevoPlaylistIE(VevoBaseIE):
|
||||||
|
_VALID_URL = r'https?://www\.vevo\.com/watch/(?P<kind>playlist|genre)/(?P<id>[^/?#&]+)'
|
||||||
|
|
||||||
|
_TESTS = [{
|
||||||
|
'url': 'http://www.vevo.com/watch/playlist/dadbf4e7-b99f-4184-9670-6f0e547b6a29',
|
||||||
|
'info_dict': {
|
||||||
|
'id': 'dadbf4e7-b99f-4184-9670-6f0e547b6a29',
|
||||||
|
'title': 'Best-Of: Birdman',
|
||||||
|
},
|
||||||
|
'playlist_count': 10,
|
||||||
|
}, {
|
||||||
|
'url': 'http://www.vevo.com/watch/genre/rock',
|
||||||
|
'info_dict': {
|
||||||
|
'id': 'rock',
|
||||||
|
'title': 'Rock',
|
||||||
|
},
|
||||||
|
'playlist_count': 20,
|
||||||
|
}, {
|
||||||
|
'url': 'http://www.vevo.com/watch/playlist/dadbf4e7-b99f-4184-9670-6f0e547b6a29?index=0',
|
||||||
|
'md5': '32dcdfddddf9ec6917fc88ca26d36282',
|
||||||
|
'info_dict': {
|
||||||
|
'id': 'USCMV1100073',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'Birdman - Y.U. MAD',
|
||||||
|
'timestamp': 1323417600,
|
||||||
|
'upload_date': '20111209',
|
||||||
|
'uploader': 'Birdman',
|
||||||
|
'track': 'Y.U. MAD',
|
||||||
|
'artist': 'Birdman',
|
||||||
|
'genre': 'Rap/Hip-Hop',
|
||||||
|
},
|
||||||
|
'expected_warnings': ['Unable to download SMIL file'],
|
||||||
|
}, {
|
||||||
|
'url': 'http://www.vevo.com/watch/genre/rock?index=0',
|
||||||
|
'only_matching': True,
|
||||||
|
}]
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
mobj = re.match(self._VALID_URL, url)
|
||||||
|
playlist_id = mobj.group('id')
|
||||||
|
playlist_kind = mobj.group('kind')
|
||||||
|
|
||||||
|
webpage = self._download_webpage(url, playlist_id)
|
||||||
|
|
||||||
|
qs = compat_urlparse.parse_qs(compat_urlparse.urlparse(url).query)
|
||||||
|
index = qs.get('index', [None])[0]
|
||||||
|
|
||||||
|
if index:
|
||||||
|
video_id = self._search_regex(
|
||||||
|
r'<meta[^>]+content=(["\'])vevo://video/(?P<id>.+?)\1[^>]*>',
|
||||||
|
webpage, 'video id', default=None, group='id')
|
||||||
|
if video_id:
|
||||||
|
return self.url_result('vevo:%s' % video_id, VevoIE.ie_key())
|
||||||
|
|
||||||
|
playlists = self._extract_json(webpage, playlist_id, '%ss' % playlist_kind)
|
||||||
|
|
||||||
|
playlist = (list(playlists.values())[0]
|
||||||
|
if playlist_kind == 'playlist' else playlists[playlist_id])
|
||||||
|
|
||||||
|
entries = [
|
||||||
|
self.url_result('vevo:%s' % src, VevoIE.ie_key())
|
||||||
|
for src in playlist['isrcs']]
|
||||||
|
|
||||||
|
return self.playlist_result(
|
||||||
|
entries, playlist.get('playlistId') or playlist_id,
|
||||||
|
playlist.get('name'), playlist.get('description'))
|
||||||
|
@ -13,12 +13,21 @@ from ..utils import (
|
|||||||
|
|
||||||
|
|
||||||
class XFileShareIE(InfoExtractor):
|
class XFileShareIE(InfoExtractor):
|
||||||
IE_DESC = 'XFileShare based sites: GorillaVid.in, daclips.in, movpod.in, fastvideo.in, realvid.net, filehoot.com and vidto.me'
|
_SITES = (
|
||||||
_VALID_URL = r'''(?x)
|
('daclips.in', 'DaClips'),
|
||||||
https?://(?P<host>(?:www\.)?
|
('filehoot.com', 'FileHoot'),
|
||||||
(?:daclips\.in|gorillavid\.in|movpod\.in|fastvideo\.in|realvid\.net|filehoot\.com|vidto\.me|powerwatch\.pw))/
|
('gorillavid.in', 'GorillaVid'),
|
||||||
(?:embed-)?(?P<id>[0-9a-zA-Z]+)(?:-[0-9]+x[0-9]+\.html)?
|
('movpod.in', 'MovPod'),
|
||||||
'''
|
('powerwatch.pw', 'PowerWatch'),
|
||||||
|
('rapidvideo.ws', 'Rapidvideo.ws'),
|
||||||
|
('thevideobee.to', 'TheVideoBee'),
|
||||||
|
('vidto.me', 'Vidto'),
|
||||||
|
('streamin.to', 'Streamin.To'),
|
||||||
|
)
|
||||||
|
|
||||||
|
IE_DESC = 'XFileShare based sites: %s' % ', '.join(list(zip(*_SITES))[1])
|
||||||
|
_VALID_URL = (r'https?://(?P<host>(?:www\.)?(?:%s))/(?:embed-)?(?P<id>[0-9a-zA-Z]+)'
|
||||||
|
% '|'.join(re.escape(site) for site in list(zip(*_SITES))[0]))
|
||||||
|
|
||||||
_FILE_NOT_FOUND_REGEX = r'>(?:404 - )?File Not Found<'
|
_FILE_NOT_FOUND_REGEX = r'>(?:404 - )?File Not Found<'
|
||||||
|
|
||||||
@ -43,25 +52,6 @@ class XFileShareIE(InfoExtractor):
|
|||||||
'title': 'Micro Pig piglets ready on 16th July 2009-bG0PdrCdxUc',
|
'title': 'Micro Pig piglets ready on 16th July 2009-bG0PdrCdxUc',
|
||||||
'thumbnail': 're:http://.*\.jpg',
|
'thumbnail': 're:http://.*\.jpg',
|
||||||
}
|
}
|
||||||
}, {
|
|
||||||
# video with countdown timeout
|
|
||||||
'url': 'http://fastvideo.in/1qmdn1lmsmbw',
|
|
||||||
'md5': '8b87ec3f6564a3108a0e8e66594842ba',
|
|
||||||
'info_dict': {
|
|
||||||
'id': '1qmdn1lmsmbw',
|
|
||||||
'ext': 'mp4',
|
|
||||||
'title': 'Man of Steel - Trailer',
|
|
||||||
'thumbnail': 're:http://.*\.jpg',
|
|
||||||
},
|
|
||||||
}, {
|
|
||||||
'url': 'http://realvid.net/ctn2y6p2eviw',
|
|
||||||
'md5': 'b2166d2cf192efd6b6d764c18fd3710e',
|
|
||||||
'info_dict': {
|
|
||||||
'id': 'ctn2y6p2eviw',
|
|
||||||
'ext': 'flv',
|
|
||||||
'title': 'rdx 1955',
|
|
||||||
'thumbnail': 're:http://.*\.jpg',
|
|
||||||
},
|
|
||||||
}, {
|
}, {
|
||||||
'url': 'http://movpod.in/0wguyyxi1yca',
|
'url': 'http://movpod.in/0wguyyxi1yca',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
|
@ -9,6 +9,11 @@ from ..utils import int_or_none
|
|||||||
class XiamiBaseIE(InfoExtractor):
|
class XiamiBaseIE(InfoExtractor):
|
||||||
_API_BASE_URL = 'http://www.xiami.com/song/playlist/cat/json/id'
|
_API_BASE_URL = 'http://www.xiami.com/song/playlist/cat/json/id'
|
||||||
|
|
||||||
|
def _download_webpage(self, *args, **kwargs):
|
||||||
|
webpage = super(XiamiBaseIE, self)._download_webpage(*args, **kwargs)
|
||||||
|
if '>Xiami is currently not available in your country.<' in webpage:
|
||||||
|
self.raise_geo_restricted('Xiami is currently not available in your country')
|
||||||
|
|
||||||
def _extract_track(self, track, track_id=None):
|
def _extract_track(self, track, track_id=None):
|
||||||
title = track['title']
|
title = track['title']
|
||||||
track_url = self._decrypt(track['location'])
|
track_url = self._decrypt(track['location'])
|
||||||
@ -81,7 +86,8 @@ class XiamiSongIE(XiamiBaseIE):
|
|||||||
'ext': 'lrc',
|
'ext': 'lrc',
|
||||||
}],
|
}],
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
|
'skip': 'Georestricted',
|
||||||
}, {
|
}, {
|
||||||
'url': 'http://www.xiami.com/song/1775256504',
|
'url': 'http://www.xiami.com/song/1775256504',
|
||||||
'md5': '932a3abd45c6aa2b1fdbe028fcb4c4fc',
|
'md5': '932a3abd45c6aa2b1fdbe028fcb4c4fc',
|
||||||
@ -100,7 +106,8 @@ class XiamiSongIE(XiamiBaseIE):
|
|||||||
'ext': 'lrc',
|
'ext': 'lrc',
|
||||||
}],
|
}],
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
|
'skip': 'Georestricted',
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
@ -124,6 +131,7 @@ class XiamiAlbumIE(XiamiPlaylistBaseIE):
|
|||||||
'id': '2100300444',
|
'id': '2100300444',
|
||||||
},
|
},
|
||||||
'playlist_count': 10,
|
'playlist_count': 10,
|
||||||
|
'skip': 'Georestricted',
|
||||||
}, {
|
}, {
|
||||||
'url': 'http://www.xiami.com/album/512288?spm=a1z1s.6843761.1110925389.6.hhE9p9',
|
'url': 'http://www.xiami.com/album/512288?spm=a1z1s.6843761.1110925389.6.hhE9p9',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
@ -141,6 +149,7 @@ class XiamiArtistIE(XiamiPlaylistBaseIE):
|
|||||||
'id': '2132',
|
'id': '2132',
|
||||||
},
|
},
|
||||||
'playlist_count': 20,
|
'playlist_count': 20,
|
||||||
|
'skip': 'Georestricted',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -155,4 +164,5 @@ class XiamiCollectionIE(XiamiPlaylistBaseIE):
|
|||||||
'id': '156527391',
|
'id': '156527391',
|
||||||
},
|
},
|
||||||
'playlist_mincount': 29,
|
'playlist_mincount': 29,
|
||||||
|
'skip': 'Georestricted',
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
__version__ = '2016.04.24'
|
__version__ = '2016.05.01'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user