refactor(api): 重构API蓝图结构按功能模块拆分
- 将原有的单一api蓝图拆分为多个独立蓝图(torrent、book、music、file、video、image) - 每个蓝图负责对应的功能模块,实现更好的代码组织和维护性 - 更新应用初始化文件中的蓝图注册方式,使用新的模块化结构 - 修改前端API调用路径,将/files/rename调整为/file/rename - 在torrent服务中新增按名称查询功能和相关处理逻辑
This commit is contained in:
+8
-3
@@ -2,6 +2,7 @@ from flask import Flask
|
|||||||
from flask_cors import CORS
|
from flask_cors import CORS
|
||||||
from .extensions import db, migrate
|
from .extensions import db, migrate
|
||||||
from .config import DevelopmentConfig, ProductionConfig, TestingConfig
|
from .config import DevelopmentConfig, ProductionConfig, TestingConfig
|
||||||
|
from .blueprints import torrent_bp, book_bp, music_bp, file_bp, video_bp, image_bp
|
||||||
|
|
||||||
|
|
||||||
def create_app(config_name="development"):
|
def create_app(config_name="development"):
|
||||||
@@ -20,7 +21,11 @@ def create_app(config_name="development"):
|
|||||||
db.init_app(app)
|
db.init_app(app)
|
||||||
migrate.init_app(app, db)
|
migrate.init_app(app, db)
|
||||||
|
|
||||||
from .blueprints.api import bp as api_bp
|
app.register_blueprint(torrent_bp.bp, url_prefix='/api/torrent')
|
||||||
app.register_blueprint(api_bp, url_prefix='/api')
|
app.register_blueprint(book_bp.bp, url_prefix='/api/book')
|
||||||
|
app.register_blueprint(music_bp.bp, url_prefix='/api/music')
|
||||||
|
app.register_blueprint(file_bp.bp, url_prefix='/api/file')
|
||||||
|
app.register_blueprint(video_bp.bp, url_prefix='/api/video')
|
||||||
|
app.register_blueprint(image_bp.bp, url_prefix='/api/image')
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|||||||
@@ -1,91 +0,0 @@
|
|||||||
from typing import List
|
|
||||||
from flask import Blueprint, jsonify, Response, current_app
|
|
||||||
from app.services import FileService, VideoService, TorrentService, BookService, ImageService, MusicService
|
|
||||||
|
|
||||||
bp = Blueprint("api", __name__)
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/book/download")
|
|
||||||
def book_download():
|
|
||||||
book_object = BookService()
|
|
||||||
app = current_app._get_current_object()
|
|
||||||
|
|
||||||
def generate():
|
|
||||||
with app.app_context():
|
|
||||||
yield from book_object.book_download()
|
|
||||||
|
|
||||||
return Response(generate(), mimetype='text/event-stream')
|
|
||||||
|
|
||||||
@bp.route("/video/findDeduplication")
|
|
||||||
def video_find_deduplication():
|
|
||||||
video_object = VideoService(paths=[
|
|
||||||
"C:\\迅雷下载\\0_done",
|
|
||||||
"D:\\",
|
|
||||||
"E:\\",
|
|
||||||
"F:\\"
|
|
||||||
])
|
|
||||||
|
|
||||||
return jsonify({"code": 200, "message": video_object.find_deduplication()})
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/video/deduplication')
|
|
||||||
def video_deduplication():
|
|
||||||
video_object = VideoService(paths=[
|
|
||||||
"C:\\迅雷下载\\0_done",
|
|
||||||
"D:\\",
|
|
||||||
"E:\\",
|
|
||||||
"F:\\"
|
|
||||||
])
|
|
||||||
|
|
||||||
return jsonify({"code": 200, "message": video_object.deduplication()})
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/video/hasTorrent")
|
|
||||||
def video_has_torrent():
|
|
||||||
torrent_obj = TorrentService(["E:\\"])
|
|
||||||
return jsonify({"code": 200, "message": torrent_obj.has_torrent()})
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/files/rename')
|
|
||||||
def files_rename():
|
|
||||||
paths: List[str] = [
|
|
||||||
"C:\\迅雷下载\\0_done",
|
|
||||||
"C:\\Users\\Localhost\\Desktop\\BT",
|
|
||||||
]
|
|
||||||
|
|
||||||
file_object = FileService(paths)
|
|
||||||
return jsonify({"code": 200, "message": file_object.rename()})
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route('/torrent/deduplication')
|
|
||||||
def torrent_deduplication():
|
|
||||||
torrent_object = TorrentService(["C:\\Users\\Localhost\\Desktop\\BT"])
|
|
||||||
return jsonify({"code": 200, "message": torrent_object.deduplication()})
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/image/export")
|
|
||||||
def image_export():
|
|
||||||
image_object = ImageService()
|
|
||||||
|
|
||||||
def generate():
|
|
||||||
yield from image_object.export()
|
|
||||||
|
|
||||||
return Response(generate(), mimetype='text/event-stream')
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/image/hasTorrent")
|
|
||||||
def image_has_torrent():
|
|
||||||
torrent_obj = TorrentService(["C:\\Users\\Localhost\\Desktop\\Images"])
|
|
||||||
return jsonify({"code": 200, "message": torrent_obj.has_torrent()})
|
|
||||||
|
|
||||||
|
|
||||||
@bp.route("/music/rename")
|
|
||||||
def music_rename():
|
|
||||||
music_object = MusicService()
|
|
||||||
return jsonify({"code": 200, "message": music_object.rename()})
|
|
||||||
|
|
||||||
@bp.route("/torrent/statistics")
|
|
||||||
def torrent_statistics():
|
|
||||||
torrent_object = TorrentService(["C:\\Users\\Localhost\\Desktop\\BT"])
|
|
||||||
return jsonify({"code": 200, "message": torrent_object.statistics()})
|
|
||||||
|
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
from flask import Blueprint, current_app, Response
|
||||||
|
|
||||||
|
from app.services import BookService
|
||||||
|
|
||||||
|
bp = Blueprint("book", __name__)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/download")
|
||||||
|
def book_download():
|
||||||
|
book_object = BookService()
|
||||||
|
app = current_app._get_current_object()
|
||||||
|
|
||||||
|
def generate():
|
||||||
|
with app.app_context():
|
||||||
|
yield from book_object.book_download()
|
||||||
|
|
||||||
|
return Response(generate(), mimetype='text/event-stream')
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
from typing import List
|
||||||
|
from flask import Blueprint, jsonify
|
||||||
|
|
||||||
|
from app.services import FileService
|
||||||
|
|
||||||
|
bp = Blueprint("file", __name__)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/rename')
|
||||||
|
def files_rename():
|
||||||
|
paths: List[str] = [
|
||||||
|
"C:\\迅雷下载\\0_done",
|
||||||
|
"C:\\Users\\Localhost\\Desktop\\BT",
|
||||||
|
]
|
||||||
|
|
||||||
|
file_object = FileService(paths)
|
||||||
|
return jsonify({"code": 200, "message": file_object.rename()})
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
from flask import Blueprint, Response, jsonify
|
||||||
|
|
||||||
|
from app.services import ImageService, TorrentService
|
||||||
|
|
||||||
|
bp = Blueprint("image", __name__)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/export")
|
||||||
|
def image_export():
|
||||||
|
image_object = ImageService()
|
||||||
|
|
||||||
|
def generate():
|
||||||
|
yield from image_object.export()
|
||||||
|
|
||||||
|
return Response(generate(), mimetype='text/event-stream')
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/hasTorrent")
|
||||||
|
def image_has_torrent():
|
||||||
|
torrent_obj = TorrentService(["C:\\Users\\Localhost\\Desktop\\Images"])
|
||||||
|
return jsonify({"code": 200, "message": torrent_obj.has_torrent()})
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
from flask import Blueprint, jsonify
|
||||||
|
|
||||||
|
from app.services import MusicService
|
||||||
|
|
||||||
|
bp = Blueprint("music", __name__)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/rename")
|
||||||
|
def music_rename():
|
||||||
|
music_object = MusicService()
|
||||||
|
return jsonify({"code": 200, "message": music_object.rename()})
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
from flask import Blueprint, jsonify
|
||||||
|
|
||||||
|
from app.services import TorrentService
|
||||||
|
|
||||||
|
bp = Blueprint("torrent", __name__)
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/deduplication')
|
||||||
|
def torrent_deduplication():
|
||||||
|
torrent_object = TorrentService(["C:\\Users\\Localhost\\Desktop\\BT"])
|
||||||
|
return jsonify({"code": 200, "message": torrent_object.deduplication()})
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/statistics")
|
||||||
|
def torrent_statistics():
|
||||||
|
torrent_object = TorrentService(["C:\\Users\\Localhost\\Desktop\\BT"])
|
||||||
|
return jsonify({"code": 200, "message": torrent_object.statistics()})
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/s/<name>")
|
||||||
|
def torrent_by_name(name):
|
||||||
|
torrent_object = TorrentService(["C:\\Users\\Localhost\\Desktop\\BT"])
|
||||||
|
return jsonify({"code": 200, "message": torrent_object.get_by_name(name)})
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
from flask import Blueprint, jsonify
|
||||||
|
|
||||||
|
from app.services import VideoService, TorrentService
|
||||||
|
|
||||||
|
bp = Blueprint("video", __name__)
|
||||||
|
|
||||||
|
@bp.route("/findDeduplication")
|
||||||
|
def video_find_deduplication():
|
||||||
|
video_object = VideoService(paths=[
|
||||||
|
"C:\\迅雷下载\\0_done",
|
||||||
|
"D:\\",
|
||||||
|
"E:\\",
|
||||||
|
"F:\\"
|
||||||
|
])
|
||||||
|
|
||||||
|
return jsonify({"code": 200, "message": video_object.find_deduplication()})
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route('/deduplication')
|
||||||
|
def video_deduplication():
|
||||||
|
video_object = VideoService(paths=[
|
||||||
|
"C:\\迅雷下载\\0_done",
|
||||||
|
"D:\\",
|
||||||
|
"E:\\",
|
||||||
|
"F:\\"
|
||||||
|
])
|
||||||
|
|
||||||
|
return jsonify({"code": 200, "message": video_object.deduplication()})
|
||||||
|
|
||||||
|
|
||||||
|
@bp.route("/hasTorrent")
|
||||||
|
def video_has_torrent():
|
||||||
|
torrent_obj = TorrentService(["E:\\"])
|
||||||
|
return jsonify({"code": 200, "message": torrent_obj.has_torrent()})
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
from collections import defaultdict
|
from collections import defaultdict
|
||||||
from typing import List
|
from typing import List, Optional
|
||||||
|
|
||||||
from app.constants import IGNORE_DIRS
|
from app.constants import IGNORE_DIRS, SEPARATORS, SPECIAL_PREFIXES, SPECIAL_DIRS
|
||||||
from app.services import FolderService
|
from app.services import FolderService
|
||||||
from app.utils import to_json_serializable
|
from app.utils import to_json_serializable
|
||||||
|
|
||||||
@@ -17,6 +17,7 @@ class TorrentService:
|
|||||||
self.list_of_duplicate_torrent: List[str] = []
|
self.list_of_duplicate_torrent: List[str] = []
|
||||||
self.result_list = []
|
self.result_list = []
|
||||||
self.torrent_name = defaultdict(lambda: defaultdict(set))
|
self.torrent_name = defaultdict(lambda: defaultdict(set))
|
||||||
|
self.search_name = ""
|
||||||
|
|
||||||
def process_torrent_file(self, entry: os.DirEntry[str]) -> None:
|
def process_torrent_file(self, entry: os.DirEntry[str]) -> None:
|
||||||
temp_name = entry.name.replace("-4K", "")
|
temp_name = entry.name.replace("-4K", "")
|
||||||
@@ -75,7 +76,47 @@ class TorrentService:
|
|||||||
print(f"有奇怪的东西混入2{path_arr}")
|
print(f"有奇怪的东西混入2{path_arr}")
|
||||||
|
|
||||||
def statistics(self):
|
def statistics(self):
|
||||||
FolderService(paths=self.paths,
|
FolderService(paths=self.paths, ignore_dirs=IGNORE_DIRS,
|
||||||
ignore_dirs=IGNORE_DIRS,
|
|
||||||
file_callback=self.statistics_file_callback).process_folder()
|
file_callback=self.statistics_file_callback).process_folder()
|
||||||
return to_json_serializable(self.torrent_name)
|
return to_json_serializable(self.torrent_name)
|
||||||
|
|
||||||
|
def process_file_name(self, filename: str) -> Optional[str]:
|
||||||
|
name, ext = os.path.splitext(filename)
|
||||||
|
ext = ext.lower()
|
||||||
|
name = name.upper()
|
||||||
|
name = name.replace("-", "")
|
||||||
|
# 处理特殊前缀
|
||||||
|
for prefix in SPECIAL_PREFIXES:
|
||||||
|
if name.startswith(prefix):
|
||||||
|
# name = name.replace(prefix, "")
|
||||||
|
return f"{prefix}-{name[len(prefix):]}{ext}"
|
||||||
|
return name
|
||||||
|
|
||||||
|
def get_by_name_file_callback(self, entry: os.DirEntry):
|
||||||
|
path_arr = entry.path.split(os.sep)
|
||||||
|
torrent_sub_type = {"0_多人", "FWAY", "0_女同", "_temp"}
|
||||||
|
torrent_type = {"4k2", "4K原版", "456k", "1024", "2048", "done", "FC2", "hhd800", "other", "高清中文字幕",
|
||||||
|
"三级写真", "无码流出", "亚洲有码原创"}
|
||||||
|
if path_arr[-2] not in torrent_type and path_arr[-2] not in torrent_sub_type:
|
||||||
|
if path_arr[-3] in torrent_sub_type:
|
||||||
|
# print(path_arr[-3])
|
||||||
|
if path_arr[-4] in torrent_type:
|
||||||
|
# print(path_arr[-4])
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print(f"有奇怪的东西混入{path_arr}")
|
||||||
|
pass
|
||||||
|
elif path_arr[-3] in torrent_type:
|
||||||
|
if self.search_name in path_arr[-2]:
|
||||||
|
print(entry.name)
|
||||||
|
# self.result_list.insert(0, entry.path)
|
||||||
|
self.torrent_name[path_arr[-2]][path_arr[-3]].add(entry.name)
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
print(f"有奇怪的东西混入2{path_arr}")
|
||||||
|
|
||||||
|
def get_by_name(self, name):
|
||||||
|
self.search_name = name
|
||||||
|
FolderService(paths=self.paths, ignore_dirs=IGNORE_DIRS,
|
||||||
|
file_callback=self.get_by_name_file_callback).process_folder()
|
||||||
|
return to_json_serializable(self.torrent_name)
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ export function video_hasTorrent() {
|
|||||||
|
|
||||||
export function files_rename() {
|
export function files_rename() {
|
||||||
return request({
|
return request({
|
||||||
url: "/files/rename",
|
url: "/file/rename",
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user