Merge pull request #3461 from jxxghp/dev

Dev
This commit is contained in:
jxxghp 2023-02-12 09:54:38 +08:00 committed by GitHub
commit e3a43d4f08
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
30 changed files with 221 additions and 213 deletions

View File

@ -177,7 +177,7 @@ https://spk7.imnks.com/
**一级菜单及一级菜单下的前几个子菜单顺序需要一模一样**,在符合截图的示例项后可以自己增加别的二级菜单项。
![image](https://user-images.githubusercontent.com/54088512/217709966-3d73d983-8eff-42d0-a132-b5ef943c3b87.png)
![image](https://user-images.githubusercontent.com/54088512/218261870-ed15b6b6-895f-45e4-913c-4dda75144a9a.png)
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**

View File

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

View File

@ -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'
}
# 全量转移模式

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1 +1 @@
APP_VERSION = 'v2.9.0'
APP_VERSION = 'v2.9.1'

View File

@ -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历史记录
"""

View File

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -28,7 +28,7 @@
"purpose": "maskable"
}
],
"theme_color": "#1e293b",
"background_color": "#1e293b",
"theme_color": "#000000",
"background_color": "#000000",
"display": "standalone"
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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