4 Commits

Author SHA1 Message Date
1a4cefba40 Updated version 2025-12-03 22:03:54 -07:00
2387fecfb6 Added main page 2025-12-03 22:03:07 -07:00
1ddb840f4a Added checks for completely unwatched movies and series 2025-11-30 21:43:47 -07:00
c001a4f2ca Corrected csproj to use assembly version 2025-11-30 21:20:26 -07:00
6 changed files with 40 additions and 22 deletions

View File

@@ -1,5 +1,5 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<AssemblyVersion>0.0.0.2</AssemblyVersion> <AssemblyVersion>0.0.0.3</AssemblyVersion>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@@ -11,7 +11,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Jellyfin.Controller" Version="10.11.3" > <PackageReference Include="Jellyfin.Controller" Version="10.11.3">
<ExcludeAssets>runtime</ExcludeAssets> <ExcludeAssets>runtime</ExcludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Jellyfin.Model" Version="10.11.3"> <PackageReference Include="Jellyfin.Model" Version="10.11.3">
@@ -20,8 +20,10 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="Configuration\configPage.html" /> <None Remove="Configuration\settings.html" />
<EmbeddedResource Include="Configuration\configPage.html" /> <EmbeddedResource Include="Configuration\settings.html" />
<None Remove="Pages\home.html" />
<EmbeddedResource Include="Pages\home.html" />
</ItemGroup> </ItemGroup>
<PropertyGroup> <PropertyGroup>
@@ -29,20 +31,6 @@
</PropertyGroup> </PropertyGroup>
<Target Name="GeneratePluginJson" BeforeTargets="Publish"> <Target Name="GeneratePluginJson" BeforeTargets="Publish">
<WriteLinesToFile <WriteLinesToFile File="$(PublishDir)\meta.json" Lines="{&#xA; &quot;guid&quot;: &quot;fef007a8-3e8f-4aa8-a22e-486a387f4192&quot;,&#xA; &quot;name&quot;: &quot;Media Cleaner&quot;,&#xA; &quot;category&quot;: &quot;Library&quot;,&#xA; &quot;overview&quot;: &quot;A cleaner for your stale media.&quot;,&#xA; &quot;description&quot;: &quot;Clean out the stale media from your library using scheduled tasks&quot;,&#xA; &quot;timestamp&quot;: &quot;$(Timestamp)&quot;,&#xA; &quot;targetAbi&quot;: &quot;10.11.0&quot;,&#xA; &quot;owner&quot;: &quot;T-Gander&quot;,&#xA; &quot;version&quot;: &quot;$(AssemblyVersion)&quot;&#xA; }" Overwrite="true" Encoding="utf-8" />
File="$(PublishDir)\meta.json"
Lines='{
"guid": "fef007a8-3e8f-4aa8-a22e-486a387f4192",
"name": "Media Cleaner",
"category": "Library",
"overview": "A cleaner for your stale media.",
"description": "Clean out the stale media from your library using scheduled tasks",
"timestamp": "$(PluginTimestamp)",
"targetAbi": "10.11.0",
"owner": "T-Gander",
"version": "$(Version)"
}'
Overwrite="true"
Encoding="utf-8" />
</Target> </Target>
</Project> </Project>

View File

@@ -0,0 +1,11 @@
<div data-role="page" class="page type-interior pluginConfigurationPage withTabs">
<div data-role="content">
<div class="content-primary">
<div>
<a href="#configurationpage?name=Home">Home</a>
<a href="#configurationpage?name=Settings">Settings</a>
</div>
<h2>Media Cleaner</h2>
</div>
</div>
</div>

View File

@@ -44,9 +44,15 @@ public class Plugin : BasePlugin<PluginConfiguration>, IHasWebPages
[ [
new PluginPageInfo new PluginPageInfo
{ {
Name = Name, Name = "Settings",
EmbeddedResourcePath = string.Format(CultureInfo.InvariantCulture, "{0}.Configuration.configPage.html", GetType().Namespace) EmbeddedResourcePath = string.Format(CultureInfo.InvariantCulture, "{0}.Configuration.settings.html", GetType().Namespace),
} },
new PluginPageInfo
{
Name = "Home",
EmbeddedResourcePath = string.Format(CultureInfo.InvariantCulture, "{0}.Pages.home.html", GetType().Namespace),
EnableInMainMenu = true,
},
]; ];
} }
} }

View File

@@ -93,13 +93,20 @@ public sealed class StaleMediaTask : IScheduledTask
private List<BaseItem> GetStaleMovies(List<BaseItem> movies) private List<BaseItem> GetStaleMovies(List<BaseItem> movies)
{ {
List<BaseItem> staleMovies = []; List<BaseItem> staleMovies = [];
foreach (var movie in movies) foreach (var movie in movies)
{ {
bool movieIsStale = movie.DateCreated > DateTime.Now.AddDays(-Configuration.StaleMediaCutoff);
var mostRecentUserData = movie.UserData.OrderByDescending(data => data.LastPlayedDate).First(); var mostRecentUserData = movie.UserData.OrderByDescending(data => data.LastPlayedDate).First();
if (mostRecentUserData.LastPlayedDate < DateTime.Now.AddDays(-Configuration.StaleMediaCutoff)) if (mostRecentUserData.LastPlayedDate < DateTime.Now.AddDays(-Configuration.StaleMediaCutoff))
{ {
staleMovies.Add(movie); staleMovies.Add(movie);
} }
else if (movieIsStale)
{
staleMovies.Add(movie);
}
} }
return staleMovies; return staleMovies;
@@ -160,6 +167,7 @@ public sealed class StaleMediaTask : IScheduledTask
}); });
bool seasonHasUserData = episodes.Any(episode => episode.UserData.Count > 0); bool seasonHasUserData = episodes.Any(episode => episode.UserData.Count > 0);
bool seasonIsStale = episodes.All(episode => episode.DateCreated > DateTime.Now.AddDays(-Configuration.StaleMediaCutoff));
if (seasonHasUserData) if (seasonHasUserData)
{ {
@@ -174,6 +182,11 @@ public sealed class StaleMediaTask : IScheduledTask
} }
} }
} }
// Check for episodes that have gone unwatched for stale media cutoff
else if (seasonIsStale)
{
staleEpisodes.AddRange(episodes);
}
} }
return staleEpisodes; return staleEpisodes;