]>
jfr.im git - yt-dlp.git/blob - yt_dlp/extractor/zingmp3.py
2 from __future__
import unicode_literals
4 from .common
import InfoExtractor
10 class ZingMp3BaseIE(InfoExtractor
):
11 _VALID_URL_TMPL
= r
'https?://(?:mp3\.zing|zingmp3)\.vn/(?:%s)/[^/]+/(?P<id>\w+)\.html'
12 _GEO_COUNTRIES
= ['VN']
14 def _extract_item(self
, item
, fatal
):
16 title
= item
.get('name') or item
['title']
19 for k
, v
in (item
.get('source') or {}).items():
22 if k
in ('mp4', 'hls'):
23 for res
, video_url
in v
.items():
27 formats
.extend(self
._extract
_m
3u8_formats
(
28 video_url
, item_id
, 'mp4',
29 'm3u8_native', m3u8_id
=k
, fatal
=False))
32 'format_id': 'mp4-' + res
,
34 'height': int_or_none(self
._search
_regex
(
35 r
'^(\d+)p', res
, 'resolution', default
=None)),
41 'tbr': int_or_none(k
),
42 'url': self
._proto
_relative
_url
(v
),
49 if msg
== 'Sorry, this content is not available in your country.':
50 self
.raise_geo_restricted(countries
=self
._GEO
_COUNTRIES
, metadata_available
=True)
51 self
.raise_no_formats(msg
, expected
=True)
52 self
._sort
_formats
(formats
)
55 lyric
= item
.get('lyric')
63 album
= item
.get('album') or {}
69 'thumbnail': item
.get('thumbnail'),
70 'subtitles': subtitles
,
71 'duration': int_or_none(item
.get('duration')),
73 'artist': item
.get('artists_names'),
74 'album': album
.get('name') or album
.get('title'),
75 'album_artist': album
.get('artists_names'),
78 def _real_extract(self
, url
):
79 page_id
= self
._match
_id
(url
)
80 webpage
= self
._download
_webpage
(
81 url
.replace('://zingmp3.vn/', '://mp3.zing.vn/'),
82 page_id
, query
={'play_song': 1}
)
83 data_path
= self
._search
_regex
(
84 r
'data-xml="([^"]+)', webpage
, 'data path')
85 return self
._process
_data
(self
._download
_json
(
86 'https://mp3.zing.vn/xhr' + data_path
, page_id
)['data'])
89 class ZingMp3IE(ZingMp3BaseIE
):
90 _VALID_URL
= ZingMp3BaseIE
._VALID
_URL
_TMPL
% 'bai-hat|video-clip'
92 'url': 'http://mp3.zing.vn/bai-hat/Xa-Mai-Xa-Bao-Thy/ZWZB9WAB.html',
93 'md5': 'ead7ae13693b3205cbc89536a077daed',
98 'thumbnail': r
're:^https?://.+\.jpg',
105 'track': 'Xa Mãi Xa',
107 'album': 'Special Album',
108 'album_artist': 'Bảo Thy',
111 'url': 'https://mp3.zing.vn/video-clip/Suong-Hoa-Dua-Loi-K-ICM-RYO/ZO8ZF7C7.html',
112 'md5': 'e9c972b693aa88301ef981c8151c4343',
115 'title': 'Sương Hoa Đưa Lối',
117 'thumbnail': r
're:^https?://.+\.jpg',
119 'track': 'Sương Hoa Đưa Lối',
120 'artist': 'K-ICM, RYO',
123 'url': 'https://zingmp3.vn/bai-hat/Xa-Mai-Xa-Bao-Thy/ZWZB9WAB.html',
124 'only_matching': True,
127 IE_DESC
= 'mp3.zing.vn'
129 def _process_data(self
, data
):
130 return self
._extract
_item
(data
, True)
133 class ZingMp3AlbumIE(ZingMp3BaseIE
):
134 _VALID_URL
= ZingMp3BaseIE
._VALID
_URL
_TMPL
% 'album|playlist'
136 'url': 'http://mp3.zing.vn/album/Lau-Dai-Tinh-Ai-Bang-Kieu-Minh-Tuyet/ZWZBWDAF.html',
140 'title': 'Lâu Đài Tình Ái',
142 'playlist_count': 10,
144 'url': 'http://mp3.zing.vn/playlist/Duong-Hong-Loan-apollobee/IWCAACCB.html',
145 'only_matching': True,
147 'url': 'https://zingmp3.vn/album/Lau-Dai-Tinh-Ai-Bang-Kieu-Minh-Tuyet/ZWZBWDAF.html',
148 'only_matching': True,
150 IE_NAME
= 'zingmp3:album'
152 def _process_data(self
, data
):
154 for item
in (data
.get('items') or []):
155 entry
= self
._extract
_item
(item
, False)
158 info
= data
.get('info') or {}
159 return self
.playlist_result(
160 entries(), info
.get('id'), info
.get('name') or info
.get('title'))