Files
tvboxtg/肥猫/api/喜马拉雅.py
Liu 0d1a88af45 更新线路
整体线路:v1018
潇洒线路:v1018(15)
2025-10-18 23:38:35 +08:00

221 lines
7.6 KiB
Python

#小心儿悠悠
from urllib.parse import quote
from base.spider import Spider
import requests
class Spider(Spider):
def __init__(self):
super().__init__()
def getName(self):
return "喜马拉雅"
def init(self, extend):
self.search_api = "https://api.cenguigui.cn/api/music/ximalaya.php"
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.ximalaya.com/',
'Host': 'api.cenguigui.cn'
}
self.session = requests.Session()
self.session.headers.update(self.headers)
def homeContent(self, filter):
categories = [
{"type_id": "有声书", "type_name": "有声书"},
{"type_id": "广播剧", "type_name": "广播剧"},
{"type_id": "娱乐", "type_name": "娱乐"},
{"type_id": "儿童", "type_name": "儿童"},
{"type_id": "音乐", "type_name": "音乐"},
{"type_id": "相声评书", "type_name": "相声评书"},
{"type_id": "个人成长", "type_name": "个人成长"}
]
return {"class": categories}
def categoryContent(self, cid, pg, filter, ext):
try:
page_num = int(pg)
url = f"{self.search_api}?name={quote(cid)}&page={page_num}"
response = self.session.get(url, timeout=8)
data = response.json()
if data.get('data'):
videos = []
albums = data.get('data', [])
for album in albums:
album_id = album.get('albumId', '')
videos.append({
"vod_id": str(album_id),
"vod_name": album.get('title', ''),
"vod_pic": album.get('cover', ''),
"vod_remarks": f"{album.get('type', '')} | {album.get('Nickname', '')}"
})
return {
'list': videos,
'page': page_num,
'pagecount': 999999,
'limit': 20,
'total': len(albums)
}
except Exception as e:return {'list': []}
def detailContent(self, ids):
try:
album_id = ids[0]
url = f"{self.search_api}?name={quote(album_id)}"
response = self.session.get(url, timeout=8)
data = response.json()
if data.get('data'):
album_info = data.get('data', [{}])[0]
tracks = self._getAlbumTracks(album_id)
play_urls = []
for i, track in enumerate(tracks):
track_title = track.get('title', f'{i+1}')
track_id = track.get('trackId', '')
play_urls.append(f"{track_title}${album_id}_{track_id}_{i}")
play_from = "喜马拉雅"
play_url = '#'.join(play_urls)
return {'list': [{
"vod_id": album_id,
"vod_name": album_info.get('title', ''),
"vod_pic": album_info.get('cover', ''),
"vod_actor": album_info.get('Nickname', ''),
"vod_year": "",
"vod_content": album_info.get('intro', ''),
"vod_remarks": f"类型:{album_info.get('type', '')}|共{len(tracks)}",
"vod_play_from": play_from,
"vod_play_url": play_url
}]}
except Exception as e:return {'list': []}
def _getAlbumTracks(self, album_id):
try:
url = f"{self.search_api}?albumId={album_id}"
response = self.session.get(url, timeout=8)
data = response.json()
if data.get('data'):
return data.get('data', [])
except Exception as e:return []
def playerContent(self, flag, id, vipFlags):
try:
if '$' in id:
album_name, album_id = id.split('$', 1)
else:
album_id = id
album_name = "未知专辑"
if '_' in album_id:
parts = album_id.split('_')
if len(parts) >= 2:
track_id = parts[1]
else:
track_id = album_id
else:
track_id = album_id
play_url = self._getPlayUrl(track_id)
pic_url = self._getAlbumCover(album_id.split('_')[0] if '_' in album_id else album_id)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.ximalaya.com/'
}
return {
"parse": 0,
"playUrl": '',
"url": play_url,
"header": headers,
"pic": pic_url
}
except Exception as e:return {
"parse": 0,
"playUrl": '',
"url": '',
"header": {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
'Referer': 'https://www.ximalaya.com/'
}
}
def _getPlayUrl(self, track_id):
try:
parse_url = f"{self.search_api}?trackId={track_id}"
response = requests.get(parse_url, headers=self.headers, timeout=8)
data = response.json()
if data.get('code') == 200:
return data.get('url', '') or data.get('data', '')
except Exception as e:return ""
def _getAlbumCover(self, album_id):
try:
url = f"{self.search_api}?name={quote(album_id)}"
response = self.session.get(url, timeout=3)
data = response.json()
if data.get('data'):
info = data.get('data', [{}])[0]
cover_url = info.get('cover', '')
if cover_url:
return cover_url
except Exception:
pass
return ""
def searchContent(self, key, quick, pg="1"):
try:
page_num = int(pg)
encoded_key = quote(key)
url = f"{self.search_api}?name={encoded_key}&page={page_num}"
response = self.session.get(url, timeout=6)
data = response.json()
if data.get('data'):
videos = []
albums = data.get('data', [])
for album in albums:
album_id = album.get('albumId', '')
videos.append({
"vod_id": str(album_id),
"vod_name": album.get('title', ''),
"vod_pic": album.get('cover', ''),
"vod_remarks": f"{album.get('type', '')} | {album.get('Nickname', '')}"
})
return {
'list': videos,
'page': page_num,
'pagecount': 999999,
'limit': 20,
'total': len(albums)
}
except Exception as e:return {'list': []}
def localProxy(self, param):
return []