mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-04-20 09:04:42 +01:00
fix SA1513/SA1516
This commit is contained in:
@@ -793,6 +793,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
saveItemStatement.TryBindNull("@Width");
|
||||
}
|
||||
|
||||
if (item.Height > 0)
|
||||
{
|
||||
saveItemStatement.TryBind("@Height", item.Height);
|
||||
@@ -932,6 +933,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
saveItemStatement.TryBindNull("@SeriesName");
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(userDataKey))
|
||||
{
|
||||
saveItemStatement.TryBindNull("@UserDataKey");
|
||||
@@ -1007,6 +1009,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
artists = string.Join("|", hasArtists.Artists);
|
||||
}
|
||||
|
||||
saveItemStatement.TryBind("@Artists", artists);
|
||||
|
||||
string albumArtists = null;
|
||||
@@ -1106,6 +1109,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
str.Append(ToValueString(i) + "|");
|
||||
}
|
||||
|
||||
@@ -1366,6 +1370,7 @@ namespace Emby.Server.Implementations.Data
|
||||
hasStartDate.StartDate = reader[index].ReadDateTime();
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1373,12 +1378,14 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.EndDate = reader[index].TryReadDateTime();
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.ChannelId = new Guid(reader.GetString(index));
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (enableProgramAttributes)
|
||||
@@ -1389,24 +1396,28 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
hasProgramAttributes.IsMovie = reader.GetBoolean(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
hasProgramAttributes.IsSeries = reader.GetBoolean(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
hasProgramAttributes.EpisodeTitle = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
hasProgramAttributes.IsRepeat = reader.GetBoolean(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
else
|
||||
@@ -1419,6 +1430,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.CommunityRating = reader.GetFloat(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.CustomRating))
|
||||
@@ -1427,6 +1439,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.CustomRating = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1434,6 +1447,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.IndexNumber = reader.GetInt32(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.Settings))
|
||||
@@ -1442,18 +1456,21 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.IsLocked = reader.GetBoolean(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.PreferredMetadataLanguage = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.PreferredMetadataCountryCode = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1463,6 +1480,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Width = reader.GetInt32(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1472,6 +1490,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Height = reader.GetInt32(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1481,6 +1500,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.DateLastRefreshed = reader[index].ReadDateTime();
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1488,18 +1508,21 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Name = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.Path = RestorePath(reader.GetString(index));
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.PremiereDate = reader[index].TryReadDateTime();
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.Overview))
|
||||
@@ -1508,6 +1531,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Overview = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1515,18 +1539,21 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.ParentIndexNumber = reader.GetInt32(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.ProductionYear = reader.GetInt32(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.OfficialRating = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.SortName))
|
||||
@@ -1535,6 +1562,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.ForcedSortName = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1542,12 +1570,14 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.RunTimeTicks = reader.GetInt64(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.Size = reader.GetInt64(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.DateCreated))
|
||||
@@ -1556,6 +1586,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.DateCreated = reader[index].ReadDateTime();
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1563,6 +1594,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.DateModified = reader[index].ReadDateTime();
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
item.Id = reader.GetGuid(index);
|
||||
@@ -1574,6 +1606,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Genres = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1581,6 +1614,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.ParentId = reader.GetGuid(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
@@ -1590,6 +1624,7 @@ namespace Emby.Server.Implementations.Data
|
||||
item.Audio = audio;
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
// TODO: Even if not needed by apps, the server needs it internally
|
||||
@@ -1603,6 +1638,7 @@ namespace Emby.Server.Implementations.Data
|
||||
liveTvChannel.ServiceName = reader.GetString(index);
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1610,6 +1646,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.IsInMixedFolder = reader.GetBoolean(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.DateLastSaved))
|
||||
@@ -1618,6 +1655,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.DateLastSaved = reader[index].ReadDateTime();
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1635,8 +1673,10 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
item.LockedFields = GetLockedFields(reader.GetString(index)).ToArray();
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1646,6 +1686,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Studios = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1655,6 +1696,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Tags = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1674,9 +1716,11 @@ namespace Emby.Server.Implementations.Data
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trailer.TrailerTypes = GetTrailerTypes(reader.GetString(index)).ToArray();
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1686,6 +1730,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.OriginalTitle = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1696,6 +1741,7 @@ namespace Emby.Server.Implementations.Data
|
||||
video.PrimaryVersionId = reader.GetString(index);
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.DateLastMediaAdded))
|
||||
@@ -1704,6 +1750,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
folder.DateLastMediaAdded = reader[index].TryReadDateTime();
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1711,18 +1758,21 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Album = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.CriticRating = reader.GetFloat(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
item.IsVirtualItem = reader.GetBoolean(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (item is IHasSeries hasSeriesName)
|
||||
@@ -1732,6 +1782,7 @@ namespace Emby.Server.Implementations.Data
|
||||
hasSeriesName.SeriesName = reader.GetString(index);
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (hasEpisodeAttributes)
|
||||
@@ -1742,6 +1793,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
episode.SeasonName = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
if (!reader.IsDBNull(index))
|
||||
{
|
||||
@@ -1752,6 +1804,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
index++;
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1765,6 +1818,7 @@ namespace Emby.Server.Implementations.Data
|
||||
hasSeries.SeriesId = reader.GetGuid(index);
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1774,6 +1828,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.PresentationUniqueKey = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1783,6 +1838,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.InheritedParentalRatingValue = reader.GetInt32(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1792,6 +1848,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.ExternalSeriesId = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1801,6 +1858,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.Tagline = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1808,6 +1866,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
DeserializeProviderIds(reader.GetString(index), item);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (query.DtoOptions.EnableImages)
|
||||
@@ -1816,6 +1875,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
DeserializeImages(reader.GetString(index), item);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1825,6 +1885,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.ProductionLocations = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1834,6 +1895,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.ExtraIds = SplitToGuids(reader.GetString(index));
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1841,6 +1903,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.TotalBitrate = reader.GetInt32(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (!reader.IsDBNull(index))
|
||||
@@ -1850,6 +1913,7 @@ namespace Emby.Server.Implementations.Data
|
||||
item.ExtraType = extraType;
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (hasArtistFields)
|
||||
@@ -1858,12 +1922,14 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
hasArtists.Artists = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (item is IHasAlbumArtist hasAlbumArtists && !reader.IsDBNull(index))
|
||||
{
|
||||
hasAlbumArtists.AlbumArtists = reader.GetString(index).Split(new[] { '|' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1871,6 +1937,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.ExternalId = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
if (HasField(query, ItemFields.SeriesPresentationUniqueKey))
|
||||
@@ -1882,6 +1949,7 @@ namespace Emby.Server.Implementations.Data
|
||||
hasSeries.SeriesPresentationUniqueKey = reader.GetString(index);
|
||||
}
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1891,6 +1959,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
program.ShowId = reader.GetString(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -1898,6 +1967,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
item.OwnerId = reader.GetGuid(index);
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
return item;
|
||||
@@ -2473,6 +2543,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind("@SearchTermStartsWith", searchTerm + "%");
|
||||
}
|
||||
|
||||
if (commandText.IndexOf("@SearchTermContains", StringComparison.OrdinalIgnoreCase) != -1)
|
||||
{
|
||||
statement.TryBind("@SearchTermContains", "%" + searchTerm + "%");
|
||||
@@ -2743,6 +2814,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
items[i] = newItem;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -2835,6 +2907,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statementTexts.Add(commandText);
|
||||
}
|
||||
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
commandText = string.Empty;
|
||||
@@ -3239,6 +3312,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statementTexts.Add(commandText);
|
||||
}
|
||||
|
||||
if (query.EnableTotalRecordCount)
|
||||
{
|
||||
commandText = string.Empty;
|
||||
@@ -3592,11 +3666,13 @@ namespace Emby.Server.Implementations.Data
|
||||
whereClauses.Add("IndexNumber=@IndexNumber");
|
||||
statement?.TryBind("@IndexNumber", query.IndexNumber.Value);
|
||||
}
|
||||
|
||||
if (query.ParentIndexNumber.HasValue)
|
||||
{
|
||||
whereClauses.Add("ParentIndexNumber=@ParentIndexNumber");
|
||||
statement?.TryBind("@ParentIndexNumber", query.ParentIndexNumber.Value);
|
||||
}
|
||||
|
||||
if (query.ParentIndexNumberNotEquals.HasValue)
|
||||
{
|
||||
whereClauses.Add("(ParentIndexNumber<>@ParentIndexNumberNotEquals or ParentIndexNumber is null)");
|
||||
@@ -3882,6 +3958,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, artistId.ToByteArray());
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -3902,6 +3979,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, artistId.ToByteArray());
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -3922,8 +4000,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, artistId.ToByteArray());
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -3941,8 +4021,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, albumId.ToByteArray());
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -3960,8 +4042,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, artistId.ToByteArray());
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -3979,8 +4063,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, genreId.ToByteArray());
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -3996,8 +4082,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind("@Genre" + index, GetCleanValue(item));
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -4013,8 +4101,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind("@Tag" + index, GetCleanValue(item));
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -4030,8 +4120,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind("@ExcludeTag" + index, GetCleanValue(item));
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -4050,8 +4142,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, studioId.ToByteArray());
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -4067,8 +4161,10 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind("@OfficialRating" + index, item);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
var clause = "(" + string.Join(" OR ", clauses) + ")";
|
||||
whereClauses.Add(clause);
|
||||
}
|
||||
@@ -4243,6 +4339,7 @@ namespace Emby.Server.Implementations.Data
|
||||
statement.TryBind("@IsVirtualItem", isVirtualItem.Value);
|
||||
}
|
||||
}
|
||||
|
||||
if (query.IsSpecialSeason.HasValue)
|
||||
{
|
||||
if (query.IsSpecialSeason.Value)
|
||||
@@ -4254,6 +4351,7 @@ namespace Emby.Server.Implementations.Data
|
||||
whereClauses.Add("IndexNumber <> 0");
|
||||
}
|
||||
}
|
||||
|
||||
if (query.IsUnaired.HasValue)
|
||||
{
|
||||
if (query.IsUnaired.Value)
|
||||
@@ -4265,6 +4363,7 @@ namespace Emby.Server.Implementations.Data
|
||||
whereClauses.Add("PremiereDate < DATETIME('now')");
|
||||
}
|
||||
}
|
||||
|
||||
var queryMediaTypes = query.MediaTypes.Where(IsValidMediaType).ToArray();
|
||||
if (queryMediaTypes.Length == 1)
|
||||
{
|
||||
@@ -4280,6 +4379,7 @@ namespace Emby.Server.Implementations.Data
|
||||
|
||||
whereClauses.Add("MediaType in (" + val + ")");
|
||||
}
|
||||
|
||||
if (query.ItemIds.Length > 0)
|
||||
{
|
||||
var includeIds = new List<string>();
|
||||
@@ -4292,11 +4392,13 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind("@IncludeId" + index, id);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
whereClauses.Add("(" + string.Join(" OR ", includeIds) + ")");
|
||||
}
|
||||
|
||||
if (query.ExcludeItemIds.Length > 0)
|
||||
{
|
||||
var excludeIds = new List<string>();
|
||||
@@ -4309,6 +4411,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind("@ExcludeId" + index, id);
|
||||
}
|
||||
|
||||
index++;
|
||||
}
|
||||
|
||||
@@ -4333,6 +4436,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, "%" + pair.Key + "=" + pair.Value + "%");
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
break;
|
||||
@@ -4375,6 +4479,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
statement.TryBind(paramName, "%" + pair.Key + "=" + pair.Value + "%");
|
||||
}
|
||||
|
||||
index++;
|
||||
|
||||
break;
|
||||
@@ -4425,6 +4530,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
whereClauses.Add("(TopParentId=@TopParentId)");
|
||||
}
|
||||
|
||||
if (statement != null)
|
||||
{
|
||||
statement.TryBind("@TopParentId", queryTopParentIds[0].ToString("N", CultureInfo.InvariantCulture));
|
||||
@@ -4462,11 +4568,13 @@ namespace Emby.Server.Implementations.Data
|
||||
statement.TryBind("@AncestorId", query.AncestorIds[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (query.AncestorIds.Length > 1)
|
||||
{
|
||||
var inClause = string.Join(",", query.AncestorIds.Select(i => "'" + i.ToString("N", CultureInfo.InvariantCulture) + "'"));
|
||||
whereClauses.Add(string.Format("Guid in (select itemId from AncestorIds where AncestorIdText in ({0}))", inClause));
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(query.AncestorWithPresentationUniqueKey))
|
||||
{
|
||||
var inClause = "select guid from TypedBaseItems where PresentationUniqueKey=@AncestorWithPresentationUniqueKey";
|
||||
@@ -4495,6 +4603,7 @@ namespace Emby.Server.Implementations.Data
|
||||
statement.TryBind("@UnratedType", query.BlockUnratedItems[0].ToString());
|
||||
}
|
||||
}
|
||||
|
||||
if (query.BlockUnratedItems.Length > 1)
|
||||
{
|
||||
var inClause = string.Join(",", query.BlockUnratedItems.Select(i => "'" + i.ToString() + "'"));
|
||||
@@ -4969,6 +5078,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
statement.TryBind("@ItemId", query.ItemId.ToByteArray());
|
||||
}
|
||||
}
|
||||
|
||||
if (!query.AppearsInItemId.Equals(Guid.Empty))
|
||||
{
|
||||
whereClauses.Add("Name in (Select Name from People where ItemId=@AppearsInItemId)");
|
||||
@@ -4977,6 +5087,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
statement.TryBind("@AppearsInItemId", query.AppearsInItemId.ToByteArray());
|
||||
}
|
||||
}
|
||||
|
||||
var queryPersonTypes = query.PersonTypes.Where(IsValidPersonType).ToList();
|
||||
|
||||
if (queryPersonTypes.Count == 1)
|
||||
@@ -4993,6 +5104,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
|
||||
whereClauses.Add("PersonType in (" + val + ")");
|
||||
}
|
||||
|
||||
var queryExcludePersonTypes = query.ExcludePersonTypes.Where(IsValidPersonType).ToList();
|
||||
|
||||
if (queryExcludePersonTypes.Count == 1)
|
||||
@@ -5009,6 +5121,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
|
||||
whereClauses.Add("PersonType not in (" + val + ")");
|
||||
}
|
||||
|
||||
if (query.MaxListOrder.HasValue)
|
||||
{
|
||||
whereClauses.Add("ListOrder<=@MaxListOrder");
|
||||
@@ -5017,6 +5130,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
statement.TryBind("@MaxListOrder", query.MaxListOrder.Value);
|
||||
}
|
||||
}
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(query.NameContains))
|
||||
{
|
||||
whereClauses.Add("Name like @NameContains");
|
||||
@@ -5156,6 +5270,7 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
|
||||
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 + "'"));
|
||||
|
||||
@@ -135,10 +135,12 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
throw new ArgumentNullException(nameof(userData));
|
||||
}
|
||||
|
||||
if (internalUserId <= 0)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(internalUserId));
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(key))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(key));
|
||||
@@ -153,6 +155,7 @@ namespace Emby.Server.Implementations.Data
|
||||
{
|
||||
throw new ArgumentNullException(nameof(userData));
|
||||
}
|
||||
|
||||
if (internalUserId <= 0)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(internalUserId));
|
||||
|
||||
@@ -169,6 +169,7 @@ namespace Emby.Server.Implementations.Devices
|
||||
{
|
||||
throw new ArgumentException("user not found");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(deviceId))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(deviceId));
|
||||
|
||||
@@ -277,6 +277,7 @@ namespace Emby.Server.Implementations.Dto
|
||||
dto.EpisodeTitle = dto.Name;
|
||||
dto.Name = dto.SeriesName;
|
||||
}
|
||||
|
||||
liveTvManager.AddInfoToRecordingDto(item, dto, activeRecording, user);
|
||||
}
|
||||
|
||||
@@ -292,6 +293,7 @@ namespace Emby.Server.Implementations.Dto
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
var containers = container.Split(new[] { ',' });
|
||||
if (containers.Length < 2)
|
||||
{
|
||||
@@ -456,6 +458,7 @@ namespace Emby.Server.Implementations.Dto
|
||||
{
|
||||
dto.SeriesName = item.SeriesName;
|
||||
}
|
||||
|
||||
private static void SetPhotoProperties(BaseItemDto dto, Photo item)
|
||||
{
|
||||
dto.CameraMake = item.CameraMake;
|
||||
@@ -554,22 +557,27 @@ namespace Emby.Server.Implementations.Dto
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (i.IsType(PersonType.GuestStar))
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (i.IsType(PersonType.Director))
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (i.IsType(PersonType.Writer))
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
if (i.IsType(PersonType.Producer))
|
||||
{
|
||||
return 4;
|
||||
}
|
||||
|
||||
if (i.IsType(PersonType.Composer))
|
||||
{
|
||||
return 4;
|
||||
@@ -1346,6 +1354,7 @@ namespace Emby.Server.Implementations.Dto
|
||||
dto.ParentLogoImageTag = GetTagAndFillBlurhash(dto, parent, image);
|
||||
}
|
||||
}
|
||||
|
||||
if (artLimit > 0 && !(imageTags != null && imageTags.ContainsKey(ImageType.Art)) && dto.ParentArtItemId == null)
|
||||
{
|
||||
var image = allImages.FirstOrDefault(i => i.Type == ImageType.Art);
|
||||
@@ -1356,6 +1365,7 @@ namespace Emby.Server.Implementations.Dto
|
||||
dto.ParentArtImageTag = GetTagAndFillBlurhash(dto, parent, image);
|
||||
}
|
||||
}
|
||||
|
||||
if (thumbLimit > 0 && !(imageTags != null && imageTags.ContainsKey(ImageType.Thumb)) && (dto.ParentThumbItemId == null || parent is Series) && !(parent is ICollectionFolder) && !(parent is UserView))
|
||||
{
|
||||
var image = allImages.FirstOrDefault(i => i.Type == ImageType.Thumb);
|
||||
@@ -1366,6 +1376,7 @@ namespace Emby.Server.Implementations.Dto
|
||||
dto.ParentThumbImageTag = GetTagAndFillBlurhash(dto, parent, image);
|
||||
}
|
||||
}
|
||||
|
||||
if (backdropLimit > 0 && !((dto.BackdropImageTags != null && dto.BackdropImageTags.Length > 0) || (dto.ParentBackdropImageTags != null && dto.ParentBackdropImageTags.Length > 0)))
|
||||
{
|
||||
var images = allImages.Where(i => i.Type == ImageType.Backdrop).Take(backdropLimit).ToList();
|
||||
|
||||
@@ -453,6 +453,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||
{
|
||||
httpRes.Headers.Add(key, value);
|
||||
}
|
||||
|
||||
httpRes.ContentType = "text/plain";
|
||||
await httpRes.WriteAsync(string.Empty, cancellationToken).ConfigureAwait(false);
|
||||
return;
|
||||
|
||||
@@ -20,15 +20,21 @@ namespace Emby.Server.Implementations.HttpServer
|
||||
/// </summary>
|
||||
/// <value>The source stream.</value>
|
||||
private Stream SourceStream { get; set; }
|
||||
|
||||
private string RangeHeader { get; set; }
|
||||
|
||||
private bool IsHeadRequest { get; set; }
|
||||
|
||||
private long RangeStart { get; set; }
|
||||
|
||||
private long RangeEnd { get; set; }
|
||||
|
||||
private long RangeLength { get; set; }
|
||||
|
||||
private long TotalContentLength { get; set; }
|
||||
|
||||
public Action OnComplete { get; set; }
|
||||
|
||||
private readonly ILogger _logger;
|
||||
|
||||
private const int BufferSize = 81920;
|
||||
@@ -139,6 +145,7 @@ namespace Emby.Server.Implementations.HttpServer
|
||||
{
|
||||
start = long.Parse(vals[0], UsCulture);
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(vals[1]))
|
||||
{
|
||||
end = long.Parse(vals[1], UsCulture);
|
||||
|
||||
@@ -140,6 +140,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
if (authAttribtues.AllowLocalOnly && request.IsLocal)
|
||||
{
|
||||
return true;
|
||||
|
||||
@@ -71,6 +71,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
|
||||
{
|
||||
token = httpReq.Headers["X-MediaBrowser-Token"];
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(token))
|
||||
{
|
||||
token = httpReq.QueryString["api_key"];
|
||||
@@ -160,6 +161,7 @@ namespace Emby.Server.Implementations.HttpServer.Security
|
||||
_authRepo.Update(tokenInfo);
|
||||
}
|
||||
}
|
||||
|
||||
httpReq.Items["OriginalAuthenticationInfo"] = tokenInfo;
|
||||
}
|
||||
|
||||
|
||||
@@ -628,6 +628,7 @@ namespace Emby.Server.Implementations.IO
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return extensions.Contains(ext, StringComparer.OrdinalIgnoreCase);
|
||||
});
|
||||
}
|
||||
@@ -682,6 +683,7 @@ namespace Emby.Server.Implementations.IO
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return extensions.Contains(ext, StringComparer.OrdinalIgnoreCase);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -12,11 +12,13 @@ namespace Emby.Server.Implementations.Library
|
||||
public class ExclusiveLiveStream : ILiveStream
|
||||
{
|
||||
public int ConsumerCount { get; set; }
|
||||
|
||||
public string OriginalStreamId { get; set; }
|
||||
|
||||
public string TunerHostId => null;
|
||||
|
||||
public bool EnableStreamSharing { get; set; }
|
||||
|
||||
public MediaSourceInfo MediaSource { get; set; }
|
||||
|
||||
public string UniqueId { get; private set; }
|
||||
|
||||
@@ -2784,10 +2784,12 @@ namespace Emby.Server.Implementations.Library
|
||||
{
|
||||
throw new ArgumentNullException(nameof(path));
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(from))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(from));
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(to))
|
||||
{
|
||||
throw new ArgumentNullException(nameof(to));
|
||||
|
||||
@@ -205,22 +205,27 @@ namespace Emby.Server.Implementations.Library
|
||||
{
|
||||
return MediaProtocol.Rtsp;
|
||||
}
|
||||
|
||||
if (path.StartsWith("Rtmp", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return MediaProtocol.Rtmp;
|
||||
}
|
||||
|
||||
if (path.StartsWith("Http", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return MediaProtocol.Http;
|
||||
}
|
||||
|
||||
if (path.StartsWith("rtp", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return MediaProtocol.Rtp;
|
||||
}
|
||||
|
||||
if (path.StartsWith("ftp", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return MediaProtocol.Ftp;
|
||||
}
|
||||
|
||||
if (path.StartsWith("udp", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return MediaProtocol.Udp;
|
||||
|
||||
@@ -41,10 +41,12 @@ namespace Emby.Server.Implementations.Library.Resolvers
|
||||
{
|
||||
return new AggregateFolder();
|
||||
}
|
||||
|
||||
if (string.Equals(args.Path, _appPaths.DefaultUserViewsPath, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return new UserRootFolder(); // if we got here and still a root - must be user root
|
||||
}
|
||||
|
||||
if (args.IsVf)
|
||||
{
|
||||
return new CollectionFolder
|
||||
|
||||
@@ -55,6 +55,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
|
||||
episode.SeriesId = series.Id;
|
||||
episode.SeriesName = series.Name;
|
||||
}
|
||||
|
||||
if (season != null)
|
||||
{
|
||||
episode.SeasonId = season.Id;
|
||||
|
||||
@@ -194,6 +194,7 @@ namespace Emby.Server.Implementations.Library
|
||||
{
|
||||
searchQuery.AncestorIds = new[] { searchQuery.ParentId };
|
||||
}
|
||||
|
||||
searchQuery.ParentId = Guid.Empty;
|
||||
searchQuery.IncludeItemsByName = true;
|
||||
searchQuery.IncludeItemTypes = Array.Empty<string>();
|
||||
|
||||
@@ -212,6 +212,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
{
|
||||
channelNumber = map.channel;
|
||||
}
|
||||
|
||||
if (string.IsNullOrWhiteSpace(channelNumber))
|
||||
{
|
||||
channelNumber = map.atscMajor + "." + map.atscMinor;
|
||||
@@ -400,6 +401,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
{
|
||||
date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
|
||||
}
|
||||
|
||||
return date;
|
||||
}
|
||||
|
||||
@@ -622,6 +624,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
_lastErrorResponse = DateTime.UtcNow;
|
||||
}
|
||||
}
|
||||
|
||||
throw;
|
||||
}
|
||||
finally
|
||||
@@ -805,11 +808,13 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
{
|
||||
throw new ArgumentException("Username is required");
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(info.Password))
|
||||
{
|
||||
throw new ArgumentException("Password is required");
|
||||
}
|
||||
}
|
||||
|
||||
if (validateListings)
|
||||
{
|
||||
if (string.IsNullOrEmpty(info.ListingsId))
|
||||
@@ -932,24 +937,35 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
public class Token
|
||||
{
|
||||
public int code { get; set; }
|
||||
|
||||
public string message { get; set; }
|
||||
|
||||
public string serverID { get; set; }
|
||||
|
||||
public string token { get; set; }
|
||||
}
|
||||
|
||||
public class Lineup
|
||||
{
|
||||
public string lineup { get; set; }
|
||||
|
||||
public string name { get; set; }
|
||||
|
||||
public string transport { get; set; }
|
||||
|
||||
public string location { get; set; }
|
||||
|
||||
public string uri { get; set; }
|
||||
}
|
||||
|
||||
public class Lineups
|
||||
{
|
||||
public int code { get; set; }
|
||||
|
||||
public string serverID { get; set; }
|
||||
|
||||
public string datetime { get; set; }
|
||||
|
||||
public List<Lineup> lineups { get; set; }
|
||||
}
|
||||
|
||||
@@ -957,8 +973,11 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
public class Headends
|
||||
{
|
||||
public string headend { get; set; }
|
||||
|
||||
public string transport { get; set; }
|
||||
|
||||
public string location { get; set; }
|
||||
|
||||
public List<Lineup> lineups { get; set; }
|
||||
}
|
||||
|
||||
@@ -967,59 +986,83 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
public class Map
|
||||
{
|
||||
public string stationID { get; set; }
|
||||
|
||||
public string channel { get; set; }
|
||||
|
||||
public string logicalChannelNumber { get; set; }
|
||||
|
||||
public int uhfVhf { get; set; }
|
||||
|
||||
public int atscMajor { get; set; }
|
||||
|
||||
public int atscMinor { get; set; }
|
||||
}
|
||||
|
||||
public class Broadcaster
|
||||
{
|
||||
public string city { get; set; }
|
||||
|
||||
public string state { get; set; }
|
||||
|
||||
public string postalcode { get; set; }
|
||||
|
||||
public string country { get; set; }
|
||||
}
|
||||
|
||||
public class Logo
|
||||
{
|
||||
public string URL { get; set; }
|
||||
|
||||
public int height { get; set; }
|
||||
|
||||
public int width { get; set; }
|
||||
|
||||
public string md5 { get; set; }
|
||||
}
|
||||
|
||||
public class Station
|
||||
{
|
||||
public string stationID { get; set; }
|
||||
|
||||
public string name { get; set; }
|
||||
|
||||
public string callsign { get; set; }
|
||||
|
||||
public List<string> broadcastLanguage { get; set; }
|
||||
|
||||
public List<string> descriptionLanguage { get; set; }
|
||||
|
||||
public Broadcaster broadcaster { get; set; }
|
||||
|
||||
public string affiliate { get; set; }
|
||||
|
||||
public Logo logo { get; set; }
|
||||
|
||||
public bool? isCommercialFree { get; set; }
|
||||
}
|
||||
|
||||
public class Metadata
|
||||
{
|
||||
public string lineup { get; set; }
|
||||
|
||||
public string modified { get; set; }
|
||||
|
||||
public string transport { get; set; }
|
||||
}
|
||||
|
||||
public class Channel
|
||||
{
|
||||
public List<Map> map { get; set; }
|
||||
|
||||
public List<Station> stations { get; set; }
|
||||
|
||||
public Metadata metadata { get; set; }
|
||||
}
|
||||
|
||||
public class RequestScheduleForChannel
|
||||
{
|
||||
public string stationID { get; set; }
|
||||
|
||||
public List<string> date { get; set; }
|
||||
}
|
||||
|
||||
@@ -1029,29 +1072,43 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
public class Rating
|
||||
{
|
||||
public string body { get; set; }
|
||||
|
||||
public string code { get; set; }
|
||||
}
|
||||
|
||||
public class Multipart
|
||||
{
|
||||
public int partNumber { get; set; }
|
||||
|
||||
public int totalParts { get; set; }
|
||||
}
|
||||
|
||||
public class Program
|
||||
{
|
||||
public string programID { get; set; }
|
||||
|
||||
public string airDateTime { get; set; }
|
||||
|
||||
public int duration { get; set; }
|
||||
|
||||
public string md5 { get; set; }
|
||||
|
||||
public List<string> audioProperties { get; set; }
|
||||
|
||||
public List<string> videoProperties { get; set; }
|
||||
|
||||
public List<Rating> ratings { get; set; }
|
||||
|
||||
public bool? @new { get; set; }
|
||||
|
||||
public Multipart multipart { get; set; }
|
||||
|
||||
public string liveTapeDelay { get; set; }
|
||||
|
||||
public bool premiere { get; set; }
|
||||
|
||||
public bool repeat { get; set; }
|
||||
|
||||
public string isPremiereOrFinale { get; set; }
|
||||
}
|
||||
|
||||
@@ -1060,16 +1117,22 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
public class MetadataSchedule
|
||||
{
|
||||
public string modified { get; set; }
|
||||
|
||||
public string md5 { get; set; }
|
||||
|
||||
public string startDate { get; set; }
|
||||
|
||||
public string endDate { get; set; }
|
||||
|
||||
public int days { get; set; }
|
||||
}
|
||||
|
||||
public class Day
|
||||
{
|
||||
public string stationID { get; set; }
|
||||
|
||||
public List<Program> programs { get; set; }
|
||||
|
||||
public MetadataSchedule metadata { get; set; }
|
||||
|
||||
public Day()
|
||||
@@ -1092,24 +1155,28 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
public class Description100
|
||||
{
|
||||
public string descriptionLanguage { get; set; }
|
||||
|
||||
public string description { get; set; }
|
||||
}
|
||||
|
||||
public class Description1000
|
||||
{
|
||||
public string descriptionLanguage { get; set; }
|
||||
|
||||
public string description { get; set; }
|
||||
}
|
||||
|
||||
public class DescriptionsProgram
|
||||
{
|
||||
public List<Description100> description100 { get; set; }
|
||||
|
||||
public List<Description1000> description1000 { get; set; }
|
||||
}
|
||||
|
||||
public class Gracenote
|
||||
{
|
||||
public int season { get; set; }
|
||||
|
||||
public int episode { get; set; }
|
||||
}
|
||||
|
||||
@@ -1121,101 +1188,152 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
public class ContentRating
|
||||
{
|
||||
public string body { get; set; }
|
||||
|
||||
public string code { get; set; }
|
||||
}
|
||||
|
||||
public class Cast
|
||||
{
|
||||
public string billingOrder { get; set; }
|
||||
|
||||
public string role { get; set; }
|
||||
|
||||
public string nameId { get; set; }
|
||||
|
||||
public string personId { get; set; }
|
||||
|
||||
public string name { get; set; }
|
||||
|
||||
public string characterName { get; set; }
|
||||
}
|
||||
|
||||
public class Crew
|
||||
{
|
||||
public string billingOrder { get; set; }
|
||||
|
||||
public string role { get; set; }
|
||||
|
||||
public string nameId { get; set; }
|
||||
|
||||
public string personId { get; set; }
|
||||
|
||||
public string name { get; set; }
|
||||
}
|
||||
|
||||
public class QualityRating
|
||||
{
|
||||
public string ratingsBody { get; set; }
|
||||
|
||||
public string rating { get; set; }
|
||||
|
||||
public string minRating { get; set; }
|
||||
|
||||
public string maxRating { get; set; }
|
||||
|
||||
public string increment { get; set; }
|
||||
}
|
||||
|
||||
public class Movie
|
||||
{
|
||||
public string year { get; set; }
|
||||
|
||||
public int duration { get; set; }
|
||||
|
||||
public List<QualityRating> qualityRating { get; set; }
|
||||
}
|
||||
|
||||
public class Recommendation
|
||||
{
|
||||
public string programID { get; set; }
|
||||
|
||||
public string title120 { get; set; }
|
||||
}
|
||||
|
||||
public class ProgramDetails
|
||||
{
|
||||
public string audience { get; set; }
|
||||
|
||||
public string programID { get; set; }
|
||||
|
||||
public List<Title> titles { get; set; }
|
||||
|
||||
public EventDetails eventDetails { get; set; }
|
||||
|
||||
public DescriptionsProgram descriptions { get; set; }
|
||||
|
||||
public string originalAirDate { get; set; }
|
||||
|
||||
public List<string> genres { get; set; }
|
||||
|
||||
public string episodeTitle150 { get; set; }
|
||||
|
||||
public List<MetadataPrograms> metadata { get; set; }
|
||||
|
||||
public List<ContentRating> contentRating { get; set; }
|
||||
|
||||
public List<Cast> cast { get; set; }
|
||||
|
||||
public List<Crew> crew { get; set; }
|
||||
|
||||
public string entityType { get; set; }
|
||||
|
||||
public string showType { get; set; }
|
||||
|
||||
public bool hasImageArtwork { get; set; }
|
||||
|
||||
public string primaryImage { get; set; }
|
||||
|
||||
public string thumbImage { get; set; }
|
||||
|
||||
public string backdropImage { get; set; }
|
||||
|
||||
public string bannerImage { get; set; }
|
||||
|
||||
public string imageID { get; set; }
|
||||
|
||||
public string md5 { get; set; }
|
||||
|
||||
public List<string> contentAdvisory { get; set; }
|
||||
|
||||
public Movie movie { get; set; }
|
||||
|
||||
public List<Recommendation> recommendations { get; set; }
|
||||
}
|
||||
|
||||
public class Caption
|
||||
{
|
||||
public string content { get; set; }
|
||||
|
||||
public string lang { get; set; }
|
||||
}
|
||||
|
||||
public class ImageData
|
||||
{
|
||||
public string width { get; set; }
|
||||
|
||||
public string height { get; set; }
|
||||
|
||||
public string uri { get; set; }
|
||||
|
||||
public string size { get; set; }
|
||||
|
||||
public string aspect { get; set; }
|
||||
|
||||
public string category { get; set; }
|
||||
|
||||
public string text { get; set; }
|
||||
|
||||
public string primary { get; set; }
|
||||
|
||||
public string tier { get; set; }
|
||||
|
||||
public Caption caption { get; set; }
|
||||
}
|
||||
|
||||
public class ShowImages
|
||||
{
|
||||
public string programID { get; set; }
|
||||
|
||||
public List<ImageData> data { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -224,6 +224,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings
|
||||
{
|
||||
uniqueString = "-" + programInfo.SeasonNumber.Value.ToString(CultureInfo.InvariantCulture);
|
||||
}
|
||||
|
||||
if (programInfo.EpisodeNumber.HasValue)
|
||||
{
|
||||
uniqueString = "-" + programInfo.EpisodeNumber.Value.ToString(CultureInfo.InvariantCulture);
|
||||
|
||||
@@ -556,6 +556,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||
{
|
||||
forceUpdate = true;
|
||||
}
|
||||
|
||||
item.ParentId = channel.Id;
|
||||
|
||||
// item.ChannelType = channelType;
|
||||
@@ -575,6 +576,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||
{
|
||||
forceUpdate = true;
|
||||
}
|
||||
|
||||
item.ExternalSeriesId = seriesId;
|
||||
|
||||
var isSeries = info.IsSeries || !string.IsNullOrEmpty(info.EpisodeTitle);
|
||||
@@ -589,30 +591,37 @@ namespace Emby.Server.Implementations.LiveTv
|
||||
{
|
||||
tags.Add("Live");
|
||||
}
|
||||
|
||||
if (info.IsPremiere)
|
||||
{
|
||||
tags.Add("Premiere");
|
||||
}
|
||||
|
||||
if (info.IsNews)
|
||||
{
|
||||
tags.Add("News");
|
||||
}
|
||||
|
||||
if (info.IsSports)
|
||||
{
|
||||
tags.Add("Sports");
|
||||
}
|
||||
|
||||
if (info.IsKids)
|
||||
{
|
||||
tags.Add("Kids");
|
||||
}
|
||||
|
||||
if (info.IsRepeat)
|
||||
{
|
||||
tags.Add("Repeat");
|
||||
}
|
||||
|
||||
if (info.IsMovie)
|
||||
{
|
||||
tags.Add("Movie");
|
||||
}
|
||||
|
||||
if (isSeries)
|
||||
{
|
||||
tags.Add("Series");
|
||||
@@ -635,6 +644,7 @@ namespace Emby.Server.Implementations.LiveTv
|
||||
{
|
||||
forceUpdate = true;
|
||||
}
|
||||
|
||||
item.IsSeries = isSeries;
|
||||
|
||||
item.Name = info.Name;
|
||||
@@ -652,12 +662,14 @@ namespace Emby.Server.Implementations.LiveTv
|
||||
{
|
||||
forceUpdate = true;
|
||||
}
|
||||
|
||||
item.StartDate = info.StartDate;
|
||||
|
||||
if (item.EndDate != info.EndDate)
|
||||
{
|
||||
forceUpdate = true;
|
||||
}
|
||||
|
||||
item.EndDate = info.EndDate;
|
||||
|
||||
item.ProductionYear = info.ProductionYear;
|
||||
|
||||
@@ -170,6 +170,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
_modelCache[cacheKey] = response;
|
||||
}
|
||||
}
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
@@ -201,6 +202,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
var name = line.Substring(0, index - 1);
|
||||
var currentChannel = line.Substring(index + 7);
|
||||
if (currentChannel != "none") { status = LiveTvTunerStatus.LiveTv; } else { status = LiveTvTunerStatus.Available; }
|
||||
|
||||
tuners.Add(new LiveTvTunerInfo
|
||||
{
|
||||
Name = name,
|
||||
@@ -229,11 +231,13 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
inside = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (let == '>')
|
||||
{
|
||||
inside = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!inside)
|
||||
{
|
||||
buffer[bufferIndex] = let;
|
||||
@@ -331,12 +335,19 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
private class Channels
|
||||
{
|
||||
public string GuideNumber { get; set; }
|
||||
|
||||
public string GuideName { get; set; }
|
||||
|
||||
public string VideoCodec { get; set; }
|
||||
|
||||
public string AudioCodec { get; set; }
|
||||
|
||||
public string URL { get; set; }
|
||||
|
||||
public bool Favorite { get; set; }
|
||||
|
||||
public bool DRM { get; set; }
|
||||
|
||||
public int HD { get; set; }
|
||||
}
|
||||
|
||||
@@ -657,13 +668,21 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||
public class DiscoverResponse
|
||||
{
|
||||
public string FriendlyName { get; set; }
|
||||
|
||||
public string ModelNumber { get; set; }
|
||||
|
||||
public string FirmwareName { get; set; }
|
||||
|
||||
public string FirmwareVersion { get; set; }
|
||||
|
||||
public string DeviceID { get; set; }
|
||||
|
||||
public string DeviceAuth { get; set; }
|
||||
|
||||
public string BaseURL { get; set; }
|
||||
|
||||
public string LineupURL { get; set; }
|
||||
|
||||
public int TunerCount { get; set; }
|
||||
|
||||
public bool SupportsTranscoding
|
||||
|
||||
@@ -58,12 +58,15 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
|
||||
protected virtual int EmptyReadLimit => 1000;
|
||||
|
||||
public MediaSourceInfo OriginalMediaSource { get; set; }
|
||||
|
||||
public MediaSourceInfo MediaSource { get; set; }
|
||||
|
||||
public int ConsumerCount { get; set; }
|
||||
|
||||
public string OriginalStreamId { get; set; }
|
||||
|
||||
public bool EnableStreamSharing { get; set; }
|
||||
|
||||
public string UniqueId { get; }
|
||||
|
||||
public string TunerHostId { get; }
|
||||
|
||||
@@ -401,6 +401,7 @@ namespace Emby.Server.Implementations.Playlists
|
||||
{
|
||||
entry.Duration = TimeSpan.FromTicks(child.RunTimeTicks.Value);
|
||||
}
|
||||
|
||||
playlist.PlaylistEntries.Add(entry);
|
||||
}
|
||||
|
||||
|
||||
@@ -143,12 +143,14 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||
Logger.LogError(ex, "Error deserializing {File}", path);
|
||||
}
|
||||
}
|
||||
|
||||
_readFromFile = true;
|
||||
}
|
||||
}
|
||||
|
||||
return _lastExecutionResult;
|
||||
}
|
||||
|
||||
private set
|
||||
{
|
||||
_lastExecutionResult = value;
|
||||
@@ -261,6 +263,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||
var triggers = InternalTriggers;
|
||||
return triggers.Select(i => i.Item1).ToArray();
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
if (value == null)
|
||||
@@ -640,6 +643,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||
Logger.LogError(ex, "Error calling CancellationToken.Cancel();");
|
||||
}
|
||||
}
|
||||
|
||||
var task = _currentTask;
|
||||
if (task != null)
|
||||
{
|
||||
@@ -675,6 +679,7 @@ namespace Emby.Server.Implementations.ScheduledTasks
|
||||
Logger.LogError(ex, "Error calling CancellationToken.Dispose();");
|
||||
}
|
||||
}
|
||||
|
||||
if (wassRunning)
|
||||
{
|
||||
OnTaskCompleted(startTime, DateTime.UtcNow, TaskCompletionStatus.Aborted, null);
|
||||
|
||||
@@ -9,6 +9,7 @@ namespace Emby.Server.Implementations.Services
|
||||
public string Id { get; set; }
|
||||
|
||||
public ActionInvokerFn ServiceAction { get; set; }
|
||||
|
||||
public MediaBrowser.Model.Services.IHasRequestFilter[] RequestFilters { get; set; }
|
||||
|
||||
public static string Key(Type serviceType, string method, string requestDtoName)
|
||||
|
||||
@@ -62,7 +62,9 @@ namespace Emby.Server.Implementations.Services
|
||||
public string Path => this.restPath;
|
||||
|
||||
public string Summary { get; private set; }
|
||||
|
||||
public string Description { get; private set; }
|
||||
|
||||
public bool IsHidden { get; private set; }
|
||||
|
||||
public static string[] GetPathPartsForMatching(string pathInfo)
|
||||
@@ -159,6 +161,7 @@ namespace Emby.Server.Implementations.Services
|
||||
this.isWildcard[i] = true;
|
||||
variableName = variableName.Substring(0, variableName.Length - 1);
|
||||
}
|
||||
|
||||
this.variablesNames[i] = variableName;
|
||||
this.VariableArgsCount++;
|
||||
}
|
||||
|
||||
@@ -22,7 +22,9 @@ namespace Emby.Server.Implementations.Services
|
||||
}
|
||||
|
||||
public Action<object, object> PropertySetFn { get; private set; }
|
||||
|
||||
public Func<string, object> PropertyParseStringFn { get; private set; }
|
||||
|
||||
public Type PropertyType { get; private set; }
|
||||
}
|
||||
|
||||
|
||||
@@ -18,13 +18,21 @@ namespace Emby.Server.Implementations.Services
|
||||
public class SwaggerSpec
|
||||
{
|
||||
public string swagger { get; set; }
|
||||
|
||||
public string[] schemes { get; set; }
|
||||
|
||||
public SwaggerInfo info { get; set; }
|
||||
|
||||
public string host { get; set; }
|
||||
|
||||
public string basePath { get; set; }
|
||||
|
||||
public SwaggerTag[] tags { get; set; }
|
||||
|
||||
public IDictionary<string, Dictionary<string, SwaggerMethod>> paths { get; set; }
|
||||
|
||||
public Dictionary<string, SwaggerDefinition> definitions { get; set; }
|
||||
|
||||
public SwaggerComponents components { get; set; }
|
||||
}
|
||||
|
||||
@@ -36,15 +44,20 @@ namespace Emby.Server.Implementations.Services
|
||||
public class SwaggerSecurityScheme
|
||||
{
|
||||
public string name { get; set; }
|
||||
|
||||
public string type { get; set; }
|
||||
|
||||
public string @in { get; set; }
|
||||
}
|
||||
|
||||
public class SwaggerInfo
|
||||
{
|
||||
public string description { get; set; }
|
||||
|
||||
public string version { get; set; }
|
||||
|
||||
public string title { get; set; }
|
||||
|
||||
public string termsOfService { get; set; }
|
||||
|
||||
public SwaggerConcactInfo contact { get; set; }
|
||||
@@ -53,36 +66,52 @@ namespace Emby.Server.Implementations.Services
|
||||
public class SwaggerConcactInfo
|
||||
{
|
||||
public string email { get; set; }
|
||||
|
||||
public string name { get; set; }
|
||||
|
||||
public string url { get; set; }
|
||||
}
|
||||
|
||||
public class SwaggerTag
|
||||
{
|
||||
public string description { get; set; }
|
||||
|
||||
public string name { get; set; }
|
||||
}
|
||||
|
||||
public class SwaggerMethod
|
||||
{
|
||||
public string summary { get; set; }
|
||||
|
||||
public string description { get; set; }
|
||||
|
||||
public string[] tags { get; set; }
|
||||
|
||||
public string operationId { get; set; }
|
||||
|
||||
public string[] consumes { get; set; }
|
||||
|
||||
public string[] produces { get; set; }
|
||||
|
||||
public SwaggerParam[] parameters { get; set; }
|
||||
|
||||
public Dictionary<string, SwaggerResponse> responses { get; set; }
|
||||
|
||||
public Dictionary<string, string[]>[] security { get; set; }
|
||||
}
|
||||
|
||||
public class SwaggerParam
|
||||
{
|
||||
public string @in { get; set; }
|
||||
|
||||
public string name { get; set; }
|
||||
|
||||
public string description { get; set; }
|
||||
|
||||
public bool required { get; set; }
|
||||
|
||||
public string type { get; set; }
|
||||
|
||||
public string collectionFormat { get; set; }
|
||||
}
|
||||
|
||||
@@ -97,15 +126,20 @@ namespace Emby.Server.Implementations.Services
|
||||
public class SwaggerDefinition
|
||||
{
|
||||
public string type { get; set; }
|
||||
|
||||
public Dictionary<string, SwaggerProperty> properties { get; set; }
|
||||
}
|
||||
|
||||
public class SwaggerProperty
|
||||
{
|
||||
public string type { get; set; }
|
||||
|
||||
public string format { get; set; }
|
||||
|
||||
public string description { get; set; }
|
||||
|
||||
public string[] @enum { get; set; }
|
||||
|
||||
public string @default { get; set; }
|
||||
}
|
||||
|
||||
|
||||
@@ -167,6 +167,7 @@ namespace Emby.Server.Implementations.Session
|
||||
_logger.LogWarning("Multiple attempts to keep alive single WebSocket {0}", webSocket);
|
||||
return;
|
||||
}
|
||||
|
||||
webSocket.Closed += OnWebSocketClosed;
|
||||
webSocket.LastKeepAliveDate = DateTime.UtcNow;
|
||||
|
||||
|
||||
@@ -44,6 +44,7 @@ namespace Emby.Server.Implementations.Sorting
|
||||
// Don't blow up if the item has a bad ProductionYear, just return MinValue
|
||||
}
|
||||
}
|
||||
|
||||
return DateTime.MinValue;
|
||||
}
|
||||
|
||||
|
||||
@@ -256,6 +256,7 @@ namespace Emby.Server.Implementations.TV
|
||||
{
|
||||
items = items.Skip(query.StartIndex.Value);
|
||||
}
|
||||
|
||||
if (query.Limit.HasValue)
|
||||
{
|
||||
items = items.Take(query.Limit.Value);
|
||||
|
||||
Reference in New Issue
Block a user