Add more test

This commit is contained in:
hatienl0i261299 2020-03-31 16:26:15 +07:00
parent 069641a93c
commit 20e5c0c992

View File

@ -1,4 +1,5 @@
# coding: utf-8 # coding: utf-8
# Code by hatienl0i261299 - fb.com/100011734236090 - hatienloi261299@gmail.com
from __future__ import unicode_literals from __future__ import unicode_literals
import datetime import datetime
@ -10,7 +11,8 @@ import time
from .common import InfoExtractor from .common import InfoExtractor
from ..compat import ( from ..compat import (
compat_urllib_parse_urlencode, compat_urllib_parse_urlencode,
compat_urllib_parse compat_urllib_parse,
compat_str
) )
from ..utils import ( from ..utils import (
url_or_none, url_or_none,
@ -22,10 +24,10 @@ from ..utils import (
class Zingmp3_vnIE(InfoExtractor): class Zingmp3_vnIE(InfoExtractor):
_VALID_URL = r'''(?x)^ _VALID_URL = r'''(?x)^
((http[s]?|fpt):)\/?\/(www\.|m\.|) ((?:http[s]?|fpt):)\/?\/(?:www\.|m\.|)
(?P<site> (?P<site>
(zingmp3\.vn) (zingmp3\.vn)
)\/(?P<type>bai-hat|video-clip|embed)\/(?P<slug>.*?)\/(?P<id>.*?)\W )\/(?P<type>(?:bai-hat|video-clip|embed))\/(?P<slug>.*?)\/(?P<id>.*?)\W
''' '''
IE_NAME = 'zingmp3_vn' IE_NAME = 'zingmp3_vn'
IE_DESC = 'zingmp3.vn' IE_DESC = 'zingmp3.vn'
@ -36,7 +38,7 @@ class Zingmp3_vnIE(InfoExtractor):
'ext': 'mp3', 'ext': 'mp3',
'title': 'Khóc Cùng Em', 'title': 'Khóc Cùng Em',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'description': str, 'description': compat_str,
'like_count': int, 'like_count': int,
'comment_count': int, 'comment_count': int,
'view_count': int, 'view_count': int,
@ -49,7 +51,7 @@ class Zingmp3_vnIE(InfoExtractor):
'ext': 'mp4', 'ext': 'mp4',
'title': "Em Gì Ơi", 'title': "Em Gì Ơi",
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'description': str, 'description': compat_str,
'like_count': int, 'like_count': int,
'comment_count': int, 'comment_count': int,
'view_count': int, 'view_count': int,
@ -61,7 +63,7 @@ class Zingmp3_vnIE(InfoExtractor):
'ext': 'mp4', 'ext': 'mp4',
'title': 'Simple Love', 'title': 'Simple Love',
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'description': str, 'description': compat_str,
'like_count': int, 'like_count': int,
'comment_count': int, 'comment_count': int,
'view_count': int 'view_count': int
@ -73,7 +75,7 @@ class Zingmp3_vnIE(InfoExtractor):
'ext': 'mp3', 'ext': 'mp3',
'title': "Marry You", 'title': "Marry You",
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'description': str, 'description': compat_str,
'like_count': int, 'like_count': int,
'comment_count': int, 'comment_count': int,
'view_count': int, 'view_count': int,
@ -85,7 +87,7 @@ class Zingmp3_vnIE(InfoExtractor):
'ext': 'mp3', 'ext': 'mp3',
'title': "Đáp Án Của Bạn / 你的答案", 'title': "Đáp Án Của Bạn / 你的答案",
'thumbnail': r're:^https?://.*\.jpg$', 'thumbnail': r're:^https?://.*\.jpg$',
'description': str, 'description': compat_str,
'like_count': int, 'like_count': int,
'comment_count': int, 'comment_count': int,
'view_count': int, 'view_count': int,
@ -152,7 +154,7 @@ class Zingmp3_vnIE(InfoExtractor):
:param data: :param data:
:return: str :return: str
""" """
lyric = data.get('lyric') or try_get(data, lambda x: x['lyrics'][0]['content']) lyric = data.get('lyric') or try_get(data, lambda x: x['lyrics'][0]['content'], compat_str)
if url_or_none(lyric): if url_or_none(lyric):
lyric = self._download_webpage(url_or_request=lyric, video_id=video_id) lyric = self._download_webpage(url_or_request=lyric, video_id=video_id)
if lyric: if lyric:
@ -212,7 +214,7 @@ class Zingmp3_vnIE(InfoExtractor):
'protocol': protocol, 'protocol': protocol,
'height': int_or_none(quality) or int_or_none(quality[:-1]) 'height': int_or_none(quality) or int_or_none(quality[:-1])
}) })
formats = sorted(formats, key=lambda x: x['height']) formats = sorted(formats, key=lambda x: x['height'] if x.get("height") else -1)
else: else:
if streaming.get('msg') != "Success": if streaming.get('msg') != "Success":
self.to_screen( self.to_screen(
@ -278,7 +280,7 @@ class Zingmp3_vnIE(InfoExtractor):
SECRET_KEY = b'10a01dcf33762d3a204cb96429918ff6' SECRET_KEY = b'10a01dcf33762d3a204cb96429918ff6'
if not name_api: if not name_api:
return return
_time = str(int(datetime.datetime.now().timestamp())) _time = compat_str(int(datetime.datetime.now().timestamp()))
def get_hash256(string): def get_hash256(string):
return hashlib.sha256(string.encode('utf-8')).hexdigest() return hashlib.sha256(string.encode('utf-8')).hexdigest()
@ -332,7 +334,7 @@ class Zingmp3_vnIE(InfoExtractor):
def get_api_info_alias(alias): def get_api_info_alias(alias):
url = r"https://zingmp3.vn/api%s?alias=%s&" % (name_api, alias) url = r"https://zingmp3.vn/api%s?alias=%s&" % (name_api, alias)
sha256 = get_hash256(r"ctime=%s" % (_time)) sha256 = get_hash256(r"ctime=%s" % _time)
data = { data = {
'ctime': _time, 'ctime': _time,
@ -358,10 +360,10 @@ class Zingmp3_vnPlaylistIE(Zingmp3_vnIE):
IE_NAME = "zingmp3_vn:playlist" IE_NAME = "zingmp3_vn:playlist"
_VALID_URL = r'''(?x)^ _VALID_URL = r'''(?x)^
((http[s]?|fpt):)\/?\/(www\.|m\.|) ((?:http[s]?|fpt):)\/?\/(?:www\.|m\.|)
(?P<site> (?P<site>
(zingmp3\.vn) (zingmp3\.vn)
)\/(?P<type>album|playlist|chu-de)\/(?P<slug>.*?)\/(?P<playlist_id>.*?)\W )\/(?P<type>(?:album|playlist|chu-de))\/(?P<slug>.*?)\/(?P<playlist_id>.*?)\W
''' '''
_TESTS = [ _TESTS = [
@ -426,8 +428,7 @@ class Zingmp3_vnPlaylistIE(Zingmp3_vnIE):
return self.playlist_result( return self.playlist_result(
entries=self._entries_for_chu_de(id_chu_de=playlist_id), entries=self._entries_for_chu_de(id_chu_de=playlist_id),
playlist_id=playlist_id, playlist_id=playlist_id,
playlist_title=slug playlist_title=slug)
)
return self._extract_playlist(id_playlist=playlist_id) return self._extract_playlist(id_playlist=playlist_id)
def _entries_for_chu_de(self, id_chu_de): def _entries_for_chu_de(self, id_chu_de):
@ -436,38 +437,42 @@ class Zingmp3_vnPlaylistIE(Zingmp3_vnIE):
info = self._download_json(url_or_request=api, video_id=id_chu_de) info = self._download_json(url_or_request=api, video_id=id_chu_de)
if info.get('msg') != "Success": if info.get('msg') != "Success":
return return
items = try_get(info, lambda x: x['data']['playlist']['items']) items = try_get(info, lambda x: x['data']['playlist']['items'], list) or []
for item in items: for item in items:
if not item:
continue
url = compat_urllib_parse.urljoin(self._default_host, item.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item.get('link'))
media_id = item.get('id') media_id = item.get('id')
if 'album' in url or 'playlist' in url: if 'album' in url or 'playlist' in url:
name_api = '/playlist/get-playlist-detail' name_api = '/playlist/get-playlist-detail'
api = self.get_api_with_signature(name_api=name_api, video_id=media_id) api = self.get_api_with_signature(name_api=name_api, video_id=media_id)
info_playlist = self._download_json(url_or_request=api, video_id=media_id) info_playlist = self._download_json(url_or_request=api, video_id=media_id)
items_playlist = try_get(info_playlist, lambda x: x['data']['song']['items']) items_playlist = try_get(info_playlist, lambda x: x['data']['song']['items'], list) or []
for item_pl in items_playlist: for item_pl in items_playlist:
if not item_pl:
continue
url = compat_urllib_parse.urljoin(self._default_host, item_pl.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item_pl.get('link'))
video_id = item_pl.get('id') video_id = item_pl.get('id')
yield self.url_result( yield self.url_result(
url=url, url=url,
ie=Zingmp3_vnIE.ie_key(), ie=Zingmp3_vnIE.ie_key(),
video_id=video_id video_id=video_id)
)
def _extract_playlist(self, id_playlist): def _extract_playlist(self, id_playlist):
api = self.get_api_with_signature(name_api=self.name_api_album_or_playlist, video_id=id_playlist) api = self.get_api_with_signature(name_api=self.name_api_album_or_playlist, video_id=id_playlist)
info = self._download_json(url_or_request=api, video_id=id_playlist) info = self._download_json(url_or_request=api, video_id=id_playlist)
title_playlist = try_get(info, lambda x: x['data']['title']) title_playlist = try_get(info, lambda x: x['data']['title'], compat_str) or ''
items = try_get(info, lambda x: x['data']['song']['items']) items = try_get(info, lambda x: x['data']['song']['items'], list) or []
entries = [] entries = []
for item in items: for item in items:
if not item:
continue
url = compat_urllib_parse.urljoin(self._default_host, item.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item.get('link'))
video_id = item.get('id') video_id = item.get('id')
entry = self.url_result( entry = self.url_result(
url=url, url=url,
ie=Zingmp3_vnIE.ie_key(), ie=Zingmp3_vnIE.ie_key(),
video_id=video_id video_id=video_id)
)
entries.append(entry) entries.append(entry)
return { return {
@ -482,10 +487,10 @@ class Zingmp3_vnChartIE(Zingmp3_vnIE):
IE_NAME = "zingmp3_vn:#zingchart" IE_NAME = "zingmp3_vn:#zingchart"
_VALID_URL = r'''(?x)^ _VALID_URL = r'''(?x)^
((http[s]?|fpt):)\/?\/(www\.|m\.|) ((?:http[s]?|fpt):)\/?\/(?:www\.|m\.|)
(?P<site> (?P<site>
(zingmp3\.vn) (zingmp3\.vn)
)\/(?P<name>zing-chart-tuan|zing-chart|top-new-release)\/ )\/(?P<name>(?:zing-chart-tuan|zing-chart|top-new-release))\/
(?P<slug_name>.*?)(\.|\/)(?P<id_name>.*?\.)? (?P<slug_name>.*?)(\.|\/)(?P<id_name>.*?\.)?
''' '''
_TESTS = [ _TESTS = [
@ -548,34 +553,32 @@ class Zingmp3_vnChartIE(Zingmp3_vnIE):
if name == 'zing-chart': if name == 'zing-chart':
api = self.get_api_with_signature( api = self.get_api_with_signature(
name_api=self.list_name_api.get(name).get('name'), name_api=self.list_name_api.get(name).get('name'),
_type=self.list_name_api.get(name).get(slug_name) _type=self.list_name_api.get(name).get(slug_name))
)
elif name == 'zing-chart-tuan': elif name == 'zing-chart-tuan':
api = self.get_api_with_signature( api = self.get_api_with_signature(
name_api=self.list_name_api.get(name).get('name'), name_api=self.list_name_api.get(name).get('name'),
video_id=mobj.group('id_name') video_id=mobj.group('id_name'))
)
else: else:
api = self.get_api_with_signature( api = self.get_api_with_signature(
name_api=self.list_name_api.get(name).get('name'), name_api=self.list_name_api.get(name).get('name'),
new_release=True new_release=True)
)
count = 0 count = 0
info = None info = None
while count != 3: while count != 3:
webpage = self._download_webpage(url_or_request=api, video_id=name) webpage = self._download_webpage(url_or_request=api, video_id=name)
if webpage: if webpage:
info = self._parse_json(webpage, name, transform_source=js_to_json) info = self._parse_json(webpage, name, transform_source=js_to_json, fatal=False)
break break
count += 1 count += 1
if info: if info:
return self.playlist_result( return self.playlist_result(
entries=self._entries(try_get(info, lambda x: x['data']['items'])), entries=self._entries(try_get(info, lambda x: x['data']['items'], list)),
playlist_title=r"%s-%s" % (name, slug_name) playlist_title=r"%s-%s" % (name, slug_name))
)
def _entries(self, items): def _entries(self, items):
for item in items: for item in items:
if not item:
continue
url = compat_urllib_parse.urljoin(self._default_host, item.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item.get('link'))
video_id = item.get('id') video_id = item.get('id')
yield self.url_result(url, ie=Zingmp3_vnIE.ie_key(), video_id=video_id) yield self.url_result(url, ie=Zingmp3_vnIE.ie_key(), video_id=video_id)
@ -583,12 +586,12 @@ class Zingmp3_vnChartIE(Zingmp3_vnIE):
class Zingmp3_vnUserIE(Zingmp3_vnIE): class Zingmp3_vnUserIE(Zingmp3_vnIE):
_VALID_URL = r'''(?x)^ _VALID_URL = r'''(?x)^
((http[s]?|fpt):)\/?\/(www\.|m\.|) ((?:http[s]?|fpt):)\/?\/(?:www\.|m\.|)
(?P<site> (?P<site>
(zingmp3\.vn) (zingmp3\.vn)
)\/(?P<nghe_si>nghe-si\/|)(?P<name>.*?) )\/(?P<nghe_si>(?:nghe-si\/|))(?P<name>.*?)
(?:$|\/) (?:$|\/)
(?P<slug_name>bai-hat|album|video|playlist)$ (?P<slug_name>(?:bai-hat|album|video|playlist))$
''' '''
IE_NAME = "zingmp3_vn:user" IE_NAME = "zingmp3_vn:user"
_TESTS = [ _TESTS = [
@ -665,20 +668,19 @@ class Zingmp3_vnUserIE(Zingmp3_vnIE):
\s+data-id=\"(?P<id_artist>.*?)\" \s+data-id=\"(?P<id_artist>.*?)\"
\s+data-type=\"(?P<data_type>.*?)\" \s+data-type=\"(?P<data_type>.*?)\"
\s+data-name=\"(?P<data_name>.*?)\".*?\> \s+data-name=\"(?P<data_name>.*?)\".*?\>
''', webpage, "artist id", group="id_artist") ''', webpage, "artist id", group="id_artist", default=None, fatal=False)
else: else:
api = self.get_api_with_signature(name_api="/oa/get-artist-info", alias=name) api = self.get_api_with_signature(name_api="/oa/get-artist-info", alias=name)
info = self._download_json(url_or_request=api, video_id=name) info = self._download_json(url_or_request=api, video_id=name)
if info.get('msg') == 'Success': if info.get('msg') == 'Success':
self.id_artist = try_get(info, lambda x: x['data']['artist_id']) self.id_artist = try_get(info, lambda x: x['data']['artist_id'], compat_str) or None
if self.id_artist: if self.id_artist:
self.api = self.get_api_with_signature(name_api=name_api, video_id=self.id_artist) self.api = self.get_api_with_signature(name_api=name_api, video_id=self.id_artist)
return self.playlist_result( return self.playlist_result(
entries=self._entries(), entries=self._entries(),
playlist_id=self.id_artist, playlist_id=self.id_artist,
playlist_title=r"%s-%s" % (name, slug_name) playlist_title=r"%s-%s" % (name, slug_name))
)
elif name == 'chu-de': elif name == 'chu-de':
self.IE_NAME = "zingmp3_vn:chu-de" self.IE_NAME = "zingmp3_vn:chu-de"
rex = re.match(r"(?P<name_chu_de>.*)\/(?P<id_chu_de>.*?)\.", slug_name) rex = re.match(r"(?P<name_chu_de>.*)\/(?P<id_chu_de>.*?)\.", slug_name)
@ -688,30 +690,32 @@ class Zingmp3_vnUserIE(Zingmp3_vnIE):
return self.playlist_result( return self.playlist_result(
entries=self._entries_for_chu_de(), entries=self._entries_for_chu_de(),
playlist_id=self.id_chu_de, playlist_id=self.id_chu_de,
playlist_title=name_chu_de, playlist_title=name_chu_de)
)
def _entries_for_chu_de(self): def _entries_for_chu_de(self):
info = self._download_json(url_or_request=self.api, video_id=self.id_chu_de) info = self._download_json(url_or_request=self.api, video_id=self.id_chu_de)
if info.get('msg') != "Success": if info.get('msg') != "Success":
return return
items = try_get(info, lambda x: x['data']['playlist']['items']) items = try_get(info, lambda x: x['data']['playlist']['items'], list) or []
for item in items: for item in items:
if not item:
continue
url = compat_urllib_parse.urljoin(self._default_host, item.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item.get('link'))
media_id = item.get('id') media_id = item.get('id')
if 'album' in url or 'playlist' in url: if 'album' in url or 'playlist' in url:
name_api = '/playlist/get-playlist-detail' name_api = '/playlist/get-playlist-detail'
api = self.get_api_with_signature(name_api=name_api, video_id=media_id) api = self.get_api_with_signature(name_api=name_api, video_id=media_id)
info_playlist = self._download_json(url_or_request=api, video_id=media_id) info_playlist = self._download_json(url_or_request=api, video_id=media_id)
items_playlist = try_get(info_playlist, lambda x: x['data']['song']['items']) items_playlist = try_get(info_playlist, lambda x: x['data']['song']['items'], list) or []
for item_pl in items_playlist: for item_pl in items_playlist:
if not item_pl:
continue
url = compat_urllib_parse.urljoin(self._default_host, item_pl.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item_pl.get('link'))
video_id = item_pl.get('id') video_id = item_pl.get('id')
yield self.url_result( yield self.url_result(
url=url, url=url,
ie=Zingmp3_vnIE.ie_key(), ie=Zingmp3_vnIE.ie_key(),
video_id=video_id video_id=video_id)
)
def _entries(self): def _entries(self):
start = 0 start = 0
@ -725,30 +729,32 @@ class Zingmp3_vnUserIE(Zingmp3_vnIE):
}) })
if info.get('msg').lower() != "success": if info.get('msg').lower() != "success":
break break
items = try_get(info, lambda x: x['data']['items']) items = try_get(info, lambda x: x['data']['items'], list) or []
for item in items: for item in items:
if not item:
continue
url = compat_urllib_parse.urljoin(self._default_host, item.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item.get('link'))
media_id = item.get('id') media_id = item.get('id')
if 'album' in url or 'playlist' in url: if 'album' in url or 'playlist' in url:
name_api = '/playlist/get-playlist-detail' name_api = '/playlist/get-playlist-detail'
api = self.get_api_with_signature(name_api=name_api, video_id=media_id) api = self.get_api_with_signature(name_api=name_api, video_id=media_id)
info_playlist = self._download_json(url_or_request=api, video_id=media_id) info_playlist = self._download_json(url_or_request=api, video_id=media_id)
items_playlist = try_get(info_playlist, lambda x: x['data']['song']['items']) items_playlist = try_get(info_playlist, lambda x: x['data']['song']['items'], list) or []
for item_pl in items_playlist: for item_pl in items_playlist:
if not item_pl:
continue
url = compat_urllib_parse.urljoin(self._default_host, item_pl.get('link')) url = compat_urllib_parse.urljoin(self._default_host, item_pl.get('link'))
video_id = item_pl.get('id') video_id = item_pl.get('id')
yield self.url_result( yield self.url_result(
url=url, url=url,
ie=Zingmp3_vnIE.ie_key(), ie=Zingmp3_vnIE.ie_key(),
video_id=video_id video_id=video_id)
)
else: else:
yield self.url_result( yield self.url_result(
url=url, url=url,
ie=Zingmp3_vnIE.ie_key(), ie=Zingmp3_vnIE.ie_key(),
video_id=media_id video_id=media_id)
) total = int_or_none(try_get(info, lambda x: x['data']['total'], int)) or -1
total = int_or_none(try_get(info, lambda x: x['data']['total']))
start += count start += count
if total <= start: if total <= start: