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
+2 -2
View File
@@ -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
View File
@@ -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]:
""" """
+27
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