Spaces:
Build error
Build error
Commit
·
f54c5d1
1
Parent(s):
ab26803
fix
Browse files- app.py +15 -12
- hf_scrapper.py +20 -7
app.py
CHANGED
|
@@ -7,8 +7,6 @@ from hf_scrapper import download_film, download_episode, get_system_proxies, get
|
|
| 7 |
from indexer import indexer
|
| 8 |
from tvdb import fetch_and_cache_json
|
| 9 |
import re
|
| 10 |
-
import psutil
|
| 11 |
-
import shutil
|
| 12 |
|
| 13 |
app = Flask(__name__)
|
| 14 |
|
|
@@ -112,6 +110,9 @@ def bytes_to_human_readable(num, suffix="B"):
|
|
| 112 |
num /= 1024.0
|
| 113 |
return f"{num:.1f} Y{suffix}"
|
| 114 |
|
|
|
|
|
|
|
|
|
|
| 115 |
def get_all_tv_shows(indexed_cache):
|
| 116 |
"""Get all TV shows from the indexed cache structure JSON file."""
|
| 117 |
tv_shows = {}
|
|
@@ -195,6 +196,7 @@ def get_tv_show_api():
|
|
| 195 |
title = request.args.get('title')
|
| 196 |
season = request.args.get('season')
|
| 197 |
episode = request.args.get('episode')
|
|
|
|
| 198 |
if not title or not season or not episode:
|
| 199 |
return jsonify({"error": "Title, season, and episode parameters are required"}), 400
|
| 200 |
|
|
@@ -203,12 +205,13 @@ def get_tv_show_api():
|
|
| 203 |
tv_store_data = json.load(json_file)
|
| 204 |
|
| 205 |
# Check if the episode is already cached
|
| 206 |
-
|
| 207 |
-
|
| 208 |
-
|
| 209 |
-
|
| 210 |
-
|
| 211 |
-
|
|
|
|
| 212 |
tv_path = find_tv_path(file_structure, title)
|
| 213 |
|
| 214 |
if not tv_path:
|
|
@@ -220,9 +223,9 @@ def get_tv_show_api():
|
|
| 220 |
for sub_directory in directory['contents']:
|
| 221 |
if sub_directory['type'] == 'directory' and title.lower() in sub_directory['path'].lower():
|
| 222 |
for season_dir in sub_directory['contents']:
|
| 223 |
-
if season_dir['type'] == 'directory':
|
| 224 |
for episode_file in season_dir['contents']:
|
| 225 |
-
if episode_file['type'] == 'file':
|
| 226 |
episode_path = episode_file['path']
|
| 227 |
break
|
| 228 |
|
|
@@ -232,7 +235,7 @@ def get_tv_show_api():
|
|
| 232 |
cache_path = os.path.join(CACHE_DIR, episode_path)
|
| 233 |
file_url = f"https://huggingface.co/{REPO}/resolve/main/{episode_path}"
|
| 234 |
proxies = get_system_proxies()
|
| 235 |
-
episode_id =
|
| 236 |
|
| 237 |
# Start the download in a separate thread if not already downloading
|
| 238 |
if episode_id not in download_threads or not download_threads[episode_id].is_alive():
|
|
@@ -266,7 +269,7 @@ def get_episode_id_api():
|
|
| 266 |
episode = request.args.get('episode')
|
| 267 |
if not title or not season or not episode:
|
| 268 |
return jsonify({"error": "Title, season, and episode parameters are required"}), 400
|
| 269 |
-
episode_id =
|
| 270 |
return jsonify({"episode_id": episode_id})
|
| 271 |
|
| 272 |
@app.route('/api/cache/size', methods=['GET'])
|
|
|
|
| 7 |
from indexer import indexer
|
| 8 |
from tvdb import fetch_and_cache_json
|
| 9 |
import re
|
|
|
|
|
|
|
| 10 |
|
| 11 |
app = Flask(__name__)
|
| 12 |
|
|
|
|
| 110 |
num /= 1024.0
|
| 111 |
return f"{num:.1f} Y{suffix}"
|
| 112 |
|
| 113 |
+
def encode_episodeid(title,season,episode):
|
| 114 |
+
f"{title}_{season}_{episode}"
|
| 115 |
+
|
| 116 |
def get_all_tv_shows(indexed_cache):
|
| 117 |
"""Get all TV shows from the indexed cache structure JSON file."""
|
| 118 |
tv_shows = {}
|
|
|
|
| 196 |
title = request.args.get('title')
|
| 197 |
season = request.args.get('season')
|
| 198 |
episode = request.args.get('episode')
|
| 199 |
+
|
| 200 |
if not title or not season or not episode:
|
| 201 |
return jsonify({"error": "Title, season, and episode parameters are required"}), 400
|
| 202 |
|
|
|
|
| 205 |
tv_store_data = json.load(json_file)
|
| 206 |
|
| 207 |
# Check if the episode is already cached
|
| 208 |
+
if title in tv_store_data and season in tv_store_data[title]:
|
| 209 |
+
for ep in tv_store_data[title][season]:
|
| 210 |
+
if episode in ep:
|
| 211 |
+
cache_path = tv_store_data[title][season][ep]
|
| 212 |
+
if os.path.exists(cache_path):
|
| 213 |
+
return send_from_directory(os.path.dirname(cache_path), os.path.basename(cache_path))
|
| 214 |
+
|
| 215 |
tv_path = find_tv_path(file_structure, title)
|
| 216 |
|
| 217 |
if not tv_path:
|
|
|
|
| 223 |
for sub_directory in directory['contents']:
|
| 224 |
if sub_directory['type'] == 'directory' and title.lower() in sub_directory['path'].lower():
|
| 225 |
for season_dir in sub_directory['contents']:
|
| 226 |
+
if season_dir['type'] == 'directory' and season in season_dir['path']:
|
| 227 |
for episode_file in season_dir['contents']:
|
| 228 |
+
if episode_file['type'] == 'file' and episode in episode_file['path']:
|
| 229 |
episode_path = episode_file['path']
|
| 230 |
break
|
| 231 |
|
|
|
|
| 235 |
cache_path = os.path.join(CACHE_DIR, episode_path)
|
| 236 |
file_url = f"https://huggingface.co/{REPO}/resolve/main/{episode_path}"
|
| 237 |
proxies = get_system_proxies()
|
| 238 |
+
episode_id = encode_episodeid(title,season,episode)
|
| 239 |
|
| 240 |
# Start the download in a separate thread if not already downloading
|
| 241 |
if episode_id not in download_threads or not download_threads[episode_id].is_alive():
|
|
|
|
| 269 |
episode = request.args.get('episode')
|
| 270 |
if not title or not season or not episode:
|
| 271 |
return jsonify({"error": "Title, season, and episode parameters are required"}), 400
|
| 272 |
+
episode_id = encode_episodeid(title,season,episode)
|
| 273 |
return jsonify({"episode_id": episode_id})
|
| 274 |
|
| 275 |
@app.route('/api/cache/size', methods=['GET'])
|
hf_scrapper.py
CHANGED
|
@@ -168,24 +168,37 @@ def download_episode(file_url, token, cache_path, proxies, episode_id, title, ch
|
|
| 168 |
|
| 169 |
def update_tv_store_json(title, cache_path):
|
| 170 |
"""
|
| 171 |
-
Updates the
|
| 172 |
|
| 173 |
Args:
|
| 174 |
-
title (str): The title of the
|
| 175 |
cache_path (str): The local path where the file is saved.
|
| 176 |
"""
|
| 177 |
TV_STORE_JSON_PATH = os.path.join(CACHE_DIR, "tv_store.json")
|
| 178 |
|
| 179 |
-
|
| 180 |
if os.path.exists(TV_STORE_JSON_PATH):
|
| 181 |
with open(TV_STORE_JSON_PATH, 'r') as json_file:
|
| 182 |
-
|
| 183 |
|
| 184 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 185 |
|
| 186 |
with open(TV_STORE_JSON_PATH, 'w') as json_file:
|
| 187 |
-
json.dump(
|
| 188 |
-
|
|
|
|
| 189 |
|
| 190 |
###############################################################################
|
| 191 |
def get_file_structure(repo, token, path="", proxies=None):
|
|
|
|
| 168 |
|
| 169 |
def update_tv_store_json(title, cache_path):
|
| 170 |
"""
|
| 171 |
+
Updates the TV store JSON with the new file, organizing by title, season, and episode.
|
| 172 |
|
| 173 |
Args:
|
| 174 |
+
title (str): The title of the TV show.
|
| 175 |
cache_path (str): The local path where the file is saved.
|
| 176 |
"""
|
| 177 |
TV_STORE_JSON_PATH = os.path.join(CACHE_DIR, "tv_store.json")
|
| 178 |
|
| 179 |
+
tv_store_data = {}
|
| 180 |
if os.path.exists(TV_STORE_JSON_PATH):
|
| 181 |
with open(TV_STORE_JSON_PATH, 'r') as json_file:
|
| 182 |
+
tv_store_data = json.load(json_file)
|
| 183 |
|
| 184 |
+
# Extract season and episode information from the cache_path
|
| 185 |
+
season_part = os.path.basename(os.path.dirname(cache_path)) # Extracts 'Season 1'
|
| 186 |
+
episode_part = os.path.basename(cache_path) # Extracts 'Grand Blue Dreaming - S01E01 - Deep Blue HDTV-720p.mp4'
|
| 187 |
+
|
| 188 |
+
# Create the structure if not already present
|
| 189 |
+
if title not in tv_store_data:
|
| 190 |
+
tv_store_data[title] = {}
|
| 191 |
+
|
| 192 |
+
if season_part not in tv_store_data[title]:
|
| 193 |
+
tv_store_data[title][season_part] = {}
|
| 194 |
+
|
| 195 |
+
# Assuming episode_part is unique for each episode within a season
|
| 196 |
+
tv_store_data[title][season_part][episode_part] = cache_path
|
| 197 |
|
| 198 |
with open(TV_STORE_JSON_PATH, 'w') as json_file:
|
| 199 |
+
json.dump(tv_store_data, json_file, indent=2)
|
| 200 |
+
|
| 201 |
+
print(f'TV store updated with {title}, {season_part}, {episode_part}.')
|
| 202 |
|
| 203 |
###############################################################################
|
| 204 |
def get_file_structure(repo, token, path="", proxies=None):
|