mirror of
				https://github.com/ls125781003/tvboxtg.git
				synced 2025-10-31 05:42:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			221 lines
		
	
	
		
			7.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			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 []
 |