mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-09 07:10:34 +02:00
commit
6aa4015e03
|
@ -85,8 +85,6 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var uri = new Uri(location);
|
|
||||||
|
|
||||||
lock (_nonRendererUrls)
|
lock (_nonRendererUrls)
|
||||||
{
|
{
|
||||||
if ((DateTime.UtcNow - _lastRendererClear).TotalMinutes >= 10)
|
if ((DateTime.UtcNow - _lastRendererClear).TotalMinutes >= 10)
|
||||||
|
@ -101,6 +99,7 @@ namespace MediaBrowser.Dlna.PlayTo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var uri = new Uri(location);
|
||||||
var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
|
var device = await Device.CreateuPnpDeviceAsync(uri, _httpClient, _config, _logger).ConfigureAwait(false);
|
||||||
|
|
||||||
if (device.RendererCommands == null)
|
if (device.RendererCommands == null)
|
||||||
|
|
|
@ -31,8 +31,8 @@ namespace MediaBrowser.Dlna.Profiles
|
||||||
MaxIconWidth = 48;
|
MaxIconWidth = 48;
|
||||||
MaxIconHeight = 48;
|
MaxIconHeight = 48;
|
||||||
|
|
||||||
MaxStreamingBitrate = 10000000;
|
MaxStreamingBitrate = 12000000;
|
||||||
MaxStaticBitrate = 10000000;
|
MaxStaticBitrate = 12000000;
|
||||||
MusicStreamingTranscodingBitrate = 128000;
|
MusicStreamingTranscodingBitrate = 128000;
|
||||||
MusicSyncBitrate = 128000;
|
MusicSyncBitrate = 128000;
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -22,8 +22,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -24,8 +24,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
<MaxAlbumArtHeight>480</MaxAlbumArtHeight>
|
||||||
<MaxIconWidth>48</MaxIconWidth>
|
<MaxIconWidth>48</MaxIconWidth>
|
||||||
<MaxIconHeight>48</MaxIconHeight>
|
<MaxIconHeight>48</MaxIconHeight>
|
||||||
<MaxStreamingBitrate>10000000</MaxStreamingBitrate>
|
<MaxStreamingBitrate>12000000</MaxStreamingBitrate>
|
||||||
<MaxStaticBitrate>10000000</MaxStaticBitrate>
|
<MaxStaticBitrate>12000000</MaxStaticBitrate>
|
||||||
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
<MusicStreamingTranscodingBitrate>128000</MusicStreamingTranscodingBitrate>
|
||||||
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
<MusicSyncBitrate>128000</MusicSyncBitrate>
|
||||||
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
<XDlnaDoc>DMS-1.50</XDlnaDoc>
|
||||||
|
|
|
@ -132,11 +132,6 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||||
|
|
||||||
internal bool IgnoreMessage(SsdpMessageEventArgs args, bool isMulticast)
|
internal bool IgnoreMessage(SsdpMessageEventArgs args, bool isMulticast)
|
||||||
{
|
{
|
||||||
if (!isMulticast)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
string usn;
|
string usn;
|
||||||
if (args.Headers.TryGetValue("USN", out usn))
|
if (args.Headers.TryGetValue("USN", out usn))
|
||||||
{
|
{
|
||||||
|
@ -243,7 +238,7 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||||
{
|
{
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
{
|
{
|
||||||
await Task.Delay(200).ConfigureAwait(false);
|
await Task.Delay(500).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
var dgram = new Datagram(endpoint, localAddress, _logger, msg, isBroadcast, enableDebugLogging);
|
var dgram = new Datagram(endpoint, localAddress, _logger, msg, isBroadcast, enableDebugLogging);
|
||||||
|
@ -308,17 +303,9 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||||
|
|
||||||
var msg = new SsdpMessageBuilder().BuildMessage(header, values);
|
var msg = new SsdpMessageBuilder().BuildMessage(header, values);
|
||||||
|
|
||||||
var ipEndPoint = endpoint as IPEndPoint;
|
|
||||||
if (ipEndPoint != null)
|
|
||||||
{
|
|
||||||
SendUnicastRequest(msg, ipEndPoint);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SendDatagram(msg, endpoint, null, false, 2);
|
SendDatagram(msg, endpoint, null, false, 2);
|
||||||
SendDatagram(msg, endpoint, new IPEndPoint(d.Address, 0), false, 2);
|
SendDatagram(msg, endpoint, new IPEndPoint(d.Address, 0), false, 2);
|
||||||
//SendDatagram(header, values, endpoint, null, true);
|
//SendDatagram(header, values, endpoint, null, true);
|
||||||
}
|
|
||||||
|
|
||||||
if (enableDebugLogging)
|
if (enableDebugLogging)
|
||||||
{
|
{
|
||||||
|
@ -481,7 +468,6 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||||
values["NTS"] = "ssdp:" + type;
|
values["NTS"] = "ssdp:" + type;
|
||||||
values["NT"] = dev.Type;
|
values["NT"] = dev.Type;
|
||||||
values["USN"] = dev.USN;
|
values["USN"] = dev.USN;
|
||||||
values["X-EMBY-SERVERID"] = _appHost.SystemId;
|
|
||||||
|
|
||||||
if (logMessage)
|
if (logMessage)
|
||||||
{
|
{
|
||||||
|
@ -490,7 +476,7 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||||
|
|
||||||
var msg = new SsdpMessageBuilder().BuildMessage(header, values);
|
var msg = new SsdpMessageBuilder().BuildMessage(header, values);
|
||||||
|
|
||||||
SendDatagram(msg, _ssdpEndp, new IPEndPoint(dev.Address, 0), true);
|
SendDatagram(msg, _ssdpEndp, new IPEndPoint(dev.Address, 0), true, 1);
|
||||||
//SendUnicastRequest(msg, 1);
|
//SendUnicastRequest(msg, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -612,8 +598,6 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.Debug("Sending unicast search request");
|
|
||||||
|
|
||||||
var ipSsdp = IPAddress.Parse(SSDPAddr);
|
var ipSsdp = IPAddress.Parse(SSDPAddr);
|
||||||
var ipTxEnd = new IPEndPoint(ipSsdp, SSDPPort);
|
var ipTxEnd = new IPEndPoint(ipSsdp, SSDPPort);
|
||||||
|
|
||||||
|
@ -627,7 +611,7 @@ namespace MediaBrowser.Dlna.Ssdp
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_logger.Debug("Sending unicast search request");
|
//_logger.Debug("Sending unicast request");
|
||||||
|
|
||||||
byte[] req = Encoding.ASCII.GetBytes(request);
|
byte[] req = Encoding.ASCII.GetBytes(request);
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
_fileSystem = fileSystem;
|
_fileSystem = fileSystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Record(MediaSourceInfo mediaSource, string targetFile, Action onStarted, CancellationToken cancellationToken)
|
public async Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var httpRequestOptions = new HttpRequestOptions()
|
var httpRequestOptions = new HttpRequestOptions()
|
||||||
{
|
{
|
||||||
|
@ -42,7 +42,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
_logger.Info("Copying recording stream to file stream");
|
_logger.Info("Copying recording stream to file stream");
|
||||||
|
|
||||||
await response.Content.CopyToAsync(output, StreamDefaults.DefaultCopyToBufferSize, cancellationToken).ConfigureAwait(false);
|
var durationToken = new CancellationTokenSource(duration);
|
||||||
|
var linkedToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
|
||||||
|
|
||||||
|
await response.Content.CopyToAsync(output, StreamDefaults.DefaultCopyToBufferSize, linkedToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,8 +103,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
public event EventHandler<RecordingStatusChangedEventArgs> RecordingStatusChanged;
|
public event EventHandler<RecordingStatusChangedEventArgs> RecordingStatusChanged;
|
||||||
|
|
||||||
private readonly ConcurrentDictionary<string, CancellationTokenSource> _activeRecordings =
|
private readonly ConcurrentDictionary<string, ActiveRecordingInfo> _activeRecordings =
|
||||||
new ConcurrentDictionary<string, CancellationTokenSource>(StringComparer.OrdinalIgnoreCase);
|
new ConcurrentDictionary<string, ActiveRecordingInfo>(StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
public string Name
|
public string Name
|
||||||
{
|
{
|
||||||
|
@ -268,11 +268,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
_timerProvider.Delete(remove);
|
_timerProvider.Delete(remove);
|
||||||
}
|
}
|
||||||
CancellationTokenSource cancellationTokenSource;
|
ActiveRecordingInfo activeRecordingInfo;
|
||||||
|
|
||||||
if (_activeRecordings.TryGetValue(timerId, out cancellationTokenSource))
|
if (_activeRecordings.TryGetValue(timerId, out activeRecordingInfo))
|
||||||
{
|
{
|
||||||
cancellationTokenSource.Cancel();
|
activeRecordingInfo.CancellationTokenSource.Cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,11 +653,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var cancellationTokenSource = new CancellationTokenSource();
|
var activeRecordingInfo = new ActiveRecordingInfo
|
||||||
|
|
||||||
if (_activeRecordings.TryAdd(timer.Id, cancellationTokenSource))
|
|
||||||
{
|
{
|
||||||
await RecordStream(timer, recordingEndDate, cancellationTokenSource.Token).ConfigureAwait(false);
|
CancellationTokenSource = new CancellationTokenSource(),
|
||||||
|
TimerId = timer.Id
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_activeRecordings.TryAdd(timer.Id, activeRecordingInfo))
|
||||||
|
{
|
||||||
|
await RecordStream(timer, recordingEndDate, activeRecordingInfo, activeRecordingInfo.CancellationTokenSource.Token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -674,7 +678,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, CancellationToken cancellationToken)
|
private async Task RecordStream(TimerInfo timer, DateTime recordingEndDate, ActiveRecordingInfo activeRecordingInfo, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (timer == null)
|
if (timer == null)
|
||||||
{
|
{
|
||||||
|
@ -729,8 +733,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
var recordingFileName = _fileSystem.GetValidFilename(RecordingHelper.GetRecordingName(timer, info)).Trim() + ".ts";
|
var recordingFileName = _fileSystem.GetValidFilename(RecordingHelper.GetRecordingName(timer, info)).Trim() + ".ts";
|
||||||
|
|
||||||
recordPath = Path.Combine(recordPath, recordingFileName);
|
recordPath = Path.Combine(recordPath, recordingFileName);
|
||||||
recordPath = EnsureFileUnique(recordPath);
|
|
||||||
_fileSystem.CreateDirectory(Path.GetDirectoryName(recordPath));
|
|
||||||
|
|
||||||
var recordingId = info.Id.GetMD5().ToString("N");
|
var recordingId = info.Id.GetMD5().ToString("N");
|
||||||
var recording = _recordingProvider.GetAll().FirstOrDefault(x => string.Equals(x.Id, recordingId, StringComparison.OrdinalIgnoreCase));
|
var recording = _recordingProvider.GetAll().FirstOrDefault(x => string.Equals(x.Id, recordingId, StringComparison.OrdinalIgnoreCase));
|
||||||
|
@ -788,6 +790,9 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
recordPath = Path.ChangeExtension(recordPath, ".mp4");
|
recordPath = Path.ChangeExtension(recordPath, ".mp4");
|
||||||
}
|
}
|
||||||
|
recordPath = EnsureFileUnique(recordPath, timer.Id);
|
||||||
|
_fileSystem.CreateDirectory(Path.GetDirectoryName(recordPath));
|
||||||
|
activeRecordingInfo.Path = recordPath;
|
||||||
|
|
||||||
_libraryMonitor.ReportFileSystemChangeBeginning(recordPath);
|
_libraryMonitor.ReportFileSystemChangeBeginning(recordPath);
|
||||||
|
|
||||||
|
@ -798,9 +803,6 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
|
|
||||||
_logger.Info("Beginning recording. Will record for {0} minutes.", duration.TotalMinutes.ToString(CultureInfo.InvariantCulture));
|
_logger.Info("Beginning recording. Will record for {0} minutes.", duration.TotalMinutes.ToString(CultureInfo.InvariantCulture));
|
||||||
|
|
||||||
var durationToken = new CancellationTokenSource(duration);
|
|
||||||
var linkedToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, durationToken.Token).Token;
|
|
||||||
|
|
||||||
_logger.Info("Writing file to path: " + recordPath);
|
_logger.Info("Writing file to path: " + recordPath);
|
||||||
_logger.Info("Opening recording stream from tuner provider");
|
_logger.Info("Opening recording stream from tuner provider");
|
||||||
|
|
||||||
|
@ -810,10 +812,10 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
isResourceOpen = false;
|
isResourceOpen = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
await recorder.Record(mediaStreamInfo, recordPath, onStarted, linkedToken).ConfigureAwait(false);
|
await recorder.Record(mediaStreamInfo, recordPath, duration, onStarted, cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
recording.Status = RecordingStatus.Completed;
|
recording.Status = RecordingStatus.Completed;
|
||||||
_logger.Info("Recording completed");
|
_logger.Info("Recording completed: {0}", recordPath);
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
@ -827,17 +829,17 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
catch (OperationCanceledException)
|
catch (OperationCanceledException)
|
||||||
{
|
{
|
||||||
_logger.Info("Recording stopped");
|
_logger.Info("Recording stopped: {0}", recordPath);
|
||||||
recording.Status = RecordingStatus.Completed;
|
recording.Status = RecordingStatus.Completed;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.ErrorException("Error recording", ex);
|
_logger.ErrorException("Error recording to {0}", ex, recordPath);
|
||||||
recording.Status = RecordingStatus.Error;
|
recording.Status = RecordingStatus.Error;
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
CancellationTokenSource removed;
|
ActiveRecordingInfo removed;
|
||||||
_activeRecordings.TryRemove(timer.Id, out removed);
|
_activeRecordings.TryRemove(timer.Id, out removed);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,12 +865,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string EnsureFileUnique(string path)
|
private string EnsureFileUnique(string path, string timerId)
|
||||||
{
|
{
|
||||||
var originalPath = path;
|
var originalPath = path;
|
||||||
var index = 1;
|
var index = 1;
|
||||||
|
|
||||||
while (_fileSystem.FileExists(path))
|
while (FileExists(path, timerId))
|
||||||
{
|
{
|
||||||
var parent = Path.GetDirectoryName(originalPath);
|
var parent = Path.GetDirectoryName(originalPath);
|
||||||
var name = Path.GetFileNameWithoutExtension(originalPath);
|
var name = Path.GetFileNameWithoutExtension(originalPath);
|
||||||
|
@ -881,6 +883,22 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private bool FileExists(string path, string timerId)
|
||||||
|
{
|
||||||
|
if (_fileSystem.FileExists(path))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hasRecordingAtPath = _activeRecordings.Values.ToList().Any(i => string.Equals(i.Path, path, StringComparison.OrdinalIgnoreCase) && !string.Equals(i.TimerId, timerId, StringComparison.OrdinalIgnoreCase));
|
||||||
|
|
||||||
|
if (hasRecordingAtPath)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private async Task<IRecorder> GetRecorder()
|
private async Task<IRecorder> GetRecorder()
|
||||||
{
|
{
|
||||||
if (GetConfiguration().EnableRecordingEncoding)
|
if (GetConfiguration().EnableRecordingEncoding)
|
||||||
|
@ -1064,7 +1082,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
foreach (var pair in _activeRecordings.ToList())
|
foreach (var pair in _activeRecordings.ToList())
|
||||||
{
|
{
|
||||||
pair.Value.Cancel();
|
pair.Value.CancellationTokenSource.Cancel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1081,5 +1099,12 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
IsRegistered = true
|
IsRegistered = true
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ActiveRecordingInfo
|
||||||
|
{
|
||||||
|
public string Path { get; set; }
|
||||||
|
public string TimerId { get; set; }
|
||||||
|
public CancellationTokenSource CancellationTokenSource { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -38,7 +38,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
_json = json;
|
_json = json;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task Record(MediaSourceInfo mediaSource, string targetFile, Action onStarted, CancellationToken cancellationToken)
|
public async Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
_targetPath = targetFile;
|
_targetPath = targetFile;
|
||||||
_fileSystem.CreateDirectory(Path.GetDirectoryName(targetFile));
|
_fileSystem.CreateDirectory(Path.GetDirectoryName(targetFile));
|
||||||
|
@ -56,7 +56,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
RedirectStandardInput = true,
|
RedirectStandardInput = true,
|
||||||
|
|
||||||
FileName = _mediaEncoder.EncoderPath,
|
FileName = _mediaEncoder.EncoderPath,
|
||||||
Arguments = GetCommandLineArgs(mediaSource, targetFile),
|
Arguments = GetCommandLineArgs(mediaSource, targetFile, duration),
|
||||||
|
|
||||||
WindowStyle = ProcessWindowStyle.Hidden,
|
WindowStyle = ProcessWindowStyle.Hidden,
|
||||||
ErrorDialog = false
|
ErrorDialog = false
|
||||||
|
@ -100,7 +100,7 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private string GetCommandLineArgs(MediaSourceInfo mediaSource, string targetFile)
|
private string GetCommandLineArgs(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration)
|
||||||
{
|
{
|
||||||
string videoArgs;
|
string videoArgs;
|
||||||
if (EncodeVideo(mediaSource))
|
if (EncodeVideo(mediaSource))
|
||||||
|
@ -116,14 +116,14 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
videoArgs = "-codec:v:0 copy";
|
videoArgs = "-codec:v:0 copy";
|
||||||
}
|
}
|
||||||
|
|
||||||
var commandLineArgs = "-fflags +genpts -async 1 -vsync -1 -i \"{0}\" -sn {2} -map_metadata -1 -threads 0 {3} -y \"{1}\"";
|
var commandLineArgs = "-fflags +genpts -async 1 -vsync -1 -i \"{0}\" -t {4} -sn {2} -map_metadata -1 -threads 0 {3} -y \"{1}\"";
|
||||||
|
|
||||||
if (mediaSource.ReadAtNativeFramerate)
|
if (mediaSource.ReadAtNativeFramerate)
|
||||||
{
|
{
|
||||||
commandLineArgs = "-re " + commandLineArgs;
|
commandLineArgs = "-re " + commandLineArgs;
|
||||||
}
|
}
|
||||||
|
|
||||||
commandLineArgs = string.Format(commandLineArgs, mediaSource.Path, targetFile, videoArgs, GetAudioArgs(mediaSource));
|
commandLineArgs = string.Format(commandLineArgs, mediaSource.Path, targetFile, videoArgs, GetAudioArgs(mediaSource), _mediaEncoder.GetTimeParameter(duration.Ticks));
|
||||||
|
|
||||||
return commandLineArgs;
|
return commandLineArgs;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,15 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
{
|
{
|
||||||
public interface IRecorder
|
public interface IRecorder
|
||||||
{
|
{
|
||||||
Task Record(MediaSourceInfo mediaSource, string targetFile, Action onStarted, CancellationToken cancellationToken);
|
/// <summary>
|
||||||
|
/// Records the specified media source.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="mediaSource">The media source.</param>
|
||||||
|
/// <param name="targetFile">The target file.</param>
|
||||||
|
/// <param name="duration">The duration.</param>
|
||||||
|
/// <param name="onStarted">The on started.</param>
|
||||||
|
/// <param name="cancellationToken">The cancellation token.</param>
|
||||||
|
/// <returns>Task.</returns>
|
||||||
|
Task Record(MediaSourceInfo mediaSource, string targetFile, TimeSpan duration, Action onStarted, CancellationToken cancellationToken);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,13 +56,13 @@ namespace MediaBrowser.Server.Implementations.LiveTv.EmbyTV
|
||||||
name += " " + info.OriginalAirDate.Value.ToString("yyyy-MM-dd");
|
name += " " + info.OriginalAirDate.Value.ToString("yyyy-MM-dd");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(info.EpisodeTitle))
|
||||||
|
{
|
||||||
if (addHyphen)
|
if (addHyphen)
|
||||||
{
|
{
|
||||||
name += " -";
|
name += " -";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(info.EpisodeTitle))
|
|
||||||
{
|
|
||||||
name += " " + info.EpisodeTitle;
|
name += " " + info.EpisodeTitle;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -951,6 +951,11 @@ namespace MediaBrowser.Server.Implementations.LiveTv.Listings
|
||||||
public string stationID { get; set; }
|
public string stationID { get; set; }
|
||||||
public List<Program> programs { get; set; }
|
public List<Program> programs { get; set; }
|
||||||
public MetadataSchedule metadata { get; set; }
|
public MetadataSchedule metadata { get; set; }
|
||||||
|
|
||||||
|
public Day()
|
||||||
|
{
|
||||||
|
programs = new List<Program>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -239,7 +239,11 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
||||||
typeof(Year).Name,
|
typeof(Year).Name,
|
||||||
typeof(Channel).Name,
|
typeof(Channel).Name,
|
||||||
typeof(AggregateFolder).Name,
|
typeof(AggregateFolder).Name,
|
||||||
typeof(CollectionFolder).Name
|
typeof(CollectionFolder).Name,
|
||||||
|
|
||||||
|
// LiveTVManager handles recordings
|
||||||
|
typeof(LiveTvAudioRecording).Name,
|
||||||
|
typeof(LiveTvVideoRecording).Name
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -308,6 +308,11 @@ namespace MediaBrowser.Server.Implementations.Sync
|
||||||
throw new ArgumentException("Unrecognized category: " + category);
|
throw new ArgumentException("Unrecognized category: " + category);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parent == null)
|
||||||
|
{
|
||||||
|
return new List<BaseItem>();
|
||||||
|
}
|
||||||
|
|
||||||
query.User = user;
|
query.User = user;
|
||||||
|
|
||||||
var result = await parent.GetItems(query).ConfigureAwait(false);
|
var result = await parent.GetItems(query).ConfigureAwait(false);
|
||||||
|
|
|
@ -481,9 +481,6 @@
|
||||||
<Content Include="dashboard-ui\photos.html">
|
<Content Include="dashboard-ui\photos.html">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
<Content Include="dashboard-ui\scripts\appsettings.js">
|
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
|
||||||
</Content>
|
|
||||||
<Content Include="dashboard-ui\scripts\dashboardhosting.js">
|
<Content Include="dashboard-ui\scripts\dashboardhosting.js">
|
||||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||||
</Content>
|
</Content>
|
||||||
|
|
Loading…
Reference in a new issue