mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-07-07 18:24:19 -04:00
commit
802d2ecfef
@ -20,6 +20,7 @@ namespace MediaBrowser.Controller.Entities
|
|||||||
|
|
||||||
[IgnoreDataMember]
|
[IgnoreDataMember]
|
||||||
public string SeriesName { get; set; }
|
public string SeriesName { get; set; }
|
||||||
|
[IgnoreDataMember]
|
||||||
public Guid? SeriesId { get; set; }
|
public Guid? SeriesId { get; set; }
|
||||||
|
|
||||||
public string FindSeriesName()
|
public string FindSeriesName()
|
||||||
|
@ -249,6 +249,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|||||||
|
|
||||||
[IgnoreDataMember]
|
[IgnoreDataMember]
|
||||||
public Guid? SeasonId { get; set; }
|
public Guid? SeasonId { get; set; }
|
||||||
|
[IgnoreDataMember]
|
||||||
public Guid? SeriesId { get; set; }
|
public Guid? SeriesId { get; set; }
|
||||||
|
|
||||||
public Guid? FindSeriesId()
|
public Guid? FindSeriesId()
|
||||||
|
@ -237,6 +237,7 @@ namespace MediaBrowser.Controller.Entities.TV
|
|||||||
[IgnoreDataMember]
|
[IgnoreDataMember]
|
||||||
public string SeriesName { get; set; }
|
public string SeriesName { get; set; }
|
||||||
|
|
||||||
|
[IgnoreDataMember]
|
||||||
public Guid? SeriesId { get; set; }
|
public Guid? SeriesId { get; set; }
|
||||||
|
|
||||||
public string FindSeriesName()
|
public string FindSeriesName()
|
||||||
|
@ -86,20 +86,28 @@ namespace MediaBrowser.MediaEncoding.Encoder
|
|||||||
"libvorbis",
|
"libvorbis",
|
||||||
"srt",
|
"srt",
|
||||||
"h264_nvenc",
|
"h264_nvenc",
|
||||||
"h264_qsv"
|
"h264_qsv",
|
||||||
|
"ac3"
|
||||||
};
|
};
|
||||||
|
|
||||||
output = output ?? string.Empty;
|
output = output ?? string.Empty;
|
||||||
|
|
||||||
|
var index = 0;
|
||||||
|
|
||||||
foreach (var codec in required)
|
foreach (var codec in required)
|
||||||
{
|
{
|
||||||
var srch = " " + codec + " ";
|
var srch = " " + codec + " ";
|
||||||
|
|
||||||
if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1)
|
if (output.IndexOf(srch, StringComparison.OrdinalIgnoreCase) != -1)
|
||||||
{
|
{
|
||||||
_logger.Info("Encoder available: " + codec);
|
if (index < required.Length - 1)
|
||||||
|
{
|
||||||
|
_logger.Info("Encoder available: " + codec);
|
||||||
|
}
|
||||||
|
|
||||||
found.Add(codec);
|
found.Add(codec);
|
||||||
}
|
}
|
||||||
|
index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return found;
|
return found;
|
||||||
|
@ -671,17 +671,6 @@ namespace MediaBrowser.Server.Implementations.Dto
|
|||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<string> GetCacheTags(BaseItem item, ImageType type, int limit)
|
|
||||||
{
|
|
||||||
return item.GetImages(type)
|
|
||||||
// Convert to a list now in case GetImageCacheTag is slow
|
|
||||||
.ToList()
|
|
||||||
.Select(p => GetImageCacheTag(item, p))
|
|
||||||
.Where(i => i != null)
|
|
||||||
.Take(limit)
|
|
||||||
.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
private string GetImageCacheTag(BaseItem item, ImageType type)
|
private string GetImageCacheTag(BaseItem item, ImageType type)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@ -1458,9 +1447,16 @@ namespace MediaBrowser.Server.Implementations.Dto
|
|||||||
while (((!dto.HasLogo && logoLimit > 0) || (!dto.HasArtImage && artLimit > 0) || (!dto.HasThumb && thumbLimit > 0) || parent is Series) &&
|
while (((!dto.HasLogo && logoLimit > 0) || (!dto.HasArtImage && artLimit > 0) || (!dto.HasThumb && thumbLimit > 0) || parent is Series) &&
|
||||||
(parent = parent ?? (isFirst ? item.GetParent() ?? owner : parent)) != null)
|
(parent = parent ?? (isFirst ? item.GetParent() ?? owner : parent)) != null)
|
||||||
{
|
{
|
||||||
|
if (parent == null)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var allImages = parent.ImageInfos;
|
||||||
|
|
||||||
if (logoLimit > 0 && !dto.HasLogo && dto.ParentLogoItemId == null)
|
if (logoLimit > 0 && !dto.HasLogo && dto.ParentLogoItemId == null)
|
||||||
{
|
{
|
||||||
var image = parent.GetImageInfo(ImageType.Logo, 0);
|
var image = allImages.FirstOrDefault(i => i.Type == ImageType.Logo);
|
||||||
|
|
||||||
if (image != null)
|
if (image != null)
|
||||||
{
|
{
|
||||||
@ -1470,7 +1466,7 @@ namespace MediaBrowser.Server.Implementations.Dto
|
|||||||
}
|
}
|
||||||
if (artLimit > 0 && !dto.HasArtImage && dto.ParentArtItemId == null)
|
if (artLimit > 0 && !dto.HasArtImage && dto.ParentArtItemId == null)
|
||||||
{
|
{
|
||||||
var image = parent.GetImageInfo(ImageType.Art, 0);
|
var image = allImages.FirstOrDefault(i => i.Type == ImageType.Art);
|
||||||
|
|
||||||
if (image != null)
|
if (image != null)
|
||||||
{
|
{
|
||||||
@ -1480,7 +1476,7 @@ namespace MediaBrowser.Server.Implementations.Dto
|
|||||||
}
|
}
|
||||||
if (thumbLimit > 0 && !dto.HasThumb && (dto.ParentThumbItemId == null || parent is Series))
|
if (thumbLimit > 0 && !dto.HasThumb && (dto.ParentThumbItemId == null || parent is Series))
|
||||||
{
|
{
|
||||||
var image = parent.GetImageInfo(ImageType.Thumb, 0);
|
var image = allImages.FirstOrDefault(i => i.Type == ImageType.Thumb);
|
||||||
|
|
||||||
if (image != null)
|
if (image != null)
|
||||||
{
|
{
|
||||||
@ -1490,7 +1486,7 @@ namespace MediaBrowser.Server.Implementations.Dto
|
|||||||
}
|
}
|
||||||
if (backdropLimit > 0 && !dto.HasBackdrop)
|
if (backdropLimit > 0 && !dto.HasBackdrop)
|
||||||
{
|
{
|
||||||
var images = parent.GetImages(ImageType.Backdrop).Take(backdropLimit).ToList();
|
var images = allImages.Where(i => i.Type == ImageType.Backdrop).Take(backdropLimit).ToList();
|
||||||
|
|
||||||
if (images.Count > 0)
|
if (images.Count > 0)
|
||||||
{
|
{
|
||||||
|
@ -17,6 +17,7 @@ using System.Threading.Tasks;
|
|||||||
using MediaBrowser.Common.Extensions;
|
using MediaBrowser.Common.Extensions;
|
||||||
using MediaBrowser.Controller.MediaEncoding;
|
using MediaBrowser.Controller.MediaEncoding;
|
||||||
using MediaBrowser.Model.Configuration;
|
using MediaBrowser.Model.Configuration;
|
||||||
|
using MediaBrowser.Model.Net;
|
||||||
|
|
||||||
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
{
|
{
|
||||||
@ -106,18 +107,31 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|||||||
|
|
||||||
private async Task<string> GetModelInfo(TunerHostInfo info, CancellationToken cancellationToken)
|
private async Task<string> GetModelInfo(TunerHostInfo info, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
using (var stream = await _httpClient.Get(new HttpRequestOptions()
|
try
|
||||||
{
|
{
|
||||||
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
|
using (var stream = await _httpClient.Get(new HttpRequestOptions()
|
||||||
CancellationToken = cancellationToken,
|
{
|
||||||
CacheLength = TimeSpan.FromDays(1),
|
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
|
||||||
CacheMode = CacheMode.Unconditional,
|
CancellationToken = cancellationToken,
|
||||||
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds)
|
CacheLength = TimeSpan.FromDays(1),
|
||||||
}))
|
CacheMode = CacheMode.Unconditional,
|
||||||
{
|
TimeoutMs = Convert.ToInt32(TimeSpan.FromSeconds(5).TotalMilliseconds)
|
||||||
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
}))
|
||||||
|
{
|
||||||
|
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
||||||
|
|
||||||
return response.ModelNumber;
|
return response.ModelNumber;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (HttpException ex)
|
||||||
|
{
|
||||||
|
if (ex.StatusCode.HasValue && ex.StatusCode.Value == System.Net.HttpStatusCode.NotFound)
|
||||||
|
{
|
||||||
|
// HDHR4 doesn't have this api
|
||||||
|
return "HDHR";
|
||||||
|
}
|
||||||
|
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -455,16 +469,29 @@ namespace MediaBrowser.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test it by pulling down the lineup
|
try
|
||||||
using (var stream = await _httpClient.Get(new HttpRequestOptions
|
|
||||||
{
|
{
|
||||||
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
|
// Test it by pulling down the lineup
|
||||||
CancellationToken = CancellationToken.None
|
using (var stream = await _httpClient.Get(new HttpRequestOptions
|
||||||
}))
|
{
|
||||||
{
|
Url = string.Format("{0}/discover.json", GetApiUrl(info, false)),
|
||||||
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
CancellationToken = CancellationToken.None
|
||||||
|
}))
|
||||||
|
{
|
||||||
|
var response = JsonSerializer.DeserializeFromStream<DiscoverResponse>(stream);
|
||||||
|
|
||||||
info.DeviceId = response.DeviceID;
|
info.DeviceId = response.DeviceID;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (HttpException ex)
|
||||||
|
{
|
||||||
|
if (ex.StatusCode.HasValue && ex.StatusCode.Value == System.Net.HttpStatusCode.NotFound)
|
||||||
|
{
|
||||||
|
// HDHR4 doesn't have this api
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,6 +155,8 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|||||||
|
|
||||||
_logger.Debug("Upgrading schema for {0} items", numItems);
|
_logger.Debug("Upgrading schema for {0} items", numItems);
|
||||||
|
|
||||||
|
var list = new List<BaseItem>();
|
||||||
|
|
||||||
foreach (var itemId in itemIds)
|
foreach (var itemId in itemIds)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@ -166,27 +168,50 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|||||||
|
|
||||||
if (item != null)
|
if (item != null)
|
||||||
{
|
{
|
||||||
try
|
list.Add(item);
|
||||||
{
|
|
||||||
await _itemRepo.SaveItem(item, cancellationToken).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
catch (OperationCanceledException)
|
|
||||||
{
|
|
||||||
throw;
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.ErrorException("Error saving item", ex);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (list.Count >= 1000)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _itemRepo.SaveItems(list, cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("Error saving item", ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
list.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
numComplete++;
|
numComplete++;
|
||||||
double percent = numComplete;
|
double percent = numComplete;
|
||||||
percent /= numItems;
|
percent /= numItems;
|
||||||
progress.Report(percent * 100);
|
progress.Report(percent * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (list.Count > 0)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await _itemRepo.SaveItems(list, cancellationToken).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
catch (OperationCanceledException)
|
||||||
|
{
|
||||||
|
throw;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.ErrorException("Error saving item", ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
progress.Report(100);
|
progress.Report(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,8 +156,6 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|||||||
string[] queries = {
|
string[] queries = {
|
||||||
|
|
||||||
"create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB, ParentId GUID, Path TEXT)",
|
"create table if not exists TypedBaseItems (guid GUID primary key, type TEXT, data BLOB, ParentId GUID, Path TEXT)",
|
||||||
"create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)",
|
|
||||||
"create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
|
|
||||||
|
|
||||||
"create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))",
|
"create table if not exists AncestorIds (ItemId GUID, AncestorId GUID, AncestorIdText TEXT, PRIMARY KEY (ItemId, AncestorId))",
|
||||||
"create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)",
|
"create index if not exists idx_AncestorIds1 on AncestorIds(AncestorId)",
|
||||||
@ -303,6 +301,9 @@ namespace MediaBrowser.Server.Implementations.Persistence
|
|||||||
"drop index if exists idx_ItemValues4",
|
"drop index if exists idx_ItemValues4",
|
||||||
"drop index if exists idx_ItemValues5",
|
"drop index if exists idx_ItemValues5",
|
||||||
|
|
||||||
|
"create index if not exists idx_PathTypedBaseItems on TypedBaseItems(Path)",
|
||||||
|
"create index if not exists idx_ParentIdTypedBaseItems on TypedBaseItems(ParentId)",
|
||||||
|
|
||||||
"create index if not exists idx_PresentationUniqueKey on TypedBaseItems(PresentationUniqueKey)",
|
"create index if not exists idx_PresentationUniqueKey on TypedBaseItems(PresentationUniqueKey)",
|
||||||
"create index if not exists idx_GuidTypeIsFolderIsVirtualItem on TypedBaseItems(Guid,Type,IsFolder,IsVirtualItem)",
|
"create index if not exists idx_GuidTypeIsFolderIsVirtualItem on TypedBaseItems(Guid,Type,IsFolder,IsVirtualItem)",
|
||||||
//"create index if not exists idx_GuidMediaTypeIsFolderIsVirtualItem on TypedBaseItems(Guid,MediaType,IsFolder,IsVirtualItem)",
|
//"create index if not exists idx_GuidMediaTypeIsFolderIsVirtualItem on TypedBaseItems(Guid,MediaType,IsFolder,IsVirtualItem)",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user