diff options
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | youtube_dl/extractor/__init__.py | 1 | ||||
-rw-r--r-- | youtube_dl/extractor/audiomack.py | 14 | ||||
-rw-r--r-- | youtube_dl/extractor/bbccouk.py | 1 | ||||
-rw-r--r-- | youtube_dl/extractor/breakcom.py | 1 | ||||
-rw-r--r-- | youtube_dl/extractor/common.py | 3 | ||||
-rw-r--r-- | youtube_dl/extractor/foxgay.py | 48 | ||||
-rw-r--r-- | youtube_dl/extractor/myspace.py | 1 | ||||
-rw-r--r-- | youtube_dl/extractor/soundcloud.py | 2 | ||||
-rw-r--r-- | youtube_dl/extractor/udemy.py | 5 | ||||
-rw-r--r-- | youtube_dl/extractor/vgtv.py | 4 | ||||
-rw-r--r-- | youtube_dl/extractor/youtube.py | 13 | ||||
-rw-r--r-- | youtube_dl/options.py | 5 |
13 files changed, 76 insertions, 23 deletions
@@ -89,3 +89,4 @@ Oskar Jauch Matthew Rayfield t0mm0 Tithen-Firion +Zack Fernandes diff --git a/youtube_dl/extractor/__init__.py b/youtube_dl/extractor/__init__.py index f4f66fb0b..647352b59 100644 --- a/youtube_dl/extractor/__init__.py +++ b/youtube_dl/extractor/__init__.py @@ -121,6 +121,7 @@ from .fktv import ( from .flickr import FlickrIE from .folketinget import FolketingetIE from .fourtube import FourTubeIE +from .foxgay import FoxgayIE from .franceculture import FranceCultureIE from .franceinter import FranceInterIE from .francetv import ( diff --git a/youtube_dl/extractor/audiomack.py b/youtube_dl/extractor/audiomack.py index eeeec768f..622b20989 100644 --- a/youtube_dl/extractor/audiomack.py +++ b/youtube_dl/extractor/audiomack.py @@ -24,17 +24,17 @@ class AudiomackIE(InfoExtractor): }, # hosted on soundcloud via audiomack { + 'add_ie': ['Soundcloud'], 'url': 'http://www.audiomack.com/song/xclusiveszone/take-kare', - 'file': '172419696.mp3', - 'info_dict': - { + 'info_dict': { + 'id': '172419696', 'ext': 'mp3', + 'description': 'md5:1fc3272ed7a635cce5be1568c2822997', 'title': 'Young Thug ft Lil Wayne - Take Kare', - "upload_date": "20141016", - "description": "New track produced by London On Da Track called “Take Kare\"\n\nhttp://instagram.com/theyoungthugworld\nhttps://www.facebook.com/ThuggerThuggerCashMoney\n", - "uploader": "Young Thug World" + 'uploader': 'Young Thug World', + 'upload_date': '20141016', } - } + }, ] def _real_extract(self, url): diff --git a/youtube_dl/extractor/bbccouk.py b/youtube_dl/extractor/bbccouk.py index beb6cfc8a..01c02d360 100644 --- a/youtube_dl/extractor/bbccouk.py +++ b/youtube_dl/extractor/bbccouk.py @@ -1,6 +1,5 @@ from __future__ import unicode_literals -import re import xml.etree.ElementTree from .subtitles import SubtitlesInfoExtractor diff --git a/youtube_dl/extractor/breakcom.py b/youtube_dl/extractor/breakcom.py index 2c0e5eea2..4bcc897c9 100644 --- a/youtube_dl/extractor/breakcom.py +++ b/youtube_dl/extractor/breakcom.py @@ -14,7 +14,6 @@ class BreakIE(InfoExtractor): _VALID_URL = r'http://(?:www\.)?break\.com/video/(?:[^/]+/)*.+-(?P<id>\d+)' _TESTS = [{ 'url': 'http://www.break.com/video/when-girls-act-like-guys-2468056', - 'md5': '33aa4ff477ecd124d18d7b5d23b87ce5', 'info_dict': { 'id': '2468056', 'ext': 'mp4', diff --git a/youtube_dl/extractor/common.py b/youtube_dl/extractor/common.py index e80a2dad0..5b5e33cea 100644 --- a/youtube_dl/extractor/common.py +++ b/youtube_dl/extractor/common.py @@ -819,7 +819,8 @@ class InfoExtractor(object): return res def _set_cookie(self, domain, name, value, expire_time=None): - cookie = compat_cookiejar.Cookie(0, name, value, None, None, domain, None, + cookie = compat_cookiejar.Cookie( + 0, name, value, None, None, domain, None, None, '/', True, False, expire_time, '', None, None, None) self._downloader.cookiejar.set_cookie(cookie) diff --git a/youtube_dl/extractor/foxgay.py b/youtube_dl/extractor/foxgay.py new file mode 100644 index 000000000..08b8ea362 --- /dev/null +++ b/youtube_dl/extractor/foxgay.py @@ -0,0 +1,48 @@ +from __future__ import unicode_literals + +from .common import InfoExtractor + + +class FoxgayIE(InfoExtractor): + _VALID_URL = r'http://(?:www\.)?foxgay\.com/videos/(?:\S+-)?(?P<id>\d+)\.shtml' + _TEST = { + 'url': 'http://foxgay.com/videos/fuck-turkish-style-2582.shtml', + 'md5': '80d72beab5d04e1655a56ad37afe6841', + 'info_dict': { + 'id': '2582', + 'ext': 'mp4', + 'title': 'md5:6122f7ae0fc6b21ebdf59c5e083ce25a', + 'description': 'md5:5e51dc4405f1fd315f7927daed2ce5cf', + 'age_limit': 18, + 'thumbnail': 're:https?://.*\.jpg$', + }, + } + + def _real_extract(self, url): + video_id = self._match_id(url) + webpage = self._download_webpage(url, video_id) + + title = self._html_search_regex( + r'<title>(?P<title>.*?)</title>', + webpage, 'title', fatal=False) + description = self._html_search_regex( + r'<div class="ico_desc"><h2>(?P<description>.*?)</h2>', + webpage, 'description', fatal=False) + + # Find the URL for the iFrame which contains the actual video. + iframe = self._download_webpage( + self._html_search_regex(r'iframe src="(?P<frame>.*?)"', webpage, 'video frame'), + video_id) + video_url = self._html_search_regex( + r"v_path = '(?P<vid>http://.*?)'", iframe, 'url') + thumb_url = self._html_search_regex( + r"t_path = '(?P<thumb>http://.*?)'", iframe, 'thumbnail', fatal=False) + + return { + 'id': video_id, + 'title': title, + 'url': video_url, + 'description': description, + 'thumbnail': thumb_url, + 'age_limit': 18, + } diff --git a/youtube_dl/extractor/myspace.py b/youtube_dl/extractor/myspace.py index e62614670..83414a232 100644 --- a/youtube_dl/extractor/myspace.py +++ b/youtube_dl/extractor/myspace.py @@ -88,6 +88,7 @@ class MySpaceIE(InfoExtractor): self.report_warning( '%s: No downloadable song on this page' % video_id) return + def search_data(name): return self._search_regex( r'''data-%s=([\'"])(?P<data>.*?)\1''' % name, diff --git a/youtube_dl/extractor/soundcloud.py b/youtube_dl/extractor/soundcloud.py index 3c1d058db..ab9483d2d 100644 --- a/youtube_dl/extractor/soundcloud.py +++ b/youtube_dl/extractor/soundcloud.py @@ -32,7 +32,7 @@ class SoundcloudIE(InfoExtractor): (?P<title>[\w\d-]+)/? (?P<token>[^?]+?)?(?:[?].*)?$) |(?:api\.soundcloud\.com/tracks/(?P<track_id>\d+) - (?:/?\?secret_token=(?P<secret_token>[^&]+?))?$) + (?:/?\?secret_token=(?P<secret_token>[^&]+))?) |(?P<player>(?:w|player|p.)\.soundcloud\.com/player/?.*?url=.*) ) ''' diff --git a/youtube_dl/extractor/udemy.py b/youtube_dl/extractor/udemy.py index 0e4d386a8..5271611ac 100644 --- a/youtube_dl/extractor/udemy.py +++ b/youtube_dl/extractor/udemy.py @@ -97,11 +97,8 @@ class UdemyIE(InfoExtractor): if 'returnUrl' not in response: raise ExtractorError('Unable to log in') - - def _real_extract(self, url): - mobj = re.match(self._VALID_URL, url) - lecture_id = mobj.group('id') + lecture_id = self._match_id(url) lecture = self._download_json( 'https://www.udemy.com/api-1.1/lectures/%s' % lecture_id, diff --git a/youtube_dl/extractor/vgtv.py b/youtube_dl/extractor/vgtv.py index 70578a4cc..2f111bf7e 100644 --- a/youtube_dl/extractor/vgtv.py +++ b/youtube_dl/extractor/vgtv.py @@ -17,7 +17,7 @@ class VGTVIE(InfoExtractor): 'info_dict': { 'id': '84196', 'ext': 'mp4', - 'title': 'Hevnen er søt episode 1:10 - Abu', + 'title': 'Hevnen er søt: Episode 10 - Abu', 'description': 'md5:e25e4badb5f544b04341e14abdc72234', 'thumbnail': 're:^https?://.*\.jpg', 'duration': 648.000, @@ -35,7 +35,7 @@ class VGTVIE(InfoExtractor): 'title': 'OPPTAK: VGTV følger EM-kvalifiseringen', 'description': 'md5:3772d9c0dc2dff92a886b60039a7d4d3', 'thumbnail': 're:^https?://.*\.jpg', - 'duration': 9056.000, + 'duration': 9103.0, 'timestamp': 1410113864, 'upload_date': '20140907', 'view_count': int, diff --git a/youtube_dl/extractor/youtube.py b/youtube_dl/extractor/youtube.py index 1cba40387..f452a90d8 100644 --- a/youtube_dl/extractor/youtube.py +++ b/youtube_dl/extractor/youtube.py @@ -44,9 +44,10 @@ class YoutubeBaseInfoExtractor(InfoExtractor): _LOGIN_REQUIRED = False def _set_language(self): - self._set_cookie('.youtube.com', 'PREF', 'f1=50000000&hl=en', + self._set_cookie( + '.youtube.com', 'PREF', 'f1=50000000&hl=en', # YouTube sets the expire time to about two months - expire_time=time.time() + 60*24*3600) + expire_time=time.time() + 2 * 30 * 24 * 3600) def _login(self): """ @@ -722,9 +723,11 @@ class YoutubeIE(YoutubeBaseInfoExtractor, SubtitlesInfoExtractor): # We fallback to the get_video_info pages (used by the embed page) self.report_video_info_webpage_download(video_id) for el_type in ['&el=embedded', '&el=detailpage', '&el=vevo', '']: - video_info_url = (proto + '://www.youtube.com/get_video_info?&video_id=%s%s&ps=default&eurl=&gl=US&hl=en' - % (video_id, el_type)) - video_info_webpage = self._download_webpage(video_info_url, + video_info_url = ( + '%s://www.youtube.com/get_video_info?&video_id=%s%s&ps=default&eurl=&gl=US&hl=en' + % (proto, video_id, el_type)) + video_info_webpage = self._download_webpage( + video_info_url, video_id, note=False, errnote='unable to download video info webpage') video_info = compat_parse_qs(video_info_webpage) diff --git a/youtube_dl/options.py b/youtube_dl/options.py index 2e8c71508..041ca83d8 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -163,7 +163,10 @@ def parseOpts(overrideArguments=None): general.add_option( '--ignore-config', action='store_true', - help='Do not read configuration files. When given in the global configuration file /etc/youtube-dl.conf: do not read the user configuration in ~/.config/youtube-dl.conf (%APPDATA%/youtube-dl/config.txt on Windows)') + help='Do not read configuration files. ' + 'When given in the global configuration file /etc/youtube-dl.conf: ' + 'Do not read the user configuration in ~/.config/youtube-dl/config ' + '(%APPDATA%/youtube-dl/config.txt on Windows)') general.add_option( '--flat-playlist', action='store_const', dest='extract_flat', const='in_playlist', |