mirror of
https://github.com/Dispatcharr/Dispatcharr.git
synced 2026-08-02 06:42:32 +00:00
Uses correct api to slected specific stream id.
This commit is contained in:
parent
c61c7573bd
commit
1a1c5dea9e
3 changed files with 78 additions and 23 deletions
|
|
@ -335,14 +335,31 @@ def change_stream(request, channel_id):
|
|||
data = json.loads(request.body)
|
||||
new_url = data.get('url')
|
||||
user_agent = data.get('user_agent')
|
||||
stream_id = data.get('stream_id')
|
||||
|
||||
if not new_url:
|
||||
return JsonResponse({'error': 'No URL provided'}, status=400)
|
||||
# If stream_id is provided, get the URL and user_agent from it
|
||||
if stream_id:
|
||||
logger.info(f"Stream ID {stream_id} provided, looking up stream info for channel {channel_id}")
|
||||
stream_info = get_stream_info_for_switch(channel_id, stream_id)
|
||||
|
||||
logger.info(f"Attempting to change stream URL for channel {channel_id} to {new_url}")
|
||||
if 'error' in stream_info:
|
||||
return JsonResponse({
|
||||
'error': stream_info['error'],
|
||||
'stream_id': stream_id
|
||||
}, status=404)
|
||||
|
||||
# Use the info from the stream
|
||||
new_url = stream_info['url']
|
||||
user_agent = stream_info['user_agent']
|
||||
# Stream ID will be passed to change_stream_url later
|
||||
elif not new_url:
|
||||
return JsonResponse({'error': 'Either url or stream_id must be provided'}, status=400)
|
||||
|
||||
logger.info(f"Attempting to change stream for channel {channel_id} to {new_url}")
|
||||
|
||||
# Use the service layer instead of direct implementation
|
||||
result = ChannelService.change_stream_url(channel_id, new_url, user_agent)
|
||||
# Pass stream_id to ensure proper connection tracking
|
||||
result = ChannelService.change_stream_url(channel_id, new_url, user_agent, stream_id)
|
||||
|
||||
# Get the stream manager before updating URL
|
||||
stream_manager = proxy_server.stream_managers.get(channel_id)
|
||||
|
|
@ -360,22 +377,19 @@ def change_stream(request, channel_id):
|
|||
}, status=404)
|
||||
|
||||
# Format response based on whether it was a direct update or event-based
|
||||
if result.get('direct_update'):
|
||||
return JsonResponse({
|
||||
'message': 'Stream URL updated',
|
||||
'channel': channel_id,
|
||||
'url': new_url,
|
||||
'owner': True,
|
||||
'worker_id': proxy_server.worker_id
|
||||
})
|
||||
else:
|
||||
return JsonResponse({
|
||||
'message': 'Stream URL change requested',
|
||||
'channel': channel_id,
|
||||
'url': new_url,
|
||||
'owner': False,
|
||||
'worker_id': proxy_server.worker_id
|
||||
})
|
||||
response_data = {
|
||||
'message': 'Stream changed successfully',
|
||||
'channel': channel_id,
|
||||
'url': new_url,
|
||||
'owner': result.get('direct_update', False),
|
||||
'worker_id': proxy_server.worker_id
|
||||
}
|
||||
|
||||
# Include stream_id in response if it was used
|
||||
if stream_id:
|
||||
response_data['stream_id'] = stream_id
|
||||
|
||||
return JsonResponse(response_data)
|
||||
|
||||
except json.JSONDecodeError:
|
||||
return JsonResponse({'error': 'Invalid JSON'}, status=400)
|
||||
|
|
|
|||
|
|
@ -1240,6 +1240,20 @@ export default class API {
|
|||
}
|
||||
|
||||
static async switchStream(channelId, streamId) {
|
||||
try {
|
||||
const response = await request(`${host}/proxy/ts/change_stream/${channelId}`, {
|
||||
method: 'POST',
|
||||
body: { stream_id: streamId },
|
||||
});
|
||||
|
||||
return response;
|
||||
} catch (e) {
|
||||
errorNotification('Failed to switch stream', e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
static async nextStream(channelId, streamId) {
|
||||
try {
|
||||
const response = await request(`${host}/proxy/ts/next_stream/${channelId}`, {
|
||||
method: 'POST',
|
||||
|
|
|
|||
|
|
@ -130,13 +130,40 @@ const ChannelCard = ({ channel, clients, stopClient, stopChannel, logos, channel
|
|||
// Handle stream switching
|
||||
const handleStreamChange = async (streamId) => {
|
||||
try {
|
||||
await API.switchStream(channel.channel_id, streamId);
|
||||
console.log("Switching to stream ID:", streamId);
|
||||
// Find the selected stream in availableStreams for debugging
|
||||
const selectedStream = availableStreams.find(s => s.id.toString() === streamId);
|
||||
console.log("Selected stream details:", selectedStream);
|
||||
|
||||
// Make sure we're passing the correct ID to the API
|
||||
const response = await API.switchStream(channel.channel_id, streamId);
|
||||
console.log("Stream switch API response:", response);
|
||||
|
||||
// Update the local active stream ID immediately
|
||||
setActiveStreamId(streamId);
|
||||
|
||||
// Show detailed notification with stream name
|
||||
notifications.show({
|
||||
title: 'Stream switching',
|
||||
message: `Switching stream for ${channel.name}`,
|
||||
message: `Switching to "${selectedStream?.name}" for ${channel.name}`,
|
||||
color: 'blue.5',
|
||||
});
|
||||
|
||||
// After a short delay, fetch streams again to confirm the switch
|
||||
setTimeout(async () => {
|
||||
try {
|
||||
const channelId = channelsByUUID[channel.channel_id];
|
||||
if (channelId) {
|
||||
const updatedStreamData = await API.getChannelStreams(channelId);
|
||||
console.log("Channel streams after switch:", updatedStreamData);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Error checking streams after switch:", error);
|
||||
}
|
||||
}, 2000);
|
||||
|
||||
} catch (error) {
|
||||
console.error("Stream switch error:", error);
|
||||
notifications.show({
|
||||
title: 'Error switching stream',
|
||||
message: error.toString(),
|
||||
|
|
@ -232,7 +259,7 @@ const ChannelCard = ({ channel, clients, stopClient, stopChannel, logos, channel
|
|||
// Create select options for available streams
|
||||
const streamOptions = availableStreams.map(stream => ({
|
||||
value: stream.id.toString(),
|
||||
label: stream.name || `Stream #${stream.id}`
|
||||
label: `${stream.name || `Stream #${stream.id}`}`, // Make sure stream name is clear
|
||||
}));
|
||||
|
||||
// Debug logging to see what stream_id values we have
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue