feat:下载按站点上传排序

This commit is contained in:
jxxghp
2024-10-14 19:45:22 +08:00
parent 7fd65c572b
commit 4877ec68b1
3 changed files with 65 additions and 16 deletions

View File

@@ -1,6 +1,6 @@
from datetime import datetime
from sqlalchemy import Column, Integer, String, Sequence, Float, JSON
from sqlalchemy import Column, Integer, String, Sequence, Float, JSON, func
from sqlalchemy.orm import Session
from app.db import db_query, Base
@@ -68,3 +68,25 @@ class SiteUserData(Base):
@db_query
def get_by_date(db: Session, date: str):
return db.query(SiteUserData).filter(SiteUserData.updated_day == date).all()
@staticmethod
@db_query
def get_latest(db: Session):
"""
获取各站点最新一天的数据
"""
subquery = (
db.query(
SiteUserData.domain,
func.max(SiteUserData.updated_day).label('latest_update_day')
)
.group_by(SiteUserData.domain)
.subquery()
)
# 主查询:按 domain 和 updated_day 获取最新的记录
return db.query(SiteUserData).join(
subquery,
(SiteUserData.domain == subquery.c.domain) &
(SiteUserData.updated_day == subquery.c.latest_update_day)
).order_by(SiteUserData.updated_time.desc()).all()

View File

@@ -116,15 +116,14 @@ class SiteOper(DbOper):
"updated_day": current_day,
"updated_time": current_time
})
siteuserdata = SiteUserData.get_by_domain(self._db, domain=domain,
workdate=current_day, worktime=current_time)
# 按站点+天判断是否存在数据
siteuserdata = SiteUserData.get_by_domain(self._db, domain=domain, workdate=current_day)
if siteuserdata:
# 存在则更新
SiteUserData.update(self._db, payload)
else:
# 不存在则插入
for key, value in payload.items():
SiteUserData(**payload).create(self._db)
SiteUserData(**payload).create(self._db)
return True, "更新站点用户数据成功"
def get_userdata(self) -> List[SiteUserData]:
@@ -145,6 +144,12 @@ class SiteOper(DbOper):
"""
return SiteUserData.get_by_date(self._db, date)
def get_userdata_latest(self) -> List[SiteUserData]:
"""
获取站点最新数据
"""
return SiteUserData.get_latest(self._db)
def get_icon_by_domain(self, domain: str) -> SiteIcon:
"""
按域名获取站点图标

View File

@@ -10,6 +10,7 @@ from torrentool.api import Torrent
from app.core.config import settings
from app.core.context import Context, TorrentInfo, MediaInfo
from app.core.metainfo import MetaInfo
from app.db.site_oper import SiteOper
from app.db.systemconfig_oper import SystemConfigOper
from app.log import logger
from app.schemas.types import MediaType, SystemConfigKey
@@ -28,6 +29,7 @@ class TorrentHelper(metaclass=Singleton):
def __init__(self):
self.system_config = SystemConfigOper()
self.site_oper = SiteOper()
def download_torrent(self, url: str,
cookie: str = None,
@@ -196,14 +198,17 @@ class TorrentHelper(metaclass=Singleton):
if not torrent_list:
return []
def get_sort_str(_context):
# 优先规则
priority = self.system_config.get(SystemConfigKey.TorrentsPriority)
def get_sort_str(_context, _sitedatas: Dict[str, float] = None):
"""
排序函数,值越大越优先
排序函数
"""
_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')
@@ -214,25 +219,42 @@ class TorrentHelper(metaclass=Singleton):
else:
# 集数越多的排越前面
_episode_len = str(len(_meta.episode_list)).rjust(4, '0')
# 优先规则
priority = self.system_config.get(SystemConfigKey.TorrentsPriority)
if priority != "site":
# 排序:标题、资源类型、做种、季集
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))
# 匹配的资源中排序分组选最好的一个下载
# 按站点顺序、资源匹配顺序、做种人数下载数逆序排序
torrent_list = sorted(torrent_list, key=lambda x: get_sort_str(x), reverse=True)
# 获取站点数据
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