[Joox] Add new extractor
This commit is contained in:
parent
86693c4930
commit
9d96a65eaf
@ -491,6 +491,7 @@ from .jamendo import (
|
||||
JamendoAlbumIE,
|
||||
)
|
||||
from .jeuxvideo import JeuxVideoIE
|
||||
from .joox import JooxIE
|
||||
from .jove import JoveIE
|
||||
from .joj import JojIE
|
||||
from .jwplatform import JWPlatformIE
|
||||
@ -1327,7 +1328,7 @@ from .webofstories import (
|
||||
WebOfStoriesPlaylistIE,
|
||||
)
|
||||
from .weibo import (
|
||||
WeiboIE,
|
||||
WeiboIE,
|
||||
WeiboMobileIE
|
||||
)
|
||||
from .weiqitv import WeiqiTVIE
|
||||
|
94
youtube_dl/extractor/joox.py
Normal file
94
youtube_dl/extractor/joox.py
Normal file
@ -0,0 +1,94 @@
|
||||
# coding: utf-8
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import re
|
||||
import time
|
||||
|
||||
from .common import InfoExtractor
|
||||
import base64
|
||||
|
||||
|
||||
from ..compat import (
|
||||
compat_urllib_parse_urlencode,
|
||||
)
|
||||
|
||||
|
||||
class JooxIE(InfoExtractor):
|
||||
IE_NAME = 'jooxmusic:single'
|
||||
IE_DESC = 'Joox'
|
||||
_VALID_URL = r'https?://www\.joox\.com/(?P<country>[a-z]*)/(?P<language>[a-z]*_?[a-z]*)/single/(?P<id>[a-zA-z0-9+]*==)'
|
||||
_TESTS = [{
|
||||
'url': 'http://www.joox.com/hk/zh_hk/single/WYL92NDGHMhCs3GdDZBsMQ==',
|
||||
'md5': '81a3d00b7422edb16a59ee9fe3dcb5dd',
|
||||
'info_dict': {
|
||||
'id': 'WYL92NDGHMhCs3GdDZBsMQ==',
|
||||
'ext': 'mp3',
|
||||
'title': '忍',
|
||||
'release_date': '20180214',
|
||||
'creator': '林欣彤',
|
||||
'thumbnail': r're:^https?://.*\.jpg$',
|
||||
}
|
||||
}]
|
||||
|
||||
def _real_extract(self, url):
|
||||
_VALID_URL = r'https?://www\.joox\.com/(?P<country>[a-z]*)/(?P<language>[a-z]*_?[a-z]*)/single/(?P<id>[a-zA-z0-9+]*==)'
|
||||
song_id = self._match_id(url)
|
||||
p = re.compile(_VALID_URL)
|
||||
m = p.search(url)
|
||||
_country = m.group('country')
|
||||
_lang = m.group('language')
|
||||
_code = int(time.time() * 1000)
|
||||
|
||||
query = {
|
||||
'songid': song_id,
|
||||
'lang': _lang,
|
||||
'country': _country,
|
||||
'form_type': -1,
|
||||
'channel_id': -1,
|
||||
'_': _code
|
||||
}
|
||||
|
||||
detail_info_page = self._download_webpage(
|
||||
"http://api.joox.com/web-fcgi-bin/web_get_songinfo?" + compat_urllib_parse_urlencode(query), song_id)
|
||||
detail_info_page = detail_info_page[18:-1]
|
||||
song_json = self._parse_json(detail_info_page, song_id)
|
||||
song320mp3 = song_json.get('r320Url')
|
||||
song192mp3 = song_json.get('r192Url')
|
||||
songmp3 = song_json.get('mp3Url')
|
||||
songm4a = song_json.get('m4aUrl')
|
||||
song_title = song_json.get('msong')
|
||||
_duration = song_json.get('minterval')
|
||||
album_thumbnail = song_json.get('album_url')
|
||||
size128 = song_json.get('size128')
|
||||
size320 = song_json.get('size320')
|
||||
singer = song_json.get('singer_list')
|
||||
singer = singer[0].get('name')
|
||||
singer = base64.b64decode(singer).decode('UTF-8')
|
||||
publish_time = song_json.get('public_time')
|
||||
publish_time = publish_time.replace('-', '')
|
||||
formats = []
|
||||
_FORMATS = {
|
||||
'128m4a': {'url': song192mp3, 'abr': 128},
|
||||
'm4a': {'url': songm4a},
|
||||
'mp3': {'url': songmp3, 'abr': 128, 'filesize': size128},
|
||||
'320mp3': {'url': song320mp3, 'preference': -1, 'abr': 320, 'filesize': size320},
|
||||
}
|
||||
for format_id, details in _FORMATS.items():
|
||||
formats.append({
|
||||
'url': details['url'],
|
||||
'format': format_id,
|
||||
'format_id': format_id,
|
||||
'preference': details.get('preference'),
|
||||
'abr': details.get('abr'),
|
||||
'filesize': details.get('filesize'),
|
||||
'resolution': 'audio only'
|
||||
})
|
||||
return {
|
||||
'id': song_id,
|
||||
'title': song_title,
|
||||
'formats': formats,
|
||||
'thumbnail': album_thumbnail,
|
||||
'release_date': publish_time,
|
||||
'duration': _duration,
|
||||
'creator': singer,
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user