|
|
|
@ -28,6 +28,14 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
ISupportsPlaceHolders,
|
|
|
|
|
IHasMediaSources
|
|
|
|
|
{
|
|
|
|
|
public Video()
|
|
|
|
|
{
|
|
|
|
|
AdditionalParts = Array.Empty<string>();
|
|
|
|
|
LocalAlternateVersions = Array.Empty<string>();
|
|
|
|
|
SubtitleFiles = Array.Empty<string>();
|
|
|
|
|
LinkedAlternateVersions = Array.Empty<LinkedChild>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public string PrimaryVersionId { get; set; }
|
|
|
|
|
|
|
|
|
@ -74,30 +82,6 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetPrimaryVersionId(string id)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(id))
|
|
|
|
|
{
|
|
|
|
|
PrimaryVersionId = null;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
PrimaryVersionId = id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PresentationUniqueKey = CreatePresentationUniqueKey();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string CreatePresentationUniqueKey()
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(PrimaryVersionId))
|
|
|
|
|
{
|
|
|
|
|
return PrimaryVersionId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.CreatePresentationUniqueKey();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override bool SupportsThemeMedia => true;
|
|
|
|
|
|
|
|
|
@ -151,24 +135,6 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
/// <value>The aspect ratio.</value>
|
|
|
|
|
public string AspectRatio { get; set; }
|
|
|
|
|
|
|
|
|
|
public Video()
|
|
|
|
|
{
|
|
|
|
|
AdditionalParts = Array.Empty<string>();
|
|
|
|
|
LocalAlternateVersions = Array.Empty<string>();
|
|
|
|
|
SubtitleFiles = Array.Empty<string>();
|
|
|
|
|
LinkedAlternateVersions = Array.Empty<LinkedChild>();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CanDownload()
|
|
|
|
|
{
|
|
|
|
|
if (VideoType == VideoType.Dvd || VideoType == VideoType.BluRay)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return IsFileProtocol;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override bool SupportsAddingToPlaylist => true;
|
|
|
|
|
|
|
|
|
@ -196,16 +162,6 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override bool HasLocalAlternateVersions => LocalAlternateVersions.Length > 0;
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Guid> GetAdditionalPartIds()
|
|
|
|
|
{
|
|
|
|
|
return AdditionalParts.Select(i => LibraryManager.GetNewItemId(i, typeof(Video)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Guid> GetLocalAlternateVersionIds()
|
|
|
|
|
{
|
|
|
|
|
return LocalAlternateVersions.Select(i => LibraryManager.GetNewItemId(i, typeof(Video)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static ILiveTvManager LiveTvManager { get; set; }
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
@ -222,37 +178,77 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override bool IsActiveRecording()
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public bool IsCompleteMedia
|
|
|
|
|
{
|
|
|
|
|
return LiveTvManager.GetActiveRecordingInfo(Path) != null;
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (SourceType == SourceType.Channel)
|
|
|
|
|
{
|
|
|
|
|
return !Tags.Contains("livestream", StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return !IsActiveRecording();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CanDelete()
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
protected virtual bool EnableDefaultVideoUserDataKeys => true;
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override string ContainingFolderPath
|
|
|
|
|
{
|
|
|
|
|
if (IsActiveRecording())
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
if (IsStacked)
|
|
|
|
|
{
|
|
|
|
|
return System.IO.Path.GetDirectoryName(Path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.CanDelete();
|
|
|
|
|
if (!IsPlaceHolder)
|
|
|
|
|
{
|
|
|
|
|
if (VideoType == VideoType.BluRay || VideoType == VideoType.Dvd)
|
|
|
|
|
{
|
|
|
|
|
return Path;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.ContainingFolderPath;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public bool IsCompleteMedia
|
|
|
|
|
public override string FileNameWithoutExtension
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (SourceType == SourceType.Channel)
|
|
|
|
|
if (IsFileProtocol)
|
|
|
|
|
{
|
|
|
|
|
return !Tags.Contains("livestream", StringComparer.OrdinalIgnoreCase);
|
|
|
|
|
if (VideoType == VideoType.BluRay || VideoType == VideoType.Dvd)
|
|
|
|
|
{
|
|
|
|
|
return System.IO.Path.GetFileName(Path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return System.IO.Path.GetFileNameWithoutExtension(Path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return !IsActiveRecording();
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a value indicating whether [is3 D].
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value><c>true</c> if [is3 D]; otherwise, <c>false</c>.</value>
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
protected virtual bool EnableDefaultVideoUserDataKeys => true;
|
|
|
|
|
public bool Is3D => Video3DFormat.HasValue;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the type of the media.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>The type of the media.</value>
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override string MediaType => Model.Entities.MediaType.Video;
|
|
|
|
|
|
|
|
|
|
public override List<string> GetUserDataKeys()
|
|
|
|
|
{
|
|
|
|
@ -293,6 +289,65 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
return list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void SetPrimaryVersionId(string id)
|
|
|
|
|
{
|
|
|
|
|
if (string.IsNullOrEmpty(id))
|
|
|
|
|
{
|
|
|
|
|
PrimaryVersionId = null;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
PrimaryVersionId = id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PresentationUniqueKey = CreatePresentationUniqueKey();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override string CreatePresentationUniqueKey()
|
|
|
|
|
{
|
|
|
|
|
if (!string.IsNullOrEmpty(PrimaryVersionId))
|
|
|
|
|
{
|
|
|
|
|
return PrimaryVersionId;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.CreatePresentationUniqueKey();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CanDownload()
|
|
|
|
|
{
|
|
|
|
|
if (VideoType == VideoType.Dvd || VideoType == VideoType.BluRay)
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return IsFileProtocol;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected override bool IsActiveRecording()
|
|
|
|
|
{
|
|
|
|
|
return LiveTvManager.GetActiveRecordingInfo(Path) != null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public override bool CanDelete()
|
|
|
|
|
{
|
|
|
|
|
if (IsActiveRecording())
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.CanDelete();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Guid> GetAdditionalPartIds()
|
|
|
|
|
{
|
|
|
|
|
return AdditionalParts.Select(i => LibraryManager.GetNewItemId(i, typeof(Video)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public IEnumerable<Guid> GetLocalAlternateVersionIds()
|
|
|
|
|
{
|
|
|
|
|
return LocalAlternateVersions.Select(i => LibraryManager.GetNewItemId(i, typeof(Video)));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private string GetUserDataKey(string providerId)
|
|
|
|
|
{
|
|
|
|
|
var key = providerId + "-" + ExtraType.ToString().ToLowerInvariant();
|
|
|
|
@ -328,47 +383,6 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
.OrderBy(i => i.SortName);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override string ContainingFolderPath
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (IsStacked)
|
|
|
|
|
{
|
|
|
|
|
return System.IO.Path.GetDirectoryName(Path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!IsPlaceHolder)
|
|
|
|
|
{
|
|
|
|
|
if (VideoType == VideoType.BluRay || VideoType == VideoType.Dvd)
|
|
|
|
|
{
|
|
|
|
|
return Path;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return base.ContainingFolderPath;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override string FileNameWithoutExtension
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
if (IsFileProtocol)
|
|
|
|
|
{
|
|
|
|
|
if (VideoType == VideoType.BluRay || VideoType == VideoType.Dvd)
|
|
|
|
|
{
|
|
|
|
|
return System.IO.Path.GetFileName(Path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return System.IO.Path.GetFileNameWithoutExtension(Path);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
internal override ItemUpdateType UpdateFromResolvedItem(BaseItem newItem)
|
|
|
|
|
{
|
|
|
|
|
var updateType = base.UpdateFromResolvedItem(newItem);
|
|
|
|
@ -397,20 +411,6 @@ namespace MediaBrowser.Controller.Entities
|
|
|
|
|
return updateType;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets a value indicating whether [is3 D].
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value><c>true</c> if [is3 D]; otherwise, <c>false</c>.</value>
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public bool Is3D => Video3DFormat.HasValue;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the type of the media.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>The type of the media.</value>
|
|
|
|
|
[JsonIgnore]
|
|
|
|
|
public override string MediaType => Model.Entities.MediaType.Video;
|
|
|
|
|
|
|
|
|
|
protected override async Task<bool> RefreshedOwnedItems(MetadataRefreshOptions options, List<FileSystemMetadata> fileSystemChildren, CancellationToken cancellationToken)
|
|
|
|
|
{
|
|
|
|
|
var hasChanges = await base.RefreshedOwnedItems(options, fileSystemChildren, cancellationToken).ConfigureAwait(false);
|
|
|
|
|