scope tubearchivist providers, fix sync intervals
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
<Project>
|
<Project>
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Version>1.4.4.0</Version>
|
<Version>1.4.5.0</Version>
|
||||||
<AssemblyVersion>1.4.4.0</AssemblyVersion>
|
<AssemblyVersion>1.4.5.0</AssemblyVersion>
|
||||||
<FileVersion>1.4.4.0</FileVersion>
|
<FileVersion>1.4.5.0</FileVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
public string Name => "TubeArchivist";
|
public string Name => "TubeArchivist";
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool Supports(BaseItem item) => item is Episode;
|
public bool Supports(BaseItem item) => item is Episode && Utils.IsTubeArchivistItem(item);
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
|
public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
|
||||||
@@ -65,7 +65,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
_logger.LogDebug("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting images for video: {0} ({1})", video?.Title, videoTAId));
|
_logger.LogDebug("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting images for video: {0} ({1})", video?.Title, videoTAId));
|
||||||
_logger.LogDebug("{Message}", "Thumb URI: " + video?.VidThumbUrl);
|
_logger.LogDebug("{Message}", "Thumb URI: " + video?.VidThumbUrl);
|
||||||
|
|
||||||
if (video != null)
|
if (video != null && Utils.HasImageUrl(video.VidThumbUrl))
|
||||||
{
|
{
|
||||||
list.Add(new RemoteImageInfo
|
list.Add(new RemoteImageInfo
|
||||||
{
|
{
|
||||||
@@ -87,6 +87,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (!Utils.HasImageUrl(url))
|
||||||
|
{
|
||||||
|
throw new HttpRequestException("TubeArchivist returned an empty image URL.");
|
||||||
|
}
|
||||||
|
|
||||||
return await Plugin.Instance.HttpClient.GetAsync(new Uri(Utils.SanitizeUrl(Plugin.Instance.Configuration.TubeArchivistUrl + url).TrimEnd('/')), cancellationToken).ConfigureAwait(false);
|
return await Plugin.Instance.HttpClient.GetAsync(new Uri(Utils.SanitizeUrl(Plugin.Instance.Configuration.TubeArchivistUrl + url).TrimEnd('/')), cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
public async Task<MetadataResult<Episode>> GetMetadata(EpisodeInfo info, CancellationToken cancellationToken)
|
public async Task<MetadataResult<Episode>> GetMetadata(EpisodeInfo info, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var result = new MetadataResult<Episode>();
|
var result = new MetadataResult<Episode>();
|
||||||
|
if (string.IsNullOrWhiteSpace(info.Path))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
var taApi = TubeArchivistApi.GetInstance();
|
var taApi = TubeArchivistApi.GetInstance();
|
||||||
var videoTAId = Utils.GetVideoNameFromPath(info.Path);
|
var videoTAId = Utils.GetVideoNameFromPath(info.Path);
|
||||||
var video = await taApi.GetVideo(videoTAId).ConfigureAwait(true);
|
var video = await taApi.GetVideo(videoTAId).ConfigureAwait(true);
|
||||||
@@ -79,6 +84,10 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
|
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(EpisodeInfo searchInfo, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var results = new List<RemoteSearchResult>();
|
var results = new List<RemoteSearchResult>();
|
||||||
|
if (string.IsNullOrWhiteSpace(searchInfo.Path))
|
||||||
|
{
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
var taApi = TubeArchivistApi.GetInstance();
|
var taApi = TubeArchivistApi.GetInstance();
|
||||||
var videoTAId = Utils.GetVideoNameFromPath(searchInfo.Path);
|
var videoTAId = Utils.GetVideoNameFromPath(searchInfo.Path);
|
||||||
|
|||||||
@@ -45,12 +45,12 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
public string Name => "TubeArchivist";
|
public string Name => "TubeArchivist";
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool Supports(BaseItem item) => item is Series;
|
public bool Supports(BaseItem item) => item is Series && Utils.IsTubeArchivistItem(item);
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
|
public IEnumerable<ImageType> GetSupportedImages(BaseItem item)
|
||||||
{
|
{
|
||||||
return new[] { ImageType.Primary };
|
return new[] { ImageType.Primary, ImageType.Art, ImageType.Banner, ImageType.Backdrop };
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -62,10 +62,8 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
var channel = await taApi.GetChannel(channelTAId).ConfigureAwait(true);
|
var channel = await taApi.GetChannel(channelTAId).ConfigureAwait(true);
|
||||||
_logger.LogDebug("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting images for channel: {0} ({1})", channel?.Name, channelTAId));
|
_logger.LogDebug("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting images for channel: {0} ({1})", channel?.Name, channelTAId));
|
||||||
_logger.LogDebug("{Message}", "Thumb URI: " + channel?.ThumbUrl);
|
_logger.LogDebug("{Message}", "Thumb URI: " + channel?.ThumbUrl);
|
||||||
_logger.LogDebug("{Message}", "TVArt URI: " + channel?.TvartUrl);
|
|
||||||
_logger.LogDebug("{Message}", "Banner URI: " + channel?.BannerUrl);
|
|
||||||
|
|
||||||
if (channel != null)
|
if (channel != null && Utils.HasImageUrl(channel.ThumbUrl))
|
||||||
{
|
{
|
||||||
list.Add(new RemoteImageInfo
|
list.Add(new RemoteImageInfo
|
||||||
{
|
{
|
||||||
@@ -73,18 +71,17 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
Type = ImageType.Primary,
|
Type = ImageType.Primary,
|
||||||
Url = channel.ThumbUrl
|
Url = channel.ThumbUrl
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (channel != null && Utils.HasImageUrl(channel.TvartUrl))
|
||||||
|
{
|
||||||
list.Add(new RemoteImageInfo
|
list.Add(new RemoteImageInfo
|
||||||
{
|
{
|
||||||
ProviderName = Name,
|
ProviderName = Name,
|
||||||
Type = ImageType.Art,
|
Type = ImageType.Art,
|
||||||
Url = channel.TvartUrl
|
Url = channel.TvartUrl
|
||||||
});
|
});
|
||||||
list.Add(new RemoteImageInfo
|
|
||||||
{
|
|
||||||
ProviderName = Name,
|
|
||||||
Type = ImageType.Banner,
|
|
||||||
Url = channel.BannerUrl
|
|
||||||
});
|
|
||||||
list.Add(new RemoteImageInfo
|
list.Add(new RemoteImageInfo
|
||||||
{
|
{
|
||||||
ProviderName = Name,
|
ProviderName = Name,
|
||||||
@@ -93,6 +90,16 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (channel != null && Utils.HasImageUrl(channel.BannerUrl))
|
||||||
|
{
|
||||||
|
list.Add(new RemoteImageInfo
|
||||||
|
{
|
||||||
|
ProviderName = Name,
|
||||||
|
Type = ImageType.Banner,
|
||||||
|
Url = channel.BannerUrl
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return list;
|
return list;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -105,6 +112,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
if (!Utils.HasImageUrl(url))
|
||||||
|
{
|
||||||
|
throw new HttpRequestException("TubeArchivist returned an empty image URL.");
|
||||||
|
}
|
||||||
|
|
||||||
return await Plugin.Instance.HttpClient.GetAsync(new Uri(Utils.SanitizeUrl(Plugin.Instance.Configuration.TubeArchivistUrl + url).TrimEnd('/')), cancellationToken).ConfigureAwait(false);
|
return await Plugin.Instance.HttpClient.GetAsync(new Uri(Utils.SanitizeUrl(Plugin.Instance.Configuration.TubeArchivistUrl + url).TrimEnd('/')), cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo info, CancellationToken cancellationToken)
|
public async Task<MetadataResult<Series>> GetMetadata(SeriesInfo info, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var result = new MetadataResult<Series>();
|
var result = new MetadataResult<Series>();
|
||||||
|
if (string.IsNullOrWhiteSpace(info.Path))
|
||||||
|
{
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
var taApi = TubeArchivistApi.GetInstance();
|
var taApi = TubeArchivistApi.GetInstance();
|
||||||
var channelTAId = Utils.GetChannelNameFromPath(info.Path);
|
var channelTAId = Utils.GetChannelNameFromPath(info.Path);
|
||||||
var channel = await taApi.GetChannel(channelTAId).ConfigureAwait(true);
|
var channel = await taApi.GetChannel(channelTAId).ConfigureAwait(true);
|
||||||
@@ -77,6 +82,10 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
|||||||
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
|
public async Task<IEnumerable<RemoteSearchResult>> GetSearchResults(SeriesInfo searchInfo, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var results = new List<RemoteSearchResult>();
|
var results = new List<RemoteSearchResult>();
|
||||||
|
if (string.IsNullOrWhiteSpace(searchInfo.Path))
|
||||||
|
{
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
var taApi = TubeArchivistApi.GetInstance();
|
var taApi = TubeArchivistApi.GetInstance();
|
||||||
var channelTAId = Utils.GetChannelNameFromPath(searchInfo.Path);
|
var channelTAId = Utils.GetChannelNameFromPath(searchInfo.Path);
|
||||||
|
|||||||
@@ -379,7 +379,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Tasks
|
|||||||
new TaskTriggerInfo
|
new TaskTriggerInfo
|
||||||
{
|
{
|
||||||
Type = TaskTriggerInfoType.IntervalTrigger,
|
Type = TaskTriggerInfoType.IntervalTrigger,
|
||||||
IntervalTicks = TimeSpan.FromSeconds(Plugin.Instance!.Configuration.TAJFProgressTaskInterval).Ticks
|
IntervalTicks = TimeSpan.FromSeconds(Plugin.Instance!.Configuration.JFTAPlaylistsSyncTaskInterval).Ticks
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,7 +201,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Tasks
|
|||||||
new TaskTriggerInfo
|
new TaskTriggerInfo
|
||||||
{
|
{
|
||||||
Type = TaskTriggerInfoType.IntervalTrigger,
|
Type = TaskTriggerInfoType.IntervalTrigger,
|
||||||
IntervalTicks = TimeSpan.FromSeconds(Plugin.Instance!.Configuration.TAJFProgressTaskInterval).Ticks
|
IntervalTicks = TimeSpan.FromSeconds(Plugin.Instance!.Configuration.TAJFPlaylistsSyncTaskInterval).Ticks
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -96,7 +96,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
|
|||||||
{
|
{
|
||||||
Name = Name,
|
Name = Name,
|
||||||
SearchProviderName = Constants.ProviderName,
|
SearchProviderName = Constants.ProviderName,
|
||||||
ImageUrl = ThumbUrl,
|
ImageUrl = Utils.HasImageUrl(ThumbUrl) ? ThumbUrl : null,
|
||||||
ProviderIds = new Dictionary<string, string>() { { Constants.ProviderName, Id } }
|
ProviderIds = new Dictionary<string, string>() { { Constants.ProviderName, Id } }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -118,14 +118,16 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
|
|||||||
Constants.ProviderName, Id
|
Constants.ProviderName, Id
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ImageInfos = new[]
|
ImageInfos = Utils.HasImageUrl(ThumbUrl) ?
|
||||||
{
|
[
|
||||||
new ItemImageInfo
|
new ItemImageInfo
|
||||||
{
|
{
|
||||||
Path = ThumbUrl,
|
Path = ThumbUrl,
|
||||||
Type = ImageType.Primary
|
Type = ImageType.Primary
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
] :
|
||||||
|
[],
|
||||||
Tags = this.Tags != null ?
|
Tags = this.Tags != null ?
|
||||||
this.Tags.ToArray<string>() :
|
this.Tags.ToArray<string>() :
|
||||||
[]
|
[]
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
|
|||||||
Name = Title,
|
Name = Title,
|
||||||
SearchProviderName = Constants.ProviderName,
|
SearchProviderName = Constants.ProviderName,
|
||||||
ProductionYear = Published.Year,
|
ProductionYear = Published.Year,
|
||||||
ImageUrl = VidThumbUrl,
|
ImageUrl = Utils.HasImageUrl(VidThumbUrl) ? VidThumbUrl : null,
|
||||||
PremiereDate = Published,
|
PremiereDate = Published,
|
||||||
ProviderIds = new Dictionary<string, string>() { { Constants.ProviderName, YoutubeId } }
|
ProviderIds = new Dictionary<string, string>() { { Constants.ProviderName, YoutubeId } }
|
||||||
};
|
};
|
||||||
@@ -142,14 +142,16 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
|
|||||||
Constants.ProviderName, YoutubeId
|
Constants.ProviderName, YoutubeId
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ImageInfos = new[]
|
ImageInfos = Utils.HasImageUrl(VidThumbUrl) ?
|
||||||
{
|
[
|
||||||
new ItemImageInfo
|
new ItemImageInfo
|
||||||
{
|
{
|
||||||
Path = VidThumbUrl,
|
Path = VidThumbUrl,
|
||||||
Type = ImageType.Primary
|
Type = ImageType.Primary
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
] :
|
||||||
|
[],
|
||||||
Tags = this.Tags.ToArray<string>()
|
Tags = this.Tags.ToArray<string>()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
|
||||||
namespace Jellyfin.Plugin.TubeArchivistMetadata.Utilities
|
namespace Jellyfin.Plugin.TubeArchivistMetadata.Utilities
|
||||||
{
|
{
|
||||||
@@ -125,6 +126,32 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Utilities
|
|||||||
return path.Split(DetectDirectorySeparator(path)).Last();
|
return path.Split(DetectDirectorySeparator(path)).Last();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks whether the Jellyfin item belongs to the configured TubeArchivist collection.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">Jellyfin item.</param>
|
||||||
|
/// <returns>True when the item belongs to the configured TubeArchivist collection.</returns>
|
||||||
|
public static bool IsTubeArchivistItem(BaseItem item)
|
||||||
|
{
|
||||||
|
if (Plugin.Instance == null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var topParent = item.GetTopParent();
|
||||||
|
return string.Equals(topParent?.Name, Plugin.Instance.Configuration.CollectionTitle, StringComparison.OrdinalIgnoreCase);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks whether a TubeArchivist image URL can be fetched safely.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="url">Image URL returned by TubeArchivist.</param>
|
||||||
|
/// <returns>True when the image URL is non-empty.</returns>
|
||||||
|
public static bool HasImageUrl(string? url)
|
||||||
|
{
|
||||||
|
return !string.IsNullOrWhiteSpace(url);
|
||||||
|
}
|
||||||
|
|
||||||
private static char DetectDirectorySeparator(string path)
|
private static char DetectDirectorySeparator(string path)
|
||||||
{
|
{
|
||||||
int backslashCount = path.Count(c => c == '\\');
|
int backslashCount = path.Count(c => c == '\\');
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@
|
|||||||
name: "TubeArchivistMetadata"
|
name: "TubeArchivistMetadata"
|
||||||
guid: "dc97d0c6-28b0-4242-afb4-5833ae1b3715"
|
guid: "dc97d0c6-28b0-4242-afb4-5833ae1b3715"
|
||||||
imageUrl: https://raw.githubusercontent.com/tubearchivist/tubearchivist-jf-plugin/master/images/logo.png
|
imageUrl: https://raw.githubusercontent.com/tubearchivist/tubearchivist-jf-plugin/master/images/logo.png
|
||||||
version: "1.4.4.0"
|
version: "1.4.5.0"
|
||||||
targetAbi: "10.11.0.0"
|
targetAbi: "10.11.0.0"
|
||||||
framework: "net9.0"
|
framework: "net9.0"
|
||||||
overview: "Metadata for your TubeArchivist library on Jellyfin"
|
overview: "Metadata for your TubeArchivist library on Jellyfin"
|
||||||
@@ -14,4 +14,4 @@ owner: "DarkFighterLuke"
|
|||||||
artifacts:
|
artifacts:
|
||||||
- "Jellyfin.Plugin.TubeArchivistMetadata.dll"
|
- "Jellyfin.Plugin.TubeArchivistMetadata.dll"
|
||||||
changelog: >
|
changelog: >
|
||||||
Handle TubeArchivist playlists pagination
|
Limit providers to TubeArchivist paths, skip empty image URLs, and fix playlist sync intervals
|
||||||
|
|||||||
Reference in New Issue
Block a user