Skip to content

Commit

Permalink
feat:下载按站点上传排序
Browse files Browse the repository at this point in the history
  • Loading branch information
jxxghp committed Oct 14, 2024
1 parent 7fd65c5 commit 4877ec6
Show file tree
Hide file tree
Showing 3 changed files with 65 additions and 16 deletions.
24 changes: 23 additions & 1 deletion app/db/models/siteuserdata.py
Original file line number Diff line number Diff line change
@@ -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
Expand Down Expand Up @@ -68,3 +68,25 @@ def get_by_domain(db: Session, domain: str, workdate: str = None, worktime: str
@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()
13 changes: 9 additions & 4 deletions app/db/site_oper.py
Original file line number Diff line number Diff line change
Expand Up @@ -116,15 +116,14 @@ def update_userdata(self, domain: str, name: str, payload: dict) -> Tuple[bool,
"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]:
Expand All @@ -145,6 +144,12 @@ def get_userdata_by_date(self, date: str) -> List[SiteUserData]:
"""
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:
"""
按域名获取站点图标
Expand Down
44 changes: 33 additions & 11 deletions app/helper/torrent.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
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
Expand All @@ -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,
Expand Down Expand Up @@ -196,14 +198,17 @@ def sort_torrents(self, torrent_list: List[Context]) -> List[Context]:
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')
Expand All @@ -214,25 +219,42 @@ def get_sort_str(_context):
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

Expand Down

0 comments on commit 4877ec6

Please sign in to comment.