mirror of
https://github.com/Cp0204/quark-auto-save.git
synced 2026-01-11 22:50:45 +08:00
✨ 资源搜索功能优化 (#117)
* perf: 优化资源发布时间解析逻辑 * perf: PanSou 源支持前端深度搜索 * feat: 网络公开搜索源支持启用或关闭 * feat: 文件选择窗口支持切换分享链接 * perf: 优化文件选择窗口资源简介展示 * perf: 优化文件选择窗口资源信息样式 * fix: 修复 net.enable=None 时 lower() 报错 * style: 优化资源简介和切换样式 * style: 优化资源搜索配置样式 --------- Co-authored-by: Cp0204 <Cp0204@qq.com>
This commit is contained in:
parent
edbc4c50c9
commit
e67d95a82b
29
app/run.py
29
app/run.py
@ -235,15 +235,18 @@ def get_task_suggestions():
|
||||
return jsonify({"success": False, "message": "未登录"})
|
||||
query = request.args.get("q", "").lower()
|
||||
deep = request.args.get("d", "").lower()
|
||||
net_data = config_data.get("source", {}).get("net", {})
|
||||
cs_data = config_data.get("source", {}).get("cloudsaver", {})
|
||||
ps_data = config_data.get("source", {}).get("pansou", {})
|
||||
|
||||
|
||||
def net_search():
|
||||
base_url = base64.b64decode("aHR0cHM6Ly9zLjkxNzc4OC54eXo=").decode()
|
||||
url = f"{base_url}/task_suggestions?q={query}&d={deep}"
|
||||
response = requests.get(url)
|
||||
return response.json()
|
||||
|
||||
if str(net_data.get("enable", "true")).lower() != "false":
|
||||
base_url = base64.b64decode("aHR0cHM6Ly9zLjkxNzc4OC54eXo=").decode()
|
||||
url = f"{base_url}/task_suggestions?q={query}&d={deep}"
|
||||
response = requests.get(url)
|
||||
return response.json()
|
||||
return []
|
||||
|
||||
def cs_search():
|
||||
if (
|
||||
cs_data.get("server")
|
||||
@ -264,13 +267,13 @@ def get_task_suggestions():
|
||||
search_results = cs.clean_search_results(search.get("data"))
|
||||
return search_results
|
||||
return []
|
||||
|
||||
|
||||
def ps_search():
|
||||
if (ps_data.get("server")):
|
||||
if ps_data.get("server"):
|
||||
ps = PanSou(ps_data.get("server"))
|
||||
return ps.search(query)
|
||||
return ps.search(query, deep == "1")
|
||||
return []
|
||||
|
||||
|
||||
try:
|
||||
search_results = []
|
||||
with ThreadPoolExecutor(max_workers=3) as executor:
|
||||
@ -281,17 +284,17 @@ def get_task_suggestions():
|
||||
for future in as_completed(features):
|
||||
result = future.result()
|
||||
search_results.extend(result)
|
||||
|
||||
|
||||
# 按时间排序并去重
|
||||
results = []
|
||||
link_array = []
|
||||
search_results.sort(key=lambda x: x.get("datetime", ""), reverse=True)
|
||||
search_results.sort(key=lambda x: x.get("datetime", ""), reverse=True)
|
||||
for item in search_results:
|
||||
url = item.get("shareurl", "")
|
||||
if url != "" and url not in link_array:
|
||||
link_array.append(url)
|
||||
results.append(item)
|
||||
|
||||
|
||||
return jsonify({"success": True, "data": results})
|
||||
except Exception as e:
|
||||
return jsonify({"success": True, "message": f"error: {str(e)}"})
|
||||
|
||||
@ -11,5 +11,6 @@ def iso_to_cst(iso_time_str: str) -> str:
|
||||
str: CST(China Standard Time) 时间字符串
|
||||
"""
|
||||
dt = datetime.fromisoformat(iso_time_str)
|
||||
dt_cst = dt.astimezone(timezone(timedelta(hours=8)))
|
||||
tz = timezone(timedelta(hours=8))
|
||||
dt_cst = dt if dt.astimezone(tz) > datetime.now(tz) else dt.astimezone(tz)
|
||||
return dt_cst.strftime("%Y-%m-%d %H:%M:%S") if dt_cst.year >= 1970 else ""
|
||||
|
||||
@ -14,7 +14,7 @@ class PanSou:
|
||||
self.server = server
|
||||
self.session = requests.Session()
|
||||
|
||||
def search(self, keyword: str) -> list:
|
||||
def search(self, keyword: str, refresh: bool = False) -> list:
|
||||
"""搜索资源
|
||||
|
||||
Args:
|
||||
@ -25,7 +25,7 @@ class PanSou:
|
||||
"""
|
||||
try:
|
||||
url = f"{self.server.rstrip('/')}/api/search"
|
||||
params = {"kw": keyword, "cloud_types": ["quark"], "res": "merge", "refresh": True}
|
||||
params = {"kw": keyword, "cloud_types": ["quark"], "res": "merge", "refresh": refresh}
|
||||
response = self.session.get(url, params=params)
|
||||
result = response.json()
|
||||
if result.get("code") == 0:
|
||||
|
||||
@ -198,43 +198,70 @@
|
||||
|
||||
<div class="row title" title="资源搜索服务配置,用于任务名称智能搜索">
|
||||
<div class="col-10">
|
||||
<h2 style="display: inline-block;"><i class="bi bi-search"></i> CloudSaver</h2>
|
||||
<span class="badge badge-pill badge-light">
|
||||
<a href="https://github.com/Cp0204/quark-auto-save/wiki/CloudSaver搜索源" target="_blank">?</a>
|
||||
</span>
|
||||
<h2 style="display: inline-block;"><i class="bi bi-search"></i> 资源搜索</h2>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">服务器</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" v-model="formData.source.cloudsaver.server" class="form-control" placeholder="资源搜索服务器地址,如 http://172.17.0.1:8008">
|
||||
<div class="form-group row mb-0" style="display:flex; align-items:center;">
|
||||
<div data-toggle="collapse" data-target="#collapse_net" aria-expanded="true" aria-controls="collapse_net">
|
||||
<div class="btn btn-block text-left">
|
||||
<i class="bi bi-caret-right-fill"></i> 网络公开搜索
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">用户名</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" v-model="formData.source.cloudsaver.username" class="form-control" placeholder="用户名">
|
||||
<div class="collapse show ml-3" id="collapse_net">
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">启用</label>
|
||||
<div class="col-sm-10 d-flex align-items-center">
|
||||
<input type="checkbox" class="form-check-input" v-model="formData.source.net.enable" placeholder="是否启用网络公开搜索,默认启用">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">密码</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" v-model="formData.source.cloudsaver.password" class="form-control" placeholder="密码">
|
||||
<div class="form-group row mb-0" style="display:flex; align-items:center;">
|
||||
<div data-toggle="collapse" data-target="#collapse_cloudsaver" aria-expanded="true" aria-controls="collapse_cloudsaver">
|
||||
<div class="btn btn-block text-left">
|
||||
<i class="bi bi-caret-right-fill"></i> CloudSaver
|
||||
<span class="badge badge-pill badge-light">
|
||||
<a href="https://github.com/Cp0204/quark-auto-save/wiki/CloudSaver搜索源" target="_blank">?</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row title" title="资源搜索服务配置,用于任务名称智能搜索">
|
||||
<div class="col-10">
|
||||
<h2 style="display: inline-block;"><i class="bi bi-search"></i> PanSou</h2>
|
||||
<span class="badge badge-pill badge-light">
|
||||
<a href="https://github.com/fish2018/pansou" target="_blank">?</a>
|
||||
</span>
|
||||
<div class="collapse show ml-3" id="collapse_cloudsaver">
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">服务器</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" v-model="formData.source.cloudsaver.server" class="form-control" placeholder="资源搜索服务器地址,如 http://172.17.0.1:8008">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">用户名</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" v-model="formData.source.cloudsaver.username" class="form-control" placeholder="用户名">
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">密码</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="password" v-model="formData.source.cloudsaver.password" class="form-control" placeholder="密码">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">服务器</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" v-model="formData.source.pansou.server" class="form-control" placeholder="资源搜索服务器地址,如 https://so.252035.xyz">
|
||||
<div class="form-group row mb-0" style="display:flex; align-items:center;">
|
||||
<div data-toggle="collapse" data-target="#collapse_pansou" aria-expanded="true" aria-controls="collapse_pansou">
|
||||
<div class="btn btn-block text-left">
|
||||
<i class="bi bi-caret-right-fill"></i> PanSou
|
||||
<span class="badge badge-pill badge-light">
|
||||
<a href="https://github.com/fish2018/pansou" target="_blank">?</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse show ml-3" id="collapse_pansou">
|
||||
<div class="form-group row">
|
||||
<label class="col-sm-2 col-form-label">服务器</label>
|
||||
<div class="col-sm-10">
|
||||
<input type="text" v-model="formData.source.pansou.server" class="form-control" placeholder="资源搜索服务器地址,如 https://so.252035.xyz">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -325,7 +352,7 @@
|
||||
<div class="input-group">
|
||||
<input type="text" name="shareurl[]" class="form-control" v-model="task.shareurl" placeholder="必填" @blur="changeShareurl(task)">
|
||||
<div class="input-group-append" v-if="task.shareurl">
|
||||
<button type="button" class="btn btn-outline-secondary" @click="fileSelect.selectDir=true;fileSelect.previewRegex=false;fileSelect.sortBy='file_name';fileSelect.sortOrder='desc';showShareSelect(index)" title="选择文件夹"><i class="bi bi-folder"></i></button>
|
||||
<button type="button" class="btn btn-outline-secondary" @click="fileSelect.selectDir=true;fileSelect.switchShare=false;fileSelect.previewRegex=false;fileSelect.sortBy='file_name';fileSelect.sortOrder='desc';showShareSelect(index)" title="选择文件夹"><i class="bi bi-folder"></i></button>
|
||||
<div class="input-group-text">
|
||||
<a target="_blank" :href="task.shareurl"><i class="bi bi-box-arrow-up-right"></i></a>
|
||||
</div>
|
||||
@ -350,7 +377,7 @@
|
||||
<div class="col-sm-10">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<button class="btn btn-outline-secondary" type="button" @click="fileSelect.selectDir=true;fileSelect.previewRegex=true;fileSelect.sortBy='file_name';fileSelect.sortOrder='asc';showShareSelect(index)" title="预览正则处理效果">正则处理</button>
|
||||
<button class="btn btn-outline-secondary" type="button" @click="fileSelect.selectDir=true;fileSelect.switchShare=false;fileSelect.previewRegex=true;fileSelect.sortBy='file_name';fileSelect.sortOrder='asc';showShareSelect(index)" title="预览正则处理效果">正则处理</button>
|
||||
</div>
|
||||
<input type="text" name="pattern[]" class="form-control" v-model="task.pattern" placeholder="匹配表达式" list="magicRegex">
|
||||
<input type="text" name="replace[]" class="form-control" v-model="task.replace" placeholder="替换表达式">
|
||||
@ -371,7 +398,7 @@
|
||||
<div class="input-group">
|
||||
<input type="text" class="form-control" placeholder="可选,只转存修改日期>此文件的文件" name="startfid[]" v-model="task.startfid">
|
||||
<div class="input-group-append" v-if="task.shareurl">
|
||||
<button class="btn btn-outline-secondary" type="button" @click="fileSelect.selectDir=false;fileSelect.previewRegex=false;fileSelect.sortBy='updated_at';fileSelect.sortOrder='desc';showShareSelect(index)">选择</button>
|
||||
<button class="btn btn-outline-secondary" type="button" @click="fileSelect.selectDir=false;fileSelect.switchShare=false;fileSelect.previewRegex=false;fileSelect.sortBy='updated_at';fileSelect.sortOrder='desc';showShareSelect(index)">选择</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -468,6 +495,34 @@
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body small">
|
||||
<!-- 分享链接来源 -->
|
||||
<div class="mb-3 row" v-if="fileSelect.switchShare">
|
||||
<div class="col-sm-8">
|
||||
<div>
|
||||
<b>名称:</b>
|
||||
<span :title="fileSelect.share.content">{{ fileSelect.share.taskname }}</span>
|
||||
</div>
|
||||
<div>
|
||||
<b>链接:</b>
|
||||
<a :href="fileSelect.share.shareurl" target="_blank" @click.stop>{{ fileSelect.share.shareurl }}</a>
|
||||
</div>
|
||||
<div>
|
||||
<b>来源:</b>
|
||||
<span class="badge bg-transparent border border-success text-success">{{ fileSelect.share.source || "网络公开" }}</span>
|
||||
<span class="badge bg-transparent border border-info text-info" v-if="fileSelect.share.channel">{{ fileSelect.share.channel }}</span>
|
||||
</div>
|
||||
<div v-if="fileSelect.share.datetime">
|
||||
<b>时间:</b>
|
||||
<span>{{ fileSelect.share.datetime }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-sm-4 text-right">
|
||||
<div class="btn-group" title="资源搜索结果切换">
|
||||
<button type="button" class="btn btn-sm btn-outline-primary" @click="switchShare(-1)">上一个</button>
|
||||
<button type="button" class="btn btn-sm btn-outline-primary" @click="switchShare(1)">下一个</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="alert alert-warning" v-if="fileSelect.error" v-html="fileSelect.error"></div>
|
||||
<div v-else>
|
||||
<!-- 正则处理表达式 -->
|
||||
@ -555,6 +610,9 @@
|
||||
tasklist: [],
|
||||
magic_regex: {},
|
||||
source: {
|
||||
net: {
|
||||
enable: ""
|
||||
},
|
||||
cloudsaver: {
|
||||
server: "",
|
||||
username: "",
|
||||
@ -595,12 +653,14 @@
|
||||
configModified: false,
|
||||
fileSelect: {
|
||||
index: null,
|
||||
share: {},
|
||||
shareurl: "",
|
||||
stoken: "",
|
||||
fileList: [],
|
||||
paths: [],
|
||||
selectDir: true,
|
||||
selectShare: true,
|
||||
switchShare: false,
|
||||
previewRegex: false,
|
||||
sortBy: "updated_at",
|
||||
sortOrder: "desc"
|
||||
@ -702,6 +762,11 @@
|
||||
server: ""
|
||||
};
|
||||
}
|
||||
if (!config_data.source.net) {
|
||||
config_data.source.net = {
|
||||
enable: ""
|
||||
};
|
||||
}
|
||||
this.formData = config_data;
|
||||
setTimeout(() => {
|
||||
this.configModified = false;
|
||||
@ -986,7 +1051,9 @@
|
||||
selectSuggestion(index, suggestion) {
|
||||
this.smart_param.showSuggestions = false;
|
||||
this.fileSelect.selectDir = true;
|
||||
this.fileSelect.switchShare = true;
|
||||
this.fileSelect.previewRegex = false;
|
||||
this.fileSelect.share = suggestion;
|
||||
this.showShareSelect(index, suggestion.shareurl);
|
||||
},
|
||||
addMagicRegex() {
|
||||
@ -1047,6 +1114,7 @@
|
||||
showSavepathSelect(index) {
|
||||
this.fileSelect.selectShare = false;
|
||||
this.fileSelect.selectDir = true;
|
||||
this.fileSelect.switchShare = false;
|
||||
this.fileSelect.previewRegex = false;
|
||||
this.fileSelect.error = undefined;
|
||||
this.fileSelect.fileList = [];
|
||||
@ -1094,6 +1162,21 @@
|
||||
$('#fileSelectModal').modal('toggle');
|
||||
this.getShareDetail();
|
||||
},
|
||||
switchShare(index) {
|
||||
currentIndex = this.smart_param.taskSuggestions.data.indexOf(this.fileSelect.share);
|
||||
nextIndex = currentIndex + index;
|
||||
if (nextIndex < 0) {
|
||||
alert("没有上一个啦");
|
||||
} else if (nextIndex >= this.smart_param.taskSuggestions.data.length) {
|
||||
alert("没有下一个啦");
|
||||
} else {
|
||||
this.fileSelect.error = "";
|
||||
this.fileSelect.stoken = "";
|
||||
this.fileSelect.share = this.smart_param.taskSuggestions.data[nextIndex];
|
||||
this.fileSelect.shareurl = this.smart_param.taskSuggestions.data[nextIndex].shareurl;
|
||||
this.getShareDetail();
|
||||
}
|
||||
},
|
||||
navigateTo(fid, name) {
|
||||
dir = { fid: fid, name: name }
|
||||
if (this.fileSelect.selectShare) {
|
||||
|
||||
Loading…
Reference in New Issue
Block a user