feat:优先下载排序逻辑,更加精细化

This commit is contained in:
jxxghp
2024-10-16 15:30:58 +08:00
parent 4455ac13e9
commit 54666cb757
3 changed files with 68 additions and 51 deletions

View File

@@ -231,9 +231,9 @@ class Settings(BaseSettings, ConfigModel):
if not value or len(value) < 16:
new_token = secrets.token_urlsafe(16)
if not value:
logger.info(f"'API_TOKEN' 未设置,已随机生成新的 API_TOKEN{new_token}")
logger.info(f"'API_TOKEN' 未设置,已随机生成新的API_TOKEN{new_token}")
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)
return new_token
return value

View File

@@ -193,70 +193,60 @@ class TorrentHelper(metaclass=Singleton):
def sort_torrents(self, torrent_list: List[Context]) -> List[Context]:
"""
对种子对行排序
对种子对行排序torrent、site、upload、seeder
"""
if not torrent_list:
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
_torrent = _context.torrent_info
_media = _context.media_info
# 站点优先级,越大越优先
_site_order = 999 - (_torrent.site_order or 0)
# 季数
_season_len = str(len(_meta.season_list)).rjust(2, '0')
# 集数
# 标题
_title = str(_media.title).ljust(200, ' ')
# 站点优先级
_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:
# 无集数的排最前面
_episode_len = "9999"
_season_episode = "%s%s" % (str(len(_meta.season_list)).rjust(3, '0'), "9999")
else:
# 集数越多的排越前面
_episode_len = str(len(_meta.episode_list)).rjust(4, '0')
if priority == "seeder":
# 做种数优先:标题、资源优先级、做种数、季集
return "%s%s%s%s" % (str(_media.title).ljust(100, ' '),
str(_torrent.pri_order).rjust(3, '0'),
str(_torrent.seeders).rjust(10, '0'),
"%s%s" % (_season_len, _episode_len))
elif priority == "upload":
# 站点上传量优先:标题、资源优先级、站点、季集
# 上传量,越大越优先
if not _sitedatas:
_site_upload = 0
else:
_site_upload = _sitedatas.get(_torrent.site_name) or 0
return "%s%s%s%s" % (str(_media.title).ljust(100, ' '),
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))
_season_episode = "%s%s" % (str(len(_meta.season_list)).rjust(3, '0'),
str(len(_meta.episode_list)).rjust(4, '0'))
# 根据下载规则的顺序拼装排序字符串
_sort_str = _title
for rule in priority_rule:
if rule == "torrent":
_sort_str += _torrent_order
elif rule == "site":
_sort_str += _site_order
elif rule == "upload":
_sort_str += _site_upload
elif rule == "seeder":
_sort_str += _torrent_seeders
_sort_str += _season_episode
return _sort_str
# 获取站点数据
if priority == "upload":
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
# 排序
return sorted(torrent_list, key=lambda x: get_sort_str(x), reverse=True)
def sort_group_torrents(self, torrent_list: List[Context]) -> List[Context]:
"""

View File

@@ -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