Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions Emby/Emby.Plugins.Moonfin/Services/MoonfinSettingsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ public async Task SaveUserSettingsAsync(Guid userId, MoonfinUserSettings setting
finalSettings.LastUpdatedBy = clientId ?? "unknown";
finalSettings.SchemaVersion = 2;

MoveContentHidingToGlobal(finalSettings);

var json = JsonSerializer.Serialize(finalSettings, _jsonOptions);
await Task.Run(() => AtomicFile.WriteAllText(filePath, json)).ConfigureAwait(false);
}
Expand Down Expand Up @@ -226,6 +228,8 @@ public async Task SaveProfileAsync(Guid userId, string profileName, MoonfinSetti
settings.LastUpdatedBy = clientId ?? "unknown";
settings.SchemaVersion = 2;

MoveContentHidingToGlobal(settings);

var serialized = JsonSerializer.Serialize(settings, _jsonOptions);
await Task.Run(() => AtomicFile.WriteAllText(filePath, serialized)).ConfigureAwait(false);
}
Expand Down Expand Up @@ -557,6 +561,80 @@ private MoonfinUserSettings MigrateV1ToV2(MoonfinUserSettings v1)
};
}

private void MoveContentHidingToGlobal(MoonfinUserSettings settings)
{
if (settings.Global == null)
{
settings.Global = new MoonfinSettingsProfile();
}

// Content hiding is a global preference, so lift each device's hidden lists into the
// global profile. Union across devices so a file that hid items on more than one device
// keeps them all instead of the last device winning.
var devices = new[] { settings.Desktop, settings.Mobile, settings.Tv };

var hiddenContinueWatching = UnionHiddenEntries(devices, p => p.HiddenContinueWatchingItems);
if (hiddenContinueWatching != null)
{
settings.Global.HiddenContinueWatchingItems = hiddenContinueWatching;
}

var hiddenNextUp = UnionHiddenEntries(devices, p => p.HiddenNextUpSeries);
if (hiddenNextUp != null)
{
settings.Global.HiddenNextUpSeries = hiddenNextUp;
}

foreach (var device in devices)
{
if (device == null) continue;
device.HiddenContinueWatchingItems = null;
device.HiddenNextUpSeries = null;
}
}

private static string? UnionHiddenEntries(
MoonfinSettingsProfile?[] devices,
Func<MoonfinSettingsProfile, string?> selector)
{
Dictionary<string, string>? merged = null;
foreach (var device in devices)
{
if (device == null) continue;
var value = selector(device);
if (value == null) continue;

if (merged == null)
{
merged = new Dictionary<string, string>();
}
foreach (var pair in ParseHiddenEntries(value))
{
merged[pair.Key] = pair.Value;
}
}

return merged == null ? null : JsonSerializer.Serialize(merged);
}

private static Dictionary<string, string> ParseHiddenEntries(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return new Dictionary<string, string>();
}

try
{
return JsonSerializer.Deserialize<Dictionary<string, string>>(value)
?? new Dictionary<string, string>();
}
catch (JsonException)
{
return new Dictionary<string, string>();
}
}

private static void MergeProfile(MoonfinSettingsProfile existing, MoonfinSettingsProfile incoming)
{
// An older client that syncs homeRowOrder but not homeSections should clear the stale
Expand Down
78 changes: 78 additions & 0 deletions Jellyfin/backend/Services/MoonfinSettingsService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,8 @@ public async Task SaveUserSettingsAsync(Guid userId, MoonfinUserSettings setting
finalSettings.LastUpdatedBy = clientId ?? "unknown";
finalSettings.SchemaVersion = 2;

MoveContentHidingToGlobal(finalSettings);

var json = JsonSerializer.Serialize(finalSettings, _jsonOptions);
AtomicFile.WriteAllText(filePath, json);
}
Expand Down Expand Up @@ -278,6 +280,8 @@ public async Task SaveProfileAsync(
settings.LastUpdatedBy = clientId ?? "unknown";
settings.SchemaVersion = 2;

MoveContentHidingToGlobal(settings);

var serialized = JsonSerializer.Serialize(settings, _jsonOptions);
AtomicFile.WriteAllText(filePath, serialized);
}
Expand Down Expand Up @@ -488,6 +492,80 @@ private void ClearLegacyFields(MoonfinUserSettings settings)
settings.ClientSpecific = null;
}

private void MoveContentHidingToGlobal(MoonfinUserSettings settings)
{
if (settings.Global == null)
{
settings.Global = new MoonfinSettingsProfile();
}

// Content hiding is a global preference, so lift each device's hidden lists into the
// global profile. Union across devices so a file that hid items on more than one device
// keeps them all instead of the last device winning.
var devices = new[] { settings.Desktop, settings.Mobile, settings.Tv };

var hiddenContinueWatching = UnionHiddenEntries(devices, p => p.HiddenContinueWatchingItems);
if (hiddenContinueWatching != null)
{
settings.Global.HiddenContinueWatchingItems = hiddenContinueWatching;
}

var hiddenNextUp = UnionHiddenEntries(devices, p => p.HiddenNextUpSeries);
if (hiddenNextUp != null)
{
settings.Global.HiddenNextUpSeries = hiddenNextUp;
}

foreach (var device in devices)
{
if (device == null) continue;
device.HiddenContinueWatchingItems = null;
device.HiddenNextUpSeries = null;
}
}

private static string? UnionHiddenEntries(
MoonfinSettingsProfile?[] devices,
Func<MoonfinSettingsProfile, string?> selector)
{
Dictionary<string, string>? merged = null;
foreach (var device in devices)
{
if (device == null) continue;
var value = selector(device);
if (value == null) continue;

if (merged == null)
{
merged = new Dictionary<string, string>();
}
foreach (var pair in ParseHiddenEntries(value))
{
merged[pair.Key] = pair.Value;
}
}

return merged == null ? null : JsonSerializer.Serialize(merged);
}

private static Dictionary<string, string> ParseHiddenEntries(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
return new Dictionary<string, string>();
}

try
{
return JsonSerializer.Deserialize<Dictionary<string, string>>(value)
?? new Dictionary<string, string>();
}
catch (JsonException)
{
return new Dictionary<string, string>();
}
}

private void MergeProfile(MoonfinSettingsProfile existing, MoonfinSettingsProfile incoming)
{
if (incoming.HomeSections == null && incoming.HomeRowOrder != null)
Expand Down
Loading