188 lines
6.1 KiB
Python
188 lines
6.1 KiB
Python
# coding=utf-8
|
||
#!/usr/bin/python
|
||
import sys
|
||
sys.path.append('..')
|
||
from base.spider import Spider
|
||
import json
|
||
import time
|
||
import urllib.parse
|
||
import re
|
||
import requests
|
||
from lxml import etree
|
||
import base64
|
||
|
||
class Spider(Spider):
|
||
def getName(self):
|
||
return "UAA[听]"
|
||
|
||
def init(self, extend):
|
||
pass
|
||
|
||
def homeContent(self, filter):
|
||
result = {}
|
||
cateManual = {
|
||
"有声小说": "有声小说",
|
||
"淫词艳曲": "淫词艳曲",
|
||
"激情骚麦": "激情骚麦",
|
||
"寸止训练": "寸止训练",
|
||
"ASMR": "ASMR"
|
||
}
|
||
classes = []
|
||
for key in cateManual:
|
||
classes.append({
|
||
'type_name': key,
|
||
'type_id': cateManual[key]
|
||
})
|
||
result['class'] = classes
|
||
return result
|
||
|
||
def homeVideoContent(self):
|
||
result = {}
|
||
return result
|
||
|
||
def categoryContent(self, tid, pg, filter, extend):
|
||
result = {}
|
||
url = 'https://www.uaa001.com/api/audio/app/audio/search?category={0}&orderType=1&page={1}&searchType=1&size=42'.format(tid, pg)
|
||
rsp = self.fetch(url)
|
||
content = rsp.text
|
||
videos = []
|
||
data = json.loads(content)
|
||
for item in data['model']['data']:
|
||
videos.append({
|
||
"vod_id": item['id'],
|
||
"vod_name": item['title'],
|
||
"vod_pic": item['coverUrl'],
|
||
"vod_remarks": item['categories']
|
||
})
|
||
result['list'] = videos
|
||
result['page'] = pg
|
||
result['pagecount'] = 9999
|
||
result['limit'] = 42
|
||
result['total'] = 999999
|
||
return result
|
||
|
||
def detailContent(self, array):
|
||
tid = array[0]
|
||
url = 'https://www.uaa001.com/api/audio/app/audio/intro?id={0}'.format(tid)
|
||
rsp = self.fetch(url)
|
||
content = rsp.text
|
||
data = json.loads(content)
|
||
model = data['model']
|
||
|
||
# 构建播放列表
|
||
play_list = []
|
||
if 'chapters' in model and model['chapters']:
|
||
for chapter in model['chapters']:
|
||
chapter_id = chapter.get('id', '')
|
||
chapter_title = chapter.get('title', '第{}集'.format(chapter.get('order', 1)))
|
||
# 获取章节播放链接
|
||
chapter_url = self.getChapterUrl(chapter_id)
|
||
if chapter_url:
|
||
play_list.append('{}${}'.format(chapter_title, chapter_url))
|
||
|
||
# 如果没有章节信息,使用默认播放链接
|
||
if not play_list and 'latestReadChapterUrl' in model:
|
||
play_list.append('第1集${}'.format(model['latestReadChapterUrl']))
|
||
|
||
play_url = '#'.join(play_list) if play_list else ''
|
||
|
||
# 构建详细信息
|
||
vod_actor = model.get('author', '未知') # CV信息
|
||
vod_area = model.get('categories', '') # 分类信息
|
||
|
||
# 构建备注信息,包含收听量和收藏量
|
||
remarks_parts = []
|
||
if 'playCount' in model:
|
||
play_count = self.format_count(model['playCount'])
|
||
remarks_parts.append(f'收听:{play_count}')
|
||
if 'collectCount' in model:
|
||
collect_count = self.format_count(model['collectCount'])
|
||
remarks_parts.append(f'收藏:{collect_count}')
|
||
|
||
vod_remarks = ' | '.join(remarks_parts) if remarks_parts else model.get('updateState', '')
|
||
|
||
vod = {
|
||
"vod_id": tid,
|
||
"vod_name": model['title'],
|
||
"vod_pic": model['coverUrl'],
|
||
"vod_content": model.get('intro', ''),
|
||
"vod_actor": vod_actor, # 显示CV信息
|
||
"vod_area": vod_area, # 显示分类信息
|
||
"vod_remarks": vod_remarks, # 显示收听量和收藏量
|
||
"vod_play_from": "UAA",
|
||
"vod_play_url": play_url
|
||
}
|
||
result = {
|
||
'list': [vod]
|
||
}
|
||
return result
|
||
|
||
def format_count(self, count):
|
||
"""格式化数字显示,如18200显示为18.2K"""
|
||
try:
|
||
count = int(count)
|
||
if count >= 10000:
|
||
return f"{count/10000:.1f}万"
|
||
elif count >= 1000:
|
||
return f"{count/1000:.1f}K"
|
||
else:
|
||
return str(count)
|
||
except:
|
||
return str(count)
|
||
|
||
def getChapterUrl(self, chapter_id):
|
||
"""获取章节播放链接"""
|
||
if not chapter_id:
|
||
return ''
|
||
|
||
try:
|
||
url = 'https://www.uaa001.com/api/audio/app/audio/chapter?id={}'.format(chapter_id)
|
||
rsp = self.fetch(url)
|
||
data = json.loads(rsp.text)
|
||
if data.get('model') and data['model'].get('chapterUrl'):
|
||
return data['model']['chapterUrl']
|
||
except:
|
||
pass
|
||
|
||
return ''
|
||
|
||
def searchContent(self, key, quick, page='1'):
|
||
result = {}
|
||
url = 'https://www.uaa001.com/api/audio/app/audio/search?category=&keyword={0}&orderType=1&orderType=1&origin=&page=1&searchType=1&size=32&tag='.format(urllib.parse.quote(key))
|
||
rsp = self.fetch(url)
|
||
content = rsp.text
|
||
videos = []
|
||
data = json.loads(content)
|
||
for item in data['model']['data']:
|
||
videos.append({
|
||
"vod_id": item['id'],
|
||
"vod_name": item['title'],
|
||
"vod_pic": item['coverUrl'],
|
||
"vod_remarks": item['categories']
|
||
})
|
||
result['list'] = videos
|
||
return result
|
||
|
||
def playerContent(self, flag, id, vipFlags):
|
||
result = {}
|
||
|
||
# 直接从播放链接播放,不需要额外解析
|
||
result["parse"] = 0
|
||
result["playUrl"] = ''
|
||
result["url"] = id
|
||
result["header"] = {
|
||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
|
||
"Referer": "https://www.uaa001.com/"
|
||
}
|
||
|
||
return result
|
||
|
||
def isVideoFormat(self, url):
|
||
pass
|
||
|
||
def manualVideoCheck(self):
|
||
pass
|
||
|
||
def localProxy(self, param):
|
||
action = {}
|
||
return [200, "video/MP2T", action, ""] |