Compare commits

...
5 Commits
Author SHA1 Message Date
4ft35tandGitHub b1ba126906 Merge branch 'yt-dlp:master' into fix-ximalaya-album 2025-03-13 23:18:14 +08:00
4ft35t 66530018e8 autopep8 format 2025-01-14 16:46:17 +08:00
4ft35t f186a2a750 clean up 2025-01-13 09:48:24 +08:00
4ft35t 69ab3e8ca5 update coding style 2025-01-11 02:35:24 +08:00
4ft35t aefe3abd73 [ie/ximalaya:album] fix #11327 2025-01-11 01:50:18 +08:00
+24 -13
View File
@@ -1,5 +1,4 @@
import base64 import base64
import math
import time import time
from .common import InfoExtractor from .common import InfoExtractor
@@ -222,25 +221,37 @@ class XimalayaAlbumIE(XimalayaBaseIE):
def _real_extract(self, url): def _real_extract(self, url):
playlist_id = self._match_id(url) playlist_id = self._match_id(url)
first_page = self._fetch_page(playlist_id, 1) meta = self._download_json('https://www.ximalaya.com/revision/album/v1/simple',
page_count = math.ceil(first_page['trackTotalCount'] / first_page['pageSize']) playlist_id, note='Downloading album info', query={'albumId': playlist_id})
title = traverse_obj(meta, ('data', 'albumPageMainInfo', 'albumTitle'))
page_size = 30
page_idx = 1
page_cache = {}
while True:
page_data = self._fetch_page(playlist_id, page_idx, page_size)
page_cache[str(page_idx)] = page_data
if len(page_data) < page_size:
break
page_idx += 1
page_count = page_idx
entries = InAdvancePagedList( entries = InAdvancePagedList(
lambda idx: self._get_entries(self._fetch_page(playlist_id, idx + 1) if idx else first_page), lambda idx: self._get_entries(page_cache.get(str(idx + 1))),
page_count, first_page['pageSize']) page_count, page_size)
title = traverse_obj(first_page, ('tracks', 0, 'albumTitle'), expected_type=str)
return self.playlist_result(entries, playlist_id, title) return self.playlist_result(entries, playlist_id, title)
def _fetch_page(self, playlist_id, page_idx): def _fetch_page(self, playlist_id, page_idx, page_size=30):
return self._download_json( meta = self._download_json(
'https://www.ximalaya.com/revision/album/v1/getTracksList', 'https://www.ximalaya.com/revision/play/v1/show',
playlist_id, note=f'Downloading tracks list page {page_idx}', playlist_id, note=f'Downloading tracks list page {page_idx}',
query={'albumId': playlist_id, 'pageNum': page_idx})['data'] query={'id': playlist_id, 'num': page_idx, 'size': page_size, 'ptype': 0})
return traverse_obj(meta, ('data', 'tracksAudioPlay'))
def _get_entries(self, page_data): def _get_entries(self, page_data):
for e in page_data['tracks']: for e in page_data:
yield self.url_result( yield self.url_result(
self._proto_relative_url(f'//www.ximalaya.com{e["url"]}'), self._proto_relative_url(f'//www.ximalaya.com{e.get("trackUrl")}'),
XimalayaIE, e.get('trackId'), e.get('title')) XimalayaIE, e.get('trackId'), e.get('title'))