mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 07:27:15 +08:00
feat(indexer): API 站点支持音乐搜索(馒头/杜比/海胆/Rousi Pro/SunnyPT)
- MTorrentSpider 新增音乐分类(406 Music(音樂)),音乐搜索不再误用电影分类 - HddolbySpider 新增音乐唱片分类(408),演唱会视频(406)不计入音乐 - HaiDanSpider 新增 HQ Audio 音乐分类(408),并修复解析时从响应顶层取 category 恒为空的既有问题 - RousiSpider 支持 music 分类参数与结果标记,分类 ID 映射补充 5->music - SunnyPTSpider 分类映射与结果解析通用支持 music 媒体类型 - 新增对应站点 spider 音乐搜索单测
This commit is contained in:
@@ -28,6 +28,8 @@ class HaiDanSpider:
|
||||
# 电影分类
|
||||
_movie_category = ['401', '404', '405']
|
||||
_tv_category = ['402', '403', '404', '405']
|
||||
# 音乐分类:408 为海胆 HQ Audio(音乐) 分区;406 MV 属于视频,不计入音乐
|
||||
_music_category = ['408']
|
||||
|
||||
# 足销状态 1-普通,2-免费,3-2X,4-2X免费,5-50%,6-2X50%,7-30%
|
||||
_dl_state = {
|
||||
@@ -88,6 +90,8 @@ class HaiDanSpider:
|
||||
categories = []
|
||||
elif mtype == MediaType.TV:
|
||||
categories = self._tv_category
|
||||
elif mtype == MediaType.MUSIC:
|
||||
categories = self._music_category
|
||||
else:
|
||||
categories = self._movie_category
|
||||
|
||||
@@ -113,8 +117,11 @@ class HaiDanSpider:
|
||||
torrents = []
|
||||
data = result.get('data') or {}
|
||||
for tid, item in data.items():
|
||||
category_value = result.get('category')
|
||||
if category_value in self._tv_category \
|
||||
# 分类字段在每条种子内,接口顶层没有 category 字段
|
||||
category_value = str(item.get('category') or '')
|
||||
if category_value in self._music_category:
|
||||
category = MediaType.MUSIC.value
|
||||
elif category_value in self._tv_category \
|
||||
and category_value not in self._movie_category:
|
||||
category = MediaType.TV.value
|
||||
elif category_value in self._movie_category:
|
||||
|
||||
@@ -28,6 +28,8 @@ class HddolbySpider:
|
||||
# 分类
|
||||
_movie_category = [401, 405]
|
||||
_tv_category = [402, 403, 404, 405]
|
||||
# 音乐分类:408 为杜比音乐唱片分区;406 演唱会蓝光属于视频,不计入音乐
|
||||
_music_category = [408]
|
||||
|
||||
# 标签
|
||||
_labels = {
|
||||
@@ -88,6 +90,8 @@ class HddolbySpider:
|
||||
categories = self._tv_category
|
||||
elif mtype == MediaType.MOVIE:
|
||||
categories = self._movie_category
|
||||
elif mtype == MediaType.MUSIC:
|
||||
categories = self._music_category
|
||||
else:
|
||||
categories = list(set(self._movie_category + self._tv_category))
|
||||
|
||||
@@ -137,7 +141,9 @@ class HddolbySpider:
|
||||
"""
|
||||
# 类别
|
||||
category_value = result.get('category')
|
||||
if category_value in self._tv_category:
|
||||
if category_value in self._music_category:
|
||||
category = MediaType.MUSIC.value
|
||||
elif category_value in self._tv_category:
|
||||
category = MediaType.TV.value
|
||||
elif category_value in self._movie_category:
|
||||
category = MediaType.MOVIE.value
|
||||
|
||||
@@ -34,7 +34,10 @@ class MTorrentSpider:
|
||||
|
||||
# 电影分类
|
||||
_movie_category = ['401', '419', '420', '421', '439', '405', '404']
|
||||
# 电视剧分类
|
||||
_tv_category = ['403', '402', '435', '438', '404', '405']
|
||||
# 音乐分类:406 为馒头 Music(音樂) 分区
|
||||
_music_category = ['406']
|
||||
|
||||
# API KEY
|
||||
_apikey = None
|
||||
@@ -84,6 +87,8 @@ class MTorrentSpider:
|
||||
categories = []
|
||||
elif mtype == MediaType.TV:
|
||||
categories = self._tv_category
|
||||
elif mtype == MediaType.MUSIC:
|
||||
categories = self._music_category
|
||||
else:
|
||||
categories = self._movie_category
|
||||
# mtorrent搜索imdb需要输入完整imdb链接,参见 https://wiki.m-team.cc/zh-tw/imdbtosearch
|
||||
@@ -107,7 +112,9 @@ class MTorrentSpider:
|
||||
|
||||
for result in results:
|
||||
category_value = result.get('category')
|
||||
if category_value in self._tv_category \
|
||||
if category_value in self._music_category:
|
||||
category = MediaType.MUSIC.value
|
||||
elif category_value in self._tv_category \
|
||||
and category_value not in self._movie_category:
|
||||
category = MediaType.TV.value
|
||||
elif category_value in self._movie_category:
|
||||
|
||||
@@ -35,6 +35,7 @@ class RousiSpider:
|
||||
# API 不支持多分类搜索,每次只使用一个分类
|
||||
_movie_category = 'movie'
|
||||
_tv_category = 'tv'
|
||||
_music_category = 'music'
|
||||
|
||||
# API KEY
|
||||
_apikey = None
|
||||
@@ -67,7 +68,7 @@ class RousiSpider:
|
||||
构建 API 请求参数
|
||||
|
||||
:param keyword: 搜索关键词
|
||||
:param mtype: 媒体类型 (MOVIE/TV)
|
||||
:param mtype: 媒体类型 (MOVIE/TV/MUSIC)
|
||||
:param cat: 用户选择的分类 ID(逗号分隔的字符串)
|
||||
:param page: 页码(从 0 开始,API 需要从 1 开始)
|
||||
:return: 请求参数字典
|
||||
@@ -93,6 +94,8 @@ class RousiSpider:
|
||||
params["category"] = self._movie_category
|
||||
elif mtype == MediaType.TV:
|
||||
params["category"] = self._tv_category
|
||||
elif mtype == MediaType.MUSIC:
|
||||
params["category"] = self._music_category
|
||||
|
||||
return params
|
||||
|
||||
@@ -112,6 +115,7 @@ class RousiSpider:
|
||||
'2': 'tv',
|
||||
'3': 'documentary',
|
||||
'4': 'animation',
|
||||
'5': 'music',
|
||||
'6': 'variety'
|
||||
}
|
||||
|
||||
@@ -178,6 +182,8 @@ class RousiSpider:
|
||||
category = MediaType.MOVIE.value
|
||||
elif cat_val == self._tv_category:
|
||||
category = MediaType.TV.value
|
||||
elif cat_val == self._music_category:
|
||||
category = MediaType.MUSIC.value
|
||||
else:
|
||||
category = MediaType.UNKNOWN.value
|
||||
|
||||
@@ -219,7 +225,7 @@ class RousiSpider:
|
||||
同步搜索种子
|
||||
|
||||
:param keyword: 搜索关键词
|
||||
:param mtype: 媒体类型 (MOVIE/TV)
|
||||
:param mtype: 媒体类型 (MOVIE/TV/MUSIC)
|
||||
:param cat: 用户选择的分类 ID(逗号分隔)
|
||||
:param page: 页码(从 0 开始)
|
||||
:return: (是否发生错误, 种子列表)
|
||||
@@ -247,7 +253,7 @@ class RousiSpider:
|
||||
异步搜索种子
|
||||
|
||||
:param keyword: 搜索关键词
|
||||
:param mtype: 媒体类型 (MOVIE/TV)
|
||||
:param mtype: 媒体类型 (MOVIE/TV/MUSIC)
|
||||
:param cat: 用户选择的分类 ID(逗号分隔)
|
||||
:param page: 页码(从 0 开始)
|
||||
:return: (是否发生错误, 种子列表)
|
||||
|
||||
@@ -54,12 +54,12 @@ class SunnyPTSpider:
|
||||
@staticmethod
|
||||
def _parse_configured_categories(category_config: dict) -> dict:
|
||||
"""
|
||||
从站点索引配置提取电影和电视剧分类 ID,作为分类接口不可用时的兜底
|
||||
从站点索引配置提取电影、电视剧和音乐分类 ID,作为分类接口不可用时的兜底
|
||||
|
||||
:param category_config: Build 站点配置中的分类段
|
||||
:return: 按 API media_type 索引的分类 ID
|
||||
"""
|
||||
category_map = {"movie": [], "tv": []}
|
||||
category_map = {"movie": [], "tv": [], "music": []}
|
||||
for media_type in category_map:
|
||||
for item in category_config.get(media_type) or []:
|
||||
category_id = item.get("id") if isinstance(item, dict) else item
|
||||
@@ -75,7 +75,7 @@ class SunnyPTSpider:
|
||||
:param items: SunnyPT 分类接口 data 数组
|
||||
:return: 按 API media_type 索引的分类 ID
|
||||
"""
|
||||
category_map = {"movie": [], "tv": []}
|
||||
category_map = {"movie": [], "tv": [], "music": []}
|
||||
for item in items or []:
|
||||
if not isinstance(item, dict) or item.get("id") is None:
|
||||
continue
|
||||
@@ -199,12 +199,14 @@ class SunnyPTSpider:
|
||||
将 MoviePilot 媒体类型转换为 SunnyPT API 枚举
|
||||
|
||||
:param media_type: MoviePilot 媒体类型
|
||||
:return: movie、tv 或 None
|
||||
:return: movie、tv、music 或 None
|
||||
"""
|
||||
if media_type == MediaType.MOVIE:
|
||||
return "movie"
|
||||
if media_type == MediaType.TV:
|
||||
return "tv"
|
||||
if media_type == MediaType.MUSIC:
|
||||
return "music"
|
||||
return None
|
||||
|
||||
def _build_params(
|
||||
@@ -259,6 +261,8 @@ class SunnyPTSpider:
|
||||
category = MediaType.MOVIE.value
|
||||
elif media_type == "tv":
|
||||
category = MediaType.TV.value
|
||||
elif media_type == "music":
|
||||
category = MediaType.MUSIC.value
|
||||
else:
|
||||
category = MediaType.UNKNOWN.value
|
||||
|
||||
|
||||
Reference in New Issue
Block a user