mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-21 05:00:39 +02:00
update dlna resume
This commit is contained in:
parent
5a2c2c1b47
commit
5e5b3614c9
|
@ -265,7 +265,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
var ticks = _device.Position.Ticks;
|
var ticks = _device.Position.Ticks;
|
||||||
|
|
||||||
if (!info.IsDirectStream)
|
if (!EnableClientSideSeek(info))
|
||||||
{
|
{
|
||||||
ticks += info.StartPositionTicks;
|
ticks += info.StartPositionTicks;
|
||||||
}
|
}
|
||||||
|
@ -376,33 +376,28 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
{
|
{
|
||||||
var info = StreamParams.ParseFromUrl(media.Url, _libraryManager, _mediaSourceManager);
|
var info = StreamParams.ParseFromUrl(media.Url, _libraryManager, _mediaSourceManager);
|
||||||
|
|
||||||
if (info.Item != null && !info.IsDirectStream)
|
if (info.Item != null && !EnableClientSideSeek(info))
|
||||||
{
|
{
|
||||||
var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
|
var user = _session.UserId.HasValue ? _userManager.GetUserById(_session.UserId.Value) : null;
|
||||||
var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, info.AudioStreamIndex, info.SubtitleStreamIndex);
|
var newItem = CreatePlaylistItem(info.Item, user, newPosition, info.MediaSourceId, info.AudioStreamIndex, info.SubtitleStreamIndex);
|
||||||
|
|
||||||
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
|
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
|
||||||
|
|
||||||
if (newItem.StreamInfo.IsDirectStream)
|
|
||||||
{
|
|
||||||
await Task.Delay(1000).ConfigureAwait(false);
|
|
||||||
|
|
||||||
var maxWait = 15000000;
|
|
||||||
var currentWait = 0;
|
|
||||||
while (_device.TransportState != TRANSPORTSTATE.PLAYING && currentWait < maxWait)
|
|
||||||
{
|
|
||||||
await Task.Delay(1000).ConfigureAwait(false);
|
|
||||||
currentWait += 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
await _device.Seek(TimeSpan.FromTicks(newPosition)).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
await _device.Seek(TimeSpan.FromTicks(newPosition)).ConfigureAwait(false);
|
await SeekAfterTransportChange(newPosition).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool EnableClientSideSeek(StreamParams info)
|
||||||
|
{
|
||||||
|
return info.IsDirectStream;
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool EnableClientSideSeek(StreamInfo info)
|
||||||
|
{
|
||||||
|
return info.IsDirectStream;
|
||||||
|
}
|
||||||
|
|
||||||
public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken)
|
public Task SendUserDataChangeInfo(UserDataChangeInfo info, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return Task.FromResult(true);
|
return Task.FromResult(true);
|
||||||
|
@ -617,8 +612,10 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
await _device.SetAvTransport(currentitem.StreamUrl, GetDlnaHeaders(currentitem), currentitem.Didl);
|
await _device.SetAvTransport(currentitem.StreamUrl, GetDlnaHeaders(currentitem), currentitem.Didl);
|
||||||
|
|
||||||
var streamInfo = currentitem.StreamInfo;
|
var streamInfo = currentitem.StreamInfo;
|
||||||
if (streamInfo.StartPositionTicks > 0 && streamInfo.IsDirectStream)
|
if (streamInfo.StartPositionTicks > 0 && EnableClientSideSeek(streamInfo))
|
||||||
await _device.Seek(TimeSpan.FromTicks(streamInfo.StartPositionTicks));
|
{
|
||||||
|
await SeekAfterTransportChange(streamInfo.StartPositionTicks).ConfigureAwait(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
@ -752,9 +749,9 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
|
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
|
||||||
|
|
||||||
if (newItem.StreamInfo.IsDirectStream)
|
if (EnableClientSideSeek(newItem.StreamInfo))
|
||||||
{
|
{
|
||||||
await _device.Seek(TimeSpan.FromTicks(newPosition)).ConfigureAwait(false);
|
await SeekAfterTransportChange(newPosition).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -778,17 +775,28 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
|
await _device.SetAvTransport(newItem.StreamUrl, GetDlnaHeaders(newItem), newItem.Didl).ConfigureAwait(false);
|
||||||
|
|
||||||
if (newItem.StreamInfo.IsDirectStream && newPosition > 0)
|
if (EnableClientSideSeek(newItem.StreamInfo) && newPosition > 0)
|
||||||
{
|
{
|
||||||
// This is rather arbitrary, but give the player time to start playing
|
await SeekAfterTransportChange(newPosition).ConfigureAwait(false);
|
||||||
await Task.Delay(5000).ConfigureAwait(false);
|
|
||||||
|
|
||||||
await _device.Seek(TimeSpan.FromTicks(newPosition)).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task SeekAfterTransportChange(long positionTicks)
|
||||||
|
{
|
||||||
|
const int maxWait = 15000000;
|
||||||
|
const int interval = 500;
|
||||||
|
var currentWait = 0;
|
||||||
|
while (_device.TransportState != TRANSPORTSTATE.PLAYING && currentWait < maxWait)
|
||||||
|
{
|
||||||
|
await Task.Delay(interval).ConfigureAwait(false);
|
||||||
|
currentWait += interval;
|
||||||
|
}
|
||||||
|
|
||||||
|
await _device.Seek(TimeSpan.FromTicks(positionTicks)).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
private class StreamParams
|
private class StreamParams
|
||||||
{
|
{
|
||||||
public string ItemId { get; set; }
|
public string ItemId { get; set; }
|
||||||
|
|
Loading…
Reference in a new issue