diff --git a/revivetube.py b/revivetube.py index a6ef5d5..0e5498f 100644 --- a/revivetube.py +++ b/revivetube.py @@ -85,13 +85,34 @@ INDEX_TEMPLATE = """ """ +WATCH_STANDARD_TEMPLATE = """ + + + + + + {{ title }} + + +

{{ title }}

+

Uploaded by: {{ uploader }}

+ +

Description:

+

{{ description }}

+ + +""" + WATCH_WII_TEMPLATE = """ - ReviveTube Video + {{ title }}
@@ -102,29 +123,14 @@ WATCH_WII_TEMPLATE = """

If the video does not play smoothly, restart the Internet Channel by pressing the Home button and then Reset. It's a bug. It happens if you visit too many Sites

+

{{ title }}

+

Uploaded by: {{ uploader }}

+

Description:

+

{{ description }}

""" -WATCH_STANDARD_TEMPLATE = """ - - - - - - ReviveTube Video - - -

ReviveTube Video

- - - -""" - -# Routen @app.route("/", methods=["GET"]) def index(): query = request.args.get("query") @@ -149,12 +155,34 @@ def index(): "id": item["id"]["videoId"], "title": item["snippet"]["title"], "uploader": item["snippet"]["channelTitle"], - "thumbnail": item["snippet"]["thumbnails"]["high"]["url"], + "thumbnail": f"/thumbnail/{item['id']['videoId']}", } for item in data.get("items", []) ] return render_template_string(INDEX_TEMPLATE, results=results) +@app.route("/video_metadata/") +def video_metadata(video_id): + # Metadaten aus der YouTube-API abrufen + params = { + "part": "snippet", + "id": video_id, + "key": YOUTUBE_API_KEY, + } + response = requests.get(YOUTUBE_SEARCH_URL.replace("search", "videos"), params=params, timeout=3) + if response.status_code != 200: + return {"error": "Failed to fetch metadata"}, 500 + + data = response.json() + if "items" not in data or not data["items"]: + return {"error": "No metadata found"}, 404 + + video_data = data["items"][0]["snippet"] + return { + "title": video_data["title"], + "uploader": video_data["channelTitle"], + "description": video_data["description"], + } @app.route("/watch", methods=["GET"]) def watch(): @@ -162,6 +190,13 @@ def watch(): if not video_id: return "Missing video ID.", 400 + # Metadaten abrufen + metadata_response = requests.get(f"http://127.0.0.1:5000/video_metadata/{video_id}") + if metadata_response.status_code != 200: + return f"Failed to fetch video metadata: {metadata_response.text}", 500 + + metadata = metadata_response.json() + # User-Agent prüfen user_agent = request.headers.get("User-Agent", "").lower() is_wii = "wii" in user_agent and "wiiu" not in user_agent @@ -178,7 +213,7 @@ def watch(): response = requests.get(video_url, stream=True, timeout=10) if response.status_code != 200: return f"Failed to download video. HTTP Status: {response.status_code}, Reason: {response.reason}", 500 - + # Check file size during download total_size = 0 with open(video_mp4_path, "wb") as f: @@ -192,12 +227,6 @@ def watch(): except requests.exceptions.RequestException as e: return f"An error occurred while downloading the video: {str(e)}", 500 - # Check folder size - if get_folder_size(VIDEO_FOLDER) > MAX_FOLDER_SIZE: - shutil.rmtree(VIDEO_FOLDER) - os.makedirs(VIDEO_FOLDER, exist_ok=True) # Recreate the folder after deletion - return "The video folder exceeded 5 GB and was deleted.", 400 - # Für Wii in FLV umwandeln if is_wii and not os.path.exists(video_flv_path): try: @@ -219,15 +248,32 @@ def watch(): # Passendes Template rendern if is_wii: - return render_template_string(WATCH_WII_TEMPLATE, video_flv=f"/videos/{video_id}.flv") + return render_template_string(WATCH_WII_TEMPLATE, video_flv=f"/videos/{video_id}.flv", **metadata) else: - return render_template_string(WATCH_STANDARD_TEMPLATE, video_mp4=f"/videos/{video_id}.mp4") - + return render_template_string(WATCH_STANDARD_TEMPLATE, video_mp4=f"/videos/{video_id}.mp4", **metadata) @app.route("/") def serve_static(filename): return send_file(os.path.join(filename)) +@app.route("/thumbnail/") +def get_thumbnail(video_id): + thumbnail_url = f"https://img.youtube.com/vi/{video_id}/hqdefault.jpg" + + try: + # Thumbnail von YouTube abrufen + response = requests.get(thumbnail_url, stream=True, timeout=5) + if response.status_code == 200: + # Content-Type weiterleiten + return send_file( + response.raw, + mimetype=response.headers.get("Content-Type", "image/jpeg"), + as_attachment=False, + ) + else: + return f"Failed to fetch thumbnail. Status: {response.status_code}", 500 + except requests.exceptions.RequestException as e: + return f"Error fetching thumbnail: {str(e)}", 500 if __name__ == "__main__": app.run(debug=True)