from flask import Flask, request, Response
import streamlink
import requests
import re
app = Flask(__name__)
def modify_m3u8_content(content):
def replace_mpd_urls(line):
if line.startswith("http") and ".mpd" in line:
scheme = request.scheme
host = request.host
return re.sub(r'^(https?://[^\s]+\.mpd)', lambda match: f'{scheme}://{host}/stream?url={match.group(1)}', line)
return line
return "\n".join(replace_mpd_urls(line) for line in content.splitlines())
@app.route('/playlist.m3u8')
def get_custom_m3u8():
url = request.args.get('url')
if not url:
return "Error: No URL provided", 400
response = requests.get(url)
if response.status_code != 200:
return "Error fetching M3U8 playlist", 500
modified_content = modify_m3u8_content(response.text)
return Response(modified_content, content_type='application/vnd.apple.mpegurl')
def generate_stream(url):
session = streamlink.Streamlink()
streams = session.streams(url)
if "best" not in streams:
raise ValueError("No valid stream found.")
stream = streams["best"]
fd = stream.open()
try:
while True:
chunk = fd.read(8192)
if not chunk:
break
yield chunk
finally:
fd.close()
@app.route('/')
def home():
return '''Streamlink Flask App
'''
@app.route('/stream')
def stream():
url = request.args.get('url')
if not url:
return "Error: No URL provided", 400
try:
return Response(generate_stream(url), content_type='video/mp4')
except ValueError as e:
return f"Error: {e}", 400
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)