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 }}
-
-
-"""
-
-@app.route("/", methods=["GET"])
-def index():
- query = request.args.get("query")
- results = None
-
- if query:
- # YouTube API aufrufen
- params = {
- "part": "snippet",
- "q": query,
- "type": "video",
- "maxResults": 10,
- "key": YOUTUBE_API_KEY,
- }
- response = requests.get(YOUTUBE_SEARCH_URL, params=params, timeout=3)
- data = response.json()
-
- # Ergebnisse verarbeiten
- if response.status_code == 200 and "items" in data:
- results = [
- {
- "id": item["id"]["videoId"],
- "title": item["snippet"]["title"],
- "uploader": item["snippet"]["channelTitle"],
- "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():
- video_id = request.args.get("video_id")
- 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
-
- # Video-Pfade
- video_mp4_path = os.path.join(VIDEO_FOLDER, f"{video_id}.mp4")
- video_flv_path = os.path.join(VIDEO_FOLDER, f"{video_id}.flv")
-
- # Video herunterladen, falls nicht vorhanden
- if not os.path.exists(video_mp4_path):
- video_url = f"{RIITUBE_BASE_URL}video/wii/?q={video_id}"
-
- try:
- 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:
- for chunk in response.iter_content(chunk_size=8192):
- f.write(chunk)
- total_size += len(chunk)
- if total_size > MAX_VIDEO_SIZE:
- os.remove(video_mp4_path)
- return "Video exceeds 1 GB in size.", 400
-
- except requests.exceptions.RequestException as e:
- return f"An error occurred while downloading the video: {str(e)}", 500
-
- # Für Wii in FLV umwandeln
- if is_wii and not os.path.exists(video_flv_path):
- try:
- subprocess.run(
- [
- "ffmpeg",
- "-i", video_mp4_path,
- "-ar", "22050",
- "-f", "flv",
- "-s", "320x240",
- "-ab", "32k",
- "-filter:v", "fps=fps=15",
- video_flv_path
- ],
- check=True
- )
- except subprocess.CalledProcessError as e:
- return f"Failed to convert video. Try reloading the Page. Error: {str(e)}", 500
-
- # Passendes Template rendern
- if is_wii:
- 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", **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)