mirror of
https://source.netsyms.com/Mirrors/youtube-dl
synced 2026-05-21 01:59:25 +00:00
Compare commits
1 Commits
2016.08.01
...
2016.07.26
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3c519ad54d |
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.08.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.
|
### Make sure you are using the *latest* version: run `youtube-dl --version` and ensure your version is *2016.07.26*. 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.08.01**
|
- [ ] I've **verified** and **I assure** that I'm running youtube-dl **2016.07.26**
|
||||||
|
|
||||||
### 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.08.01
|
[debug] youtube-dl version 2016.07.26
|
||||||
[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: {}
|
||||||
|
|||||||
271
ChangeLog
271
ChangeLog
@@ -1,271 +0,0 @@
|
|||||||
version 2016.08.01
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- [yandexmusic:track] Adapt to changes in track location JSON (#10193)
|
|
||||||
- [bloomberg] Support another form of player (#10187)
|
|
||||||
- [limelight] Skip DRM protected videos
|
|
||||||
- [safari] Relax regular expressions for URL matching (#10202)
|
|
||||||
- [cwtv] Add support for cwtvpr.com (#10196)
|
|
||||||
|
|
||||||
version 2016.07.30
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- [twitch:clips] Sort formats
|
|
||||||
- [tv2] Use m3u8_native
|
|
||||||
- [tv2:article] Fix video detection (#10188)
|
|
||||||
- rtve (#10076)
|
|
||||||
- [dailymotion:playlist] Optimize download archive processing (#10180)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.28
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- shared (#10170)
|
|
||||||
- soundcloud (#10179)
|
|
||||||
- twitch (#9767)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.26.2
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- smotri
|
|
||||||
- camdemy
|
|
||||||
- mtv
|
|
||||||
- comedycentral
|
|
||||||
- cmt
|
|
||||||
- cbc
|
|
||||||
- mgtv
|
|
||||||
- orf
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.24
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- arkena (#8682)
|
|
||||||
- lcp (#8682)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- facebook (#10151)
|
|
||||||
- dailymail
|
|
||||||
- telegraaf
|
|
||||||
- dcn
|
|
||||||
- onet
|
|
||||||
- tvp
|
|
||||||
|
|
||||||
Miscellaneous
|
|
||||||
- Support $Time$ in DASH manifests
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.22
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- odatv (#9285)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- bbc
|
|
||||||
- youjizz (#10131)
|
|
||||||
- youtube (#10140)
|
|
||||||
- pornhub (#10138)
|
|
||||||
- eporner (#10139)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.17
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- nintendo (#9986)
|
|
||||||
- streamable (#9122)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- ard (#10095)
|
|
||||||
- mtv
|
|
||||||
- comedycentral (#10101)
|
|
||||||
- viki (#10098)
|
|
||||||
- spike (#10106)
|
|
||||||
|
|
||||||
Miscellaneous
|
|
||||||
- Improved twitter player detection (#10090)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.16
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- ninenow (#5181)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- rtve (#10076)
|
|
||||||
- brightcove
|
|
||||||
- 3qsdn
|
|
||||||
- syfy (#9087, #3820, #2388)
|
|
||||||
- youtube (#10083)
|
|
||||||
|
|
||||||
Miscellaneous
|
|
||||||
- Fix subtitle embedding for video-only and audio-only files (#10081)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.13
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- rudo
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- biobiochiletv
|
|
||||||
- tvplay
|
|
||||||
- dbtv
|
|
||||||
- brightcove
|
|
||||||
- tmz
|
|
||||||
- youtube (#10059)
|
|
||||||
- shahid (#10062)
|
|
||||||
- vk
|
|
||||||
- ellentv (#10067)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.11
|
|
||||||
|
|
||||||
New Extractors
|
|
||||||
- roosterteeth (#9864)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- miomio (#9605)
|
|
||||||
- vuclip
|
|
||||||
- youtube
|
|
||||||
- vidzi (#10058)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.09.2
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- vimeo (#1638)
|
|
||||||
- facebook (#10048)
|
|
||||||
- lynda (#10047)
|
|
||||||
- animeondemand
|
|
||||||
|
|
||||||
Fixed/improved features
|
|
||||||
- Embedding subtitles no longer throws an error with problematic inputs (#9063)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.09.1
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- youtube
|
|
||||||
- ard
|
|
||||||
- srmediatek (#9373)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.09
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- Flipagram (#9898)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- telecinco
|
|
||||||
- toutv
|
|
||||||
- radiocanada
|
|
||||||
- tweakers (#9516)
|
|
||||||
- lynda
|
|
||||||
- nick (#7542)
|
|
||||||
- polskieradio (#10028)
|
|
||||||
- le
|
|
||||||
- facebook (#9851)
|
|
||||||
- mgtv
|
|
||||||
- animeondemand (#10031)
|
|
||||||
|
|
||||||
Fixed/improved features
|
|
||||||
- `--postprocessor-args` and `--downloader-args` now accepts non-ASCII inputs
|
|
||||||
on non-Windows systems
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.07
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- kamcord (#10001)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- spiegel (#10018)
|
|
||||||
- metacafe (#8539, #3253)
|
|
||||||
- onet (#9950)
|
|
||||||
- francetv (#9955)
|
|
||||||
- brightcove (#9965)
|
|
||||||
- daum (#9972)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.06
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- youtube (#10007, #10009)
|
|
||||||
- xuite
|
|
||||||
- stitcher
|
|
||||||
- spiegel
|
|
||||||
- slideshare
|
|
||||||
- sandia
|
|
||||||
- rtvnh
|
|
||||||
- prosiebensat1
|
|
||||||
- onionstudios
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.05
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- brightcove
|
|
||||||
- yahoo (#9995)
|
|
||||||
- pornhub (#9997)
|
|
||||||
- iqiyi
|
|
||||||
- kaltura (#5557)
|
|
||||||
- la7
|
|
||||||
- Changed features
|
|
||||||
- Rename --cn-verfication-proxy to --geo-verification-proxy
|
|
||||||
Miscellaneous
|
|
||||||
- Add script for displaying downloads statistics
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.03.1
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- theplatform
|
|
||||||
- aenetworks
|
|
||||||
- nationalgeographic
|
|
||||||
- hrti (#9482)
|
|
||||||
- facebook (#5701)
|
|
||||||
- buzzfeed (#5701)
|
|
||||||
- rai (#8617, #9157, #9232, #8552, #8551)
|
|
||||||
- nationalgeographic (#9991)
|
|
||||||
- iqiyi
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.03
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- hrti (#9482)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- vk (#9981)
|
|
||||||
- facebook (#9938)
|
|
||||||
- xtube (#9953, #9961)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.02
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- fusion (#9958)
|
|
||||||
|
|
||||||
Fixed/improved extractors
|
|
||||||
- twitch (#9975)
|
|
||||||
- vine (#9970)
|
|
||||||
- periscope (#9967)
|
|
||||||
- pornhub (#8696)
|
|
||||||
|
|
||||||
|
|
||||||
version 2016.07.01
|
|
||||||
|
|
||||||
New extractors
|
|
||||||
- 9c9media
|
|
||||||
- ctvnews (#2156)
|
|
||||||
- ctv (#4077)
|
|
||||||
|
|
||||||
Fixed/Improved extractors
|
|
||||||
- rds
|
|
||||||
- meta (#8789)
|
|
||||||
- pornhub (#9964)
|
|
||||||
- sixplay (#2183)
|
|
||||||
|
|
||||||
New features
|
|
||||||
- Accept quoted strings across multiple lines (#9940)
|
|
||||||
4
Makefile
4
Makefile
@@ -94,7 +94,7 @@ _EXTRACTOR_FILES != find youtube_dl/extractor -iname '*.py' -and -not -iname 'la
|
|||||||
youtube_dl/extractor/lazy_extractors.py: devscripts/make_lazy_extractors.py devscripts/lazy_load_template.py $(_EXTRACTOR_FILES)
|
youtube_dl/extractor/lazy_extractors.py: devscripts/make_lazy_extractors.py devscripts/lazy_load_template.py $(_EXTRACTOR_FILES)
|
||||||
$(PYTHON) devscripts/make_lazy_extractors.py $@
|
$(PYTHON) devscripts/make_lazy_extractors.py $@
|
||||||
|
|
||||||
youtube-dl.tar.gz: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion youtube-dl.zsh youtube-dl.fish ChangeLog
|
youtube-dl.tar.gz: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-completion youtube-dl.zsh youtube-dl.fish
|
||||||
@tar -czf youtube-dl.tar.gz --transform "s|^|youtube-dl/|" --owner 0 --group 0 \
|
@tar -czf youtube-dl.tar.gz --transform "s|^|youtube-dl/|" --owner 0 --group 0 \
|
||||||
--exclude '*.DS_Store' \
|
--exclude '*.DS_Store' \
|
||||||
--exclude '*.kate-swp' \
|
--exclude '*.kate-swp' \
|
||||||
@@ -107,7 +107,7 @@ youtube-dl.tar.gz: youtube-dl README.md README.txt youtube-dl.1 youtube-dl.bash-
|
|||||||
--exclude 'docs/_build' \
|
--exclude 'docs/_build' \
|
||||||
-- \
|
-- \
|
||||||
bin devscripts test youtube_dl docs \
|
bin devscripts test youtube_dl docs \
|
||||||
ChangeLog LICENSE README.md README.txt \
|
LICENSE README.md README.txt \
|
||||||
Makefile MANIFEST.in youtube-dl.1 youtube-dl.bash-completion \
|
Makefile MANIFEST.in youtube-dl.1 youtube-dl.bash-completion \
|
||||||
youtube-dl.zsh youtube-dl.fish setup.py \
|
youtube-dl.zsh youtube-dl.fish setup.py \
|
||||||
youtube-dl
|
youtube-dl
|
||||||
|
|||||||
@@ -71,12 +71,9 @@ fi
|
|||||||
/bin/echo -e "\n### Changing version in version.py..."
|
/bin/echo -e "\n### Changing version in version.py..."
|
||||||
sed -i "s/__version__ = '.*'/__version__ = '$version'/" youtube_dl/version.py
|
sed -i "s/__version__ = '.*'/__version__ = '$version'/" youtube_dl/version.py
|
||||||
|
|
||||||
/bin/echo -e "\n### Changing version in ChangeLog..."
|
|
||||||
sed -i "s/<unreleased>/$version/" ChangeLog
|
|
||||||
|
|
||||||
/bin/echo -e "\n### Committing documentation, templates and youtube_dl/version.py..."
|
/bin/echo -e "\n### Committing documentation, templates and youtube_dl/version.py..."
|
||||||
make README.md CONTRIBUTING.md .github/ISSUE_TEMPLATE.md supportedsites
|
make README.md CONTRIBUTING.md .github/ISSUE_TEMPLATE.md supportedsites
|
||||||
git add README.md CONTRIBUTING.md .github/ISSUE_TEMPLATE.md docs/supportedsites.md youtube_dl/version.py ChangeLog
|
git add README.md CONTRIBUTING.md .github/ISSUE_TEMPLATE.md docs/supportedsites.md youtube_dl/version.py
|
||||||
git commit $gpg_sign_commits -m "release $version"
|
git commit $gpg_sign_commits -m "release $version"
|
||||||
|
|
||||||
/bin/echo -e "\n### Now tagging, signing and pushing..."
|
/bin/echo -e "\n### Now tagging, signing and pushing..."
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
#!/usr/bin/env python
|
#!/usr/bin/env python
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import itertools
|
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
@@ -22,15 +21,10 @@ def format_size(bytes):
|
|||||||
|
|
||||||
total_bytes = 0
|
total_bytes = 0
|
||||||
|
|
||||||
for page in itertools.count(1):
|
releases = json.loads(compat_urllib_request.urlopen(
|
||||||
releases = json.loads(compat_urllib_request.urlopen(
|
'https://api.github.com/repos/rg3/youtube-dl/releases').read().decode('utf-8'))
|
||||||
'https://api.github.com/repos/rg3/youtube-dl/releases?page=%s' % page
|
|
||||||
).read().decode('utf-8'))
|
|
||||||
|
|
||||||
if not releases:
|
for release in releases:
|
||||||
break
|
|
||||||
|
|
||||||
for release in releases:
|
|
||||||
compat_print(release['name'])
|
compat_print(release['name'])
|
||||||
for asset in release['assets']:
|
for asset in release['assets']:
|
||||||
asset_name = asset['name']
|
asset_name = asset['name']
|
||||||
|
|||||||
@@ -73,7 +73,6 @@ class ARDMediathekIE(InfoExtractor):
|
|||||||
'description': 'md5:c0c1c8048514deaed2a73b3a60eecacb',
|
'description': 'md5:c0c1c8048514deaed2a73b3a60eecacb',
|
||||||
'duration': 3287,
|
'duration': 3287,
|
||||||
},
|
},
|
||||||
'skip': 'Video is no longer available',
|
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _extract_media_info(self, media_info_url, webpage, video_id):
|
def _extract_media_info(self, media_info_url, webpage, video_id):
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
# coding: utf-8
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import re
|
import re
|
||||||
@@ -21,18 +20,6 @@ class BloombergIE(InfoExtractor):
|
|||||||
'params': {
|
'params': {
|
||||||
'format': 'best[format_id^=hds]',
|
'format': 'best[format_id^=hds]',
|
||||||
},
|
},
|
||||||
}, {
|
|
||||||
# video ID in BPlayer(...)
|
|
||||||
'url': 'http://www.bloomberg.com/features/2016-hello-world-new-zealand/',
|
|
||||||
'info_dict': {
|
|
||||||
'id': '938c7e72-3f25-4ddb-8b85-a9be731baa74',
|
|
||||||
'ext': 'flv',
|
|
||||||
'title': 'Meet the Real-Life Tech Wizards of Middle Earth',
|
|
||||||
'description': 'Hello World, Episode 1: New Zealand’s freaky AI babies, robot exoskeletons, and a virtual you.',
|
|
||||||
},
|
|
||||||
'params': {
|
|
||||||
'format': 'best[format_id^=hds]',
|
|
||||||
},
|
|
||||||
}, {
|
}, {
|
||||||
'url': 'http://www.bloomberg.com/news/articles/2015-11-12/five-strange-things-that-have-been-happening-in-financial-markets',
|
'url': 'http://www.bloomberg.com/news/articles/2015-11-12/five-strange-things-that-have-been-happening-in-financial-markets',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
@@ -46,11 +33,7 @@ class BloombergIE(InfoExtractor):
|
|||||||
webpage = self._download_webpage(url, name)
|
webpage = self._download_webpage(url, name)
|
||||||
video_id = self._search_regex(
|
video_id = self._search_regex(
|
||||||
r'["\']bmmrId["\']\s*:\s*(["\'])(?P<url>.+?)\1',
|
r'["\']bmmrId["\']\s*:\s*(["\'])(?P<url>.+?)\1',
|
||||||
webpage, 'id', group='url', default=None)
|
webpage, 'id', group='url')
|
||||||
if not video_id:
|
|
||||||
bplayer_data = self._parse_json(self._search_regex(
|
|
||||||
r'BPlayer\(null,\s*({[^;]+})\);', webpage, 'id'), name)
|
|
||||||
video_id = bplayer_data['id']
|
|
||||||
title = re.sub(': Video$', '', self._og_search_title(webpage))
|
title = re.sub(': Video$', '', self._og_search_title(webpage))
|
||||||
|
|
||||||
embed_info = self._download_json(
|
embed_info = self._download_json(
|
||||||
|
|||||||
@@ -1786,7 +1786,7 @@ class InfoExtractor(object):
|
|||||||
|
|
||||||
any_restricted = False
|
any_restricted = False
|
||||||
for tc in self.get_testcases(include_onlymatching=False):
|
for tc in self.get_testcases(include_onlymatching=False):
|
||||||
if tc.get('playlist', []):
|
if 'playlist' in tc:
|
||||||
tc = tc['playlist'][0]
|
tc = tc['playlist'][0]
|
||||||
is_restricted = age_restricted(
|
is_restricted = age_restricted(
|
||||||
tc.get('info_dict', {}).get('age_limit'), age_limit)
|
tc.get('info_dict', {}).get('age_limit'), age_limit)
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from ..utils import (
|
|||||||
|
|
||||||
|
|
||||||
class CWTVIE(InfoExtractor):
|
class CWTVIE(InfoExtractor):
|
||||||
_VALID_URL = r'https?://(?:www\.)?cw(?:tv(?:pr)?|seed)\.com/(?:shows/)?(?:[^/]+/)+[^?]*\?.*\b(?:play|watch)=(?P<id>[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})'
|
_VALID_URL = r'https?://(?:www\.)?cw(?:tv|seed)\.com/(?:shows/)?(?:[^/]+/){2}\?.*\bplay=(?P<id>[a-z0-9]{8}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{4}-[a-z0-9]{12})'
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
'url': 'http://cwtv.com/shows/arrow/legends-of-yesterday/?play=6b15e985-9345-4f60-baf8-56e96be57c63',
|
'url': 'http://cwtv.com/shows/arrow/legends-of-yesterday/?play=6b15e985-9345-4f60-baf8-56e96be57c63',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
@@ -51,12 +51,6 @@ class CWTVIE(InfoExtractor):
|
|||||||
}, {
|
}, {
|
||||||
'url': 'http://cwtv.com/thecw/chroniclesofcisco/?play=8adebe35-f447-465f-ab52-e863506ff6d6',
|
'url': 'http://cwtv.com/thecw/chroniclesofcisco/?play=8adebe35-f447-465f-ab52-e863506ff6d6',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
}, {
|
|
||||||
'url': 'http://cwtvpr.com/the-cw/video?watch=9eee3f60-ef4e-440b-b3b2-49428ac9c54e',
|
|
||||||
'only_matching': True,
|
|
||||||
}, {
|
|
||||||
'url': 'http://cwtv.com/shows/arrow/legends-of-yesterday/?watch=6b15e985-9345-4f60-baf8-56e96be57c63',
|
|
||||||
'only_matching': True,
|
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
|
|||||||
@@ -331,9 +331,7 @@ class DailymotionPlaylistIE(DailymotionBaseInfoExtractor):
|
|||||||
|
|
||||||
for video_id in re.findall(r'data-xid="(.+?)"', webpage):
|
for video_id in re.findall(r'data-xid="(.+?)"', webpage):
|
||||||
if video_id not in video_ids:
|
if video_id not in video_ids:
|
||||||
yield self.url_result(
|
yield self.url_result('http://www.dailymotion.com/video/%s' % video_id, 'Dailymotion')
|
||||||
'http://www.dailymotion.com/video/%s' % video_id,
|
|
||||||
DailymotionIE.ie_key(), video_id)
|
|
||||||
video_ids.add(video_id)
|
video_ids.add(video_id)
|
||||||
|
|
||||||
if re.search(self._MORE_PAGES_INDICATOR, webpage) is None:
|
if re.search(self._MORE_PAGES_INDICATOR, webpage) is None:
|
||||||
|
|||||||
@@ -71,7 +71,6 @@ from .vessel import VesselIE
|
|||||||
from .kaltura import KalturaIE
|
from .kaltura import KalturaIE
|
||||||
from .eagleplatform import EaglePlatformIE
|
from .eagleplatform import EaglePlatformIE
|
||||||
from .facebook import FacebookIE
|
from .facebook import FacebookIE
|
||||||
from .soundcloud import SoundcloudIE
|
|
||||||
|
|
||||||
|
|
||||||
class GenericIE(InfoExtractor):
|
class GenericIE(InfoExtractor):
|
||||||
@@ -785,15 +784,6 @@ class GenericIE(InfoExtractor):
|
|||||||
'upload_date': '20141029',
|
'upload_date': '20141029',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
# Soundcloud multiple embeds
|
|
||||||
{
|
|
||||||
'url': 'http://www.guitarplayer.com/lessons/1014/legato-workout-one-hour-to-more-fluid-performance---tab/52809',
|
|
||||||
'info_dict': {
|
|
||||||
'id': '52809',
|
|
||||||
'title': 'Guitar Essentials: Legato Workout—One-Hour to Fluid Performance | TAB + AUDIO',
|
|
||||||
},
|
|
||||||
'playlist_mincount': 7,
|
|
||||||
},
|
|
||||||
# Livestream embed
|
# Livestream embed
|
||||||
{
|
{
|
||||||
'url': 'http://www.esa.int/Our_Activities/Space_Science/Rosetta/Philae_comet_touch-down_webcast',
|
'url': 'http://www.esa.int/Our_Activities/Space_Science/Rosetta/Philae_comet_touch-down_webcast',
|
||||||
@@ -2009,9 +1999,12 @@ class GenericIE(InfoExtractor):
|
|||||||
return self.url_result(myvi_url)
|
return self.url_result(myvi_url)
|
||||||
|
|
||||||
# Look for embedded soundcloud player
|
# Look for embedded soundcloud player
|
||||||
soundcloud_urls = SoundcloudIE._extract_urls(webpage)
|
mobj = re.search(
|
||||||
if soundcloud_urls:
|
r'<iframe\s+(?:[a-zA-Z0-9_-]+="[^"]+"\s+)*src="(?P<url>https?://(?:w\.)?soundcloud\.com/player[^"]+)"',
|
||||||
return _playlist_from_matches(soundcloud_urls, getter=unescapeHTML, ie=SoundcloudIE.ie_key())
|
webpage)
|
||||||
|
if mobj is not None:
|
||||||
|
url = unescapeHTML(mobj.group('url'))
|
||||||
|
return self.url_result(url)
|
||||||
|
|
||||||
# Look for embedded mtvservices player
|
# Look for embedded mtvservices player
|
||||||
mtvservices_url = MTVServicesEmbeddedIE._extract_url(webpage)
|
mtvservices_url = MTVServicesEmbeddedIE._extract_url(webpage)
|
||||||
|
|||||||
@@ -37,12 +37,11 @@ class LimelightBaseIE(InfoExtractor):
|
|||||||
|
|
||||||
for stream in streams:
|
for stream in streams:
|
||||||
stream_url = stream.get('url')
|
stream_url = stream.get('url')
|
||||||
if not stream_url or stream.get('drmProtected'):
|
if not stream_url:
|
||||||
continue
|
continue
|
||||||
ext = determine_ext(stream_url)
|
if '.f4m' in stream_url:
|
||||||
if ext == 'f4m':
|
|
||||||
formats.extend(self._extract_f4m_formats(
|
formats.extend(self._extract_f4m_formats(
|
||||||
stream_url, video_id, f4m_id='hds', fatal=False))
|
stream_url, video_id, fatal=False))
|
||||||
else:
|
else:
|
||||||
fmt = {
|
fmt = {
|
||||||
'url': stream_url,
|
'url': stream_url,
|
||||||
@@ -51,7 +50,7 @@ class LimelightBaseIE(InfoExtractor):
|
|||||||
'fps': float_or_none(stream.get('videoFrameRate')),
|
'fps': float_or_none(stream.get('videoFrameRate')),
|
||||||
'width': int_or_none(stream.get('videoWidthInPixels')),
|
'width': int_or_none(stream.get('videoWidthInPixels')),
|
||||||
'height': int_or_none(stream.get('videoHeightInPixels')),
|
'height': int_or_none(stream.get('videoHeightInPixels')),
|
||||||
'ext': ext,
|
'ext': determine_ext(stream_url)
|
||||||
}
|
}
|
||||||
rtmp = re.search(r'^(?P<url>rtmpe?://[^/]+/(?P<app>.+))/(?P<playpath>mp4:.+)$', stream_url)
|
rtmp = re.search(r'^(?P<url>rtmpe?://[^/]+/(?P<app>.+))/(?P<playpath>mp4:.+)$', stream_url)
|
||||||
if rtmp:
|
if rtmp:
|
||||||
@@ -69,23 +68,18 @@ class LimelightBaseIE(InfoExtractor):
|
|||||||
|
|
||||||
for mobile_url in mobile_urls:
|
for mobile_url in mobile_urls:
|
||||||
media_url = mobile_url.get('mobileUrl')
|
media_url = mobile_url.get('mobileUrl')
|
||||||
format_id = mobile_url.get('targetMediaPlatform')
|
if not media_url:
|
||||||
if not media_url or format_id == 'Widevine':
|
|
||||||
continue
|
continue
|
||||||
ext = determine_ext(media_url)
|
format_id = mobile_url.get('targetMediaPlatform')
|
||||||
if ext == 'm3u8':
|
if determine_ext(media_url) == 'm3u8':
|
||||||
formats.extend(self._extract_m3u8_formats(
|
formats.extend(self._extract_m3u8_formats(
|
||||||
media_url, video_id, 'mp4', 'm3u8_native',
|
media_url, video_id, 'mp4', 'm3u8_native',
|
||||||
m3u8_id=format_id, fatal=False))
|
m3u8_id=format_id, fatal=False))
|
||||||
elif ext == 'f4m':
|
|
||||||
formats.extend(self._extract_f4m_formats(
|
|
||||||
stream_url, video_id, f4m_id=format_id, fatal=False))
|
|
||||||
else:
|
else:
|
||||||
formats.append({
|
formats.append({
|
||||||
'url': media_url,
|
'url': media_url,
|
||||||
'format_id': format_id,
|
'format_id': format_id,
|
||||||
'preference': -1,
|
'preference': -1,
|
||||||
'ext': ext,
|
|
||||||
})
|
})
|
||||||
|
|
||||||
self._sort_formats(formats)
|
self._sort_formats(formats)
|
||||||
@@ -151,7 +145,7 @@ class LimelightMediaIE(LimelightBaseIE):
|
|||||||
'url': 'http://link.videoplatform.limelight.com/media/?mediaId=3ffd040b522b4485b6d84effc750cd86',
|
'url': 'http://link.videoplatform.limelight.com/media/?mediaId=3ffd040b522b4485b6d84effc750cd86',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': '3ffd040b522b4485b6d84effc750cd86',
|
'id': '3ffd040b522b4485b6d84effc750cd86',
|
||||||
'ext': 'mp4',
|
'ext': 'flv',
|
||||||
'title': 'HaP and the HB Prince Trailer',
|
'title': 'HaP and the HB Prince Trailer',
|
||||||
'description': 'md5:8005b944181778e313d95c1237ddb640',
|
'description': 'md5:8005b944181778e313d95c1237ddb640',
|
||||||
'thumbnail': 're:^https?://.*\.jpeg$',
|
'thumbnail': 're:^https?://.*\.jpeg$',
|
||||||
@@ -160,7 +154,7 @@ class LimelightMediaIE(LimelightBaseIE):
|
|||||||
'upload_date': '20090604',
|
'upload_date': '20090604',
|
||||||
},
|
},
|
||||||
'params': {
|
'params': {
|
||||||
# m3u8 download
|
# rtmp download
|
||||||
'skip_download': True,
|
'skip_download': True,
|
||||||
},
|
},
|
||||||
}, {
|
}, {
|
||||||
@@ -170,6 +164,7 @@ class LimelightMediaIE(LimelightBaseIE):
|
|||||||
'id': 'a3e00274d4564ec4a9b29b9466432335',
|
'id': 'a3e00274d4564ec4a9b29b9466432335',
|
||||||
'ext': 'flv',
|
'ext': 'flv',
|
||||||
'title': '3Play Media Overview Video',
|
'title': '3Play Media Overview Video',
|
||||||
|
'description': '',
|
||||||
'thumbnail': 're:^https?://.*\.jpeg$',
|
'thumbnail': 're:^https?://.*\.jpeg$',
|
||||||
'duration': 78.101,
|
'duration': 78.101,
|
||||||
'timestamp': 1338929955,
|
'timestamp': 1338929955,
|
||||||
|
|||||||
@@ -113,8 +113,6 @@ class RTVEALaCartaIE(InfoExtractor):
|
|||||||
png = self._download_webpage(png_request, video_id, 'Downloading url information')
|
png = self._download_webpage(png_request, video_id, 'Downloading url information')
|
||||||
video_url = _decrypt_url(png)
|
video_url = _decrypt_url(png)
|
||||||
if not video_url.endswith('.f4m'):
|
if not video_url.endswith('.f4m'):
|
||||||
if '?' not in video_url:
|
|
||||||
video_url = video_url.replace('resources/', 'auth/resources/')
|
|
||||||
video_url = video_url.replace('.net.rtve', '.multimedia.cdn.rtve')
|
video_url = video_url.replace('.net.rtve', '.multimedia.cdn.rtve')
|
||||||
|
|
||||||
subtitles = None
|
subtitles = None
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ class SafariBaseIE(InfoExtractor):
|
|||||||
class SafariIE(SafariBaseIE):
|
class SafariIE(SafariBaseIE):
|
||||||
IE_NAME = 'safari'
|
IE_NAME = 'safari'
|
||||||
IE_DESC = 'safaribooksonline.com online video'
|
IE_DESC = 'safaribooksonline.com online video'
|
||||||
_VALID_URL = r'https?://(?:www\.)?safaribooksonline\.com/library/view/[^/]+/(?P<course_id>[^/]+)/(?P<part>[^/?#&]+)\.html'
|
_VALID_URL = r'https?://(?:www\.)?safaribooksonline\.com/library/view/[^/]+/(?P<course_id>[^/]+)/(?P<part>part\d+)\.html'
|
||||||
|
|
||||||
_TESTS = [{
|
_TESTS = [{
|
||||||
'url': 'https://www.safaribooksonline.com/library/view/hadoop-fundamentals-livelessons/9780133392838/part00.html',
|
'url': 'https://www.safaribooksonline.com/library/view/hadoop-fundamentals-livelessons/9780133392838/part00.html',
|
||||||
@@ -92,9 +92,6 @@ class SafariIE(SafariBaseIE):
|
|||||||
# non-digits in course id
|
# non-digits in course id
|
||||||
'url': 'https://www.safaribooksonline.com/library/view/create-a-nodejs/100000006A0210/part00.html',
|
'url': 'https://www.safaribooksonline.com/library/view/create-a-nodejs/100000006A0210/part00.html',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
}, {
|
|
||||||
'url': 'https://www.safaribooksonline.com/library/view/learning-path-red/9780134664057/RHCE_Introduction.html',
|
|
||||||
'only_matching': True,
|
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
@@ -135,15 +132,12 @@ class SafariIE(SafariBaseIE):
|
|||||||
|
|
||||||
class SafariApiIE(SafariBaseIE):
|
class SafariApiIE(SafariBaseIE):
|
||||||
IE_NAME = 'safari:api'
|
IE_NAME = 'safari:api'
|
||||||
_VALID_URL = r'https?://(?:www\.)?safaribooksonline\.com/api/v1/book/(?P<course_id>[^/]+)/chapter(?:-content)?/(?P<part>[^/?#&]+)\.html'
|
_VALID_URL = r'https?://(?:www\.)?safaribooksonline\.com/api/v1/book/(?P<course_id>[^/]+)/chapter(?:-content)?/(?P<part>part\d+)\.html'
|
||||||
|
|
||||||
_TESTS = [{
|
_TEST = {
|
||||||
'url': 'https://www.safaribooksonline.com/api/v1/book/9780133392838/chapter/part00.html',
|
'url': 'https://www.safaribooksonline.com/api/v1/book/9780133392838/chapter/part00.html',
|
||||||
'only_matching': True,
|
'only_matching': True,
|
||||||
}, {
|
}
|
||||||
'url': 'https://www.safaribooksonline.com/api/v1/book/9780134664057/chapter/RHCE_Introduction.html',
|
|
||||||
'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)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from .common import InfoExtractor
|
|||||||
from ..utils import (
|
from ..utils import (
|
||||||
ExtractorError,
|
ExtractorError,
|
||||||
int_or_none,
|
int_or_none,
|
||||||
|
sanitized_Request,
|
||||||
urlencode_postdata,
|
urlencode_postdata,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -36,33 +37,28 @@ class SharedIE(InfoExtractor):
|
|||||||
|
|
||||||
def _real_extract(self, url):
|
def _real_extract(self, url):
|
||||||
video_id = self._match_id(url)
|
video_id = self._match_id(url)
|
||||||
|
webpage = self._download_webpage(url, video_id)
|
||||||
webpage, urlh = self._download_webpage_handle(url, video_id)
|
|
||||||
|
|
||||||
if '>File does not exist<' in webpage:
|
if '>File does not exist<' in webpage:
|
||||||
raise ExtractorError(
|
raise ExtractorError(
|
||||||
'Video %s does not exist' % video_id, expected=True)
|
'Video %s does not exist' % video_id, expected=True)
|
||||||
|
|
||||||
download_form = self._hidden_inputs(webpage)
|
download_form = self._hidden_inputs(webpage)
|
||||||
|
request = sanitized_Request(
|
||||||
|
url, urlencode_postdata(download_form))
|
||||||
|
request.add_header('Content-Type', 'application/x-www-form-urlencoded')
|
||||||
|
|
||||||
video_page = self._download_webpage(
|
video_page = self._download_webpage(
|
||||||
urlh.geturl(), video_id, 'Downloading video page',
|
request, video_id, 'Downloading video page')
|
||||||
data=urlencode_postdata(download_form),
|
|
||||||
headers={
|
|
||||||
'Content-Type': 'application/x-www-form-urlencoded',
|
|
||||||
'Referer': urlh.geturl(),
|
|
||||||
})
|
|
||||||
|
|
||||||
video_url = self._html_search_regex(
|
video_url = self._html_search_regex(
|
||||||
r'data-url=(["\'])(?P<url>(?:(?!\1).)+)\1',
|
r'data-url="([^"]+)"', video_page, 'video URL')
|
||||||
video_page, 'video URL', group='url')
|
|
||||||
title = base64.b64decode(self._html_search_meta(
|
title = base64.b64decode(self._html_search_meta(
|
||||||
'full:title', webpage, 'title').encode('utf-8')).decode('utf-8')
|
'full:title', webpage, 'title').encode('utf-8')).decode('utf-8')
|
||||||
filesize = int_or_none(self._html_search_meta(
|
filesize = int_or_none(self._html_search_meta(
|
||||||
'full:size', webpage, 'file size', fatal=False))
|
'full:size', webpage, 'file size', fatal=False))
|
||||||
thumbnail = self._html_search_regex(
|
thumbnail = self._html_search_regex(
|
||||||
r'data-poster=(["\'])(?P<url>(?:(?!\1).)+)\1',
|
r'data-poster="([^"]+)"', video_page, 'thumbnail', default=None)
|
||||||
video_page, 'thumbnail', default=None, group='url')
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': video_id,
|
'id': video_id,
|
||||||
|
|||||||
@@ -119,12 +119,6 @@ class SoundcloudIE(InfoExtractor):
|
|||||||
_CLIENT_ID = '02gUJC0hH2ct1EGOcYXQIzRFU91c72Ea'
|
_CLIENT_ID = '02gUJC0hH2ct1EGOcYXQIzRFU91c72Ea'
|
||||||
_IPHONE_CLIENT_ID = '376f225bf427445fc4bfb6b99b72e0bf'
|
_IPHONE_CLIENT_ID = '376f225bf427445fc4bfb6b99b72e0bf'
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def _extract_urls(webpage):
|
|
||||||
return [m.group('url') for m in re.finditer(
|
|
||||||
r'<iframe[^>]+src=(["\'])(?P<url>(?:https?://)?(?:w\.)?soundcloud\.com/player.+?)\1',
|
|
||||||
webpage)]
|
|
||||||
|
|
||||||
def report_resolve(self, video_id):
|
def report_resolve(self, video_id):
|
||||||
"""Report information extraction."""
|
"""Report information extraction."""
|
||||||
self.to_screen('%s: Resolving id' % video_id)
|
self.to_screen('%s: Resolving id' % video_id)
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ from ..utils import (
|
|||||||
determine_ext,
|
determine_ext,
|
||||||
int_or_none,
|
int_or_none,
|
||||||
float_or_none,
|
float_or_none,
|
||||||
js_to_json,
|
|
||||||
parse_iso8601,
|
parse_iso8601,
|
||||||
remove_end,
|
remove_end,
|
||||||
)
|
)
|
||||||
@@ -55,11 +54,10 @@ class TV2IE(InfoExtractor):
|
|||||||
ext = determine_ext(video_url)
|
ext = determine_ext(video_url)
|
||||||
if ext == 'f4m':
|
if ext == 'f4m':
|
||||||
formats.extend(self._extract_f4m_formats(
|
formats.extend(self._extract_f4m_formats(
|
||||||
video_url, video_id, f4m_id=format_id, fatal=False))
|
video_url, video_id, f4m_id=format_id))
|
||||||
elif ext == 'm3u8':
|
elif ext == 'm3u8':
|
||||||
formats.extend(self._extract_m3u8_formats(
|
formats.extend(self._extract_m3u8_formats(
|
||||||
video_url, video_id, 'mp4', entry_protocol='m3u8_native',
|
video_url, video_id, 'mp4', m3u8_id=format_id))
|
||||||
m3u8_id=format_id, fatal=False))
|
|
||||||
elif ext == 'ism' or video_url.endswith('.ism/Manifest'):
|
elif ext == 'ism' or video_url.endswith('.ism/Manifest'):
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
@@ -107,7 +105,7 @@ class TV2ArticleIE(InfoExtractor):
|
|||||||
'url': 'http://www.tv2.no/2015/05/16/nyheter/alesund/krim/pingvin/6930542',
|
'url': 'http://www.tv2.no/2015/05/16/nyheter/alesund/krim/pingvin/6930542',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
'id': '6930542',
|
'id': '6930542',
|
||||||
'title': 'Russen hetses etter pingvintyveri - innrømmer å ha åpnet luken på buret',
|
'title': 'Russen hetses etter pingvintyveri – innrømmer å ha åpnet luken på buret',
|
||||||
'description': 'md5:339573779d3eea3542ffe12006190954',
|
'description': 'md5:339573779d3eea3542ffe12006190954',
|
||||||
},
|
},
|
||||||
'playlist_count': 2,
|
'playlist_count': 2,
|
||||||
@@ -121,23 +119,9 @@ class TV2ArticleIE(InfoExtractor):
|
|||||||
|
|
||||||
webpage = self._download_webpage(url, playlist_id)
|
webpage = self._download_webpage(url, playlist_id)
|
||||||
|
|
||||||
# Old embed pattern (looks unused nowadays)
|
|
||||||
assets = re.findall(r'data-assetid=["\'](\d+)', webpage)
|
|
||||||
|
|
||||||
if not assets:
|
|
||||||
# New embed pattern
|
|
||||||
for v in re.findall('TV2ContentboxVideo\(({.+?})\)', webpage):
|
|
||||||
video = self._parse_json(
|
|
||||||
v, playlist_id, transform_source=js_to_json, fatal=False)
|
|
||||||
if not video:
|
|
||||||
continue
|
|
||||||
asset = video.get('assetId')
|
|
||||||
if asset:
|
|
||||||
assets.append(asset)
|
|
||||||
|
|
||||||
entries = [
|
entries = [
|
||||||
self.url_result('http://www.tv2.no/v/%s' % asset_id, 'TV2')
|
self.url_result('http://www.tv2.no/v/%s' % video_id, 'TV2')
|
||||||
for asset_id in assets]
|
for video_id in re.findall(r'data-assetid="(\d+)"', webpage)]
|
||||||
|
|
||||||
title = remove_end(self._og_search_title(webpage), ' - TV2.no')
|
title = remove_end(self._og_search_title(webpage), ' - TV2.no')
|
||||||
description = remove_end(self._og_search_description(webpage), ' - TV2.no')
|
description = remove_end(self._og_search_description(webpage), ' - TV2.no')
|
||||||
|
|||||||
@@ -461,7 +461,7 @@ class TwitchClipsIE(InfoExtractor):
|
|||||||
IE_NAME = 'twitch:clips'
|
IE_NAME = 'twitch:clips'
|
||||||
_VALID_URL = r'https?://clips\.twitch\.tv/(?:[^/]+/)*(?P<id>[^/?#&]+)'
|
_VALID_URL = r'https?://clips\.twitch\.tv/(?:[^/]+/)*(?P<id>[^/?#&]+)'
|
||||||
|
|
||||||
_TESTS = [{
|
_TEST = {
|
||||||
'url': 'https://clips.twitch.tv/ea/AggressiveCobraPoooound',
|
'url': 'https://clips.twitch.tv/ea/AggressiveCobraPoooound',
|
||||||
'md5': '761769e1eafce0ffebfb4089cb3847cd',
|
'md5': '761769e1eafce0ffebfb4089cb3847cd',
|
||||||
'info_dict': {
|
'info_dict': {
|
||||||
@@ -473,11 +473,7 @@ class TwitchClipsIE(InfoExtractor):
|
|||||||
'uploader': 'stereotype_',
|
'uploader': 'stereotype_',
|
||||||
'uploader_id': 'stereotype_',
|
'uploader_id': 'stereotype_',
|
||||||
},
|
},
|
||||||
}, {
|
}
|
||||||
# multiple formats
|
|
||||||
'url': 'https://clips.twitch.tv/rflegendary/UninterestedBeeDAESuppy',
|
|
||||||
'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)
|
||||||
@@ -489,27 +485,15 @@ class TwitchClipsIE(InfoExtractor):
|
|||||||
r'(?s)clipInfo\s*=\s*({.+?});', webpage, 'clip info'),
|
r'(?s)clipInfo\s*=\s*({.+?});', webpage, 'clip info'),
|
||||||
video_id, transform_source=js_to_json)
|
video_id, transform_source=js_to_json)
|
||||||
|
|
||||||
title = clip.get('channel_title') or self._og_search_title(webpage)
|
video_url = clip['clip_video_url']
|
||||||
|
title = clip['channel_title']
|
||||||
formats = [{
|
|
||||||
'url': option['source'],
|
|
||||||
'format_id': option.get('quality'),
|
|
||||||
'height': int_or_none(option.get('quality')),
|
|
||||||
} for option in clip.get('quality_options', []) if option.get('source')]
|
|
||||||
|
|
||||||
if not formats:
|
|
||||||
formats = [{
|
|
||||||
'url': clip['clip_video_url'],
|
|
||||||
}]
|
|
||||||
|
|
||||||
self._sort_formats(formats)
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': video_id,
|
'id': video_id,
|
||||||
|
'url': video_url,
|
||||||
'title': title,
|
'title': title,
|
||||||
'thumbnail': self._og_search_thumbnail(webpage),
|
'thumbnail': self._og_search_thumbnail(webpage),
|
||||||
'creator': clip.get('broadcaster_display_name') or clip.get('broadcaster_login'),
|
'creator': clip.get('broadcaster_display_name') or clip.get('broadcaster_login'),
|
||||||
'uploader': clip.get('curator_login'),
|
'uploader': clip.get('curator_login'),
|
||||||
'uploader_id': clip.get('curator_display_name'),
|
'uploader_id': clip.get('curator_display_name'),
|
||||||
'formats': formats,
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -75,12 +75,6 @@ class YandexMusicTrackIE(YandexMusicBaseIE):
|
|||||||
% storage_dir,
|
% storage_dir,
|
||||||
track_id, 'Downloading track location JSON')
|
track_id, 'Downloading track location JSON')
|
||||||
|
|
||||||
# Each string is now wrapped in a list, this is probably only temporarily thus
|
|
||||||
# supporting both scenarios (see https://github.com/rg3/youtube-dl/issues/10193)
|
|
||||||
for k, v in data.items():
|
|
||||||
if v and isinstance(v, list):
|
|
||||||
data[k] = v[0]
|
|
||||||
|
|
||||||
key = hashlib.md5(('XGRlBW9FXlekgbPrRHuSiA' + data['path'][1:] + data['s']).encode('utf-8')).hexdigest()
|
key = hashlib.md5(('XGRlBW9FXlekgbPrRHuSiA' + data['path'][1:] + data['s']).encode('utf-8')).hexdigest()
|
||||||
storage = storage_dir.split('.')
|
storage = storage_dir.split('.')
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
__version__ = '2016.08.01'
|
__version__ = '2016.07.26'
|
||||||
|
|||||||
Reference in New Issue
Block a user