mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 23:47:41 +08:00
feat:优先下载排序逻辑,更加精细化
This commit is contained in:
+2
-2
@@ -231,9 +231,9 @@ class Settings(BaseSettings, ConfigModel):
|
|||||||
if not value or len(value) < 16:
|
if not value or len(value) < 16:
|
||||||
new_token = secrets.token_urlsafe(16)
|
new_token = secrets.token_urlsafe(16)
|
||||||
if not value:
|
if not value:
|
||||||
logger.info(f"'API_TOKEN' 未设置,已随机生成新的 API_TOKEN:{new_token}")
|
logger.info(f"'API_TOKEN' 未设置,已随机生成新的【API_TOKEN】{new_token}")
|
||||||
else:
|
else:
|
||||||
logger.warning(f"'API_TOKEN' 长度不足 16 个字符,存在安全隐患,已生成新的更复杂的 API_TOKEN:{new_token}")
|
logger.warning(f"'API_TOKEN' 长度不足 16 个字符,存在安全隐患,已随机生成新的【API_TOKEN】{new_token}")
|
||||||
cls.update_env_config(field, original_value=value or "", converted_value=new_token)
|
cls.update_env_config(field, original_value=value or "", converted_value=new_token)
|
||||||
return new_token
|
return new_token
|
||||||
return value
|
return value
|
||||||
|
|||||||
+39
-49
@@ -193,70 +193,60 @@ class TorrentHelper(metaclass=Singleton):
|
|||||||
|
|
||||||
def sort_torrents(self, torrent_list: List[Context]) -> List[Context]:
|
def sort_torrents(self, torrent_list: List[Context]) -> List[Context]:
|
||||||
"""
|
"""
|
||||||
对种子对行排序
|
对种子对行排序:torrent、site、upload、seeder
|
||||||
"""
|
"""
|
||||||
if not torrent_list:
|
if not torrent_list:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
# 优先规则
|
# 下载规则
|
||||||
priority = self.system_config.get(SystemConfigKey.TorrentsPriority)
|
priority_rule: List[str] = self.system_config.get(
|
||||||
|
SystemConfigKey.TorrentsPriority) or ["torrent", "upload", "seeder"]
|
||||||
|
# 站点上传量
|
||||||
|
site_uploads = {
|
||||||
|
site.name: site.upload for site in self.site_oper.get_userdata_latest()
|
||||||
|
}
|
||||||
|
|
||||||
def get_sort_str(_context, _sitedatas: Dict[str, float] = None):
|
def get_sort_str(_context):
|
||||||
"""
|
"""
|
||||||
排序函数
|
拼装排序字段
|
||||||
"""
|
"""
|
||||||
_meta = _context.meta_info
|
_meta = _context.meta_info
|
||||||
_torrent = _context.torrent_info
|
_torrent = _context.torrent_info
|
||||||
_media = _context.media_info
|
_media = _context.media_info
|
||||||
# 站点优先级,越大越优先
|
# 标题
|
||||||
_site_order = 999 - (_torrent.site_order or 0)
|
_title = str(_media.title).ljust(200, ' ')
|
||||||
# 季数
|
# 站点优先级
|
||||||
_season_len = str(len(_meta.season_list)).rjust(2, '0')
|
_site_order = str(999 - (_torrent.site_order or 0)).rjust(3, '0')
|
||||||
# 集数
|
# 站点上传量
|
||||||
|
_site_upload = str(site_uploads.get(_torrent.site_name) or 0).rjust(30, '0')
|
||||||
|
# 资源优先级
|
||||||
|
_torrent_order = str(_torrent.pri_order or 0).rjust(3, '0')
|
||||||
|
# 资源做种数
|
||||||
|
_torrent_seeders = str(_torrent.seeders or 0).rjust(10, '0')
|
||||||
|
# 季集
|
||||||
if not _meta.episode_list:
|
if not _meta.episode_list:
|
||||||
# 无集数的排最前面
|
# 无集数的排最前面
|
||||||
_episode_len = "9999"
|
_season_episode = "%s%s" % (str(len(_meta.season_list)).rjust(3, '0'), "9999")
|
||||||
else:
|
else:
|
||||||
# 集数越多的排越前面
|
# 集数越多的排越前面
|
||||||
_episode_len = str(len(_meta.episode_list)).rjust(4, '0')
|
_season_episode = "%s%s" % (str(len(_meta.season_list)).rjust(3, '0'),
|
||||||
if priority == "seeder":
|
str(len(_meta.episode_list)).rjust(4, '0'))
|
||||||
# 做种数优先:标题、资源优先级、做种数、季集
|
# 根据下载规则的顺序拼装排序字符串
|
||||||
return "%s%s%s%s" % (str(_media.title).ljust(100, ' '),
|
_sort_str = _title
|
||||||
str(_torrent.pri_order).rjust(3, '0'),
|
for rule in priority_rule:
|
||||||
str(_torrent.seeders).rjust(10, '0'),
|
if rule == "torrent":
|
||||||
"%s%s" % (_season_len, _episode_len))
|
_sort_str += _torrent_order
|
||||||
elif priority == "upload":
|
elif rule == "site":
|
||||||
# 站点上传量优先:标题、资源优先级、站点、季集
|
_sort_str += _site_order
|
||||||
# 上传量,越大越优先
|
elif rule == "upload":
|
||||||
if not _sitedatas:
|
_sort_str += _site_upload
|
||||||
_site_upload = 0
|
elif rule == "seeder":
|
||||||
else:
|
_sort_str += _torrent_seeders
|
||||||
_site_upload = _sitedatas.get(_torrent.site_name) or 0
|
_sort_str += _season_episode
|
||||||
return "%s%s%s%s" % (str(_media.title).ljust(100, ' '),
|
return _sort_str
|
||||||
str(_torrent.pri_order).rjust(3, '0'),
|
|
||||||
str(_site_upload).rjust(30, '0'),
|
|
||||||
"%s%s" % (_season_len, _episode_len))
|
|
||||||
else:
|
|
||||||
# 站点优先:标题、资源优先级、站点、做种、季集
|
|
||||||
return "%s%s%s%s%s" % (str(_media.title).ljust(100, ' '),
|
|
||||||
str(_torrent.pri_order).rjust(3, '0'),
|
|
||||||
str(_site_order).rjust(3, '0'),
|
|
||||||
str(_torrent.seeders).rjust(10, '0'),
|
|
||||||
"%s%s" % (_season_len, _episode_len))
|
|
||||||
|
|
||||||
# 获取站点数据
|
# 排序
|
||||||
if priority == "upload":
|
return sorted(torrent_list, key=lambda x: get_sort_str(x), reverse=True)
|
||||||
torrent_list = sorted(torrent_list,
|
|
||||||
key=lambda x: get_sort_str(
|
|
||||||
x,
|
|
||||||
{
|
|
||||||
site.name: site.upload for site in self.site_oper.get_userdata_latest()
|
|
||||||
}
|
|
||||||
), reverse=True)
|
|
||||||
else:
|
|
||||||
torrent_list = sorted(torrent_list, key=lambda x: get_sort_str(x), reverse=True)
|
|
||||||
|
|
||||||
return torrent_list
|
|
||||||
|
|
||||||
def sort_group_torrents(self, torrent_list: List[Context]) -> List[Context]:
|
def sort_group_torrents(self, torrent_list: List[Context]) -> List[Context]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@@ -0,0 +1,27 @@
|
|||||||
|
"""2.0.4
|
||||||
|
|
||||||
|
Revision ID: a73f2dbf5c09
|
||||||
|
Revises: e2dbe1421fa4
|
||||||
|
Create Date: 2024-10-16 15:05:01.775429
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from app.db.systemconfig_oper import SystemConfigOper
|
||||||
|
from app.schemas.types import SystemConfigKey
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'a73f2dbf5c09'
|
||||||
|
down_revision = 'e2dbe1421fa4'
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
# ### commands auto generated by Alembic - please adjust! ###
|
||||||
|
# 初始化下载优先规则
|
||||||
|
SystemConfigOper().set(SystemConfigKey.TorrentsPriority, ["torrent", "upload", "seeder"])
|
||||||
|
# ### end Alembic commands ###
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
pass
|
||||||
Reference in New Issue
Block a user