diff --git a/Makefile b/Makefile index 8ded91d..a6cd37b 100644 --- a/Makefile +++ b/Makefile @@ -40,17 +40,18 @@ install-all: pip install -e ".[dev,serve,serve-restful,shortcuts]" test: - pytest tests/ + python3 -m pytest tests/ test-cov: - pytest tests/ --cov=weeb_cli --cov-report=html --cov-report=term + python3 -m pytest tests/ --cov=weeb_cli --cov-report=html --cov-report=term lint: @echo "Running linting checks..." - @python -m py_compile weeb_cli/**/*.py || echo "Syntax check completed" + @python3 -m py_compile weeb_cli/**/*.py || echo "Syntax check completed" format: - @echo "Code formatting not configured. Consider adding black or ruff." + @echo "Formatting code using ruff (if available)..." + @python3 -m ruff format . || echo "Ruff not found. Consider adding it via pip install ruff." check-deps: @echo "Checking dependencies..." diff --git a/weeb_cli/commands/serve_restful.py b/weeb_cli/commands/serve_restful.py index 1123ac0..e744c9f 100644 --- a/weeb_cli/commands/serve_restful.py +++ b/weeb_cli/commands/serve_restful.py @@ -37,6 +37,39 @@ def _quality_score(q: str) -> int: return 1 return 0 +def _serialize_anime_result(result): + """Serialize AnimeResult to dict.""" + return { + "id": result.id, + "title": result.title, + "type": getattr(result, "type", ""), + "cover": getattr(result, "cover", ""), + "year": getattr(result, "year", None), + } + +def _serialize_episode(episode): + """Serialize Episode to dict.""" + return { + "id": episode.id, + "number": episode.number, + "title": getattr(episode, "title", ""), + "season": getattr(episode, "season", 1), + "url": getattr(episode, "url", ""), + } + +def _serialize_stream(stream): + """Serialize StreamLink to dict.""" + return { + "url": stream.url, + "quality": stream.quality, + "server": getattr(stream, "server", "default"), + "headers": getattr(stream, "headers", {}), + "subtitles": getattr(stream, "subtitles", ""), + } + +# Import provider functions at module level for easier mocking +from weeb_cli.providers.registry import get_provider, list_providers as list_all_providers + @restful_app.callback(invoke_without_command=True) def serve_restful( @@ -77,9 +110,6 @@ def serve_restful( stream=sys.stdout, ) - # Import provider functions - from weeb_cli.providers.registry import get_provider, list_providers as list_all_providers - # Create Flask app flask_app = Flask(__name__) @@ -148,10 +178,7 @@ def api_search(): try: results = provider.search(query) - return jsonify([ - {"id": r.id, "title": r.title, "type": r.type, "cover": r.cover, "year": r.year} - for r in results - ]) + return jsonify([_serialize_anime_result(r) for r in results]) except Exception as e: log.error(f"Search error: {e}") return jsonify({"error": str(e)}), 500 @@ -189,10 +216,7 @@ def api_episodes(): except ValueError: return jsonify({"error": "Invalid season number"}), 400 - return jsonify([ - {"id": e.id, "number": e.number, "title": e.title, "season": e.season, "url": e.url} - for e in eps - ]) + return jsonify([_serialize_episode(e) for e in eps]) except Exception as e: log.error(f"Episodes error: {e}") return jsonify({"error": str(e)}), 500 @@ -238,10 +262,7 @@ def api_streams(): ep = target[0] links = provider.get_streams(anime_id, ep.id) - return jsonify([ - {"url": s.url, "quality": s.quality, "server": s.server, "headers": s.headers, "subtitles": s.subtitles} - for s in links - ]) + return jsonify([_serialize_stream(s) for s in links]) except Exception as e: log.error(f"Streams error: {e}") return jsonify({"error": str(e)}), 500