Fix HTTP/HTTPS URL handling in M3U playlists
This commit is contained in:
+30
-11
@@ -37,17 +37,28 @@ def parse_m3u_playlist(m3u_path):
|
|||||||
else:
|
else:
|
||||||
current_name = None
|
current_name = None
|
||||||
elif line and not line.startswith('#'):
|
elif line and not line.startswith('#'):
|
||||||
# This is a file path
|
# This is a file path or URL
|
||||||
video_path = line.strip()
|
video_path = line.strip()
|
||||||
# Resolve relative paths relative to M3U file location
|
|
||||||
if not os.path.isabs(video_path):
|
# Check if it's a URL (http, https, rtmp, etc.)
|
||||||
|
is_url = (video_path.startswith('http://') or
|
||||||
|
video_path.startswith('https://') or
|
||||||
|
video_path.startswith('rtmp://') or
|
||||||
|
video_path.startswith('rtsp://') or
|
||||||
|
video_path.startswith('udp://') or
|
||||||
|
video_path.startswith('tcp://'))
|
||||||
|
|
||||||
|
# Only resolve relative paths for local files, not URLs
|
||||||
|
if not is_url and not os.path.isabs(video_path):
|
||||||
m3u_dir = os.path.dirname(os.path.abspath(m3u_path))
|
m3u_dir = os.path.dirname(os.path.abspath(m3u_path))
|
||||||
video_path = os.path.join(m3u_dir, video_path)
|
video_path = os.path.join(m3u_dir, video_path)
|
||||||
video_path = os.path.normpath(video_path)
|
video_path = os.path.normpath(video_path)
|
||||||
|
|
||||||
|
# For URLs, use the URL as-is. For local files, check existence later
|
||||||
videos.append({
|
videos.append({
|
||||||
'name': current_name or os.path.basename(video_path),
|
'name': current_name or (os.path.basename(video_path) if not is_url else video_path),
|
||||||
'path': video_path
|
'path': video_path,
|
||||||
|
'is_url': is_url
|
||||||
})
|
})
|
||||||
current_name = None
|
current_name = None
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
@@ -56,20 +67,22 @@ def parse_m3u_playlist(m3u_path):
|
|||||||
|
|
||||||
return videos
|
return videos
|
||||||
|
|
||||||
def stream_video_to_rtmp(video_path, rtmp_url, ffmpeg_path='ffmpeg', loop=False):
|
def stream_video_to_rtmp(video_path, rtmp_url, ffmpeg_path='ffmpeg', loop=False, is_url=False):
|
||||||
"""
|
"""
|
||||||
Stream a single video file to RTMP server without re-encoding.
|
Stream a single video file or URL to RTMP server without re-encoding.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
video_path: Path to video file
|
video_path: Path to video file or URL
|
||||||
rtmp_url: RTMP server URL
|
rtmp_url: RTMP server URL
|
||||||
ffmpeg_path: Path to ffmpeg executable
|
ffmpeg_path: Path to ffmpeg executable
|
||||||
loop: Whether to loop the video
|
loop: Whether to loop the video
|
||||||
|
is_url: Whether video_path is a URL (not a local file)
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
True if successful, False otherwise
|
True if successful, False otherwise
|
||||||
"""
|
"""
|
||||||
if not os.path.exists(video_path):
|
# Only check file existence for local files, not URLs
|
||||||
|
if not is_url and not os.path.exists(video_path):
|
||||||
print(f"Error: Video file not found: {video_path}")
|
print(f"Error: Video file not found: {video_path}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
@@ -169,10 +182,16 @@ def stream_m3u_to_rtmp(m3u_path, rtmp_url, ffmpeg_path='ffmpeg', loop_playlist=F
|
|||||||
for i, video in enumerate(videos, 1):
|
for i, video in enumerate(videos, 1):
|
||||||
print(f"\n{'='*60}")
|
print(f"\n{'='*60}")
|
||||||
print(f"Streaming video {i}/{len(videos)}: {video['name']}")
|
print(f"Streaming video {i}/{len(videos)}: {video['name']}")
|
||||||
print(f"File: {video['path']}")
|
print(f"Source: {video['path']}")
|
||||||
print(f"{'='*60}\n")
|
print(f"{'='*60}\n")
|
||||||
|
|
||||||
success = stream_video_to_rtmp(video['path'], rtmp_url, ffmpeg_path, loop_video)
|
success = stream_video_to_rtmp(
|
||||||
|
video['path'],
|
||||||
|
rtmp_url,
|
||||||
|
ffmpeg_path,
|
||||||
|
loop_video,
|
||||||
|
video.get('is_url', False)
|
||||||
|
)
|
||||||
|
|
||||||
if not success:
|
if not success:
|
||||||
print(f"Failed to stream: {video['name']}")
|
print(f"Failed to stream: {video['name']}")
|
||||||
|
|||||||
Reference in New Issue
Block a user