|
|
@ -5,6 +5,7 @@ from __future__ import absolute_import |
|
|
|
|
|
|
|
import base64 |
|
|
|
import datetime |
|
|
|
import itertools |
|
|
|
import netrc |
|
|
|
import os |
|
|
|
import re |
|
|
@ -3812,8 +3813,6 @@ class PornotubeIE(InfoExtractor): |
|
|
|
|
|
|
|
return [info] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class YouJizzIE(InfoExtractor): |
|
|
|
"""Information extractor for youjizz.com.""" |
|
|
|
_VALID_URL = r'^(?:https?://)?(?:\w+\.)?youjizz\.com/videos/(?P<videoid>[^.]+).html$' |
|
|
@ -3860,6 +3859,47 @@ class YouJizzIE(InfoExtractor): |
|
|
|
|
|
|
|
return [info] |
|
|
|
|
|
|
|
class EightTracksIE(InfoExtractor): |
|
|
|
IE_NAME = '8tracks' |
|
|
|
_VALID_URL = r'https?://8tracks.com/(?P<user>[^/]+)/(?P<id>[^/]+)' |
|
|
|
|
|
|
|
def _real_extract(self, url): |
|
|
|
mobj = re.match(self._VALID_URL, url) |
|
|
|
if mobj is None: |
|
|
|
raise ExtractorError(u'Invalid URL: %s' % url) |
|
|
|
playlist_id = mobj.group('id') |
|
|
|
|
|
|
|
webpage = self._download_webpage(url, playlist_id) |
|
|
|
|
|
|
|
m = re.search(r"new TRAX.Mix\((.*?)\);\n*\s*TRAX.initSearchAutocomplete\('#search'\);", webpage, flags=re.DOTALL) |
|
|
|
if not m: |
|
|
|
raise ExtractorError(u'Cannot find trax information') |
|
|
|
json_like = m.group(1) |
|
|
|
data = json.loads(json_like) |
|
|
|
|
|
|
|
session = str(random.randint(0, 1000000000)) |
|
|
|
mix_id = data['id'] |
|
|
|
track_count = data['tracks_count'] |
|
|
|
first_url = 'http://8tracks.com/sets/%s/play?player=sm&mix_id=%s&format=jsonh' % (session, mix_id) |
|
|
|
next_url = first_url |
|
|
|
res = [] |
|
|
|
for i in itertools.count(): |
|
|
|
api_json = self._download_webpage(next_url, playlist_id, |
|
|
|
note=u'Downloading song information %s/%s' % (str(i+1), track_count), |
|
|
|
errnote=u'Failed to download song information') |
|
|
|
api_data = json.loads(api_json) |
|
|
|
track_data = api_data[u'set']['track'] |
|
|
|
info = { |
|
|
|
'id': track_data['id'], |
|
|
|
'url': track_data['track_file_stream_url'], |
|
|
|
'title': track_data['name'], |
|
|
|
'ext': 'm4a', |
|
|
|
} |
|
|
|
res.append(info) |
|
|
|
if api_data['set']['at_last_track']: |
|
|
|
break |
|
|
|
next_url = 'http://8tracks.com/sets/%s/next?player=sm&mix_id=%s&format=jsonh&track_id=%s' % (session, mix_id, track_data['id']) |
|
|
|
return res |
|
|
|
|
|
|
|
def gen_extractors(): |
|
|
|
""" Return a list of an instance of every supported extractor. |
|
|
@ -3906,6 +3946,7 @@ def gen_extractors(): |
|
|
|
SteamIE(), |
|
|
|
UstreamIE(), |
|
|
|
RBMARadioIE(), |
|
|
|
EightTracksIE(), |
|
|
|
GenericIE() |
|
|
|
] |
|
|
|
|
|
|
|