Spaces:
Paused
Paused
File size: 5,567 Bytes
f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee 4e15391 f0de3f7 5efa5ee f0de3f7 5efa5ee f0de3f7 5efa5ee |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 |
from flask import Flask, jsonify, render_template, redirect, request, Response
import os
import json
import requests
import urllib.parse
from datetime import datetime, timedelta
from threading import Thread
from hf_scrapper import get_system_proxies, stream_file
from indexer import indexer
from dotenv import load_dotenv
load_dotenv()
INDEX_FILE = os.getenv("INDEX_FILE")
TOKEN = os.getenv("TOKEN")
REPO = os.getenv("REPO")
THETVDB_API_KEY = os.getenv("THETVDB_API_KEY")
THETVDB_API_URL = os.getenv("THETVDB_API_URL")
CACHE_DIR = os.getenv("CACHE_DIR")
TOKEN_EXPIRY = None
THETVDB_TOKEN = None
proxies = get_system_proxies()
if not os.path.exists(CACHE_DIR):
os.makedirs(CACHE_DIR)
indexer()
# Check if INDEX_FILE exists
if not os.path.exists(INDEX_FILE):
raise FileNotFoundError(f"{INDEX_FILE} not found. Please make sure the file exists.")
with open(INDEX_FILE, 'r') as f:
file_structure = json.load(f)
def authenticate_thetvdb():
global THETVDB_TOKEN, TOKEN_EXPIRY
auth_url = f"{THETVDB_API_URL}/login"
auth_data = {
"apikey": THETVDB_API_KEY
}
try:
response = requests.post(auth_url, json=auth_data, proxies=proxies)
response.raise_for_status()
response_data = response.json()
THETVDB_TOKEN = response_data['data']['token']
TOKEN_EXPIRY = datetime.now() + timedelta(days=30) # token is valid for 1 month
except requests.RequestException as e:
print(f"Authentication failed: {e}")
THETVDB_TOKEN = None
TOKEN_EXPIRY = None
def get_thetvdb_token():
global THETVDB_TOKEN, TOKEN_EXPIRY
if not THETVDB_TOKEN or datetime.now() >= TOKEN_EXPIRY:
authenticate_thetvdb()
return THETVDB_TOKEN
def fetch_and_cache_json(original_title, title, media_type, year=None):
if year:
search_url = f"{THETVDB_API_URL}/search?query={title}&type={media_type}&year={year}"
else:
search_url = f"{THETVDB_API_URL}/search?query={title}&type={media_type}"
token = get_thetvdb_token()
if not token:
print("Authentication failed")
return
headers = {
"Authorization": f"Bearer {token}",
"accept": "application/json",
}
try:
response = requests.get(search_url, headers=headers, proxies=proxies)
response.raise_for_status()
data = response.json()
if 'data' in data and data['data']:
# Use original_title to save JSON response to cache
json_cache_path = os.path.join(CACHE_DIR, f"{urllib.parse.quote(original_title)}.json")
with open(json_cache_path, 'w') as f:
json.dump(data, f)
except requests.RequestException as e:
print(f"Error fetching data: {e}")
def prefetch_metadata():
for item in file_structure:
if 'contents' in item:
for sub_item in item['contents']:
original_title = sub_item['path'].split('/')[-1]
media_type = 'series' if item['path'].startswith('tv') else 'movie'
title = original_title
year = None
if any(char.isdigit() for char in original_title):
# Strip year from title if present
parts = original_title.rsplit(' ', 1)
year_str = parts[-1]
if year_str.isdigit() and len(year_str) == 4:
title = parts[0]
year = int(year_str)
fetch_and_cache_json(original_title, title, media_type, year)
# Run prefetch_metadata in a background thread
def start_prefetching():
prefetch_metadata()
# Start prefetching before running the Flask app
thread = Thread(target=start_prefetching)
thread.daemon = True
thread.start()
app = Flask(__name__)
@app.route('/')
def home():
return render_template('index.html')
@app.route('/player')
def player():
return render_template('player.html')
@app.route('/films')
def list_films():
films = [item for item in file_structure if item['path'].startswith('films')]
return jsonify([sub_item for film in films for sub_item in film['contents']])
@app.route('/tv')
def list_tv():
tv_shows = [item for item in file_structure if item['path'].startswith('tv')]
return jsonify([sub_item for show in tv_shows for sub_item in show['contents']])
@app.route('/play/<path:file_path>')
def play(file_path):
file_url = f"https://huggingface.co/{REPO}/resolve/main/{file_path}"
return redirect(file_url)
@app.route('/get_metadata')
def get_metadata():
title = request.args.get('title')
if not title:
return jsonify({'error': 'No title provided'}), 400
json_cache_path = os.path.join(CACHE_DIR, f"{urllib.parse.quote(title)}.json")
if os.path.exists(json_cache_path):
with open(json_cache_path, 'r') as f:
data = json.load(f)
return jsonify(data)
# If metadata is not found in cache, return an error
return jsonify({'error': 'Metadata not found'}), 404
@app.route('/stream')
def stream_video():
file_path = request.args.get('path')
if not file_path:
return "File path not provided", 400
proxies = get_system_proxies()
file_url = f"https://huggingface.co/{REPO}/resolve/main/{file_path}"
def generate():
for chunk in stream_file(file_url, TOKEN, proxies):
yield chunk
return Response(generate(), content_type='video/mp4')
if __name__ == '__main__':
app.run(debug=True, host="0.0.0.0", port=7860)
|