Update app.py
Browse files
app.py
CHANGED
|
@@ -23,14 +23,20 @@ class StartPayload(BaseModel):
|
|
| 23 |
anime_id: str
|
| 24 |
|
| 25 |
def download_video(anime_id: str, episode: int, quality: str) -> str | None:
|
| 26 |
-
"""Downloads video from Ayano API. Returns local path or None if episode
|
| 27 |
url = f"{HF_AYANO_BASE}/anime/download?id={anime_id}&episode={episode}&quality={quality}"
|
| 28 |
resp = requests.get(url)
|
| 29 |
if resp.status_code != 200:
|
| 30 |
return None
|
| 31 |
data = resp.json()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
if data.get("status") != 200:
|
| 33 |
-
return None
|
| 34 |
|
| 35 |
video_url = data["direct_link"]
|
| 36 |
tmp_path = tempfile.mktemp(suffix=".mp4")
|
|
@@ -68,27 +74,40 @@ def notify_render(anime_id: str, episode: int, quality: str, url: str, filename:
|
|
| 68 |
except Exception as e:
|
| 69 |
print("Failed to notify Render:", e)
|
| 70 |
|
| 71 |
-
def process_anime(anime_id: str):
|
| 72 |
-
"""Background task: iterates episodes and qualities, uploads, notifies."""
|
| 73 |
episode = 1
|
| 74 |
while True:
|
| 75 |
-
|
| 76 |
for quality in QUALITIES:
|
| 77 |
try:
|
| 78 |
-
|
| 79 |
-
|
|
|
|
|
|
|
| 80 |
continue
|
| 81 |
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
|
|
|
| 85 |
os.remove(local_file)
|
| 86 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
except Exception as e:
|
| 88 |
print(f"Error ep {episode} quality {quality}: {e}")
|
| 89 |
-
notify_render(anime_id, episode, quality, "", "", code=5)
|
| 90 |
|
| 91 |
-
if not
|
|
|
|
| 92 |
break
|
| 93 |
episode += 1
|
| 94 |
|
|
|
|
| 23 |
anime_id: str
|
| 24 |
|
| 25 |
def download_video(anime_id: str, episode: int, quality: str) -> str | None:
|
| 26 |
+
"""Downloads video from Ayano API. Returns local path or None if episode/quality unavailable."""
|
| 27 |
url = f"{HF_AYANO_BASE}/anime/download?id={anime_id}&episode={episode}&quality={quality}"
|
| 28 |
resp = requests.get(url)
|
| 29 |
if resp.status_code != 200:
|
| 30 |
return None
|
| 31 |
data = resp.json()
|
| 32 |
+
|
| 33 |
+
# Stop entirely if episode number exceeds available count
|
| 34 |
+
if data.get("status") == 422:
|
| 35 |
+
raise EpisodeExceedsAvailableCount(f"Episode {episode} exceeds available count")
|
| 36 |
+
|
| 37 |
+
# Skip if quality is missing
|
| 38 |
if data.get("status") != 200:
|
| 39 |
+
return None
|
| 40 |
|
| 41 |
video_url = data["direct_link"]
|
| 42 |
tmp_path = tempfile.mktemp(suffix=".mp4")
|
|
|
|
| 74 |
except Exception as e:
|
| 75 |
print("Failed to notify Render:", e)
|
| 76 |
|
| 77 |
+
def process_anime(anime_id: str, anime_name: str):
|
|
|
|
| 78 |
episode = 1
|
| 79 |
while True:
|
| 80 |
+
episode_processed = False
|
| 81 |
for quality in QUALITIES:
|
| 82 |
try:
|
| 83 |
+
# Download returns None if episode/quality unavailable
|
| 84 |
+
result = download_video(anime_id, episode, quality)
|
| 85 |
+
if result is None:
|
| 86 |
+
# If the API explicitly says episode exceeds count
|
| 87 |
continue
|
| 88 |
|
| 89 |
+
local_file = result
|
| 90 |
+
|
| 91 |
+
# Blur + watermark
|
| 92 |
+
blurred_file = blur_video(local_file)
|
| 93 |
os.remove(local_file)
|
| 94 |
+
|
| 95 |
+
new_name = rename_file(blurred_file, anime_name, episode, quality)
|
| 96 |
+
catbox_url = upload_to_catbox_public(blurred_file, new_name)
|
| 97 |
+
os.remove(blurred_file)
|
| 98 |
+
|
| 99 |
+
notify_render(anime_id, episode, quality, catbox_url, new_name, code=2)
|
| 100 |
+
episode_processed = True
|
| 101 |
+
|
| 102 |
+
except EpisodeExceedsAvailableCount:
|
| 103 |
+
# Stop the outer loop entirely if the episode doesn't exist
|
| 104 |
+
return
|
| 105 |
except Exception as e:
|
| 106 |
print(f"Error ep {episode} quality {quality}: {e}")
|
| 107 |
+
notify_render(anime_id, episode, quality, "", "", code=5)
|
| 108 |
|
| 109 |
+
if not episode_processed:
|
| 110 |
+
# No qualities were processed → stop
|
| 111 |
break
|
| 112 |
episode += 1
|
| 113 |
|