mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-06-03 14:28:46 +01:00
merge branch 'master' into auto-manifest
This commit is contained in:
@@ -374,7 +374,7 @@ namespace Emby.Server.Implementations
|
||||
/// <summary>
|
||||
/// Creates an instance of type and resolves all constructor dependencies.
|
||||
/// </summary>
|
||||
/// /// <typeparam name="T">The type.</typeparam>
|
||||
/// <typeparam name="T">The type.</typeparam>
|
||||
/// <returns>T.</returns>
|
||||
public T CreateInstance<T>()
|
||||
=> ActivatorUtilities.CreateInstance<T>(ServiceProvider);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using SQLitePCL.pretty;
|
||||
|
||||
@@ -59,7 +60,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
connection.RunInTransaction(conn =>
|
||||
{
|
||||
conn.ExecuteAll(string.Join(";", queries));
|
||||
conn.ExecuteAll(string.Join(';', queries));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -142,11 +143,10 @@ namespace Emby.Server.Implementations.Data
|
||||
return result[index].ReadGuidFromBlob();
|
||||
}
|
||||
|
||||
[Conditional("DEBUG")]
|
||||
private static void CheckName(string name)
|
||||
{
|
||||
#if DEBUG
|
||||
throw new ArgumentException("Invalid param name: " + name, nameof(name));
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void TryBind(this IStatement statement, string name, double value)
|
||||
|
||||
@@ -687,7 +687,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (item.Genres.Length > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@Genres", string.Join("|", item.Genres));
|
||||
saveItemStatement.TryBind("@Genres", string.Join('|', item.Genres));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -749,7 +749,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (item.LockedFields.Length > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@LockedFields", string.Join("|", item.LockedFields));
|
||||
saveItemStatement.TryBind("@LockedFields", string.Join('|', item.LockedFields));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -758,7 +758,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (item.Studios.Length > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@Studios", string.Join("|", item.Studios));
|
||||
saveItemStatement.TryBind("@Studios", string.Join('|', item.Studios));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -785,7 +785,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (item.Tags.Length > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@Tags", string.Join("|", item.Tags));
|
||||
saveItemStatement.TryBind("@Tags", string.Join('|', item.Tags));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -807,7 +807,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (item is Trailer trailer && trailer.TrailerTypes.Length > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@TrailerTypes", string.Join("|", trailer.TrailerTypes));
|
||||
saveItemStatement.TryBind("@TrailerTypes", string.Join('|', trailer.TrailerTypes));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -902,7 +902,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (item.ProductionLocations.Length > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@ProductionLocations", string.Join("|", item.ProductionLocations));
|
||||
saveItemStatement.TryBind("@ProductionLocations", string.Join('|', item.ProductionLocations));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -911,7 +911,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (item.ExtraIds.Length > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@ExtraIds", string.Join("|", item.ExtraIds));
|
||||
saveItemStatement.TryBind("@ExtraIds", string.Join('|', item.ExtraIds));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -931,7 +931,7 @@ namespace Emby.Server.Implementations.Data
|
||||
string artists = null;
|
||||
if (item is IHasArtist hasArtists && hasArtists.Artists.Count > 0)
|
||||
{
|
||||
artists = string.Join("|", hasArtists.Artists);
|
||||
artists = string.Join('|', hasArtists.Artists);
|
||||
}
|
||||
|
||||
saveItemStatement.TryBind("@Artists", artists);
|
||||
@@ -940,7 +940,7 @@ namespace Emby.Server.Implementations.Data
|
||||
if (item is IHasAlbumArtist hasAlbumArtists
|
||||
&& hasAlbumArtists.AlbumArtists.Count > 0)
|
||||
{
|
||||
albumArtists = string.Join("|", hasAlbumArtists.AlbumArtists);
|
||||
albumArtists = string.Join('|', hasAlbumArtists.AlbumArtists);
|
||||
}
|
||||
|
||||
saveItemStatement.TryBind("@AlbumArtists", albumArtists);
|
||||
@@ -2549,7 +2549,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (groups.Count > 0)
|
||||
{
|
||||
return " Group by " + string.Join(",", groups);
|
||||
return " Group by " + string.Join(',', groups);
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
@@ -2578,7 +2578,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
|
||||
var commandText = "select "
|
||||
+ string.Join(",", GetFinalColumnsToSelect(query, new[] { "count(distinct PresentationUniqueKey)" }))
|
||||
+ string.Join(',', GetFinalColumnsToSelect(query, new[] { "count(distinct PresentationUniqueKey)" }))
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query);
|
||||
|
||||
@@ -2630,7 +2630,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
|
||||
var commandText = "select "
|
||||
+ string.Join(",", GetFinalColumnsToSelect(query, _retriveItemColumns))
|
||||
+ string.Join(',', GetFinalColumnsToSelect(query, _retriveItemColumns))
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query);
|
||||
|
||||
@@ -2880,7 +2880,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
|
||||
var commandText = "select "
|
||||
+ string.Join(",", GetFinalColumnsToSelect(query, _retriveItemColumns))
|
||||
+ string.Join(',', GetFinalColumnsToSelect(query, _retriveItemColumns))
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query);
|
||||
|
||||
@@ -2923,15 +2923,15 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (EnableGroupByPresentationUniqueKey(query))
|
||||
{
|
||||
commandText += " select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" })) + GetFromText();
|
||||
commandText += " select " + string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" })) + GetFromText();
|
||||
}
|
||||
else if (query.GroupBySeriesPresentationUniqueKey)
|
||||
{
|
||||
commandText += " select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (distinct SeriesPresentationUniqueKey)" })) + GetFromText();
|
||||
commandText += " select " + string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (distinct SeriesPresentationUniqueKey)" })) + GetFromText();
|
||||
}
|
||||
else
|
||||
{
|
||||
commandText += " select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (guid)" })) + GetFromText();
|
||||
commandText += " select " + string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (guid)" })) + GetFromText();
|
||||
}
|
||||
|
||||
commandText += GetJoinUserDataText(query)
|
||||
@@ -3039,7 +3039,7 @@ namespace Emby.Server.Implementations.Data
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return " ORDER BY " + string.Join(",", orderBy.Select(i =>
|
||||
return " ORDER BY " + string.Join(',', orderBy.Select(i =>
|
||||
{
|
||||
var columnMap = MapOrderByField(i.Item1, query);
|
||||
|
||||
@@ -3137,7 +3137,7 @@ namespace Emby.Server.Implementations.Data
|
||||
var now = DateTime.UtcNow;
|
||||
|
||||
var commandText = "select "
|
||||
+ string.Join(",", GetFinalColumnsToSelect(query, new[] { "guid" }))
|
||||
+ string.Join(',', GetFinalColumnsToSelect(query, new[] { "guid" }))
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query);
|
||||
|
||||
@@ -3203,7 +3203,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
var now = DateTime.UtcNow;
|
||||
|
||||
var commandText = "select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "guid", "path" })) + GetFromText();
|
||||
var commandText = "select " + string.Join(',', GetFinalColumnsToSelect(query, new[] { "guid", "path" })) + GetFromText();
|
||||
|
||||
var whereClauses = GetWhereClauses(query, null);
|
||||
if (whereClauses.Count != 0)
|
||||
@@ -3284,7 +3284,7 @@ namespace Emby.Server.Implementations.Data
|
||||
var now = DateTime.UtcNow;
|
||||
|
||||
var commandText = "select "
|
||||
+ string.Join(",", GetFinalColumnsToSelect(query, new[] { "guid" }))
|
||||
+ string.Join(',', GetFinalColumnsToSelect(query, new[] { "guid" }))
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query);
|
||||
|
||||
@@ -3327,15 +3327,15 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (EnableGroupByPresentationUniqueKey(query))
|
||||
{
|
||||
commandText += " select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" })) + GetFromText();
|
||||
commandText += " select " + string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" })) + GetFromText();
|
||||
}
|
||||
else if (query.GroupBySeriesPresentationUniqueKey)
|
||||
{
|
||||
commandText += " select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (distinct SeriesPresentationUniqueKey)" })) + GetFromText();
|
||||
commandText += " select " + string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (distinct SeriesPresentationUniqueKey)" })) + GetFromText();
|
||||
}
|
||||
else
|
||||
{
|
||||
commandText += " select " + string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (guid)" })) + GetFromText();
|
||||
commandText += " select " + string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (guid)" })) + GetFromText();
|
||||
}
|
||||
|
||||
commandText += GetJoinUserDataText(query)
|
||||
@@ -3596,7 +3596,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (excludeTypes.Length > 1)
|
||||
{
|
||||
var inClause = string.Join(",", excludeTypes.Select(i => "'" + i + "'"));
|
||||
var inClause = string.Join(',', excludeTypes.Select(i => "'" + i + "'"));
|
||||
whereClauses.Add($"type not in ({inClause})");
|
||||
}
|
||||
}
|
||||
@@ -3607,7 +3607,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (includeTypes.Length > 1)
|
||||
{
|
||||
var inClause = string.Join(",", includeTypes.Select(i => "'" + i + "'"));
|
||||
var inClause = string.Join(',', includeTypes.Select(i => "'" + i + "'"));
|
||||
whereClauses.Add($"type in ({inClause})");
|
||||
}
|
||||
|
||||
@@ -3618,7 +3618,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (query.ChannelIds.Count > 1)
|
||||
{
|
||||
var inClause = string.Join(",", query.ChannelIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
|
||||
var inClause = string.Join(',', query.ChannelIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
|
||||
whereClauses.Add($"ChannelId in ({inClause})");
|
||||
}
|
||||
|
||||
@@ -4351,7 +4351,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (query.Years.Length > 1)
|
||||
{
|
||||
var val = string.Join(",", query.Years);
|
||||
var val = string.Join(',', query.Years);
|
||||
|
||||
whereClauses.Add("ProductionYear in (" + val + ")");
|
||||
}
|
||||
@@ -4401,7 +4401,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (queryMediaTypes.Length > 1)
|
||||
{
|
||||
var val = string.Join(",", queryMediaTypes.Select(i => "'" + i + "'"));
|
||||
var val = string.Join(',', queryMediaTypes.Select(i => "'" + i + "'"));
|
||||
|
||||
whereClauses.Add("MediaType in (" + val + ")");
|
||||
}
|
||||
@@ -4498,7 +4498,7 @@ namespace Emby.Server.Implementations.Data
|
||||
var paramName = "@HasAnyProviderId" + index;
|
||||
|
||||
// this is a search for the placeholder
|
||||
hasProviderIds.Add("ProviderIds like " + paramName + "");
|
||||
hasProviderIds.Add("ProviderIds like " + paramName);
|
||||
|
||||
// this replaces the placeholder with a value, here: %key=val%
|
||||
if (statement != null)
|
||||
@@ -4549,7 +4549,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (enableItemsByName && includedItemByNameTypes.Count > 1)
|
||||
{
|
||||
var itemByNameTypeVal = string.Join(",", includedItemByNameTypes.Select(i => "'" + i + "'"));
|
||||
var itemByNameTypeVal = string.Join(',', includedItemByNameTypes.Select(i => "'" + i + "'"));
|
||||
whereClauses.Add("(TopParentId=@TopParentId or Type in (" + itemByNameTypeVal + "))");
|
||||
}
|
||||
else
|
||||
@@ -4564,7 +4564,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (queryTopParentIds.Length > 1)
|
||||
{
|
||||
var val = string.Join(",", queryTopParentIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
|
||||
var val = string.Join(',', queryTopParentIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
|
||||
|
||||
if (enableItemsByName && includedItemByNameTypes.Count == 1)
|
||||
{
|
||||
@@ -4576,7 +4576,7 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
else if (enableItemsByName && includedItemByNameTypes.Count > 1)
|
||||
{
|
||||
var itemByNameTypeVal = string.Join(",", includedItemByNameTypes.Select(i => "'" + i + "'"));
|
||||
var itemByNameTypeVal = string.Join(',', includedItemByNameTypes.Select(i => "'" + i + "'"));
|
||||
whereClauses.Add("(Type in (" + itemByNameTypeVal + ") or TopParentId in (" + val + "))");
|
||||
}
|
||||
else
|
||||
@@ -4597,7 +4597,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
if (query.AncestorIds.Length > 1)
|
||||
{
|
||||
var inClause = string.Join(",", query.AncestorIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
|
||||
var inClause = string.Join(',', query.AncestorIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
|
||||
whereClauses.Add(string.Format(CultureInfo.InvariantCulture, "Guid in (select itemId from AncestorIds where AncestorIdText in ({0}))", inClause));
|
||||
}
|
||||
|
||||
@@ -5148,7 +5148,7 @@ AND Type = @InternalPersonType)");
|
||||
}
|
||||
else if (queryPersonTypes.Count > 1)
|
||||
{
|
||||
var val = string.Join(",", queryPersonTypes.Select(i => "'" + i + "'"));
|
||||
var val = string.Join(',', queryPersonTypes.Select(i => "'" + i + "'"));
|
||||
|
||||
whereClauses.Add("PersonType in (" + val + ")");
|
||||
}
|
||||
@@ -5162,7 +5162,7 @@ AND Type = @InternalPersonType)");
|
||||
}
|
||||
else if (queryExcludePersonTypes.Count > 1)
|
||||
{
|
||||
var val = string.Join(",", queryExcludePersonTypes.Select(i => "'" + i + "'"));
|
||||
var val = string.Join(',', queryExcludePersonTypes.Select(i => "'" + i + "'"));
|
||||
|
||||
whereClauses.Add("PersonType not in (" + val + ")");
|
||||
}
|
||||
@@ -5308,19 +5308,19 @@ AND Type = @InternalPersonType)");
|
||||
|
||||
var typeClause = itemValueTypes.Length == 1 ?
|
||||
("Type=" + itemValueTypes[0].ToString(CultureInfo.InvariantCulture)) :
|
||||
("Type in (" + string.Join(",", itemValueTypes.Select(i => i.ToString(CultureInfo.InvariantCulture))) + ")");
|
||||
("Type in (" + string.Join(',', itemValueTypes.Select(i => i.ToString(CultureInfo.InvariantCulture))) + ")");
|
||||
|
||||
var commandText = "Select Value From ItemValues where " + typeClause;
|
||||
|
||||
if (withItemTypes.Count > 0)
|
||||
{
|
||||
var typeString = string.Join(",", withItemTypes.Select(i => "'" + i + "'"));
|
||||
var typeString = string.Join(',', withItemTypes.Select(i => "'" + i + "'"));
|
||||
commandText += " AND ItemId In (select guid from typedbaseitems where type in (" + typeString + "))";
|
||||
}
|
||||
|
||||
if (excludeItemTypes.Count > 0)
|
||||
{
|
||||
var typeString = string.Join(",", excludeItemTypes.Select(i => "'" + i + "'"));
|
||||
var typeString = string.Join(',', excludeItemTypes.Select(i => "'" + i + "'"));
|
||||
commandText += " AND ItemId not In (select guid from typedbaseitems where type in (" + typeString + "))";
|
||||
}
|
||||
|
||||
@@ -5363,7 +5363,7 @@ AND Type = @InternalPersonType)");
|
||||
|
||||
var typeClause = itemValueTypes.Length == 1 ?
|
||||
("Type=" + itemValueTypes[0].ToString(CultureInfo.InvariantCulture)) :
|
||||
("Type in (" + string.Join(",", itemValueTypes.Select(i => i.ToString(CultureInfo.InvariantCulture))) + ")");
|
||||
("Type in (" + string.Join(',', itemValueTypes.Select(i => i.ToString(CultureInfo.InvariantCulture))) + ")");
|
||||
|
||||
InternalItemsQuery typeSubQuery = null;
|
||||
|
||||
@@ -5427,7 +5427,7 @@ AND Type = @InternalPersonType)");
|
||||
columns = GetFinalColumnsToSelect(query, columns);
|
||||
|
||||
var commandText = "select "
|
||||
+ string.Join(",", columns)
|
||||
+ string.Join(',', columns)
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query);
|
||||
|
||||
@@ -5504,7 +5504,7 @@ AND Type = @InternalPersonType)");
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
var countText = "select "
|
||||
+ string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" }))
|
||||
+ string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" }))
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query)
|
||||
+ whereText;
|
||||
@@ -5565,7 +5565,7 @@ AND Type = @InternalPersonType)");
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
commandText = "select "
|
||||
+ string.Join(",", GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" }))
|
||||
+ string.Join(',', GetFinalColumnsToSelect(query, new[] { "count (distinct PresentationUniqueKey)" }))
|
||||
+ GetFromText()
|
||||
+ GetJoinUserDataText(query)
|
||||
+ whereText;
|
||||
@@ -6207,9 +6207,9 @@ AND Type = @InternalPersonType)");
|
||||
|
||||
if (item.Type == MediaStreamType.Subtitle)
|
||||
{
|
||||
item.localizedUndefined = _localization.GetLocalizedString("Undefined");
|
||||
item.localizedDefault = _localization.GetLocalizedString("Default");
|
||||
item.localizedForced = _localization.GetLocalizedString("Forced");
|
||||
item.LocalizedUndefined = _localization.GetLocalizedString("Undefined");
|
||||
item.LocalizedDefault = _localization.GetLocalizedString("Default");
|
||||
item.LocalizedForced = _localization.GetLocalizedString("Forced");
|
||||
}
|
||||
|
||||
return item;
|
||||
|
||||
@@ -47,7 +47,7 @@ namespace Emby.Server.Implementations.Data
|
||||
connection.RunInTransaction(
|
||||
db =>
|
||||
{
|
||||
db.ExecuteAll(string.Join(";", new[] {
|
||||
db.ExecuteAll(string.Join(';', new[] {
|
||||
|
||||
"create table if not exists UserDatas (key nvarchar not null, userId INT not null, rating float null, played bit not null, playCount int not null, isFavorite bit not null, playbackPositionTicks bigint not null, lastPlayedDate datetime null, AudioStreamIndex INT, SubtitleStreamIndex INT)",
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="5.0.0" />
|
||||
<PackageReference Include="Mono.Nat" Version="3.0.1" />
|
||||
<PackageReference Include="prometheus-net.DotNetRuntime" Version="3.4.1" />
|
||||
<PackageReference Include="sharpcompress" Version="0.27.1" />
|
||||
<PackageReference Include="sharpcompress" Version="0.28.1" />
|
||||
<PackageReference Include="SQLitePCL.pretty.netstandard" Version="2.1.0" />
|
||||
<PackageReference Include="DotNet.Glob" Version="3.1.2" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
#nullable enable
|
||||
|
||||
using System.Net.Sockets;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
@@ -29,7 +31,7 @@ namespace Emby.Server.Implementations.EntryPoints
|
||||
/// <summary>
|
||||
/// The UDP server.
|
||||
/// </summary>
|
||||
private UdpServer _udpServer;
|
||||
private UdpServer? _udpServer;
|
||||
private CancellationTokenSource _cancellationTokenSource = new CancellationTokenSource();
|
||||
private bool _disposed = false;
|
||||
|
||||
@@ -71,9 +73,8 @@ namespace Emby.Server.Implementations.EntryPoints
|
||||
}
|
||||
|
||||
_cancellationTokenSource.Cancel();
|
||||
_udpServer.Dispose();
|
||||
_cancellationTokenSource.Dispose();
|
||||
_cancellationTokenSource = null;
|
||||
_udpServer?.Dispose();
|
||||
_udpServer = null;
|
||||
|
||||
_disposed = true;
|
||||
|
||||
@@ -79,11 +79,6 @@ namespace Emby.Server.Implementations.Library.Resolvers.Audio
|
||||
return new MusicArtist();
|
||||
}
|
||||
|
||||
if (_config.Configuration.EnableSimpleArtistDetection)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// Avoid mis-identifying top folders
|
||||
if (args.Parent.IsRoot)
|
||||
{
|
||||
|
||||
@@ -35,8 +35,8 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
private readonly ICryptoProvider _cryptoProvider;
|
||||
|
||||
private readonly ConcurrentDictionary<string, NameValuePair> _tokens = new ConcurrentDictionary<string, NameValuePair>();
|
||||
private DateTime _lastErrorResponse;
|
||||
private readonly JsonSerializerOptions _jsonOptions = JsonDefaults.GetOptions();
|
||||
private DateTime _lastErrorResponse;
|
||||
|
||||
public SchedulesDirect(
|
||||
ILogger<SchedulesDirect> logger,
|
||||
@@ -111,7 +111,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
options.Headers.TryAddWithoutValidation("token", token);
|
||||
using var response = await Send(options, true, info, cancellationToken).ConfigureAwait(false);
|
||||
await using var responseStream = await response.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
|
||||
var dailySchedules = await JsonSerializer.DeserializeAsync<List<ScheduleDirect.Day>>(responseStream, _jsonOptions).ConfigureAwait(false);
|
||||
var dailySchedules = await JsonSerializer.DeserializeAsync<List<ScheduleDirect.Day>>(responseStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
|
||||
_logger.LogDebug("Found {ScheduleCount} programs on {ChannelID} ScheduleDirect", dailySchedules.Count, channelId);
|
||||
|
||||
using var programRequestOptions = new HttpRequestMessage(HttpMethod.Post, ApiUrl + "/programs");
|
||||
@@ -122,12 +122,12 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
|
||||
using var innerResponse = await Send(programRequestOptions, true, info, cancellationToken).ConfigureAwait(false);
|
||||
await using var innerResponseStream = await innerResponse.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
|
||||
var programDetails = await JsonSerializer.DeserializeAsync<List<ScheduleDirect.ProgramDetails>>(innerResponseStream, _jsonOptions).ConfigureAwait(false);
|
||||
var programDetails = await JsonSerializer.DeserializeAsync<List<ScheduleDirect.ProgramDetails>>(innerResponseStream, _jsonOptions, cancellationToken).ConfigureAwait(false);
|
||||
var programDict = programDetails.ToDictionary(p => p.programID, y => y);
|
||||
|
||||
var programIdsWithImages =
|
||||
programDetails.Where(p => p.hasImageArtwork).Select(p => p.programID)
|
||||
.ToList();
|
||||
var programIdsWithImages = programDetails
|
||||
.Where(p => p.hasImageArtwork).Select(p => p.programID)
|
||||
.ToList();
|
||||
|
||||
var images = await GetImageForPrograms(info, programIdsWithImages, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
@@ -182,8 +182,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
|
||||
private static int GetSizeOrder(ScheduleDirect.ImageData image)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(image.height)
|
||||
&& int.TryParse(image.height, out int value))
|
||||
if (int.TryParse(image.height, out int value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
@@ -704,7 +703,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
httpResponse.EnsureSuccessStatusCode();
|
||||
await using var stream = await httpResponse.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
|
||||
using var response = httpResponse.Content;
|
||||
var root = await JsonSerializer.DeserializeAsync<ScheduleDirect.Lineups>(stream, _jsonOptions).ConfigureAwait(false);
|
||||
var root = await JsonSerializer.DeserializeAsync<ScheduleDirect.Lineups>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
|
||||
|
||||
return root.lineups.Any(i => string.Equals(info.ListingsId, i.lineup, StringComparison.OrdinalIgnoreCase));
|
||||
}
|
||||
@@ -776,7 +775,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
|
||||
using var httpResponse = await Send(options, true, info, cancellationToken).ConfigureAwait(false);
|
||||
await using var stream = await httpResponse.Content.ReadAsStreamAsync(cancellationToken).ConfigureAwait(false);
|
||||
var root = await JsonSerializer.DeserializeAsync<ScheduleDirect.Channel>(stream, _jsonOptions).ConfigureAwait(false);
|
||||
var root = await JsonSerializer.DeserializeAsync<ScheduleDirect.Channel>(stream, _jsonOptions, cancellationToken).ConfigureAwait(false);
|
||||
_logger.LogInformation("Found {ChannelCount} channels on the lineup on ScheduleDirect", root.map.Count);
|
||||
_logger.LogInformation("Mapping Stations to Channel");
|
||||
|
||||
|
||||
@@ -335,11 +335,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
return new Uri(url).AbsoluteUri.TrimEnd('/');
|
||||
}
|
||||
|
||||
protected EncodingOptions GetEncodingOptions()
|
||||
{
|
||||
return Config.GetConfiguration<EncodingOptions>("encoding");
|
||||
}
|
||||
|
||||
private static string GetHdHrIdFromChannelId(string channelId)
|
||||
{
|
||||
return channelId.Split('_')[1];
|
||||
|
||||
@@ -92,7 +92,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
{
|
||||
try
|
||||
{
|
||||
await tcpClient.ConnectAsync(remoteAddress, HdHomerunManager.HdHomeRunPort).ConfigureAwait(false);
|
||||
await tcpClient.ConnectAsync(remoteAddress, HdHomerunManager.HdHomeRunPort, openCancellationToken).ConfigureAwait(false);
|
||||
localAddress = ((IPEndPoint)tcpClient.Client.LocalEndPoint).Address;
|
||||
tcpClient.Close();
|
||||
}
|
||||
|
||||
@@ -155,7 +155,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
|
||||
|
||||
if (channelIdValues.Count > 0)
|
||||
{
|
||||
channel.Id = string.Join("_", channelIdValues);
|
||||
channel.Id = string.Join('_', channelIdValues);
|
||||
}
|
||||
|
||||
return channel;
|
||||
|
||||
@@ -159,7 +159,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
|
||||
|
||||
EnableStreamSharing = false;
|
||||
await DeleteTempFiles(new List<string> { TempFilePath }).ConfigureAwait(false);
|
||||
});
|
||||
}, CancellationToken.None);
|
||||
}
|
||||
|
||||
private void Resolve(TaskCompletionSource<bool> openTaskCompletionSource)
|
||||
|
||||
@@ -55,26 +55,26 @@
|
||||
"NotificationOptionPluginInstalled": "Приставката е инсталирана",
|
||||
"NotificationOptionPluginUninstalled": "Приставката е деинсталирана",
|
||||
"NotificationOptionPluginUpdateInstalled": "Обновлението на приставката е инсталирано",
|
||||
"NotificationOptionServerRestartRequired": "Нужно е повторно пускане на сървъра",
|
||||
"NotificationOptionServerRestartRequired": "Сървърът трябва да се рестартира",
|
||||
"NotificationOptionTaskFailed": "Грешка в планирана задача",
|
||||
"NotificationOptionUserLockedOut": "Потребителя е заключен",
|
||||
"NotificationOptionUserLockedOut": "Потребителят е заключен",
|
||||
"NotificationOptionVideoPlayback": "Възпроизвеждането на видео започна",
|
||||
"NotificationOptionVideoPlaybackStopped": "Възпроизвеждането на видео е спряно",
|
||||
"Photos": "Снимки",
|
||||
"Playlists": "Списъци",
|
||||
"Plugin": "Приставка",
|
||||
"PluginInstalledWithName": "{0} е инсталирано",
|
||||
"PluginUninstalledWithName": "{0} е деинсталирано",
|
||||
"PluginUpdatedWithName": "{0} е обновено",
|
||||
"PluginInstalledWithName": "{0} е инсталиранa",
|
||||
"PluginUninstalledWithName": "{0} е деинсталиранa",
|
||||
"PluginUpdatedWithName": "{0} е обновенa",
|
||||
"ProviderValue": "Доставчик: {0}",
|
||||
"ScheduledTaskFailedWithName": "{0} се провали",
|
||||
"ScheduledTaskStartedWithName": "{0} започна",
|
||||
"ServerNameNeedsToBeRestarted": "{0} е нужно да се рестартира",
|
||||
"ServerNameNeedsToBeRestarted": "{0} трябва да се рестартира",
|
||||
"Shows": "Сериали",
|
||||
"Songs": "Песни",
|
||||
"StartupEmbyServerIsLoading": "Сървърът зарежда. Моля, опитайте отново след малко.",
|
||||
"SubtitleDownloadFailureForItem": "Неуспешно изтегляне на субтитри за {0}",
|
||||
"SubtitleDownloadFailureFromForItem": "Поднадписите за {1} от {0} не можаха да се изтеглят",
|
||||
"SubtitleDownloadFailureFromForItem": "Субтитрите за {1} от {0} не можаха да бъдат изтеглени",
|
||||
"Sync": "Синхронизиране",
|
||||
"System": "Система",
|
||||
"TvShows": "Телевизионни сериали",
|
||||
@@ -92,12 +92,12 @@
|
||||
"ValueHasBeenAddedToLibrary": "{0} беше добавен във Вашата библиотека",
|
||||
"ValueSpecialEpisodeName": "Специални - {0}",
|
||||
"VersionNumber": "Версия {0}",
|
||||
"TaskDownloadMissingSubtitlesDescription": "Търси Интернет за липсващи поднадписи, на база конфигурацията за мета-данни.",
|
||||
"TaskDownloadMissingSubtitles": "Изтегляне на липсващи поднадписи",
|
||||
"TaskDownloadMissingSubtitlesDescription": "Търси Интернет за липсващи субтитри, на база конфигурацията за мета-данни.",
|
||||
"TaskDownloadMissingSubtitles": "Изтегляне на липсващи субтитри",
|
||||
"TaskRefreshChannelsDescription": "Обновява информацията за интернет канала.",
|
||||
"TaskRefreshChannels": "Обновяване на Канали",
|
||||
"TaskCleanTranscodeDescription": "Изтрива прекодирани файлове по-стари от един ден.",
|
||||
"TaskCleanTranscode": "Изчиства директорията за прекодиране",
|
||||
"TaskCleanTranscodeDescription": "Изтрива транскодирани файлове по-стари от един ден.",
|
||||
"TaskCleanTranscode": "Изчиства директорията за транскодиране",
|
||||
"TaskUpdatePluginsDescription": "Изтегля и инсталира актуализации за добавките, които са настроени за автоматична актуализация.",
|
||||
"TaskUpdatePlugins": "Актуализира добавките",
|
||||
"TaskRefreshPeopleDescription": "Актуализира мета-данните за артистите и режисьорите за Вашата медийна библиотека.",
|
||||
|
||||
@@ -4,11 +4,11 @@
|
||||
"VersionNumber": "Верзија {0}",
|
||||
"ValueSpecialEpisodeName": "Специјал - {0}",
|
||||
"ValueHasBeenAddedToLibrary": "{0} је додато у вашу медијску библиотеку",
|
||||
"UserStoppedPlayingItemWithValues": "{0} заврши пуштање {1} на {2}",
|
||||
"UserStoppedPlayingItemWithValues": "{0} завршио пуштање {1} на {2}",
|
||||
"UserStartedPlayingItemWithValues": "{0} пушта {1} на {2}",
|
||||
"UserPasswordChangedWithName": "Лозинка је промењена за корисника {0}",
|
||||
"UserOnlineFromDevice": "{0} је на вези од {1}",
|
||||
"UserOfflineFromDevice": "{0} се одвезао са {1}",
|
||||
"UserOfflineFromDevice": "{0} је прекинуо/а везу са {1}",
|
||||
"UserLockedOutWithName": "Корисник {0} је закључан",
|
||||
"UserDownloadingItemWithValues": "{0} преузима {1}",
|
||||
"UserDeletedWithName": "Корисник {0} је обрисан",
|
||||
@@ -41,7 +41,7 @@
|
||||
"NotificationOptionPluginError": "Грешка прикључка",
|
||||
"NotificationOptionNewLibraryContent": "Додат нови садржај",
|
||||
"NotificationOptionInstallationFailed": "Неуспела инсталација",
|
||||
"NotificationOptionCameraImageUploaded": "Слика са камере послата",
|
||||
"NotificationOptionCameraImageUploaded": "Слика са камере отпремљена",
|
||||
"NotificationOptionAudioPlaybackStopped": "Заустављено пуштање звука",
|
||||
"NotificationOptionAudioPlayback": "Покренуто пуштање звука",
|
||||
"NotificationOptionApplicationUpdateInstalled": "Ажурирање инсталирано",
|
||||
@@ -86,7 +86,7 @@
|
||||
"Channels": "Канали",
|
||||
"CameraImageUploadedFrom": "Нова фотографија је учитана са {0}",
|
||||
"Books": "Књиге",
|
||||
"AuthenticationSucceededWithUserName": "{0} успешно проверено",
|
||||
"AuthenticationSucceededWithUserName": "{0} Успешна аутентикација",
|
||||
"Artists": "Извођачи",
|
||||
"Application": "Апликација",
|
||||
"AppDeviceValues": "Апликација: {0}, Уређај: {1}",
|
||||
@@ -100,7 +100,7 @@
|
||||
"TaskUpdatePluginsDescription": "Преузима и инсталира исправке за додатке који су конфигурисани за аутоматско ажурирање.",
|
||||
"TaskUpdatePlugins": "Ажурирајте додатке",
|
||||
"TaskRefreshPeopleDescription": "Ажурира метаподатке за глумце и редитеље у вашој медијској библиотеци.",
|
||||
"TaskRefreshPeople": "Освежите људе",
|
||||
"TaskRefreshPeople": "Освежите кориснике",
|
||||
"TaskCleanLogsDescription": "Брише логове старије од {0} дана.",
|
||||
"TaskCleanLogs": "Очистите директоријум логова",
|
||||
"TaskRefreshLibraryDescription": "Скенира вашу медијску библиотеку за нове датотеке и освежава метаподатке.",
|
||||
@@ -116,6 +116,6 @@
|
||||
"TaskCleanActivityLogDescription": "Брише историју активности старију од конфигурисаног броја година.",
|
||||
"TaskCleanActivityLog": "Очисти историју активности",
|
||||
"Undefined": "Недефинисано",
|
||||
"Forced": "Форсирано",
|
||||
"Forced": "Принудно",
|
||||
"Default": "Подразумевано"
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
"Favorites": "Yêu Thích",
|
||||
"Folders": "Thư Mục",
|
||||
"Genres": "Thể Loại",
|
||||
"HeaderAlbumArtists": "Bộ Sưu Tập Nghệ sĩ",
|
||||
"HeaderAlbumArtists": "Tuyển Tập Nghệ sĩ",
|
||||
"HeaderContinueWatching": "Xem Tiếp",
|
||||
"HeaderLiveTV": "TV Trực Tiếp",
|
||||
"Movies": "Phim",
|
||||
@@ -13,7 +13,7 @@
|
||||
"Songs": "Các Bài Hát",
|
||||
"Sync": "Đồng Bộ",
|
||||
"ValueSpecialEpisodeName": "Đặc Biệt - {0}",
|
||||
"Albums": "Albums",
|
||||
"Albums": "Tuyển Tập",
|
||||
"Artists": "Các Nghệ Sĩ",
|
||||
"TaskDownloadMissingSubtitlesDescription": "Tìm kiếm phụ đề bị thiếu trên Internet dựa trên cấu hình dữ liệu mô tả.",
|
||||
"TaskDownloadMissingSubtitles": "Tải Xuống Phụ Đề Bị Thiếu",
|
||||
|
||||
@@ -166,7 +166,7 @@ namespace Emby.Server.Implementations.MediaEncoder
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.LogError(ex, "Error extracting chapter images for {0}", string.Join(",", video.Path));
|
||||
_logger.LogError(ex, "Error extracting chapter images for {0}", string.Join(',', video.Path));
|
||||
success = false;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||
|
||||
Directory.CreateDirectory(parentPath);
|
||||
|
||||
string text = string.Join("|", previouslyFailedImages);
|
||||
string text = string.Join('|', previouslyFailedImages);
|
||||
File.WriteAllText(failHistoryPath, text);
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ using System.Linq;
|
||||
using System.Net.WebSockets;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using MediaBrowser.Common.Extensions;
|
||||
using MediaBrowser.Controller.Net;
|
||||
using MediaBrowser.Controller.Session;
|
||||
using MediaBrowser.Model.Net;
|
||||
|
||||
Reference in New Issue
Block a user