mirror of
https://github.com/Cp0204/quark-auto-save.git
synced 2026-01-16 17:30:43 +08:00
Merge aab5205507 into edbc4c50c9
This commit is contained in:
commit
1218e7a03b
29
app/run.py
29
app/run.py
@ -235,15 +235,18 @@ def get_task_suggestions():
|
|||||||
return jsonify({"success": False, "message": "未登录"})
|
return jsonify({"success": False, "message": "未登录"})
|
||||||
query = request.args.get("q", "").lower()
|
query = request.args.get("q", "").lower()
|
||||||
deep = request.args.get("d", "").lower()
|
deep = request.args.get("d", "").lower()
|
||||||
|
net_data = config_data.get("source", {}).get("net", {})
|
||||||
cs_data = config_data.get("source", {}).get("cloudsaver", {})
|
cs_data = config_data.get("source", {}).get("cloudsaver", {})
|
||||||
ps_data = config_data.get("source", {}).get("pansou", {})
|
ps_data = config_data.get("source", {}).get("pansou", {})
|
||||||
|
|
||||||
def net_search():
|
def net_search():
|
||||||
base_url = base64.b64decode("aHR0cHM6Ly9zLjkxNzc4OC54eXo=").decode()
|
if net_data.get("enable", "true").lower() != "false":
|
||||||
url = f"{base_url}/task_suggestions?q={query}&d={deep}"
|
base_url = base64.b64decode("aHR0cHM6Ly9zLjkxNzc4OC54eXo=").decode()
|
||||||
response = requests.get(url)
|
url = f"{base_url}/task_suggestions?q={query}&d={deep}"
|
||||||
return response.json()
|
response = requests.get(url)
|
||||||
|
return response.json()
|
||||||
|
return []
|
||||||
|
|
||||||
def cs_search():
|
def cs_search():
|
||||||
if (
|
if (
|
||||||
cs_data.get("server")
|
cs_data.get("server")
|
||||||
@ -264,13 +267,13 @@ def get_task_suggestions():
|
|||||||
search_results = cs.clean_search_results(search.get("data"))
|
search_results = cs.clean_search_results(search.get("data"))
|
||||||
return search_results
|
return search_results
|
||||||
return []
|
return []
|
||||||
|
|
||||||
def ps_search():
|
def ps_search():
|
||||||
if (ps_data.get("server")):
|
if ps_data.get("server"):
|
||||||
ps = PanSou(ps_data.get("server"))
|
ps = PanSou(ps_data.get("server"))
|
||||||
return ps.search(query)
|
return ps.search(query, deep == "1")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
try:
|
try:
|
||||||
search_results = []
|
search_results = []
|
||||||
with ThreadPoolExecutor(max_workers=3) as executor:
|
with ThreadPoolExecutor(max_workers=3) as executor:
|
||||||
@ -281,17 +284,17 @@ def get_task_suggestions():
|
|||||||
for future in as_completed(features):
|
for future in as_completed(features):
|
||||||
result = future.result()
|
result = future.result()
|
||||||
search_results.extend(result)
|
search_results.extend(result)
|
||||||
|
|
||||||
# 按时间排序并去重
|
# 按时间排序并去重
|
||||||
results = []
|
results = []
|
||||||
link_array = []
|
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:
|
for item in search_results:
|
||||||
url = item.get("shareurl", "")
|
url = item.get("shareurl", "")
|
||||||
if url != "" and url not in link_array:
|
if url != "" and url not in link_array:
|
||||||
link_array.append(url)
|
link_array.append(url)
|
||||||
results.append(item)
|
results.append(item)
|
||||||
|
|
||||||
return jsonify({"success": True, "data": results})
|
return jsonify({"success": True, "data": results})
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"success": True, "message": f"error: {str(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) 时间字符串
|
str: CST(China Standard Time) 时间字符串
|
||||||
"""
|
"""
|
||||||
dt = datetime.fromisoformat(iso_time_str)
|
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 ""
|
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.server = server
|
||||||
self.session = requests.Session()
|
self.session = requests.Session()
|
||||||
|
|
||||||
def search(self, keyword: str) -> list:
|
def search(self, keyword: str, refresh: bool = False) -> list:
|
||||||
"""搜索资源
|
"""搜索资源
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
@ -25,7 +25,7 @@ class PanSou:
|
|||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
url = f"{self.server.rstrip('/')}/api/search"
|
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)
|
response = self.session.get(url, params=params)
|
||||||
result = response.json()
|
result = response.json()
|
||||||
if result.get("code") == 0:
|
if result.get("code") == 0:
|
||||||
|
|||||||
@ -196,6 +196,18 @@
|
|||||||
<input type="text" v-model="formData.api_token" class="form-control" style="background-color:white;" disabled>
|
<input type="text" v-model="formData.api_token" class="form-control" style="background-color:white;" disabled>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row title" title="资源搜索服务配置,用于任务名称智能搜索">
|
||||||
|
<div class="col-10">
|
||||||
|
<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.net.enable" class="form-control" placeholder="是否启用网络公开搜索,默认启用,可选值 True/False">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row title" title="资源搜索服务配置,用于任务名称智能搜索">
|
<div class="row title" title="资源搜索服务配置,用于任务名称智能搜索">
|
||||||
<div class="col-10">
|
<div class="col-10">
|
||||||
<h2 style="display: inline-block;"><i class="bi bi-search"></i> CloudSaver</h2>
|
<h2 style="display: inline-block;"><i class="bi bi-search"></i> CloudSaver</h2>
|
||||||
@ -325,7 +337,7 @@
|
|||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" name="shareurl[]" class="form-control" v-model="task.shareurl" placeholder="必填" @blur="changeShareurl(task)">
|
<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">
|
<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">
|
<div class="input-group-text">
|
||||||
<a target="_blank" :href="task.shareurl"><i class="bi bi-box-arrow-up-right"></i></a>
|
<a target="_blank" :href="task.shareurl"><i class="bi bi-box-arrow-up-right"></i></a>
|
||||||
</div>
|
</div>
|
||||||
@ -350,7 +362,7 @@
|
|||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<div class="input-group-prepend">
|
<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>
|
</div>
|
||||||
<input type="text" name="pattern[]" class="form-control" v-model="task.pattern" placeholder="匹配表达式" list="magicRegex">
|
<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="替换表达式">
|
<input type="text" name="replace[]" class="form-control" v-model="task.replace" placeholder="替换表达式">
|
||||||
@ -371,7 +383,7 @@
|
|||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" class="form-control" placeholder="可选,只转存修改日期>此文件的文件" name="startfid[]" v-model="task.startfid">
|
<input type="text" class="form-control" placeholder="可选,只转存修改日期>此文件的文件" name="startfid[]" v-model="task.startfid">
|
||||||
<div class="input-group-append" v-if="task.shareurl">
|
<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>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -468,6 +480,22 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body small">
|
<div class="modal-body small">
|
||||||
|
<!-- 分享链接来源 -->
|
||||||
|
<div class="mb-3" v-if="fileSelect.switchShare">
|
||||||
|
<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 badge-info">{{ fileSelect.share.source || "网络公开" }}</span>
|
||||||
|
<span class="badge badge-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="alert alert-warning" v-if="fileSelect.error" v-html="fileSelect.error"></div>
|
<div class="alert alert-warning" v-if="fileSelect.error" v-html="fileSelect.error"></div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<!-- 正则处理表达式 -->
|
<!-- 正则处理表达式 -->
|
||||||
@ -530,6 +558,9 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer" v-if="fileSelect.selectDir && !fileSelect.previewRegex">
|
<div class="modal-footer" v-if="fileSelect.selectDir && !fileSelect.previewRegex">
|
||||||
|
<span v-if="fileSelect.switchShare">分享:</span>
|
||||||
|
<button type="button" class="btn btn-primary btn-sm" @click="switchShare(-1)" v-if="fileSelect.switchShare">上一个</button>
|
||||||
|
<button type="button" class="btn btn-primary btn-sm" @click="switchShare(1)" v-if="fileSelect.switchShare">下一个</button>
|
||||||
<span v-html="fileSelect.selectShare ? '转存:' : '保存到:'"></span>
|
<span v-html="fileSelect.selectShare ? '转存:' : '保存到:'"></span>
|
||||||
<button type="button" class="btn btn-primary btn-sm" @click="selectCurrentFolder()">当前文件夹</button>
|
<button type="button" class="btn btn-primary btn-sm" @click="selectCurrentFolder()">当前文件夹</button>
|
||||||
<button type="button" class="btn btn-primary btn-sm" v-if="!fileSelect.selectShare" @click="selectCurrentFolder(true)">当前文件夹<span class="badge badge-light" v-if="fileSelect.index<this.formData.tasklist.length" v-html="'/'+formData.tasklist[fileSelect.index].taskname"></span></button>
|
<button type="button" class="btn btn-primary btn-sm" v-if="!fileSelect.selectShare" @click="selectCurrentFolder(true)">当前文件夹<span class="badge badge-light" v-if="fileSelect.index<this.formData.tasklist.length" v-html="'/'+formData.tasklist[fileSelect.index].taskname"></span></button>
|
||||||
@ -555,6 +586,9 @@
|
|||||||
tasklist: [],
|
tasklist: [],
|
||||||
magic_regex: {},
|
magic_regex: {},
|
||||||
source: {
|
source: {
|
||||||
|
net: {
|
||||||
|
enable: ""
|
||||||
|
},
|
||||||
cloudsaver: {
|
cloudsaver: {
|
||||||
server: "",
|
server: "",
|
||||||
username: "",
|
username: "",
|
||||||
@ -595,12 +629,14 @@
|
|||||||
configModified: false,
|
configModified: false,
|
||||||
fileSelect: {
|
fileSelect: {
|
||||||
index: null,
|
index: null,
|
||||||
|
share: {},
|
||||||
shareurl: "",
|
shareurl: "",
|
||||||
stoken: "",
|
stoken: "",
|
||||||
fileList: [],
|
fileList: [],
|
||||||
paths: [],
|
paths: [],
|
||||||
selectDir: true,
|
selectDir: true,
|
||||||
selectShare: true,
|
selectShare: true,
|
||||||
|
switchShare: false,
|
||||||
previewRegex: false,
|
previewRegex: false,
|
||||||
sortBy: "updated_at",
|
sortBy: "updated_at",
|
||||||
sortOrder: "desc"
|
sortOrder: "desc"
|
||||||
@ -702,6 +738,11 @@
|
|||||||
server: ""
|
server: ""
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if (!config_data.source.net) {
|
||||||
|
config_data.source.net = {
|
||||||
|
enable: ""
|
||||||
|
};
|
||||||
|
}
|
||||||
this.formData = config_data;
|
this.formData = config_data;
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
this.configModified = false;
|
this.configModified = false;
|
||||||
@ -986,7 +1027,9 @@
|
|||||||
selectSuggestion(index, suggestion) {
|
selectSuggestion(index, suggestion) {
|
||||||
this.smart_param.showSuggestions = false;
|
this.smart_param.showSuggestions = false;
|
||||||
this.fileSelect.selectDir = true;
|
this.fileSelect.selectDir = true;
|
||||||
|
this.fileSelect.switchShare = true;
|
||||||
this.fileSelect.previewRegex = false;
|
this.fileSelect.previewRegex = false;
|
||||||
|
this.fileSelect.share = suggestion;
|
||||||
this.showShareSelect(index, suggestion.shareurl);
|
this.showShareSelect(index, suggestion.shareurl);
|
||||||
},
|
},
|
||||||
addMagicRegex() {
|
addMagicRegex() {
|
||||||
@ -1047,6 +1090,7 @@
|
|||||||
showSavepathSelect(index) {
|
showSavepathSelect(index) {
|
||||||
this.fileSelect.selectShare = false;
|
this.fileSelect.selectShare = false;
|
||||||
this.fileSelect.selectDir = true;
|
this.fileSelect.selectDir = true;
|
||||||
|
this.fileSelect.switchShare = false;
|
||||||
this.fileSelect.previewRegex = false;
|
this.fileSelect.previewRegex = false;
|
||||||
this.fileSelect.error = undefined;
|
this.fileSelect.error = undefined;
|
||||||
this.fileSelect.fileList = [];
|
this.fileSelect.fileList = [];
|
||||||
@ -1094,6 +1138,21 @@
|
|||||||
$('#fileSelectModal').modal('toggle');
|
$('#fileSelectModal').modal('toggle');
|
||||||
this.getShareDetail();
|
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) {
|
navigateTo(fid, name) {
|
||||||
dir = { fid: fid, name: name }
|
dir = { fid: fid, name: name }
|
||||||
if (this.fileSelect.selectShare) {
|
if (this.fileSelect.selectShare) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user