""" 种子管理 API 蓝图 """ from flask import Blueprint, request, jsonify from werkzeug.utils import secure_filename import os import tempfile from services.torrent_service import TorrentService torrents_bp = Blueprint('torrents', __name__, url_prefix='/api/torrents') torrent_service = TorrentService() @torrents_bp.route('', methods=['GET']) def get_torrents(): """获取种子列表""" try: # 获取查询参数 client_ids = request.args.getlist('client_ids') data = torrent_service.get_all_torrents(client_ids if client_ids else None) return jsonify({ 'success': True, 'data': data }) except Exception as e: return jsonify({ 'success': False, 'error': str(e) }), 500 @torrents_bp.route('/maindata', methods=['GET']) def get_maindata(): """获取主要数据(聚合接口)""" try: # 获取查询参数 client_ids = request.args.getlist('client_ids') data = torrent_service.get_all_torrents(client_ids if client_ids else None) return jsonify({ 'success': True, 'data': data }) except Exception as e: return jsonify({ 'success': False, 'error': str(e) }), 500 @torrents_bp.route('/pause', methods=['POST']) def pause_torrents(): """暂停种子""" try: data = request.get_json() torrent_hashes = data.get('hashes', []) client_id = data.get('client_id') if not torrent_hashes: return jsonify({ 'success': False, 'error': '请提供要暂停的种子哈希值' }), 400 result = torrent_service.pause_torrents(torrent_hashes, client_id) return jsonify(result) except Exception as e: return jsonify({ 'success': False, 'error': str(e) }), 500 @torrents_bp.route('/resume', methods=['POST']) def resume_torrents(): """恢复种子""" try: data = request.get_json() torrent_hashes = data.get('hashes', []) client_id = data.get('client_id') if not torrent_hashes: return jsonify({ 'success': False, 'error': '请提供要恢复的种子哈希值' }), 400 result = torrent_service.resume_torrents(torrent_hashes, client_id) return jsonify(result) except Exception as e: return jsonify({ 'success': False, 'error': str(e) }), 500 @torrents_bp.route('/delete', methods=['POST']) def delete_torrents(): """删除种子""" try: data = request.get_json() torrent_hashes = data.get('hashes', []) client_id = data.get('client_id') delete_files = data.get('delete_files', False) if not torrent_hashes: return jsonify({ 'success': False, 'error': '请提供要删除的种子哈希值' }), 400 result = torrent_service.delete_torrents(torrent_hashes, delete_files, client_id) return jsonify(result) except Exception as e: return jsonify({ 'success': False, 'error': str(e) }), 500 @torrents_bp.route('//details', methods=['GET']) def get_torrent_details(torrent_hash): """获取种子详细信息""" try: client_id = request.args.get('client_id') if not client_id: return jsonify({ 'success': False, 'error': '请提供客户端ID' }), 400 details = torrent_service.get_torrent_details(torrent_hash, client_id) if details: return jsonify({ 'success': True, 'data': details }) else: return jsonify({ 'success': False, 'error': '种子不存在或无法获取详细信息' }), 404 except Exception as e: return jsonify({ 'success': False, 'error': str(e) }), 500 @torrents_bp.route('/add', methods=['POST']) def add_torrent(): """添加种子""" try: # 获取客户端ID client_id = request.form.get('client_id') or request.json.get('client_id') if request.is_json else None if not client_id: return jsonify({ 'success': False, 'error': '请指定客户端ID' }), 400 # 检查添加方式 if 'torrent_file' in request.files: # 种子文件上传 return _add_torrent_file(client_id) elif request.is_json: data = request.get_json() if 'magnet_link' in data: # 磁力链接 return _add_magnet_link(client_id, data['magnet_link'], data.get('options', {})) elif 'torrent_url' in data: # 种子URL return _add_torrent_url(client_id, data['torrent_url'], data.get('options', {})) return jsonify({ 'success': False, 'error': '请提供种子文件、磁力链接或种子URL' }), 400 except Exception as e: return jsonify({ 'success': False, 'error': str(e) }), 500 def _add_torrent_file(client_id): """添加种子文件""" file = request.files['torrent_file'] if file.filename == '': return jsonify({ 'success': False, 'error': '请选择种子文件' }), 400 if not file.filename.lower().endswith('.torrent'): return jsonify({ 'success': False, 'error': '请上传.torrent文件' }), 400 # 获取可选参数 options = { 'category': request.form.get('category', ''), 'tags': request.form.get('tags', ''), 'save_path': request.form.get('save_path', ''), 'paused': request.form.get('paused', 'false').lower() == 'true' } # 保存临时文件 filename = secure_filename(file.filename) with tempfile.NamedTemporaryFile(delete=False, suffix='.torrent') as temp_file: file.save(temp_file.name) try: result = torrent_service.add_torrent_file(client_id, temp_file.name, options) return jsonify(result) finally: # 清理临时文件 os.unlink(temp_file.name) def _add_magnet_link(client_id, magnet_link, options): """添加磁力链接""" if not magnet_link.startswith('magnet:'): return jsonify({ 'success': False, 'error': '无效的磁力链接' }), 400 result = torrent_service.add_magnet_link(client_id, magnet_link, options) return jsonify(result) def _add_torrent_url(client_id, torrent_url, options): """添加种子URL""" if not torrent_url.startswith(('http://', 'https://')): return jsonify({ 'success': False, 'error': '无效的种子URL' }), 400 result = torrent_service.add_torrent_url(client_id, torrent_url, options) return jsonify(result)