Merge branch 'master' into GoogleDrive-issue-13619
This commit is contained in:
commit
ef30b6186b
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 *2017.07.30.1*. 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 *2017.08.06*. 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 **2017.07.30.1**
|
- [ ] I've **verified** and **I assure** that I'm running youtube-dl **2017.08.06**
|
||||||
|
|
||||||
### Before submitting an *issue* make sure you have:
|
### Before submitting an *issue* make sure you have:
|
||||||
- [ ] At least skimmed through the [README](https://github.com/rg3/youtube-dl/blob/master/README.md), **most notably** the [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections
|
- [ ] At least skimmed through the [README](https://github.com/rg3/youtube-dl/blob/master/README.md), **most notably** the [FAQ](https://github.com/rg3/youtube-dl#faq) and [BUGS](https://github.com/rg3/youtube-dl#bugs) sections
|
||||||
@ -35,7 +35,7 @@ Add the `-v` flag to **your command line** you run youtube-dl with (`youtube-dl
|
|||||||
[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 2017.07.30.1
|
[debug] youtube-dl version 2017.08.06
|
||||||
[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: {}
|
||||||
|
22
ChangeLog
22
ChangeLog
@ -1,3 +1,25 @@
|
|||||||
|
version 2017.08.06
|
||||||
|
|
||||||
|
Core
|
||||||
|
* Use relative paths for DASH fragments (#12990)
|
||||||
|
|
||||||
|
Extractors
|
||||||
|
* [pluralsight] Fix format selection
|
||||||
|
- [mpora] Remove extractor (#13826)
|
||||||
|
+ [voot] Add support for voot.com (#10255, #11644, #11814, #12350, #13218)
|
||||||
|
* [vlive:channel] Limit number of videos per page to 100 (#13830)
|
||||||
|
* [podomatic] Extend URL regular expression (#13827)
|
||||||
|
* [cinchcast] Extend URL regular expression
|
||||||
|
* [yandexdisk] Relax URL regular expression (#13824)
|
||||||
|
* [vidme] Extract DASH and HLS formats
|
||||||
|
- [teamfour] Remove extractor (#13782)
|
||||||
|
* [pornhd] Fix extraction (#13783)
|
||||||
|
* [udemy] Fix subtitles extraction (#13812)
|
||||||
|
* [mlb] Extend URL regular expression (#13740, #13773)
|
||||||
|
+ [pbs] Add support for new URL schema (#13801)
|
||||||
|
* [nrktv] Update API host (#13796)
|
||||||
|
|
||||||
|
|
||||||
version 2017.07.30.1
|
version 2017.07.30.1
|
||||||
|
|
||||||
Core
|
Core
|
||||||
|
@ -472,7 +472,6 @@
|
|||||||
- **MovieFap**
|
- **MovieFap**
|
||||||
- **Moviezine**
|
- **Moviezine**
|
||||||
- **MovingImage**
|
- **MovingImage**
|
||||||
- **MPORA**
|
|
||||||
- **MSN**
|
- **MSN**
|
||||||
- **mtg**: MTG services
|
- **mtg**: MTG services
|
||||||
- **mtv**
|
- **mtv**
|
||||||
@ -783,7 +782,6 @@
|
|||||||
- **teachertube:user:collection**: teachertube.com user and collection videos
|
- **teachertube:user:collection**: teachertube.com user and collection videos
|
||||||
- **TeachingChannel**
|
- **TeachingChannel**
|
||||||
- **Teamcoco**
|
- **Teamcoco**
|
||||||
- **TeamFourStar**
|
|
||||||
- **TechTalks**
|
- **TechTalks**
|
||||||
- **techtv.mit.edu**
|
- **techtv.mit.edu**
|
||||||
- **ted**
|
- **ted**
|
||||||
@ -953,6 +951,7 @@
|
|||||||
- **VODPl**
|
- **VODPl**
|
||||||
- **VODPlatform**
|
- **VODPlatform**
|
||||||
- **VoiceRepublic**
|
- **VoiceRepublic**
|
||||||
|
- **Voot**
|
||||||
- **VoxMedia**
|
- **VoxMedia**
|
||||||
- **Vporn**
|
- **Vporn**
|
||||||
- **vpro**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl
|
- **vpro**: npo.nl, ntr.nl, omroepwnl.nl, zapp.nl and npo3.nl
|
||||||
|
@ -9,12 +9,20 @@ from ..utils import (
|
|||||||
|
|
||||||
|
|
||||||
class CinchcastIE(InfoExtractor):
|
class CinchcastIE(InfoExtractor):
|
||||||
_VALID_URL = r'https?://player\.cinchcast\.com/.*?assetId=(?P<id>[0-9]+)'
|
_VALID_URL = r'https?://player\.cinchcast\.com/.*?(?:assetId|show_id)=(?P<id>[0-9]+)'
|
||||||
_TEST = {
|
_TESTS = [{
|
||||||
|
'url': 'http://player.cinchcast.com/?show_id=5258197&platformId=1&assetType=single',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '5258197',
|
||||||
|
'ext': 'mp3',
|
||||||
|
'title': 'Train Your Brain to Up Your Game with Coach Mandy',
|
||||||
|
'upload_date': '20130816',
|
||||||
|
},
|
||||||
|
}, {
|
||||||
# Actual test is run in generic, look for undergroundwellness
|
# Actual test is run in generic, look for undergroundwellness
|
||||||
'url': 'http://player.cinchcast.com/?platformId=1&assetType=single&assetId=7141703',
|
'url': 'http://player.cinchcast.com/?platformId=1&assetType=single&assetId=7141703',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
}
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
video_id = self._match_id(url)
|
video_id = self._match_id(url)
|
||||||
|
@ -584,7 +584,6 @@ from .mixcloud import (
|
|||||||
)
|
)
|
||||||
from .mlb import MLBIE
|
from .mlb import MLBIE
|
||||||
from .mnet import MnetIE
|
from .mnet import MnetIE
|
||||||
from .mpora import MporaIE
|
|
||||||
from .moevideo import MoeVideoIE
|
from .moevideo import MoeVideoIE
|
||||||
from .mofosex import MofosexIE
|
from .mofosex import MofosexIE
|
||||||
from .mojvideo import MojvideoIE
|
from .mojvideo import MojvideoIE
|
||||||
@ -1222,6 +1221,7 @@ from .vodlocker import VodlockerIE
|
|||||||
from .vodpl import VODPlIE
|
from .vodpl import VODPlIE
|
||||||
from .vodplatform import VODPlatformIE
|
from .vodplatform import VODPlatformIE
|
||||||
from .voicerepublic import VoiceRepublicIE
|
from .voicerepublic import VoiceRepublicIE
|
||||||
|
from .voot import VootIE
|
||||||
from .voxmedia import VoxMediaIE
|
from .voxmedia import VoxMediaIE
|
||||||
from .vporn import VpornIE
|
from .vporn import VpornIE
|
||||||
from .vrt import VRTIE
|
from .vrt import VRTIE
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from .common import InfoExtractor
|
|
||||||
from ..utils import int_or_none
|
|
||||||
|
|
||||||
|
|
||||||
class MporaIE(InfoExtractor):
|
|
||||||
_VALID_URL = r'https?://(?:www\.)?mpora\.(?:com|de)/videos/(?P<id>[^?#/]+)'
|
|
||||||
IE_NAME = 'MPORA'
|
|
||||||
|
|
||||||
_TEST = {
|
|
||||||
'url': 'http://mpora.de/videos/AAdo8okx4wiz/embed?locale=de',
|
|
||||||
'md5': 'a7a228473eedd3be741397cf452932eb',
|
|
||||||
'info_dict': {
|
|
||||||
'id': 'AAdo8okx4wiz',
|
|
||||||
'ext': 'mp4',
|
|
||||||
'title': 'Katy Curd - Winter in the Forest',
|
|
||||||
'duration': 416,
|
|
||||||
'uploader': 'Peter Newman Media',
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
def _real_extract(self, url):
|
|
||||||
video_id = self._match_id(url)
|
|
||||||
webpage = self._download_webpage(url, video_id)
|
|
||||||
|
|
||||||
data_json = self._search_regex(
|
|
||||||
[r"new FM\.Player\('[^']+',\s*(\{.*?)\).player;",
|
|
||||||
r"new\s+FM\.Kaltura\.Player\('[^']+'\s*,\s*({.+?})\);"],
|
|
||||||
webpage, 'json')
|
|
||||||
data = self._parse_json(data_json, video_id)
|
|
||||||
|
|
||||||
uploader = data['info_overlay'].get('username')
|
|
||||||
duration = data['video']['duration'] // 1000
|
|
||||||
thumbnail = data['video']['encodings']['sd']['poster']
|
|
||||||
title = data['info_overlay']['title']
|
|
||||||
|
|
||||||
formats = []
|
|
||||||
for encoding_id, edata in data['video']['encodings'].items():
|
|
||||||
for src in edata['sources']:
|
|
||||||
width_str = self._search_regex(
|
|
||||||
r'_([0-9]+)\.[a-zA-Z0-9]+$', src['src'],
|
|
||||||
False, default=None)
|
|
||||||
vcodec = src['type'].partition('/')[2]
|
|
||||||
|
|
||||||
formats.append({
|
|
||||||
'format_id': encoding_id + '-' + vcodec,
|
|
||||||
'url': src['src'],
|
|
||||||
'vcodec': vcodec,
|
|
||||||
'width': int_or_none(width_str),
|
|
||||||
})
|
|
||||||
|
|
||||||
self._sort_formats(formats)
|
|
||||||
|
|
||||||
return {
|
|
||||||
'id': video_id,
|
|
||||||
'title': title,
|
|
||||||
'formats': formats,
|
|
||||||
'uploader': uploader,
|
|
||||||
'duration': duration,
|
|
||||||
'thumbnail': thumbnail,
|
|
||||||
}
|
|
@ -224,6 +224,7 @@ class PluralsightIE(PluralsightBaseIE):
|
|||||||
req_format_split = req_format.split('-', 1)
|
req_format_split = req_format.split('-', 1)
|
||||||
if len(req_format_split) > 1:
|
if len(req_format_split) > 1:
|
||||||
req_ext, req_quality = req_format_split
|
req_ext, req_quality = req_format_split
|
||||||
|
req_quality = '-'.join(req_quality.split('-')[:2])
|
||||||
for allowed_quality in ALLOWED_QUALITIES:
|
for allowed_quality in ALLOWED_QUALITIES:
|
||||||
if req_ext == allowed_quality.ext and req_quality in allowed_quality.qualities:
|
if req_ext == allowed_quality.ext and req_quality in allowed_quality.qualities:
|
||||||
return (AllowedQuality(req_ext, (req_quality, )), )
|
return (AllowedQuality(req_ext, (req_quality, )), )
|
||||||
|
@ -9,39 +9,46 @@ from ..utils import int_or_none
|
|||||||
|
|
||||||
class PodomaticIE(InfoExtractor):
|
class PodomaticIE(InfoExtractor):
|
||||||
IE_NAME = 'podomatic'
|
IE_NAME = 'podomatic'
|
||||||
_VALID_URL = r'^(?P<proto>https?)://(?P<channel>[^.]+)\.podomatic\.com/entry/(?P<id>[^?]+)'
|
_VALID_URL = r'''(?x)
|
||||||
|
(?P<proto>https?)://
|
||||||
|
(?:
|
||||||
|
(?P<channel>[^.]+)\.podomatic\.com/entry|
|
||||||
|
(?:www\.)?podomatic\.com/podcasts/(?P<channel_2>[^/]+)/episodes
|
||||||
|
)/
|
||||||
|
(?P<id>[^/?#&]+)
|
||||||
|
'''
|
||||||
|
|
||||||
_TESTS = [
|
_TESTS = [{
|
||||||
{
|
'url': 'http://scienceteachingtips.podomatic.com/entry/2009-01-02T16_03_35-08_00',
|
||||||
'url': 'http://scienceteachingtips.podomatic.com/entry/2009-01-02T16_03_35-08_00',
|
'md5': '84bb855fcf3429e6bf72460e1eed782d',
|
||||||
'md5': '84bb855fcf3429e6bf72460e1eed782d',
|
'info_dict': {
|
||||||
'info_dict': {
|
'id': '2009-01-02T16_03_35-08_00',
|
||||||
'id': '2009-01-02T16_03_35-08_00',
|
'ext': 'mp3',
|
||||||
'ext': 'mp3',
|
'uploader': 'Science Teaching Tips',
|
||||||
'uploader': 'Science Teaching Tips',
|
'uploader_id': 'scienceteachingtips',
|
||||||
'uploader_id': 'scienceteachingtips',
|
'title': '64. When the Moon Hits Your Eye',
|
||||||
'title': '64. When the Moon Hits Your Eye',
|
'duration': 446,
|
||||||
'duration': 446,
|
}
|
||||||
}
|
}, {
|
||||||
},
|
'url': 'http://ostbahnhof.podomatic.com/entry/2013-11-15T16_31_21-08_00',
|
||||||
{
|
'md5': 'd2cf443931b6148e27638650e2638297',
|
||||||
'url': 'http://ostbahnhof.podomatic.com/entry/2013-11-15T16_31_21-08_00',
|
'info_dict': {
|
||||||
'md5': 'd2cf443931b6148e27638650e2638297',
|
'id': '2013-11-15T16_31_21-08_00',
|
||||||
'info_dict': {
|
'ext': 'mp3',
|
||||||
'id': '2013-11-15T16_31_21-08_00',
|
'uploader': 'Ostbahnhof / Techno Mix',
|
||||||
'ext': 'mp3',
|
'uploader_id': 'ostbahnhof',
|
||||||
'uploader': 'Ostbahnhof / Techno Mix',
|
'title': 'Einunddreizig',
|
||||||
'uploader_id': 'ostbahnhof',
|
'duration': 3799,
|
||||||
'title': 'Einunddreizig',
|
}
|
||||||
'duration': 3799,
|
}, {
|
||||||
}
|
'url': 'https://www.podomatic.com/podcasts/scienceteachingtips/episodes/2009-01-02T16_03_35-08_00',
|
||||||
},
|
'only_matching': True,
|
||||||
]
|
}]
|
||||||
|
|
||||||
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')
|
||||||
channel = mobj.group('channel')
|
channel = mobj.group('channel') or mobj.group('channel_2')
|
||||||
|
|
||||||
json_url = (('%s://%s.podomatic.com/entry/embed_params/%s' +
|
json_url = (('%s://%s.podomatic.com/entry/embed_params/%s' +
|
||||||
'?permalink=true&rtmp=0') %
|
'?permalink=true&rtmp=0') %
|
||||||
|
@ -236,7 +236,12 @@ class VLiveChannelIE(InfoExtractor):
|
|||||||
query={
|
query={
|
||||||
'app_id': app_id,
|
'app_id': app_id,
|
||||||
'channelSeq': channel_seq,
|
'channelSeq': channel_seq,
|
||||||
'maxNumOfRows': 1000,
|
# Large values of maxNumOfRows (~300 or above) may cause
|
||||||
|
# empty responses (see [1]), e.g. this happens for [2] that
|
||||||
|
# has more than 300 videos.
|
||||||
|
# 1. https://github.com/rg3/youtube-dl/issues/13830
|
||||||
|
# 2. http://channels.vlive.tv/EDBF.
|
||||||
|
'maxNumOfRows': 100,
|
||||||
'_': int(time.time()),
|
'_': int(time.time()),
|
||||||
'pageNo': page_num
|
'pageNo': page_num
|
||||||
}
|
}
|
||||||
|
98
youtube_dl/extractor/voot.py
Normal file
98
youtube_dl/extractor/voot.py
Normal file
@ -0,0 +1,98 @@
|
|||||||
|
# coding: utf-8
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from .common import InfoExtractor
|
||||||
|
from .kaltura import KalturaIE
|
||||||
|
from ..utils import (
|
||||||
|
ExtractorError,
|
||||||
|
int_or_none,
|
||||||
|
try_get,
|
||||||
|
unified_timestamp,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class VootIE(InfoExtractor):
|
||||||
|
_VALID_URL = r'https?://(?:www\.)?voot\.com/(?:[^/]+/)+(?P<id>\d+)'
|
||||||
|
_GEO_COUNTRIES = ['IN']
|
||||||
|
_TESTS = [{
|
||||||
|
'url': 'https://www.voot.com/shows/ishq-ka-rang-safed/1/360558/is-this-the-end-of-kamini-/441353',
|
||||||
|
'info_dict': {
|
||||||
|
'id': '0_8ledb18o',
|
||||||
|
'ext': 'mp4',
|
||||||
|
'title': 'Ishq Ka Rang Safed - Season 01 - Episode 340',
|
||||||
|
'description': 'md5:06291fbbbc4dcbe21235c40c262507c1',
|
||||||
|
'uploader_id': 'batchUser',
|
||||||
|
'timestamp': 1472162937,
|
||||||
|
'upload_date': '20160825',
|
||||||
|
'duration': 1146,
|
||||||
|
'series': 'Ishq Ka Rang Safed',
|
||||||
|
'season_number': 1,
|
||||||
|
'episode': 'Is this the end of Kamini?',
|
||||||
|
'episode_number': 340,
|
||||||
|
'view_count': int,
|
||||||
|
'like_count': int,
|
||||||
|
},
|
||||||
|
'params': {
|
||||||
|
'skip_download': True,
|
||||||
|
},
|
||||||
|
'expected_warnings': ['Failed to download m3u8 information'],
|
||||||
|
}, {
|
||||||
|
'url': 'https://www.voot.com/kids/characters/mighty-cat-masked-niyander-e-/400478/school-bag-disappears/440925',
|
||||||
|
'only_matching': True,
|
||||||
|
}, {
|
||||||
|
'url': 'https://www.voot.com/movies/pandavas-5/424627',
|
||||||
|
'only_matching': True,
|
||||||
|
}]
|
||||||
|
|
||||||
|
def _real_extract(self, url):
|
||||||
|
video_id = self._match_id(url)
|
||||||
|
|
||||||
|
media_info = self._download_json(
|
||||||
|
'https://wapi.voot.com/ws/ott/getMediaInfo.json', video_id,
|
||||||
|
query={
|
||||||
|
'platform': 'Web',
|
||||||
|
'pId': 2,
|
||||||
|
'mediaId': video_id,
|
||||||
|
})
|
||||||
|
|
||||||
|
status_code = try_get(media_info, lambda x: x['status']['code'], int)
|
||||||
|
if status_code != 0:
|
||||||
|
raise ExtractorError(media_info['status']['message'], expected=True)
|
||||||
|
|
||||||
|
media = media_info['assets']
|
||||||
|
|
||||||
|
entry_id = media['EntryId']
|
||||||
|
title = media['MediaName']
|
||||||
|
|
||||||
|
description, series, season_number, episode, episode_number = [None] * 5
|
||||||
|
|
||||||
|
for meta in try_get(media, lambda x: x['Metas'], list) or []:
|
||||||
|
key, value = meta.get('Key'), meta.get('Value')
|
||||||
|
if not key or not value:
|
||||||
|
continue
|
||||||
|
if key == 'ContentSynopsis':
|
||||||
|
description = value
|
||||||
|
elif key == 'RefSeriesTitle':
|
||||||
|
series = value
|
||||||
|
elif key == 'RefSeriesSeason':
|
||||||
|
season_number = int_or_none(value)
|
||||||
|
elif key == 'EpisodeMainTitle':
|
||||||
|
episode = value
|
||||||
|
elif key == 'EpisodeNo':
|
||||||
|
episode_number = int_or_none(value)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'_type': 'url_transparent',
|
||||||
|
'url': 'kaltura:1982551:%s' % entry_id,
|
||||||
|
'ie_key': KalturaIE.ie_key(),
|
||||||
|
'title': title,
|
||||||
|
'description': description,
|
||||||
|
'series': series,
|
||||||
|
'season_number': season_number,
|
||||||
|
'episode': episode,
|
||||||
|
'episode_number': episode_number,
|
||||||
|
'timestamp': unified_timestamp(media.get('CreationDate')),
|
||||||
|
'duration': int_or_none(media.get('Duration')),
|
||||||
|
'view_count': int_or_none(media.get('ViewCounter')),
|
||||||
|
'like_count': int_or_none(media.get('like_counter')),
|
||||||
|
}
|
@ -1,3 +1,3 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
__version__ = '2017.07.30.1'
|
__version__ = '2017.08.06'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user