forked from tfornik/RussiaTools
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
188 lines
6.1 KiB
188 lines
6.1 KiB
# 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, ""] |