Spaces:
Paused
Paused
Commit
·
b6642bd
1
Parent(s):
a77c7cb
fix
Browse files- app.py +21 -19
- templates/film_details_page.html +17 -2
- templates/film_player.html +6 -32
app.py
CHANGED
|
@@ -19,7 +19,7 @@ CACHE_DIR = os.getenv("CACHE_DIR")
|
|
| 19 |
if not os.path.exists(CACHE_DIR):
|
| 20 |
os.makedirs(CACHE_DIR)
|
| 21 |
|
| 22 |
-
indexer()
|
| 23 |
|
| 24 |
if not os.path.exists(INDEX_FILE):
|
| 25 |
raise FileNotFoundError(f"{INDEX_FILE} not found. Please make sure the file exists.")
|
|
@@ -53,7 +53,6 @@ def prefetch_metadata():
|
|
| 53 |
def start_prefetching():
|
| 54 |
prefetch_metadata()
|
| 55 |
|
| 56 |
-
|
| 57 |
thread = Thread(target=start_prefetching)
|
| 58 |
thread.daemon = True
|
| 59 |
thread.start()
|
|
@@ -140,9 +139,10 @@ def film_page(title):
|
|
| 140 |
else:
|
| 141 |
return jsonify({'error': 'Metadata not found'}), 404
|
| 142 |
|
|
|
|
| 143 |
return jsonify({
|
| 144 |
'metadata': metadata,
|
| 145 |
-
'
|
| 146 |
})
|
| 147 |
|
| 148 |
@app.route('/api/tv/<path:show_title>')
|
|
@@ -179,29 +179,31 @@ def get_metadata():
|
|
| 179 |
|
| 180 |
return jsonify({'error': 'Metadata not found'}), 404
|
| 181 |
|
| 182 |
-
@app.route('/
|
| 183 |
-
def
|
| 184 |
-
return render_template('film_details_page.html', title=title)
|
| 185 |
-
|
| 186 |
-
@app.route('/film/<path:title>/play')
|
| 187 |
-
def film_player(title):
|
| 188 |
title = urllib.parse.unquote(title)
|
| 189 |
film_file_path = get_film_file_path(title)
|
| 190 |
if not film_file_path:
|
| 191 |
return jsonify({'error': 'Film not found'}), 404
|
| 192 |
-
|
| 193 |
-
cached_file_path = download_film_if_needed(film_file_path)
|
| 194 |
|
| 195 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
|
| 197 |
-
@app.route('/
|
| 198 |
-
def
|
| 199 |
-
|
| 200 |
-
film_file_path = get_film_file_path(title)
|
| 201 |
-
if not film_file_path:
|
| 202 |
-
return jsonify({'error': 'Film not found'}), 404
|
| 203 |
|
| 204 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 205 |
|
| 206 |
def generate():
|
| 207 |
with open(cached_file_path, 'rb') as f:
|
|
|
|
| 19 |
if not os.path.exists(CACHE_DIR):
|
| 20 |
os.makedirs(CACHE_DIR)
|
| 21 |
|
| 22 |
+
#indexer()
|
| 23 |
|
| 24 |
if not os.path.exists(INDEX_FILE):
|
| 25 |
raise FileNotFoundError(f"{INDEX_FILE} not found. Please make sure the file exists.")
|
|
|
|
| 53 |
def start_prefetching():
|
| 54 |
prefetch_metadata()
|
| 55 |
|
|
|
|
| 56 |
thread = Thread(target=start_prefetching)
|
| 57 |
thread.daemon = True
|
| 58 |
thread.start()
|
|
|
|
| 139 |
else:
|
| 140 |
return jsonify({'error': 'Metadata not found'}), 404
|
| 141 |
|
| 142 |
+
cached_url = f"/cached_films/{urllib.parse.quote(title)}"
|
| 143 |
return jsonify({
|
| 144 |
'metadata': metadata,
|
| 145 |
+
'cached_url': cached_url
|
| 146 |
})
|
| 147 |
|
| 148 |
@app.route('/api/tv/<path:show_title>')
|
|
|
|
| 179 |
|
| 180 |
return jsonify({'error': 'Metadata not found'}), 404
|
| 181 |
|
| 182 |
+
@app.route('/api/cache_film/<path:title>')
|
| 183 |
+
def cache_film(title):
|
|
|
|
|
|
|
|
|
|
|
|
|
| 184 |
title = urllib.parse.unquote(title)
|
| 185 |
film_file_path = get_film_file_path(title)
|
| 186 |
if not film_file_path:
|
| 187 |
return jsonify({'error': 'Film not found'}), 404
|
|
|
|
|
|
|
| 188 |
|
| 189 |
+
cached_file_path = os.path.join(CACHE_DIR, film_file_path)
|
| 190 |
+
if not os.path.exists(cached_file_path):
|
| 191 |
+
file_url = f"https://huggingface.co/{REPO}/resolve/main/{film_file_path}"
|
| 192 |
+
success = download_and_cache_file(file_url, TOKEN, cached_file_path, proxies=get_system_proxies())
|
| 193 |
+
if not success:
|
| 194 |
+
return jsonify({'error': 'Failed to cache film'}), 500
|
| 195 |
+
|
| 196 |
+
return jsonify({'success': True})
|
| 197 |
|
| 198 |
+
@app.route('/film/<path:title>')
|
| 199 |
+
def film_details(title):
|
| 200 |
+
return render_template('film_details_page.html', title=title)
|
|
|
|
|
|
|
|
|
|
| 201 |
|
| 202 |
+
@app.route('/cached_films/<path:title>')
|
| 203 |
+
def serve_cached_film(title):
|
| 204 |
+
cached_file_path = os.path.join(CACHE_DIR, urllib.parse.unquote(title))
|
| 205 |
+
if not os.path.exists(cached_file_path):
|
| 206 |
+
return jsonify({'error': 'Film not cached'}), 404
|
| 207 |
|
| 208 |
def generate():
|
| 209 |
with open(cached_file_path, 'rb') as f:
|
templates/film_details_page.html
CHANGED
|
@@ -122,7 +122,7 @@
|
|
| 122 |
<p id="film-overview">Film overview goes here...</p>
|
| 123 |
<div class="genres" id="film-genres"></div>
|
| 124 |
<div class="metadata-container" id="film-metadata"></div>
|
| 125 |
-
<a href="#" class="play-button" id="play-button">Play</a>
|
| 126 |
</div>
|
| 127 |
</div>
|
| 128 |
<script>
|
|
@@ -172,7 +172,22 @@
|
|
| 172 |
metadataContainer.appendChild(createMetadataElement('Release Date', metadata.first_air_time));
|
| 173 |
|
| 174 |
const playButton = document.getElementById('play-button');
|
| 175 |
-
playButton.href =
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
}
|
| 177 |
|
| 178 |
const urlParams = new URLSearchParams(window.location.search);
|
|
|
|
| 122 |
<p id="film-overview">Film overview goes here...</p>
|
| 123 |
<div class="genres" id="film-genres"></div>
|
| 124 |
<div class="metadata-container" id="film-metadata"></div>
|
| 125 |
+
<a href="#" class="play-button" id="play-button" onclick="playFilm()">Play</a>
|
| 126 |
</div>
|
| 127 |
</div>
|
| 128 |
<script>
|
|
|
|
| 172 |
metadataContainer.appendChild(createMetadataElement('Release Date', metadata.first_air_time));
|
| 173 |
|
| 174 |
const playButton = document.getElementById('play-button');
|
| 175 |
+
playButton.href = `#`; // Will be handled by JavaScript
|
| 176 |
+
}
|
| 177 |
+
|
| 178 |
+
async function playFilm() {
|
| 179 |
+
const title = "{{ title }}";
|
| 180 |
+
try {
|
| 181 |
+
const response = await fetch(`/api/cache_film/${encodeURIComponent(title)}`);
|
| 182 |
+
const data = await response.json();
|
| 183 |
+
if (data.success) {
|
| 184 |
+
window.location.href = `/film_player/${encodeURIComponent(title)}`;
|
| 185 |
+
} else {
|
| 186 |
+
alert('Error caching film: ' + data.error);
|
| 187 |
+
}
|
| 188 |
+
} catch (error) {
|
| 189 |
+
alert('Error: ' + error.message);
|
| 190 |
+
}
|
| 191 |
}
|
| 192 |
|
| 193 |
const urlParams = new URLSearchParams(window.location.search);
|
templates/film_player.html
CHANGED
|
@@ -3,39 +3,13 @@
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
-
<title>
|
| 7 |
-
<style>
|
| 8 |
-
body {
|
| 9 |
-
font-family: Arial, sans-serif;
|
| 10 |
-
margin: 0;
|
| 11 |
-
padding: 0;
|
| 12 |
-
display: flex;
|
| 13 |
-
justify-content: center;
|
| 14 |
-
align-items: center;
|
| 15 |
-
height: 100vh;
|
| 16 |
-
background-color: #f0f0f0;
|
| 17 |
-
}
|
| 18 |
-
.video-container {
|
| 19 |
-
position: relative;
|
| 20 |
-
width: 80%;
|
| 21 |
-
max-width: 1200px;
|
| 22 |
-
background: #000;
|
| 23 |
-
border-radius: 8px;
|
| 24 |
-
overflow: hidden;
|
| 25 |
-
}
|
| 26 |
-
video {
|
| 27 |
-
width: 100%;
|
| 28 |
-
height: auto;
|
| 29 |
-
display: block;
|
| 30 |
-
}
|
| 31 |
-
</style>
|
| 32 |
</head>
|
| 33 |
<body>
|
| 34 |
-
<
|
| 35 |
-
|
| 36 |
-
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
</div>
|
| 40 |
</body>
|
| 41 |
</html>
|
|
|
|
| 3 |
<head>
|
| 4 |
<meta charset="UTF-8">
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>{{ title }}</title>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
</head>
|
| 8 |
<body>
|
| 9 |
+
<h1>{{ title }}</h1>
|
| 10 |
+
<video controls width="100%" height="auto">
|
| 11 |
+
<source src="{{ cached_url }}" type="video/mp4">
|
| 12 |
+
Your browser does not support the video tag.
|
| 13 |
+
</video>
|
|
|
|
| 14 |
</body>
|
| 15 |
</html>
|