commit
e3a43d4f08
25
README.md
25
README.md
@ -177,7 +177,7 @@ https://spk7.imnks.com/
|
||||
|
||||
**一级菜单及一级菜单下的前几个子菜单顺序需要一模一样**,在符合截图的示例项后可以自己增加别的二级菜单项。
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
2) **Telegram Bot机器人**
|
||||
@ -194,16 +194,19 @@ https://spk7.imnks.com/
|
||||
|
||||
**命令与功能对应关系**
|
||||
|
||||
| 命令 | 功能 |
|
||||
| ---- | ---- |
|
||||
| /rss | RSS订阅 |
|
||||
| /ptt | 下载文件转移 |
|
||||
| /ptr | 删种 |
|
||||
| /pts | 站点签到 |
|
||||
| /udt | 系统更新 |
|
||||
| /rst | 目录同步 |
|
||||
| /db | 豆瓣想看 |
|
||||
| /utf | 重新识别 |
|
||||
| 命令 | 功能 |
|
||||
|---------| ---- |
|
||||
| /rss | RSS订阅 |
|
||||
| /ssa | 订阅搜索 |
|
||||
| /ptt | 下载文件转移 |
|
||||
| /ptr | 自动删种 |
|
||||
| /pts | 站点签到 |
|
||||
| /udt | 系统更新 |
|
||||
| /tbl | 清理转移缓存 |
|
||||
| /trh | 清理RSS缓存 |
|
||||
| /rst | 目录同步 |
|
||||
| /db | 豆瓣想看 |
|
||||
| /utf | 重新识别 |
|
||||
|
||||
4) **Synology Chat**
|
||||
|
||||
|
||||
@ -195,7 +195,7 @@ class BrushTask(object):
|
||||
max_dlcount = rss_rule.get("dlcount")
|
||||
success_count = 0
|
||||
if max_dlcount:
|
||||
downloading_count = self.__get_downloading_count(downloader_cfg)
|
||||
downloading_count = self.__get_downloading_count(downloader_cfg) or 0
|
||||
new_torrent_count = int(max_dlcount) - int(downloading_count)
|
||||
|
||||
for res in rss_result:
|
||||
|
||||
@ -5,16 +5,20 @@ from app.utils.types import *
|
||||
class ModuleConf(object):
|
||||
# 菜单对应关系,配置WeChat应用中配置的菜单ID与执行命令的对应关系,需要手工修改
|
||||
# 菜单序号在https://work.weixin.qq.com/wework_admin/frame#apps 应用自定义菜单中维护,然后看日志输出的菜单序号是啥(按顺利能猜到的)....
|
||||
# 命令对应关系:/ptt 下载文件转移;/ptr 删种;/pts 站点签到;/rst 目录同步;/rst 豆瓣想看;/utf 重新识别;/rss RSS下载;/udt 系统更新
|
||||
# 命令对应关系:/ptt 下载文件转移;/ptr 删种;/pts 站点签到;/rst 目录同步;/rst 豆瓣想看;/utf 重新识别;
|
||||
# /ssa 订阅搜索;/tbl 清理转移缓存;/trh 清理RSS缓存;/rss RSS下载;/udt 系统更新
|
||||
WECHAT_MENU = {
|
||||
'_0_0': '/ptt',
|
||||
'_0_1': '/ptr',
|
||||
'_0_2': '/rss',
|
||||
'_0_3': '/ssa',
|
||||
'_1_0': '/rst',
|
||||
'_1_1': '/db',
|
||||
'_1_2': '/utf',
|
||||
'_2_0': '/pts',
|
||||
'_2_1': '/udt'
|
||||
'_2_1': '/udt',
|
||||
'_2_2': '/tbl',
|
||||
'_2_3': '/trh'
|
||||
}
|
||||
|
||||
# 全量转移模式
|
||||
|
||||
@ -41,7 +41,7 @@ class DbHelper:
|
||||
EPISODE=media_item.get_episode_string() if ident_flag else '',
|
||||
ES_STRING=media_item.get_season_episode_string() if ident_flag else '',
|
||||
VOTE=media_item.vote_average or "0",
|
||||
IMAGE=media_item.get_backdrop_image(default=False),
|
||||
IMAGE=media_item.get_backdrop_image(default=False, original=True),
|
||||
POSTER=media_item.get_poster_image(),
|
||||
TMDBID=media_item.tmdb_id,
|
||||
OVERVIEW=media_item.overview,
|
||||
|
||||
@ -307,24 +307,22 @@ class Scraper:
|
||||
if media.type == MediaType.MOVIE:
|
||||
scraper_movie_nfo = scraper_nfo.get("movie")
|
||||
scraper_movie_pic = scraper_pic.get("movie")
|
||||
# 已存在时不处理
|
||||
if os.path.exists(os.path.join(dir_path, "movie.nfo")):
|
||||
return
|
||||
if os.path.exists(os.path.join(dir_path, "%s.nfo" % file_name)):
|
||||
return
|
||||
# nfo
|
||||
# movie nfo
|
||||
if scraper_movie_nfo.get("basic") or scraper_movie_nfo.get("credits"):
|
||||
# 查询Douban信息
|
||||
if scraper_movie_nfo.get("credits") and scraper_movie_nfo.get("credits_chinese"):
|
||||
doubaninfo = self.douban.get_douban_info(media)
|
||||
else:
|
||||
doubaninfo = None
|
||||
# 生成电影描述文件
|
||||
self.gen_movie_nfo_file(tmdbinfo=media.tmdb_info,
|
||||
doubaninfo=doubaninfo,
|
||||
scraper_movie_nfo=scraper_movie_nfo,
|
||||
out_path=dir_path,
|
||||
file_name=file_name)
|
||||
# 已存在时不处理
|
||||
if not os.path.exists(os.path.join(dir_path, "movie.nfo")) \
|
||||
and not os.path.exists(os.path.join(dir_path, "%s.nfo" % file_name)):
|
||||
# 查询Douban信息
|
||||
if scraper_movie_nfo.get("credits") and scraper_movie_nfo.get("credits_chinese"):
|
||||
doubaninfo = self.douban.get_douban_info(media)
|
||||
else:
|
||||
doubaninfo = None
|
||||
# 生成电影描述文件
|
||||
self.gen_movie_nfo_file(tmdbinfo=media.tmdb_info,
|
||||
doubaninfo=doubaninfo,
|
||||
scraper_movie_nfo=scraper_movie_nfo,
|
||||
out_path=dir_path,
|
||||
file_name=file_name)
|
||||
# poster
|
||||
if scraper_movie_pic.get("poster"):
|
||||
poster_image = media.get_poster_image(original=True)
|
||||
@ -360,12 +358,11 @@ class Scraper:
|
||||
thumb_image = media.fanart.get_thumb(media_type=media.type, queryid=media.tmdb_id)
|
||||
if thumb_image:
|
||||
self.__save_image(thumb_image, dir_path, "thumb")
|
||||
|
||||
# 电视剧
|
||||
else:
|
||||
scraper_tv_nfo = scraper_nfo.get("tv")
|
||||
scraper_tv_pic = scraper_pic.get("tv")
|
||||
# 处理根目录
|
||||
# tv nfo
|
||||
if not os.path.exists(os.path.join(os.path.dirname(dir_path), "tvshow.nfo")):
|
||||
if scraper_tv_nfo.get("basic") or scraper_tv_nfo.get("credits"):
|
||||
# 查询Douban信息
|
||||
@ -375,110 +372,115 @@ class Scraper:
|
||||
doubaninfo = None
|
||||
# 根目录描述文件
|
||||
self.gen_tv_nfo_file(media.tmdb_info, doubaninfo, scraper_tv_nfo, os.path.dirname(dir_path))
|
||||
# poster
|
||||
if scraper_tv_pic.get("poster"):
|
||||
poster_image = media.get_poster_image(original=True)
|
||||
if poster_image:
|
||||
self.__save_image(poster_image, os.path.dirname(dir_path), "poster")
|
||||
# backdrop
|
||||
if scraper_tv_pic.get("backdrop"):
|
||||
backdrop_image = media.get_backdrop_image(default=False, original=True)
|
||||
if backdrop_image:
|
||||
self.__save_image(backdrop_image, os.path.dirname(dir_path), "fanart")
|
||||
# background
|
||||
if scraper_tv_pic.get("background"):
|
||||
background_image = media.fanart.get_background(media_type=media.type, queryid=media.tvdb_id)
|
||||
if background_image:
|
||||
self.__save_image(background_image, dir_path, "show")
|
||||
# logo
|
||||
if scraper_tv_pic.get("logo"):
|
||||
logo_image = media.fanart.get_logo(media_type=media.type, queryid=media.tvdb_id)
|
||||
if logo_image:
|
||||
self.__save_image(logo_image, dir_path, "logo")
|
||||
# clearart
|
||||
if scraper_tv_pic.get("clearart"):
|
||||
clearart_image = media.fanart.get_disc(media_type=media.type, queryid=media.tvdb_id)
|
||||
if clearart_image:
|
||||
self.__save_image(clearart_image, dir_path, "clearart")
|
||||
# banner
|
||||
if scraper_tv_pic.get("banner"):
|
||||
banner_image = media.fanart.get_banner(media_type=media.type, queryid=media.tvdb_id)
|
||||
if banner_image:
|
||||
self.__save_image(banner_image, dir_path, "banner")
|
||||
# thumb
|
||||
if scraper_tv_pic.get("thumb"):
|
||||
thumb_image = media.fanart.get_thumb(media_type=media.type, queryid=media.tvdb_id)
|
||||
if thumb_image:
|
||||
self.__save_image(thumb_image, dir_path, "thumb")
|
||||
# 处理集
|
||||
if not os.path.exists(os.path.join(dir_path, "%s.nfo" % file_name)):
|
||||
# 查询TMDB信息
|
||||
if scraper_tv_nfo.get("season_basic") \
|
||||
or scraper_tv_nfo.get("episode_basic") \
|
||||
or scraper_tv_nfo.get("episode_credits"):
|
||||
# poster
|
||||
if scraper_tv_pic.get("poster"):
|
||||
poster_image = media.get_poster_image(original=True)
|
||||
if poster_image:
|
||||
self.__save_image(poster_image, os.path.dirname(dir_path), "poster")
|
||||
# backdrop
|
||||
if scraper_tv_pic.get("backdrop"):
|
||||
backdrop_image = media.get_backdrop_image(default=False, original=True)
|
||||
if backdrop_image:
|
||||
self.__save_image(backdrop_image, os.path.dirname(dir_path), "fanart")
|
||||
# background
|
||||
if scraper_tv_pic.get("background"):
|
||||
background_image = media.fanart.get_background(media_type=media.type, queryid=media.tvdb_id)
|
||||
if background_image:
|
||||
self.__save_image(background_image, dir_path, "show")
|
||||
# logo
|
||||
if scraper_tv_pic.get("logo"):
|
||||
logo_image = media.fanart.get_logo(media_type=media.type, queryid=media.tvdb_id)
|
||||
if logo_image:
|
||||
self.__save_image(logo_image, dir_path, "logo")
|
||||
# clearart
|
||||
if scraper_tv_pic.get("clearart"):
|
||||
clearart_image = media.fanart.get_disc(media_type=media.type, queryid=media.tvdb_id)
|
||||
if clearart_image:
|
||||
self.__save_image(clearart_image, dir_path, "clearart")
|
||||
# banner
|
||||
if scraper_tv_pic.get("banner"):
|
||||
banner_image = media.fanart.get_banner(media_type=media.type, queryid=media.tvdb_id)
|
||||
if banner_image:
|
||||
self.__save_image(banner_image, dir_path, "banner")
|
||||
# thumb
|
||||
if scraper_tv_pic.get("thumb"):
|
||||
thumb_image = media.fanart.get_thumb(media_type=media.type, queryid=media.tvdb_id)
|
||||
if thumb_image:
|
||||
self.__save_image(thumb_image, dir_path, "thumb")
|
||||
# season nfo
|
||||
if scraper_tv_nfo.get("season_basic"):
|
||||
if not os.path.exists(os.path.join(dir_path, "season.nfo")):
|
||||
# season nfo
|
||||
seasoninfo = self.media.get_tmdb_tv_season_detail(tmdbid=media.tmdb_id,
|
||||
season=int(media.get_season_seq()))
|
||||
if scraper_tv_nfo.get("episode_basic") or scraper_tv_nfo.get("episode_credits"):
|
||||
if seasoninfo:
|
||||
self.gen_tv_season_nfo_file(seasoninfo, int(media.get_season_seq()), dir_path)
|
||||
# episode nfo
|
||||
if scraper_tv_nfo.get("episode_basic") \
|
||||
or scraper_tv_nfo.get("episode_credits"):
|
||||
if not os.path.exists(os.path.join(dir_path, "%s.nfo" % file_name)):
|
||||
seasoninfo = self.media.get_tmdb_tv_season_detail(tmdbid=media.tmdb_id,
|
||||
season=int(media.get_season_seq()))
|
||||
if seasoninfo:
|
||||
self.gen_tv_episode_nfo_file(tmdbinfo=seasoninfo,
|
||||
scraper_tv_nfo=scraper_tv_nfo,
|
||||
season=int(media.get_season_seq()),
|
||||
episode=int(media.get_episode_seq()),
|
||||
out_path=dir_path,
|
||||
file_name=file_name)
|
||||
# 处理季
|
||||
if not os.path.exists(os.path.join(dir_path, "season.nfo")):
|
||||
# season nfo
|
||||
if scraper_tv_nfo.get("season_basic"):
|
||||
self.gen_tv_season_nfo_file(seasoninfo, int(media.get_season_seq()), dir_path)
|
||||
# season poster
|
||||
if scraper_tv_pic.get("season_poster"):
|
||||
seasonposter = media.fanart.get_seasonposter(media_type=media.type,
|
||||
queryid=media.tvdb_id,
|
||||
season=media.get_season_seq())
|
||||
if seasonposter:
|
||||
self.__save_image(seasonposter,
|
||||
os.path.dirname(dir_path),
|
||||
"season%s-poster" % media.get_season_seq().rjust(2, '0'))
|
||||
else:
|
||||
self.__save_image(TMDB_IMAGE_W500_URL % seasoninfo.get("poster_path"),
|
||||
os.path.dirname(dir_path),
|
||||
"season%s-poster" % media.get_season_seq().rjust(2, '0'))
|
||||
# season banner
|
||||
if scraper_tv_pic.get("season_banner"):
|
||||
seasonbanner = media.fanart.get_seasonbanner(media_type=media.type,
|
||||
queryid=media.tvdb_id,
|
||||
season=media.get_season_seq())
|
||||
if seasonbanner:
|
||||
self.__save_image(seasonbanner,
|
||||
os.path.dirname(dir_path),
|
||||
"season%s-banner" % media.get_season_seq().rjust(2, '0'))
|
||||
# season thumb
|
||||
if scraper_tv_pic.get("season_thumb"):
|
||||
seasonthumb = media.fanart.get_seasonthumb(media_type=media.type,
|
||||
queryid=media.tvdb_id,
|
||||
season=media.get_season_seq())
|
||||
if seasonthumb:
|
||||
self.__save_image(seasonthumb,
|
||||
os.path.dirname(dir_path),
|
||||
"season%s-landscape" % media.get_season_seq().rjust(2, '0'))
|
||||
# 处理集图片
|
||||
if scraper_tv_pic.get("episode_thumb"):
|
||||
episode_thumb = os.path.join(dir_path, file_name + "-thumb.jpg")
|
||||
if not os.path.exists(episode_thumb):
|
||||
# 优先从TMDB查询
|
||||
episode_image = self.media.get_episode_images(tv_id=media.tmdb_id,
|
||||
season_id=media.get_season_seq(),
|
||||
episode_id=media.get_episode_seq(),
|
||||
orginal=True)
|
||||
if episode_image:
|
||||
self.__save_image(episode_image, episode_thumb)
|
||||
else:
|
||||
# 从视频文件生成缩略图
|
||||
video_path = os.path.join(dir_path, file_name + file_ext)
|
||||
log.info(f"【Scraper】正在生成缩略图:{video_path} ...")
|
||||
FfmpegHelper().get_thumb_image_from_video(video_path=video_path,
|
||||
image_path=episode_thumb)
|
||||
log.info(f"【Scraper】缩略图生成完成:{episode_thumb}")
|
||||
# season poster
|
||||
if scraper_tv_pic.get("season_poster"):
|
||||
season_poster = "season%s-poster" % media.get_season_seq().rjust(2, '0')
|
||||
seasonposter = media.fanart.get_seasonposter(media_type=media.type,
|
||||
queryid=media.tvdb_id,
|
||||
season=media.get_season_seq())
|
||||
if seasonposter:
|
||||
self.__save_image(seasonposter,
|
||||
os.path.dirname(dir_path),
|
||||
season_poster)
|
||||
else:
|
||||
seasoninfo = self.media.get_tmdb_tv_season_detail(tmdbid=media.tmdb_id,
|
||||
season=int(media.get_season_seq()))
|
||||
if seasoninfo:
|
||||
self.__save_image(TMDB_IMAGE_W500_URL % seasoninfo.get("poster_path"),
|
||||
os.path.dirname(dir_path),
|
||||
season_poster)
|
||||
# season banner
|
||||
if scraper_tv_pic.get("season_banner"):
|
||||
seasonbanner = media.fanart.get_seasonbanner(media_type=media.type,
|
||||
queryid=media.tvdb_id,
|
||||
season=media.get_season_seq())
|
||||
if seasonbanner:
|
||||
self.__save_image(seasonbanner,
|
||||
os.path.dirname(dir_path),
|
||||
"season%s-banner" % media.get_season_seq().rjust(2, '0'))
|
||||
# season thumb
|
||||
if scraper_tv_pic.get("season_thumb"):
|
||||
seasonthumb = media.fanart.get_seasonthumb(media_type=media.type,
|
||||
queryid=media.tvdb_id,
|
||||
season=media.get_season_seq())
|
||||
if seasonthumb:
|
||||
self.__save_image(seasonthumb,
|
||||
os.path.dirname(dir_path),
|
||||
"season%s-landscape" % media.get_season_seq().rjust(2, '0'))
|
||||
# episode thumb
|
||||
if scraper_tv_pic.get("episode_thumb"):
|
||||
episode_thumb = os.path.join(dir_path, file_name + "-thumb.jpg")
|
||||
if not os.path.exists(episode_thumb):
|
||||
# 优先从TMDB查询
|
||||
episode_image = self.media.get_episode_images(tv_id=media.tmdb_id,
|
||||
season_id=media.get_season_seq(),
|
||||
episode_id=media.get_episode_seq(),
|
||||
orginal=True)
|
||||
if episode_image:
|
||||
self.__save_image(episode_image, episode_thumb)
|
||||
else:
|
||||
# 从视频文件生成缩略图
|
||||
video_path = os.path.join(dir_path, file_name + file_ext)
|
||||
log.info(f"【Scraper】正在生成缩略图:{video_path} ...")
|
||||
FfmpegHelper().get_thumb_image_from_video(video_path=video_path,
|
||||
image_path=episode_thumb)
|
||||
log.info(f"【Scraper】缩略图生成完成:{episode_thumb}")
|
||||
|
||||
except Exception as e:
|
||||
ExceptionUtils.exception_traceback(e)
|
||||
|
||||
@ -22,6 +22,8 @@ ENV LANG="C.UTF-8" \
|
||||
NASTOOL_VERSION=master \
|
||||
PS1="\u@\h:\w \$ " \
|
||||
REPO_URL="https://github.com/jxxghp/nas-tools.git" \
|
||||
PYPI_MIRROR="https://pypi.tuna.tsinghua.edu.cn/simple" \
|
||||
ALPINE_MIRROR="mirrors.ustc.edu.cn" \
|
||||
PUID=0 \
|
||||
PGID=0 \
|
||||
UMASK=000 \
|
||||
|
||||
@ -22,6 +22,8 @@ ENV LANG="C.UTF-8" \
|
||||
NASTOOL_VERSION=dev \
|
||||
PS1="\u@\h:\w \$ " \
|
||||
REPO_URL="https://github.com/jxxghp/nas-tools.git" \
|
||||
PYPI_MIRROR="https://pypi.tuna.tsinghua.edu.cn/simple" \
|
||||
ALPINE_MIRROR="mirrors.ustc.edu.cn" \
|
||||
PUID=0 \
|
||||
PGID=0 \
|
||||
UMASK=000 \
|
||||
|
||||
@ -29,6 +29,8 @@ ENV LANG="C.UTF-8" \
|
||||
NASTOOL_VERSION=lite \
|
||||
PS1="\u@\h:\w \$ " \
|
||||
REPO_URL="https://github.com/jxxghp/nas-tools.git" \
|
||||
PYPI_MIRROR="https://pypi.tuna.tsinghua.edu.cn/simple" \
|
||||
ALPINE_MIRROR="mirrors.ustc.edu.cn" \
|
||||
PUID=0 \
|
||||
PGID=0 \
|
||||
UMASK=000 \
|
||||
|
||||
@ -32,8 +32,8 @@ if [ "${NASTOOL_AUTO_UPDATE}" = "true" ]; then
|
||||
if [ "${hash_old}" != "${hash_new}" ]; then
|
||||
echo "检测到requirements.txt有变化,重新安装依赖..."
|
||||
if [ "${NASTOOL_CN_UPDATE}" = "true" ]; then
|
||||
pip install --upgrade pip setuptools wheel -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
|
||||
pip install --upgrade pip setuptools wheel -i "${PYPI_MIRROR}"
|
||||
pip install -r requirements.txt -i "${PYPI_MIRROR}"
|
||||
else
|
||||
pip install --upgrade pip setuptools wheel
|
||||
pip install -r requirements.txt
|
||||
@ -64,7 +64,7 @@ if [ "${NASTOOL_AUTO_UPDATE}" = "true" ]; then
|
||||
if [ "${hash_old}" != "${hash_new}" ]; then
|
||||
echo "检测到package_list.txt有变化,更新软件包..."
|
||||
if [ "${NASTOOL_CN_UPDATE}" = "true" ]; then
|
||||
sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
|
||||
sed -i "s/dl-cdn.alpinelinux.org/${ALPINE_MIRROR}/g" /etc/apk/repositories
|
||||
apk update -f
|
||||
fi
|
||||
apk add --no-cache libffi-dev
|
||||
|
||||
@ -1 +1 @@
|
||||
APP_VERSION = 'v2.9.0'
|
||||
APP_VERSION = 'v2.9.1'
|
||||
|
||||
@ -96,8 +96,8 @@ class WebAction:
|
||||
"tv_calendar_data": self.__tv_calendar_data,
|
||||
"modify_tmdb_cache": self.__modify_tmdb_cache,
|
||||
"rss_detail": self.__rss_detail,
|
||||
"truncate_blacklist": self.__truncate_blacklist,
|
||||
"truncate_rsshistory": self.__truncate_rsshistory,
|
||||
"truncate_blacklist": self.truncate_blacklist,
|
||||
"truncate_rsshistory": self.truncate_rsshistory,
|
||||
"add_brushtask": self.__add_brushtask,
|
||||
"del_brushtask": self.__del_brushtask,
|
||||
"brushtask_detail": self.__brushtask_detail,
|
||||
@ -277,6 +277,9 @@ class WebAction:
|
||||
"/rst": {"func": Sync().transfer_all_sync, "desp": "目录同步"},
|
||||
"/rss": {"func": Rss().rssdownload, "desp": "RSS订阅"},
|
||||
"/db": {"func": DoubanSync().sync, "desp": "豆瓣同步"},
|
||||
"/ssa": {"func": Subscribe().subscribe_search_all, "desp": "订阅搜索"},
|
||||
"/tbl": {"func": WebAction().truncate_blacklist, "desp": "清理转移缓存"},
|
||||
"/trh": {"func": WebAction().truncate_rsshistory, "desp": "清理RSS缓存"},
|
||||
"/utf": {"func": WebAction().unidentification, "desp": "重新识别"},
|
||||
"/udt": {"func": WebAction().update_system, "desp": "系统更新"}
|
||||
}
|
||||
@ -1884,14 +1887,14 @@ class WebAction:
|
||||
MetaHelper().save_meta_data(force=True)
|
||||
return {"code": 0}
|
||||
|
||||
def __truncate_blacklist(self, data):
|
||||
def truncate_blacklist(self, data):
|
||||
"""
|
||||
清空文件转移黑名单记录
|
||||
"""
|
||||
self.dbhelper.truncate_transfer_blacklist()
|
||||
return {"code": 0}
|
||||
|
||||
def __truncate_rsshistory(self, data):
|
||||
def truncate_rsshistory(self, data):
|
||||
"""
|
||||
清空RSS历史记录
|
||||
"""
|
||||
|
||||
@ -8,11 +8,11 @@ body, .page {
|
||||
}
|
||||
|
||||
.theme-light .page {
|
||||
background-image: linear-gradient(180deg, rgba(123, 178, 233, 0.4) 0%, rgba(231, 235, 239, 1) 60%);
|
||||
background-image: linear-gradient(180deg, rgba(123, 178, 233, 0.4) 0%, rgba(231, 235, 239, 1) calc(50vh));
|
||||
}
|
||||
|
||||
.theme-dark .page {
|
||||
background-image: linear-gradient(180deg, var(--tblr-body-bg) 0%, var(--tblr-bg-surface) 50%);
|
||||
background-image: linear-gradient(180deg, var(--tblr-body-bg) 0%, var(--tblr-bg-surface) calc(50vh));
|
||||
}
|
||||
|
||||
.tooltip-inner {
|
||||
|
||||
BIN
web/static/img/icons/196_ALT.png
Normal file
BIN
web/static/img/icons/196_ALT.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.2 KiB |
BIN
web/static/img/icons/512_ALT.png
Normal file
BIN
web/static/img/icons/512_ALT.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 18 KiB |
@ -28,7 +28,7 @@
|
||||
"purpose": "maskable"
|
||||
}
|
||||
],
|
||||
"theme_color": "#1e293b",
|
||||
"background_color": "#1e293b",
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#000000",
|
||||
"display": "standalone"
|
||||
}
|
||||
@ -43,7 +43,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>名称</th>
|
||||
|
||||
@ -82,6 +82,7 @@
|
||||
|
||||
<!-- 生成过滤的下拉选项 -->
|
||||
{% macro gen_recommend_filter_dropdown(Fields, Params) %}
|
||||
{% if Fields %}
|
||||
{% for FieldId, FieldAttr in Fields.items() %}
|
||||
{% if FieldAttr.type == "dropdown" %}
|
||||
<div class="dropdown">
|
||||
@ -107,4 +108,5 @@
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{% endmacro %}
|
||||
|
||||
@ -67,7 +67,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive" style="min-height: 300px">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
{% if TotalCount > 0 %}
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
{% import 'macro/svg.html' as SVG %}
|
||||
<div class="page-body">
|
||||
<div class="container-xl">
|
||||
<div class="card">
|
||||
<div class="card bg-transparent border-0">
|
||||
<div class="ribbon ribbon-top g-cyan d-md-none">
|
||||
<a class="text-white" href="javascript:js_change_card()">
|
||||
切换
|
||||
@ -22,11 +22,11 @@
|
||||
{{ SVG.arrow_back_up() }}
|
||||
上级目录
|
||||
</a>
|
||||
<div id="mediafile_tree" style="overflow-y: auto;"></div>
|
||||
<div id="mediafile_tree"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col d-md-block js-change-card-b" style="display: none;">
|
||||
<div class="card-body">
|
||||
<div class="card-body border-0">
|
||||
<div class="d-flex flex-column flex-md-row justify-content-md-between">
|
||||
<div class="text-muted align-self-center">
|
||||
共 <span id="mediafile_num">0</span> 个文件
|
||||
@ -43,11 +43,10 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="card-body border-0">
|
||||
<input type="hidden" id="mediafile_current_dir">
|
||||
<input type="hidden" id="mediafile_current_files">
|
||||
<div class="row row-cards">
|
||||
<div class="space-y" id="mediafile_file_container" style="overflow-y: auto;"></div>
|
||||
<div class="d-grid gap-3" id="mediafile_file_container">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -114,7 +113,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive" style="overflow-y: auto; max-height: 35em;">
|
||||
<table id="table-hardlinks" class="table table-vcenter card-table"></table>
|
||||
<table id="table-hardlinks" class="table table-vcenter card-table table-hover table-striped"></table>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<a href="javascript:void(0)" class="me-auto ms-3" onclick="select_btn_SelectALL(this, 'hardlink_files')">全选</a>
|
||||
@ -346,13 +345,6 @@
|
||||
$("#modal-find-links-dir").modal("show");
|
||||
}
|
||||
|
||||
// 设置高度
|
||||
function set_mediafile_height() {
|
||||
let height = $(window).height();
|
||||
$("#mediafile_tree").css("height", `${(height - 240)}px`);
|
||||
$("#mediafile_file_container").css("height", `${(height - 225)}px`);
|
||||
}
|
||||
|
||||
// 返回上级目录
|
||||
function return_to_parentdir() {
|
||||
let dir = $("#mediafile_path").val();
|
||||
@ -364,55 +356,48 @@
|
||||
// 初始列表
|
||||
init_mediafile_tree();
|
||||
|
||||
// 初始化高度
|
||||
set_mediafile_height();
|
||||
$(window).bind('resize', function () {
|
||||
set_mediafile_height();
|
||||
});
|
||||
|
||||
</script>
|
||||
<script id="mediafile_item_template" type="text/html">
|
||||
<div class="card card-link-pop">
|
||||
<div class="row g-0">
|
||||
<div class="col-auto">
|
||||
<div class="p-2">
|
||||
<div class="avatar avatar-md">{FILEEXT}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="p-2 ps-0">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3 class="mb-0"><a href='javascript:mediafile_transfer("{FILENAME}", "{FILEPOS}")'>{FILENAME}</a></h3>
|
||||
<custom-chips class="mt-1" id="testresults_{FILEPOS}"></custom-chips>
|
||||
<input type="hidden" value="{FILEPATH}" id="mediafilepath_{FILEPOS}">
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="row">
|
||||
<div class="col-auto">
|
||||
<div class="m-1">
|
||||
<div class="avatar avatar-md">{FILEEXT}</div>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="mt-3 list-inline list-inline-dots mb-0 text-muted">
|
||||
<div class="list-inline-item d-none d-lg-block">
|
||||
{{ SVG.file_info() }}
|
||||
{FILESIZE}
|
||||
</div>
|
||||
</div>
|
||||
<div class="col">
|
||||
<div class="p-2 ps-0">
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<h3 class="mb-0"><a href='javascript:mediafile_transfer("{FILENAME}", "{FILEPOS}")'>{FILENAME}</a></h3>
|
||||
<custom-chips class="mt-1" id="testresults_{FILEPOS}"></custom-chips>
|
||||
<input type="hidden" value="{FILEPATH}" id="mediafilepath_{FILEPOS}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="mt-3 badges">
|
||||
<a href='javascript:mediafile_name_test("{FILENAME}", "testresults_{FILEPOS}")' class="badge badge-outline text-muted border fw-normal badge-pill mb-1">识别</a>
|
||||
<a href='javascript:mediafile_transfer("{FILENAME}", "{FILEPOS}")' class="badge badge-outline text-muted border fw-normal badge-pill mb-1">转移</a>
|
||||
<a href='javascript:mediafile_subtitle("{FILENAME}", "{FILEPOS}")' class="badge badge-outline text-muted border fw-normal badge-pill mb-1">下载字幕</a>
|
||||
<a href='javascript:mediafile_findlinks("{FILENAME}", "{FILEPOS}")' class="badge badge-outline text-muted border fw-normal badge-pill mb-1">硬链接查询</a>
|
||||
<a href='javascript:show_mediafile_rename_modal("{FILENAME}", "{FILEPOS}")' class="badge badge-outline text-muted border fw-normal badge-pill mb-1">重命名</a>
|
||||
<a href='javascript:mediafile_delete("{FILENAME}", "{FILEPOS}")' class="badge badge-outline text-muted border fw-normal badge-pill mb-1">删除</a>
|
||||
<div class="row">
|
||||
<div class="col">
|
||||
<div class="mt-1 list-inline list-inline-dots mb-0 text-muted">
|
||||
<div class="list-inline-item">
|
||||
{{ SVG.file_info() }}
|
||||
{FILESIZE}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="mt-1 btn-list">
|
||||
<button onclick='mediafile_name_test("{FILENAME}", "testresults_{FILEPOS}")' class="btn btn-sm btn-pill">识别</button>
|
||||
<button onclick='mediafile_transfer("{FILENAME}", "{FILEPOS}")' class="btn btn-sm btn-pill">转移</button>
|
||||
<button onclick='mediafile_subtitle("{FILENAME}", "{FILEPOS}")' class="btn btn-sm btn-pill">下载字幕</button>
|
||||
<button onclick='mediafile_findlinks("{FILENAME}", "{FILEPOS}")' class="btn btn-sm btn-pill">硬链接查询</button>
|
||||
<button onclick='show_mediafile_rename_modal("{FILENAME}", "{FILEPOS}")' class="btn btn-sm btn-pill">重命名</button>
|
||||
<button onclick='mediafile_delete("{FILENAME}", "{FILEPOS}")' class="btn btn-sm btn-pill">删除</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</script>
|
||||
|
||||
<script id="hardlinks_table_content_template" type="text/html">
|
||||
@ -431,7 +416,7 @@
|
||||
<script id="hardlinks_tbody_template" type="text/html">
|
||||
<tr class="ms-3">
|
||||
<td class="w-1">
|
||||
<input class="form-check-input m-0 align-middle" name="hardlink_files" value="{HARDLINK_FILE}" type="checkbox">
|
||||
<input class="form-check-input m-0 align-middle" name="hardlink_files" value="{HARDLINK_FILE}" type="checkbox" aria-label="">
|
||||
</td>
|
||||
<td>
|
||||
<div class="ms-3">
|
||||
|
||||
@ -43,12 +43,13 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive" style="min-height: 300px; overflow: hidden">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>索引</th>
|
||||
<th></th>
|
||||
<th>标题</th>
|
||||
<th>TMDB</th>
|
||||
<th></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@ -72,6 +73,8 @@
|
||||
</td>
|
||||
<td>
|
||||
<div>{{ TmdbCache[1].title }}</div>
|
||||
</td>
|
||||
<td>
|
||||
<div class="text-muted text-nowrap">{{ TmdbCache[1].id }}
|
||||
{% if TmdbCache[1].media_type == "电影" %}
|
||||
<a class="ms-1"
|
||||
@ -117,7 +120,7 @@
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<tr>
|
||||
<td colspan="4" align="center">没有数据</td>
|
||||
<td colspan="5" align="center">没有数据</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
</tbody>
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive" style="min-height: 300px">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
{% if TotalCount > 0 %}
|
||||
|
||||
@ -38,7 +38,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive" style="min-height: 300px">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>名称</th>
|
||||
|
||||
@ -80,7 +80,7 @@
|
||||
</div>
|
||||
<div id="div_group{{ Group.id }}" class="table-responsive" {% if GroupsCount> 8 %}style="display: none;"{%
|
||||
endif %}>
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
{% if Group.words %}
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>源目录</th>
|
||||
|
||||
@ -123,7 +123,7 @@
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="table-responsive" style="min-height: 300px">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th></th>
|
||||
|
||||
@ -24,7 +24,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>目录</th>
|
||||
@ -65,7 +65,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>目录</th>
|
||||
@ -106,7 +106,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>目录</th>
|
||||
@ -147,7 +147,7 @@
|
||||
</a>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable">
|
||||
<table class="table card-table table-vcenter text-nowrap datatable table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>目录</th>
|
||||
|
||||
@ -43,7 +43,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="w-7 text-nowrap">类型</th>
|
||||
|
||||
@ -36,7 +36,7 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-responsive">
|
||||
<table class="table table-vcenter card-table">
|
||||
<table class="table table-vcenter card-table table-hover table-striped">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>用户名</th>
|
||||
|
||||
@ -92,7 +92,7 @@
|
||||
value="{{ Result.downloadvolumefactor }}">
|
||||
</td>
|
||||
<td>
|
||||
<div class="font-weight-medium strong">
|
||||
<div class="font-weight-medium strong text-nowrap">
|
||||
<a href="{{ Result.page_url }}" target="_blank">{{ Result.title }} </a>
|
||||
{% if Result.uploadvolumefactor != 1.0 %}
|
||||
<span class="badge text-white bg-azure">{{ (Result.uploadvolumefactor * 100) | int }}%UL</span>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user