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';