Compare commits

...

21 Commits

Author SHA1 Message Date
DarkFighterLuke 4f2f6c0429 Merge pull request #41 from tubearchivist/ta-v0.5.0
TubeArchivist v0.5.0 new API
2025-03-10 18:45:14 +01:00
DarkFighterLuke 11eb456c56 Fix JF crash when setting watched status with TA offline 2025-02-22 15:39:58 +01:00
DarkFighterLuke 4db1ce755a Update build.yaml 2025-02-22 15:15:54 +01:00
DarkFighterLuke a424721d93 Update README.md 2025-02-22 15:14:11 +01:00
DarkFighterLuke 16598bb86e Adapt to the new TA API changes 2025-02-21 17:42:58 +01:00
DarkFighterLuke 98472b5aa6 Fix JF->TA watched status synchronization 2025-02-21 17:41:51 +01:00
DarkFighterLuke ab96b227a1 Merge pull request #31 from AgentK20/tag-nre-fix
Fix ArgumentNullException when channel has no tags
2025-01-08 23:12:25 +01:00
AgentK 5ff96113c8 Spacing 2024-12-01 11:12:34 -06:00
AgentK 6697f2b4cc Correctly handle the possibility of a null-deserialized tags 2024-12-01 11:09:53 -06:00
DarkFighterLuke a45ef87f84 Update manifest.json
Signed-off-by: DarkFighterLuke <DarkFighterLuke@users.noreply.github.com>
2024-11-04 21:30:26 +00:00
DarkFighterLuke 157facdceb Merge workaround for JF crashing when scanning Series pull request by wolffshots 2024-11-04 22:29:26 +01:00
DarkFighterLuke be8481c795 Remove useless comments 2024-11-04 22:26:42 +01:00
DarkFighterLuke bd0a8371a5 Merge pull request #26 from wolffshots/workaround-series-crash
Workaround for JF crashing when scanning Series
2024-11-04 22:23:45 +01:00
DarkFighterLuke a75c474647 Fix manifest.json 2024-11-04 21:52:19 +01:00
DarkFighterLuke 1dd7019676 Fix manifest.json 2024-11-04 21:47:55 +01:00
DarkFighterLuke 355576c283 Update README.md 2024-11-04 21:44:38 +01:00
DarkFighterLuke 9091cdbe5b Update manifest.json
Signed-off-by: DarkFighterLuke <DarkFighterLuke@users.noreply.github.com>
2024-11-04 20:41:49 +00:00
DarkFighterLuke a162ebb25d Add compatibility with Jellyfin 10.10 2024-11-04 21:40:29 +01:00
DarkFighterLuke 36eec27d9f Update .gitignore 2024-11-04 21:39:19 +01:00
wolffshots 2fee654efe chore: wrap itemYTId stuff in try catch 2024-10-22 15:11:50 +02:00
DarkFighterLuke ce8aea629b Update manifest.json
Signed-off-by: DarkFighterLuke <DarkFighterLuke@users.noreply.github.com>
2024-09-14 13:42:01 +00:00
11 changed files with 86 additions and 64 deletions
+1
View File
@@ -3,3 +3,4 @@ obj/
.vs/
.idea/
artifacts
nuget.config
+3 -3
View File
@@ -1,7 +1,7 @@
<Project>
<PropertyGroup>
<Version>1.3.0.0</Version>
<AssemblyVersion>1.3.0.0</AssemblyVersion>
<FileVersion>1.3.0.0</FileVersion>
<Version>1.3.4.0</Version>
<AssemblyVersion>1.3.4.0</AssemblyVersion>
<FileVersion>1.3.4.0</FileVersion>
</PropertyGroup>
</Project>
@@ -11,8 +11,8 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Jellyfin.Controller" Version="10.9.0-20240509061132" />
<PackageReference Include="Jellyfin.Model" Version="10.9.0-20240509061132" />
<PackageReference Include="Jellyfin.Controller" Version="10.10.0" />
<PackageReference Include="Jellyfin.Model" Version="10.10.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
+26 -11
View File
@@ -173,28 +173,43 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata
private async void OnWatchedStatusChange(object? sender, UserDataSaveEventArgs eventArgs)
{
var user = _userManager.GetUserById(eventArgs.UserId);
if (user != null && Configuration.GetJFUsernamesToArray().Contains(user!.Username))
if (Configuration.JFTASync && user != null && Configuration.GetJFUsernamesToArray().Contains(user!.Username))
{
var isPlayed = eventArgs.Item.IsPlayed(user);
Logger.LogDebug("User {UserId} changed watched status to {Status} for the item {ItemName}", eventArgs.UserId, isPlayed, eventArgs.Item.Name);
string itemYTId;
if (eventArgs.Item is Series)
try
{
itemYTId = Utils.GetChannelNameFromPath(eventArgs.Item.Path);
if (eventArgs.Item is Series)
{
itemYTId = Utils.GetChannelNameFromPath(eventArgs.Item.Path);
}
else if (eventArgs.Item is Episode)
{
itemYTId = Utils.GetVideoNameFromPath(eventArgs.Item.Path);
}
else
{
return;
}
}
else if (eventArgs.Item is Episode)
{
itemYTId = Utils.GetVideoNameFromPath(eventArgs.Item.Path);
}
else
catch (Exception ex)
{
Logger.LogError(ex, "Error while processing item path: {ItemPath}", eventArgs.Item.Path ?? "null");
return;
}
var statusCode = await TubeArchivistApi.GetInstance().SetWatchedStatus(itemYTId, isPlayed).ConfigureAwait(true);
if (statusCode != System.Net.HttpStatusCode.OK)
try
{
Logger.LogCritical("POST /watched returned {StatusCode} for item {ItemName} ({VideoYTId}) with watched status {IsPlayed}", statusCode, eventArgs.Item.Name, itemYTId, isPlayed);
var statusCode = await TubeArchivistApi.GetInstance().SetWatchedStatus(itemYTId, isPlayed).ConfigureAwait(true);
if (statusCode != System.Net.HttpStatusCode.OK)
{
Logger.LogCritical("POST /watched returned {StatusCode} for item {ItemName} ({VideoYTId}) with watched status {IsPlayed}", statusCode, eventArgs.Item.Name, itemYTId, isPlayed);
}
}
catch (Exception ex)
{
Logger.LogCritical("An exception occurred while calling POST /watched for item {ItemName} ({VideoYTId}) with watched status {IsPlayed}: {ExceptionMessage}", eventArgs.Item.Name, itemYTId, isPlayed, ex.Message);
}
}
}
@@ -167,7 +167,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.Tasks
foreach (Episode video in videos)
{
var videoYTId = Utils.GetVideoNameFromPath(video.Path);
var playbackProgress = _userDataManager.GetUserData(user.Id, video).PlaybackPositionTicks / TimeSpan.TicksPerSecond;
var playbackProgress = _userDataManager.GetUserData(user, video).PlaybackPositionTicks / TimeSpan.TicksPerSecond;
var statusCode = await taApi.SetProgress(videoYTId, playbackProgress).ConfigureAwait(true);
if (statusCode != System.Net.HttpStatusCode.OK)
{
@@ -126,7 +126,9 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
Type = ImageType.Primary
}
},
Tags = this.Tags.ToArray<string>()
Tags = this.Tags != null ?
this.Tags.ToArray<string>() :
[]
};
}
}
@@ -65,7 +65,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
/// <returns>A task.</returns>
public async Task<Channel?> GetChannel(string channelId)
{
ResponseContainer<Channel>? channel = null;
Channel? channel = null;
var channelsEndpoint = "/api/channel/";
var url = new Uri(Utils.SanitizeUrl(Plugin.Instance?.Configuration.TubeArchivistUrl + channelsEndpoint + channelId));
@@ -82,10 +82,10 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
if (response.IsSuccessStatusCode)
{
string rawData = await response.Content.ReadAsStringAsync().ConfigureAwait(true);
channel = JsonConvert.DeserializeObject<ResponseContainer<Channel>>(rawData);
channel = JsonConvert.DeserializeObject<Channel>(rawData);
}
return channel?.Data;
return channel;
}
/// <summary>
@@ -95,7 +95,7 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
/// <returns>A task.</returns>
public async Task<Video?> GetVideo(string videoId)
{
ResponseContainer<Video>? video = null;
Video? video = null;
var videosEndpoint = "/api/video/";
var url = new Uri(Utils.SanitizeUrl(Plugin.Instance?.Configuration.TubeArchivistUrl + videosEndpoint + videoId));
@@ -112,10 +112,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
if (response.IsSuccessStatusCode)
{
string rawData = await response.Content.ReadAsStringAsync().ConfigureAwait(true);
video = JsonConvert.DeserializeObject<ResponseContainer<Video>>(rawData);
_logger.LogInformation("{Message}", rawData);
video = JsonConvert.DeserializeObject<Video>(rawData);
}
return video?.Data;
return video;
}
/// <summary>
@@ -174,15 +175,11 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
{
Progress? progress = null;
var progressEndpoint = $"/api/video/{videoId}/progress/";
var url = new Uri(Utils.SanitizeUrl(Plugin.Instance!.Configuration.TubeArchivistUrl + progressEndpoint));
var response = await client.GetAsync(url).ConfigureAwait(true);
if (response.IsSuccessStatusCode)
var video = await GetVideo(videoId).ConfigureAwait(true);
if (video != null)
{
string rawData = await response.Content.ReadAsStringAsync().ConfigureAwait(true);
progress = JsonConvert.DeserializeObject<Progress>(rawData);
progress = new Progress((long)video.Player.Position);
_logger.LogInformation("{Message}", $"Retrieved progress {video.Player.Position}");
}
return progress;
@@ -1,4 +1,3 @@
using System;
using Newtonsoft.Json;
namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
@@ -13,12 +12,12 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
/// </summary>
/// <param name="duration">Duration of the video.</param>
/// <param name="isWatched">Whether the video is marked as watched.</param>
/// <param name="watchedUnixTime">Unix time of when the video has been marked watched.</param>
public Player(long duration, bool isWatched, long watchedUnixTime)
/// <param name="position">Video watched seconds.</param>
public Player(long duration, bool isWatched, double position)
{
Duration = duration;
IsWatched = isWatched;
WatchedUnixTime = watchedUnixTime;
Position = position;
}
/// <summary>
@@ -34,18 +33,9 @@ namespace Jellyfin.Plugin.TubeArchivistMetadata.TubeArchivist
public bool IsWatched { get; }
/// <summary>
/// Gets the Unix date and time when the video has been marked as watched.
/// Gets the video watched seconds.
/// </summary>
[JsonProperty(PropertyName = "watched_date")]
public long WatchedUnixTime { get; }
/// <summary>
/// Gets the date and time when the video has been marked as watched.
/// </summary>
[JsonIgnore]
public DateTime WatchedTime
{
get => DateTimeOffset.FromUnixTimeSeconds(WatchedUnixTime).DateTime;
}
[JsonProperty(PropertyName = "position")]
public double Position { get; }
}
}
+2 -1
View File
@@ -6,7 +6,8 @@
</p>
> [!IMPORTANT]
> Jellyfin 10.9.1 has been finally released and since starting with the version 1.3.0 the plugin supports only the latest Jellyfin release, in order to continue using this plugin with all the latest features you will need to upgrade your Jellyfin installation.
> Jellyfin release cycle has changed in the past few months and now it is shorter than before. The plugin supports only the latest Jellyfin release, in order to continue using this plugin with all the latest features you will need to upgrade your Jellyfin installation.
> The same rule applies to TubeArchivist: the plugin is only guaranteed to work with the latest TubeArchivist version.
## About
+4 -4
View File
@@ -2,8 +2,8 @@
name: "TubeArchivistMetadata"
guid: "dc97d0c6-28b0-4242-afb4-5833ae1b3715"
imageUrl: https://raw.githubusercontent.com/tubearchivist/tubearchivist-jf-plugin/master/images/logo.png
version: "1.3.2.0"
targetAbi: "10.9.1.0"
version: "1.3.5.0"
targetAbi: "10.10.0.0"
framework: "net8.0"
overview: "Metadata for your TubeArchivist library on Jellyfin"
description: >
@@ -14,5 +14,5 @@ owner: "DarkFighterLuke"
artifacts:
- "Jellyfin.Plugin.TubeArchivistMetadata.dll"
changelog: >
Add tasks progress status
Adjust logs levels
Adapt to the new TA API changes
Fix JF crash when setting watched status with TA offline
+27 -11
View File
@@ -8,13 +8,29 @@
"overview": "Metadata for your TubeArchivist library on Jellyfin",
"imageUrl": "https://raw.githubusercontent.com/tubearchivist/tubearchivist-jf-plugin/master/images/logo.png",
"versions": [
{
"version": "1.3.4.0",
"changelog": "Merge workaround for JF crashing when scanning Series pull request by wolffshots\n",
"targetAbi": "10.10.0.0",
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.3.4/tubearchivistmetadata_1.3.4.0.zip",
"checksum": "1ee6041139a6fdc3cecc8b2a427c60a8",
"timestamp": "2024-11-04T21:30:24Z"
},
{
"version": "1.3.3.0",
"changelog": "Add compatibility with Jellyfin 10.10\n",
"targetAbi": "10.10.0.0",
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.3.3/tubearchivistmetadata_1.3.3.0.zip",
"checksum": "ee6431d8bdaf844672d167b6f3ee0a73",
"timestamp": "2024-11-04T20:41:46Z"
},
{
"version": "1.3.2.0",
"changelog": "Add support for Jellyfin 10.9.1\n",
"changelog": "Add tasks progress status Adjust logs levels\n",
"targetAbi": "10.9.1.0",
"sourceUrl": "https://github.com/tubearchivist/tubearchivist-jf-plugin/releases/download/v1.3.2/tubearchivistmetadata_1.3.2.0.zip",
"checksum": "90e3bc35cdadf8688813252e6d5c390a",
"timestamp": "2024-09-14T13:33:07Z"
"checksum": "6162235807535a5c2a7570276798e69e",
"timestamp": "2024-09-14T13:41:58Z"
},
{
"version": "1.3.1.0",
@@ -46,7 +62,7 @@
"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"
"timestamp": "2024-05-09T15:41:00Z"
},
{
"version": "1.2.3.0",
@@ -54,7 +70,7 @@
"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"
"timestamp": "2024-04-18T21:45:00Z"
},
{
"version": "1.2.2.0",
@@ -62,7 +78,7 @@
"targetAbi": "10.8.0.0",
"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"
"timestamp": "2024-03-15T10:12:00Z"
},
{
"version": "1.2.1.0",
@@ -70,7 +86,7 @@
"targetAbi": "10.8.0.0",
"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"
"timestamp": "2024-03-14T21:50:00Z"
},
{
"version": "1.2.0.0",
@@ -78,7 +94,7 @@
"targetAbi": "10.8.0.0",
"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"
"timestamp": "2024-03-14T20:00:00Z"
},
{
"version": "1.1.1.0",
@@ -86,7 +102,7 @@
"targetAbi": "10.8.0.0",
"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"
"timestamp": "2024-03-14T16:35:00Z"
},
{
"version": "1.1.0.0",
@@ -94,7 +110,7 @@
"targetAbi": "10.8.0.0",
"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"
"timestamp": "2024-03-13T15:02:00Z"
},
{
"version": "1.0.0.0",
@@ -102,7 +118,7 @@
"targetAbi": "10.8.0.0",
"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"
"timestamp": "2024-03-11T16:02:00Z"
}
]
}