Compare commits
92 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2bdee20beb | |||
| a085a5a4bf | |||
| 3f0267ced0 | |||
| 70123f597a | |||
| b4d6ea2646 | |||
| e0ef8b1e86 | |||
| 362582dddf | |||
| 1c49427761 | |||
| 49effb3d3f | |||
| 66e6a49cc7 | |||
| 3dca19c3e5 | |||
| 55ab16a01a | |||
| 08c8df0292 | |||
| 1a8f3b1aa7 | |||
| 59bfaa077e | |||
| 9635a49c06 | |||
| 00eeff552c | |||
| 4294e7d138 | |||
| b2c7ba6509 | |||
| 81895dadab | |||
| 59710b2aba | |||
| f34db507b0 | |||
| a2432beaa2 | |||
| c908ea5b9c | |||
| e61beea66b | |||
| 61b3849406 | |||
| cb9f79b3fa | |||
| cf7cdb1ab3 | |||
| f202240fe6 | |||
| b9d0aeeb05 | |||
| 46ac3cfdfa | |||
| a00060ca9c | |||
| c3f5248c80 | |||
| 9921dd2308 | |||
| 1fcbbba49f | |||
| 4557ab6efd | |||
| 9febfef12a | |||
| 56e8c29a94 | |||
| 7ea9d20e86 | |||
| bff3b2b59a | |||
| c4b1d1d954 | |||
| 8842a5fdf9 | |||
| bc5fd7fa20 | |||
| 13fd9de010 | |||
| 6803016a17 | |||
| 00047b6753 | |||
| 107aa0ed6c | |||
| c93d705216 | |||
| 8cbdeee818 | |||
| f70527d218 | |||
| 9f2c7e4510 | |||
| a5904a5310 | |||
| a7c6d575ed | |||
| 5b14b3ac87 | |||
| 8b6eae7a6c | |||
| 3c33025cfa | |||
| da56d00689 | |||
| aab2de6189 | |||
| 9b0c4b5d34 | |||
| d6cf76f948 | |||
| 03c77fcbc5 | |||
| 1f33b908be | |||
| ebb74cf7f5 | |||
| 59550760eb | |||
| 3b9d235aee | |||
| 857ca0f8e0 | |||
| 80f1091af3 | |||
| d1ddd4d32d | |||
| 924f85260e | |||
| ca56fcac34 | |||
| 37c7056204 | |||
| 8d89c82660 | |||
| 06efee0051 | |||
| 83b92f5dfe | |||
| 8e77326c20 | |||
| 37a49ddabd | |||
| 6e24a61623 | |||
| ddd61fa39c | |||
| 3ba7e2ec52 | |||
| 40d5c90c4c | |||
| 634b3f7dc7 | |||
| 057020f0ba | |||
| 02846a7d00 | |||
| c9fee17716 | |||
| 195acd2f1b | |||
| 14032d3ed3 | |||
| 604ed24f7c | |||
| eefdd2a635 | |||
| 30715d5c26 | |||
| c12340583e | |||
| a9b335f797 | |||
| 6d5c0b86b2 |
@@ -0,0 +1,55 @@
|
||||
name: Bug Report
|
||||
description: File a bug report
|
||||
title: "[Bug]: "
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to help improve this project! Please read the [how to open an issue](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#how-to-open-an-issue) guide carefully before continuing.
|
||||
|
||||
- type: checkboxes
|
||||
id: latest
|
||||
attributes:
|
||||
label: "I've read the documentation"
|
||||
options:
|
||||
- label: I'm running the latest version of tubearchivist-jf-plugin.
|
||||
required: true
|
||||
- label: I have read the [how to open an issue](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#how-to-open-an-issue) guide, particularly the [bug report](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#bug-report) section.
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: os
|
||||
attributes:
|
||||
label: Operating System
|
||||
description: On what operating system are you running Tube Archivist on?
|
||||
placeholder: eg. Linux, Windows, ...
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: Your Bug Report
|
||||
value: "## Describe the bug\n\n## Steps To Reproduce\n\n## Expected behavior"
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant Jellyfin log output
|
||||
description: Please copy and paste any relevant Jellyfin logs. This will be automatically formatted into code, so no need for backticks.
|
||||
render: shell
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Anything else?
|
||||
description: |
|
||||
Links? References? Anything that will give us more context about the issue you are encountering!
|
||||
|
||||
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||
validations:
|
||||
required: false
|
||||
@@ -0,0 +1,34 @@
|
||||
name: Feature Request
|
||||
description: I have an idea for a great addition to this project
|
||||
title: "[Feature Request]: "
|
||||
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to help improve this project! This project is *very* selective with accepting new feature requests. Please read the [how to open an issue](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#how-to-open-an-issue) guide carefully before continuing.
|
||||
|
||||
- type: checkboxes
|
||||
id: already
|
||||
attributes:
|
||||
label: "I've read the documentation"
|
||||
options:
|
||||
- label: I have read the [how to open an issue](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#how-to-open-an-issue) guide, particularly the [feature request](https://github.com/tubearchivist/tubearchivist/blob/master/CONTRIBUTING.md#feature-request) section.
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
attributes:
|
||||
label: Your Feature Request
|
||||
value: "## Is your feature request related to a problem? Please describe.\n\n## Describe the solution you'd like\n\n## Additional context"
|
||||
placeholder: Tell us what you see!
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: help
|
||||
attributes:
|
||||
label: Your help is needed!
|
||||
description: This project is ambitious as it is, please contribute.
|
||||
options:
|
||||
- label: Yes I will work on this in the next few days or weeks.
|
||||
@@ -0,0 +1,86 @@
|
||||
name: TubeArchivistMetadata Release
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- v*
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
name: Build & Release
|
||||
permissions:
|
||||
contents: write
|
||||
packages: read
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
ref: master
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Get release version
|
||||
id: newtag
|
||||
uses: "WyriHaximus/github-action-get-previous-tag@v1"
|
||||
|
||||
- name: Setup .Net
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: 8.0.x
|
||||
|
||||
- name: Add Jellyfin GitHub Nuget registry to sources
|
||||
run: |
|
||||
dotnet nuget add source \
|
||||
--username DarkFighterLuke \
|
||||
--password ${{ secrets.GITHUB_TOKEN }} \
|
||||
--store-password-in-clear-text \
|
||||
--name github https://nuget.pkg.github.com/jellyfin/index.json
|
||||
|
||||
- name: Get version number only
|
||||
run: |
|
||||
TAG=${{ steps.newtag.outputs.tag }}
|
||||
echo "VERSION=${TAG#v}" >> $GITHUB_ENV
|
||||
|
||||
- name: Generate release message
|
||||
run: |
|
||||
# Read the YAML file and extract the value of the 'changelog' field
|
||||
changelog=$(awk '/changelog:/ {flag=1; next} /^[^ ]/ {flag=0} flag' build.yaml | awk '{$1=$1};1')
|
||||
|
||||
# Check if changelog contains multiple lines
|
||||
if [[ $(echo "$changelog" | wc -l) -gt 1 ]]; then
|
||||
changelog=$(echo "$changelog" | sed 's/^/* /')
|
||||
else
|
||||
changelog="* $changelog"
|
||||
fi
|
||||
|
||||
# Create release-changelog.md
|
||||
echo "Changelog:" > release-changelog.md
|
||||
echo "$changelog" >> release-changelog.md
|
||||
|
||||
|
||||
- name: Build Jellyfin Plugin
|
||||
uses: DarkFighterLuke/jellyfin-plugin-repository-manager@7a96768accc155ac7b597351b5033532f3c48173
|
||||
id: jprm
|
||||
with:
|
||||
dotnet-target: net8.0
|
||||
version: ${VERSION}
|
||||
update-manifest: "true"
|
||||
|
||||
- name: Create release
|
||||
uses: ncipollo/release-action@v1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
artifacts: ${{ steps.jprm.outputs.artifact }}
|
||||
makeLatest: latest
|
||||
bodyFile: release-changelog.md
|
||||
tag: ${{ steps.newtag.outputs.tag }}
|
||||
allowUpdates: true
|
||||
|
||||
- name: Commit manifest.json
|
||||
uses: EndBug/add-and-commit@v9
|
||||
with:
|
||||
add: manifest.json
|
||||
commit: --signoff
|
||||
message: "Update manifest.json"
|
||||
pull: "--no-rebase -X ours origin master"
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>1.2.2.0</Version>
|
||||
<AssemblyVersion>1.2.2.0</AssemblyVersion>
|
||||
<FileVersion>1.2.2.0</FileVersion>
|
||||
<Version>1.3.0.0</Version>
|
||||
<AssemblyVersion>1.3.0.0</AssemblyVersion>
|
||||
<FileVersion>1.3.0.0</FileVersion>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Configuration
|
||||
{
|
||||
private ILogger _logger;
|
||||
private string _tubeArchivistUrl;
|
||||
private string _tubeArchivistApiKey;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="PluginConfiguration"/> class.
|
||||
@@ -30,7 +31,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Configuration
|
||||
|
||||
CollectionTitle = string.Empty;
|
||||
_tubeArchivistUrl = string.Empty;
|
||||
TubeArchivistApiKey = string.Empty;
|
||||
_tubeArchivistApiKey = string.Empty;
|
||||
MaxDescriptionLength = 500;
|
||||
}
|
||||
|
||||
@@ -60,13 +61,27 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Configuration
|
||||
_logger.LogInformation("{Message}", "Given TubeArchivist URL contains no schema. Adding http://...");
|
||||
_tubeArchivistUrl = Utils.SanitizeUrl("http://" + value);
|
||||
}
|
||||
|
||||
Plugin.Instance?.LogTAApiConnectionStatus();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets TubeArchivist API key.
|
||||
/// </summary>
|
||||
public string TubeArchivistApiKey { get; set; }
|
||||
public string TubeArchivistApiKey
|
||||
{
|
||||
get
|
||||
{
|
||||
return _tubeArchivistApiKey;
|
||||
}
|
||||
|
||||
set
|
||||
{
|
||||
_tubeArchivistApiKey = value;
|
||||
Plugin.Instance?.LogTAApiConnectionStatus();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets maximum series and episodes overviews length.
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<RootNamespace>Jellyfin.Plugin.TubeArchivistMetadata</RootNamespace>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
@@ -11,8 +11,8 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Jellyfin.Controller" Version="10.8.13" />
|
||||
<PackageReference Include="Jellyfin.Model" Version="10.8.13" />
|
||||
<PackageReference Include="Jellyfin.Controller" Version="10.9.0-20240509061132" />
|
||||
<PackageReference Include="Jellyfin.Model" Version="10.9.0-20240509061132" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -2,7 +2,9 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using Jellyfin.Plugin.TubeArchivistMetadata.Configuration;
|
||||
using Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Common.Plugins;
|
||||
using MediaBrowser.Model.Plugins;
|
||||
@@ -34,6 +36,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata
|
||||
HttpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Token", Instance?.Configuration.TubeArchivistApiKey);
|
||||
logger.LogInformation("{Message}", "Collection display name: " + Instance?.Configuration.CollectionTitle);
|
||||
logger.LogInformation("{Message}", "TubeArchivist API URL: " + Instance?.Configuration.TubeArchivistUrl);
|
||||
logger.LogInformation("{Message}", "Pinging TubeArchivist API...");
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -66,5 +69,28 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata
|
||||
EmbeddedResourcePath = string.Format(CultureInfo.InvariantCulture, "{0}.Configuration.configPage.html", GetType().Namespace)
|
||||
}
|
||||
};
|
||||
|
||||
/// <summary>
|
||||
/// Logs the TubeArchivist API connection status.
|
||||
/// </summary>
|
||||
public void LogTAApiConnectionStatus()
|
||||
{
|
||||
Logger.LogInformation("{Message}", "Ping...");
|
||||
|
||||
var api = TubeArchivistApi.GetInstance();
|
||||
Task.Run(() => api.Ping()).ContinueWith(
|
||||
task =>
|
||||
{
|
||||
if (task.Result != null)
|
||||
{
|
||||
Logger.LogInformation("{Message}", "TubeArchivist API said: " + task.Result.Response + "!");
|
||||
}
|
||||
else
|
||||
{
|
||||
Logger.LogCritical("{Message}", "TubeArchivist API was unreachable!");
|
||||
}
|
||||
},
|
||||
TaskScheduler.Default);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
@@ -59,7 +60,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
{
|
||||
var list = new List<RemoteImageInfo>();
|
||||
var taApi = TubeArchivistApi.GetInstance();
|
||||
var videoTAId = item.Path.Split("/").Last().Split(".").First();
|
||||
var videoTAId = Utils.GetVideoNameFromPath(item.Path);
|
||||
var video = await taApi.GetVideo(videoTAId).ConfigureAwait(true);
|
||||
_logger.LogInformation("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting images for video: {0} ({1})", video?.Title, videoTAId));
|
||||
_logger.LogInformation("{Message}", "Thumb URI: " + video?.VidThumbUrl);
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Threading;
|
||||
@@ -50,7 +51,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
{
|
||||
var result = new MetadataResult<Episode>();
|
||||
var taApi = TubeArchivistApi.GetInstance();
|
||||
var videoTAId = info.Path.Split("/").Last().Split(".").First();
|
||||
var videoTAId = Utils.GetVideoNameFromPath(info.Path);
|
||||
var video = await taApi.GetVideo(videoTAId).ConfigureAwait(true);
|
||||
_logger.LogInformation("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting metadata for video: {0} ({1})", video?.Title, videoTAId));
|
||||
_logger.LogInformation("{Message}", "Received metadata: \n" + JsonConvert.SerializeObject(video));
|
||||
@@ -62,7 +63,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
{
|
||||
Name = video.Channel.Name,
|
||||
ImageUrl = video.Channel.ThumbUrl,
|
||||
Type = PersonType.Actor,
|
||||
Type = Data.Enums.PersonKind.Actor,
|
||||
});
|
||||
result.HasMetadata = true;
|
||||
result.Item = video.ToEpisode();
|
||||
@@ -79,7 +80,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
var results = new List<RemoteSearchResult>();
|
||||
|
||||
var taApi = TubeArchivistApi.GetInstance();
|
||||
var videoTAId = searchInfo.Path.Split("/").Last().Split(".").First();
|
||||
var videoTAId = Utils.GetVideoNameFromPath(searchInfo.Path);
|
||||
var video = await taApi.GetVideo(videoTAId).ConfigureAwait(true);
|
||||
if (video != null)
|
||||
{
|
||||
|
||||
@@ -58,7 +58,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
{
|
||||
var list = new List<RemoteImageInfo>();
|
||||
var taApi = TubeArchivistApi.GetInstance();
|
||||
var channelTAId = item.Path.Split("/").Last();
|
||||
var channelTAId = Utils.GetChannelNameFromPath(item.Path);
|
||||
var channel = await taApi.GetChannel(channelTAId).ConfigureAwait(true);
|
||||
_logger.LogInformation("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting images for channel: {0} ({1})", channel?.Name, channelTAId));
|
||||
_logger.LogInformation("{Message}", "Thumb URI: " + channel?.ThumbUrl);
|
||||
|
||||
@@ -50,7 +50,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
{
|
||||
var result = new MetadataResult<Series>();
|
||||
var taApi = TubeArchivistApi.GetInstance();
|
||||
var channelTAId = info.Path.Split("/").Last();
|
||||
var channelTAId = Utils.GetChannelNameFromPath(info.Path);
|
||||
var channel = await taApi.GetChannel(channelTAId).ConfigureAwait(true);
|
||||
_logger.LogInformation("{Message}", string.Format(CultureInfo.CurrentCulture, "Getting metadata for channel: {0} ({1})", channel?.Name, channelTAId));
|
||||
_logger.LogInformation("{Message}", "Received metadata: \n" + JsonConvert.SerializeObject(channel));
|
||||
@@ -62,7 +62,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
{
|
||||
Name = channel.Name,
|
||||
ImageUrl = channel.ThumbUrl,
|
||||
Type = PersonType.Actor,
|
||||
Type = Data.Enums.PersonKind.Actor,
|
||||
});
|
||||
result.HasMetadata = true;
|
||||
result.Item = channel.ToSeries();
|
||||
@@ -79,7 +79,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Providers
|
||||
var results = new List<RemoteSearchResult>();
|
||||
|
||||
var taApi = TubeArchivistApi.GetInstance();
|
||||
var channelTAId = searchInfo.Path.Split("/").Last();
|
||||
var channelTAId = Utils.GetChannelNameFromPath(searchInfo.Path);
|
||||
var channel = await taApi.GetChannel(channelTAId).ConfigureAwait(true);
|
||||
if (channel != null)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
using Newtonsoft.Json;
|
||||
|
||||
namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
|
||||
{
|
||||
/// <summary>
|
||||
/// A class representing TubeArchivist API ping response data.
|
||||
/// </summary>
|
||||
public class PingResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="PingResponse"/> class.
|
||||
/// </summary>
|
||||
/// <param name="response">Response from the API ("pong").</param>
|
||||
/// <param name="user">TubeArchivist user id.</param>
|
||||
/// <param name="version">TubeArchivist version.</param>
|
||||
public PingResponse(
|
||||
string response,
|
||||
int user,
|
||||
string version)
|
||||
{
|
||||
this.Response = response;
|
||||
this.User = user;
|
||||
this.Version = version;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets response to the ping ("pong").
|
||||
/// </summary>
|
||||
[JsonProperty(PropertyName = "response")]
|
||||
public string Response { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets user id.
|
||||
/// </summary>
|
||||
[JsonProperty(PropertyName = "user")]
|
||||
public int User { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets TubeArchivist version.
|
||||
/// </summary>
|
||||
[JsonProperty(PropertyName = "version")]
|
||||
public string Version { get; }
|
||||
}
|
||||
}
|
||||
@@ -116,5 +116,35 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
|
||||
|
||||
return video?.Data;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Validates connection and authentication to TubeArchivist.
|
||||
/// </summary>
|
||||
/// <returns>The ping response.</returns>
|
||||
public async Task<PingResponse?> Ping()
|
||||
{
|
||||
PingResponse? pong = null;
|
||||
|
||||
var pingEndpoint = "/api/ping/";
|
||||
var url = new Uri(Utils.SanitizeUrl(Plugin.Instance!.Configuration.TubeArchivistUrl + pingEndpoint));
|
||||
var response = await client.GetAsync(url).ConfigureAwait(true);
|
||||
|
||||
while (response.StatusCode == HttpStatusCode.Moved)
|
||||
{
|
||||
url = response.Headers.Location;
|
||||
_logger.LogInformation("{Message}", "Received redirect to: " + url);
|
||||
response = await client.GetAsync(url).ConfigureAwait(true);
|
||||
}
|
||||
|
||||
_logger.LogInformation("{Message}", url + ": " + response.StatusCode);
|
||||
|
||||
if (response.IsSuccessStatusCode)
|
||||
{
|
||||
string rawData = await response.Content.ReadAsStringAsync().ConfigureAwait(true);
|
||||
pong = JsonConvert.DeserializeObject<PingResponse>(rawData);
|
||||
}
|
||||
|
||||
return pong;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace Jellyfin.Plugin.TubeArchivistMetadata.Utilities
|
||||
@@ -47,10 +49,46 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Utilities
|
||||
|
||||
if (description.Length > maxLength)
|
||||
{
|
||||
description = description.Replace("\n", "<br>", System.StringComparison.CurrentCulture).Substring(0, maxLength);
|
||||
description = description.Substring(0, maxLength);
|
||||
description = description.Replace("\n", "<br>", System.StringComparison.CurrentCulture);
|
||||
}
|
||||
|
||||
return description;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get video name from file path on the disk.
|
||||
/// </summary>
|
||||
/// <param name="path">File path on disk.</param>
|
||||
/// <returns>The video name.</returns>
|
||||
public static string GetVideoNameFromPath(string path)
|
||||
{
|
||||
return path.Split(DetectDirectorySeparator(path)).Last().Split(".").First();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get channel name from directory path on the disk.
|
||||
/// </summary>
|
||||
/// <param name="path">Directory path on disk.</param>
|
||||
/// <returns>The channel name.</returns>
|
||||
public static string GetChannelNameFromPath(string path)
|
||||
{
|
||||
return path.Split(DetectDirectorySeparator(path)).Last();
|
||||
}
|
||||
|
||||
private static char DetectDirectorySeparator(string path)
|
||||
{
|
||||
int backslashCount = path.Count(c => c == '\\');
|
||||
int forwardSlashCount = path.Count(c => c == '/');
|
||||
|
||||
if (backslashCount > forwardSlashCount)
|
||||
{
|
||||
return '\\'; // Windows directory separator
|
||||
}
|
||||
else
|
||||
{
|
||||
return '/'; // Unix directory separator
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,18 +1,19 @@
|
||||
<h1 align="center">Jellyfin TubeArchivist Plugin</h1>
|
||||
|
||||
<p align="center">
|
||||
<img alt="Plugin Banner" src="https://raw.githubusercontent.com/DarkFighterLuke/TubeArchivistMetadata/master/images/logo.png"/>
|
||||
<img alt="Plugin Banner" src="https://raw.githubusercontent.com/tubearchivist/tubearchivist-jf-plugin/master/images/logo.png"/>
|
||||
<br/>
|
||||
</p>
|
||||
|
||||
> [!IMPORTANT]
|
||||
> Jellyfin 10.9.1 has been finally released, since the plugin is maintained only for the latest Jellyfin release, in order to continue using this plugin with all the latest features you will need to upgrade your Jellyfin installation.
|
||||
|
||||
## About
|
||||
|
||||
<p>This plugin adds the metadata provider for <a href="https://www.tubearchivist.com/">TubeArchivist</a>.</p>
|
||||
<p>This plugin offers improved flexibility and native integration with Jellyfin compared to <a href="https://github.com/tubearchivist/tubearchivist-jf">tubearchivist-jf</a> solution.<br> This solution runs also more smoothly than the cited one since it is direcly integrated in Jellyfin and it is not based on strict folder paths on the disk.<br>
|
||||
Furthermore, it allows to configure a custom collection name.</p>
|
||||
<p>This plugin adds the metadata provider for <a href="https://www.tubearchivist.com/">TubeArchivist</a>, offering improved flexibility and native integration with Jellyfin compared to previous solutions.</p>
|
||||
|
||||
## How it works
|
||||
The media organization is the same used in [tubearchivist-jf](https://github.com/tubearchivist/tubearchivist-jf), so the collection will be a `Shows` collection, where each channel is a show and its videos are the episodes, organized in seasons by year.<br>
|
||||
The media organization is a `Shows` collection, where each channel is a show and its videos are the episodes, organized in seasons by year.<br>
|
||||
The plugin interacts with TubeArchivist APIs to fetch videos and channels metadata.
|
||||
|
||||
### Features
|
||||
@@ -27,17 +28,18 @@ The plugin interacts with TubeArchivist APIs to fetch videos and channels metada
|
||||
1. Go to `Dashboard -> Plugins` and select the `Repositories` tab
|
||||
2. Add a new repository with the following details:
|
||||
- Repository name: `TubeArchivistMetadata`
|
||||
- Repository URL: `https://github.com/DarkFighterLuke/TubeArchivistMetadata/raw/master/manifest.json`
|
||||

|
||||
- Repository URL: `https://github.com/tubearchivist/tubearchivist-jf-plugin/raw/master/manifest.json`
|
||||

|
||||
|
||||
3. Go to the `Catalog` tab
|
||||
4. Find `TubeArchivistMetadata` in the `Metadata` section and install it
|
||||

|
||||

|
||||
5. Restart Jellyfin to apply the changes
|
||||
|
||||
|
||||
### From ZIP in GitHub releases
|
||||
1. Download the latest available release (`TubeArchivist-*.zip`) from the repository releases section
|
||||
1. Download the latest available release (`tubearchivistmetadata_*.zip`) from the repository releases section
|
||||
2. Extract the contained files in the `plugins/TubeArchivistMetadata` folder (you might need to create the folders) of your Jellyfin installation
|
||||
3. Restart Jellyfin to apply the changes
|
||||
3. Restart Jellyfin to apply the changes
|
||||
|
||||
## Configuration
|
||||
<p>This plugin requires that you have already an instance of TubeArchivist up and running.</p>
|
||||
@@ -49,7 +51,8 @@ Once installed, you have to configure the following parameters in the plugin con
|
||||
<li>Overviews length (channels and videos descriptions)</li>
|
||||
</ul>
|
||||
|
||||

|
||||

|
||||
|
||||
|
||||
## Use the plugin
|
||||
<p>Using the plugin is very simple. Let's start from the beginning:</p>
|
||||
@@ -57,20 +60,21 @@ Once installed, you have to configure the following parameters in the plugin con
|
||||
_NOTE: If you are using Docker containers, it is important to mount the TubeArchivist media path into Jellyfin container as **read-only**, in order to avoid possible operations on the media files that will break TubeArchivist._ <br>
|
||||
1. Go to `Dashboard -> Libraries` and add a media library
|
||||
2. In the form select `Shows` as Content type, set a display name for the library and set the TubeArchivist media folder in the `Folders` section
|
||||

|
||||
3. Scrolling down, uncheck all metadata and image providers except `TubeArchivist`. (You won't find TubeArchivist in seasons providers, so just disable everything there)
|
||||
4. Save and come back to Home, you will see the newly added library. Jellyfin will have executed the metadata fetching for you after the collection creation and then you will see the metadata and the images of channels and videos
|
||||

|
||||
|
||||
4. Scrolling down, uncheck all metadata and image providers except `TubeArchivist`. (You won't find TubeArchivist in seasons providers, so just disable everything there)
|
||||
5. Save and come back to Home, you will see the newly added library. Jellyfin will have executed the metadata fetching for you after the collection creation and then you will see the metadata and the images of channels and videos
|
||||
|
||||
## Build
|
||||
|
||||
1. To build this plugin you will need [.Net 6.x](https://dotnet.microsoft.com/download/dotnet/6.0).
|
||||
1. To build this plugin you will need [.Net 8.x](https://dotnet.microsoft.com/download/dotnet/8.0).
|
||||
|
||||
2. Build plugin with following command
|
||||
```
|
||||
dotnet publish Jellyfin.Plugin.TubeArchivistMetadata --configuration Release --output bin
|
||||
$ dotnet publish Jellyfin.Plugin.TubeArchivistMetadata --configuration Release --output bin
|
||||
```
|
||||
|
||||
3. Place the dll-file in the `plugins/TubeArchivistMetadata` folder (you might need to create the folders) of your Jellyfin installation
|
||||
3. Place the dll-file in the `plugins/tubearchivist-jf-plugin` folder (you might need to create the folders) of your Jellyfin installation
|
||||
|
||||
## License
|
||||
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio Version 17
|
||||
VisualStudioVersion = 17.0.31903.59
|
||||
MinimumVisualStudioVersion = 10.0.40219.1
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Jellyfin.Plugin.TubeArchivistMetadata", "Jellyfin.Plugin.TubeArchivistMetadata\Jellyfin.Plugin.TubeArchivistMetadata.csproj", "{7A112ACB-79E8-4FC9-BCF6-B3AC849DA2D4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{7A112ACB-79E8-4FC9-BCF6-B3AC849DA2D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7A112ACB-79E8-4FC9-BCF6-B3AC849DA2D4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7A112ACB-79E8-4FC9-BCF6-B3AC849DA2D4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7A112ACB-79E8-4FC9-BCF6-B3AC849DA2D4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
||||
+5
-4
@@ -1,9 +1,10 @@
|
||||
---
|
||||
name: "TubeArchivistMetadata"
|
||||
guid: "dc97d0c6-28b0-4242-afb4-5833ae1b3715"
|
||||
version: "1.2.2.0"
|
||||
targetAbi: "10.8.0.0"
|
||||
framework: "net6.0"
|
||||
imageUrl: https://raw.githubusercontent.com/tubearchivist/tubearchivist-jf-plugin/master/images/logo.png
|
||||
version: "1.3.0.0"
|
||||
targetAbi: "10.9.1.0"
|
||||
framework: "net8.0"
|
||||
overview: "Metadata for your TubeArchivist library on Jellyfin"
|
||||
description: >
|
||||
TubeArchivistMetadata is a plugin that automatically manages
|
||||
@@ -13,4 +14,4 @@ owner: "DarkFighterLuke"
|
||||
artifacts:
|
||||
- "Jellyfin.Plugin.TubeArchivistMetadata.dll"
|
||||
changelog: >
|
||||
Fix bug on description length substringing
|
||||
Add support for Jellyfin 10.9.1
|
||||
|
||||
+32
-8
@@ -3,16 +3,40 @@
|
||||
"category": "Metadata",
|
||||
"guid": "dc97d0c6-28b0-4242-afb4-5833ae1b3715",
|
||||
"name": "TubeArchivistMetadata",
|
||||
"description": "A new and fully integrated way to manage metadata and organize your TubeArchivist library videos on Jellyfin.",
|
||||
"description": "TubeArchivistMetadata is a plugin that automatically manages metadata for videos downloaded with TubeArchivist from YouTube.\n",
|
||||
"owner": "DarkFighterLuke",
|
||||
"overview": "Metadata for your TubeArchivist library on Jellyfin",
|
||||
"imageUrl": "https://raw.githubusercontent.com/DarkFighterLuke/TubeArchivistMetadata/master/images/logo.png",
|
||||
"imageUrl": "https://raw.githubusercontent.com/tubearchivist/tubearchivist-jf-plugin/master/images/logo.png",
|
||||
"versions": [
|
||||
{
|
||||
"version": "1.2.5.0",
|
||||
"changelog": "Ping the TA API to validate connection\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.2.5/tubearchivistmetadata_1.2.5.0.zip",
|
||||
"checksum": "e4a0d076ffd84c976ad66dde91dfb840",
|
||||
"timestamp": "2024-05-14T17:37:17Z"
|
||||
},
|
||||
{
|
||||
"version": "1.2.4.0",
|
||||
"changelog": "Fix issues with directory separators\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.2.4/tubearchivistmetadata_1.2.4.0.zip",
|
||||
"checksum": "b418a46d458fe28354580d70748b1ced",
|
||||
"timestamp": "2024-05-09 15:41:00"
|
||||
},
|
||||
{
|
||||
"version": "1.2.3.0",
|
||||
"changelog": "Add fix for unclosed HTML breaks\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.2.3/tubearchivistmetadata_1.2.3.0.zip",
|
||||
"checksum": "f5328a662444739eaa7c59855bfcb203",
|
||||
"timestamp": "2024-04-18 21:45:00"
|
||||
},
|
||||
{
|
||||
"version": "1.2.2.0",
|
||||
"changelog": "Fix bug on description length substringing\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/DarkFighterLuke/TubeArchivistMetadata/releases/download/v1.2.2/TubeArchivistMetadata-1.2.2.zip",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.2.2/tubearchivistmetadata_1.2.2.0.zip",
|
||||
"checksum": "82d04546916e1ba76d56de28e648447a",
|
||||
"timestamp": "2024-03-15 10:12:00"
|
||||
},
|
||||
@@ -20,7 +44,7 @@
|
||||
"version": "1.2.1.0",
|
||||
"changelog": "Make maximum description length configurable\nTruncate descriptions to 500 characters\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/DarkFighterLuke/TubeArchivistMetadata/releases/download/v1.2.1/TubeArchivistMetadata-1.2.1.zip",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.2.1/tubearchivistmetadata_1.2.1.0.zip",
|
||||
"checksum": "cf68d169956f166a6ee68a06192651c2",
|
||||
"timestamp": "2024-03-14 21:50:00"
|
||||
},
|
||||
@@ -28,7 +52,7 @@
|
||||
"version": "1.2.0.0",
|
||||
"changelog": "Add episodes and series overview\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/DarkFighterLuke/TubeArchivistMetadata/releases/download/v1.2.0/TubeArchivistMetadata-1.2.0.zip",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.2.0/tubearchivistmetadata_1.2.0.0.zip",
|
||||
"checksum": "75812a4464bf68c43fb9dcdb74d924e3",
|
||||
"timestamp": "2024-03-14 20:00:00"
|
||||
},
|
||||
@@ -36,7 +60,7 @@
|
||||
"version": "1.1.1.0",
|
||||
"changelog": "Handle empty tags for videos and channels\nFix URL by removing trailing slash for images\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/DarkFighterLuke/TubeArchivistMetadata/releases/download/v1.1.1/TubeArchivistMetadata-1.1.1.zip",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.1.1/tubearchivistmetadata_1.1.1.0.zip",
|
||||
"checksum": "84ce752ce662e834690512c88ba48664",
|
||||
"timestamp": "2024-03-14 16:35:00"
|
||||
},
|
||||
@@ -44,7 +68,7 @@
|
||||
"version": "1.1.0.0",
|
||||
"changelog": "Fix field name and add placeholders\nFix URL in logs after redirection\nAdd schema to TubeArchivist URL if not present in settings\nFix a particular case\nLog configuration settings at initialization\nSanitize URLs\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/DarkFighterLuke/TubeArchivistMetadata/releases/download/v1.1.0/TubeArchivistMetadata-1.1.0.zip",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.1.0/tubearchivistmetadata_1.1.0.0.zip",
|
||||
"checksum": "de4b6562973b7f75b6afe3a441bb0e19",
|
||||
"timestamp": "2024-03-13 15:02:00"
|
||||
},
|
||||
@@ -52,7 +76,7 @@
|
||||
"version": "1.0.0.0",
|
||||
"changelog": "First release\n",
|
||||
"targetAbi": "10.8.0.0",
|
||||
"sourceUrl": "https://github.com/DarkFighterLuke/TubeArchivistMetadata/releases/download/v1.0.0/TubeArchivistMetadata-1.0.0.zip",
|
||||
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.0.0/tubearchivistmetadata_1.0.0.0.zip",
|
||||
"checksum": "444f8980671de494b1875ee7d1657bcf",
|
||||
"timestamp": "2024-03-11 16:02:00"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user