diff --git a/src/app.py b/src/app.py index 59f0149..63e06df 100644 --- a/src/app.py +++ b/src/app.py @@ -35,12 +35,13 @@ komga = KOMGAPI( username=settings.komga.user, password=settings.komga.password, ) +cat = Nyaa() # komga_series = komga.seriesList() @limit(limit=1, every=2) async def fetch_data( - inputdata: Dict[str, Any], check_downloads: bool = False + inputdata: Dict[str, Any], check_downloads: int = 0 ) -> List[Dict[str, Any]]: log.error(f"fetch_data called with data: {inputdata}") async with httpx.AsyncClient() as client: @@ -92,36 +93,41 @@ async def fetch_data( args={"id": manga.id}, ) komga_request = bool(requested) - results.append( - { - "id": manga.id, - "title": manga.title.english - if manga.title.english - else manga.title.romaji, - "image": manga.coverImage.get("large") - if manga.coverImage - else "https://demofree.sirv.com/nope-not-here.jpg", - "status": manga.status, - "type": manga.format, - "genres": manga.genres or [], - "tags": [tag.name for tag in (manga.tags or [])], - "description": manga.description.replace("
", "\n") - if manga.description - else "No description available", - "isAdult": manga.isAdult, - "in_komga": in_komga, - "requested": komga_request, - "siteUrl": manga.siteUrl, - } - ) - if check_downloads: - for result in results: - downloads = Nyaa().search(result.get("title"), 3, 1) - else: - downloads = [] - result["download"] = len(downloads) if downloads else 0 + + result_data: dict[str, Any] = { + "id": manga.id, + "title": manga.title.english + if manga.title.english + else manga.title.romaji, + "image": manga.coverImage.get("large") + if manga.coverImage + else "https://demofree.sirv.com/nope-not-here.jpg", + "status": manga.status, + "type": manga.format, + "genres": manga.genres or [], + "tags": [tag.name for tag in (manga.tags or [])], + "description": manga.description.replace("
", "\n") + if manga.description + else "No description available", + "isAdult": manga.isAdult, + "in_komga": in_komga, + "requested": komga_request, + "siteUrl": manga.siteUrl, + } + + results.append(result_data) + # async check for available downloads log.debug(f"Fetched {len(results)} results for query: {inputdata['query']}") + if check_downloads == 1: + for manga in results: + log.debug(f"Checking downloads for manga: {manga['title']}") + search_query = manga["title"] + search_results = cat.search(search_query, 3, 1) + manga["downloads"] = ( + len(search_results) if isinstance(search_results, list) else 0 + ) + log.debug(f"Downloads for {manga['title']}: {manga['downloads']}") log.error(f"Results: {results}") return results except ValueError as ve: @@ -247,7 +253,10 @@ async def get_tags(): async def search(): data = await request.get_json() print(data) - results = await fetch_data(data) + # in data replace bool value for check_downloads with 1 or 0 + if "check_downloads" in data: + data["check_downloads"] = 1 if data["check_downloads"] is True else 0 + results = await fetch_data(data, check_downloads=data.get("check_downloads", 0)) if not results: return jsonify({"error": "No results found"}), 404 return jsonify(results) @@ -358,9 +367,23 @@ async def delete_request(): return jsonify({"status": "failed"}), 400 if __name__ == "__main__": - log.info("Starting Komga Manga Grabber API") - # use hypercorn to run the app - import uvicorn + import sys - uvicorn.run(app, host="0.0.0.0", port=5001) - # run in test mode + log.info("Starting Komga Manga Grabber API") + if len(sys.argv) > 1: + if sys.argv[1] == "test": + log.info("Running in test mode") + # run in test mode + app.run(debug=True, host="0.0.0.0", port=5001) + elif sys.argv[1] == "prod": + log.info("Running in production mode") + # run in production mode + log.info("Starting Komga Manga Grabber API") + # use hypercorn to run the app + import uvicorn + + uvicorn.run(app, host="0.0.0.0", port=5001) + # run in test mode + else: + log.info("No arguments provided, running in default mode") + app.run(debug=True, host="0.0.0.0", port=5000) diff --git a/src/templates/index.html b/src/templates/index.html index f03a0fd..b110dc5 100644 --- a/src/templates/index.html +++ b/src/templates/index.html @@ -52,6 +52,10 @@ Show Novels + @@ -271,13 +275,14 @@ const selectedGenres = document.getElementById("genreInput").value.split(',').map(v => v.trim()).filter(v => v); const selectedTags = document.getElementById("tagInput").value.split(',').map(v => v.trim()).filter(v => v); const selectedType = document.getElementById("typeSelect").value; + const checkDownloads = document.getElementById("checkAvailability").checked; // Get the checkbox value const query = { query: searchTerm, genres: selectedGenres, tags: selectedTags, - type: selectedType // Include the selected type in the query - + type: selectedType, + check_downloads: checkDownloads // Pass the checkbox value }; const loadingElement = document.getElementById("loading"); @@ -324,6 +329,24 @@ imageContainer.appendChild(badge); } + // Add download badge if applicable + if (result.downloads && document.getElementById("checkAvailability").checked) { + const downloadBadge = document.createElement('div'); + downloadBadge.className = 'download-badge'; + downloadBadge.textContent = `${result.downloads} Downloads`; + downloadBadge.style.position = 'absolute'; + downloadBadge.style.top = '8px'; + downloadBadge.style.right = '8px'; + downloadBadge.style.backgroundColor = 'rgba(0, 0, 255, 0.8)'; + downloadBadge.style.color = 'white'; + downloadBadge.style.padding = '4px 8px'; + downloadBadge.style.fontSize = '12px'; + downloadBadge.style.fontWeight = 'bold'; + downloadBadge.style.borderRadius = '4px'; + downloadBadge.style.zIndex = '1'; + imageContainer.appendChild(downloadBadge); + } + const title = document.createElement('p'); title.textContent = result.title || 'Untitled';