refactor: reorganize Models into subdirectories by context

Split monolithic MusicModels.cs (177 lines) into separate files:
- Models/Settings/ (DeezerSettings, QobuzSettings, SubsonicSettings)
- Models/Domain/ (Song, Album, Artist)
- Models/Search/ (SearchResult)
- Models/Download/ (DownloadInfo, DownloadStatus)
- Models/Subsonic/ (ScanStatus)

Updated namespaces and imports across 22 files.
Improves navigation and separates models by business context.
This commit is contained in:
V1ck3s
2026-01-08 19:57:11 +01:00
parent c38291efa3
commit ce779b3c8a
29 changed files with 162 additions and 102 deletions

View File

@@ -1,7 +1,11 @@
using octo_fiesta.Services; using octo_fiesta.Services;
using octo_fiesta.Services.Deezer; using octo_fiesta.Services.Deezer;
using octo_fiesta.Services.Local; using octo_fiesta.Services.Local;
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;

View File

@@ -1,5 +1,9 @@
using octo_fiesta.Services.Deezer; using octo_fiesta.Services.Deezer;
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using Moq; using Moq;
using Moq.Protected; using Moq.Protected;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;

View File

@@ -1,5 +1,9 @@
using octo_fiesta.Services.Local; using octo_fiesta.Services.Local;
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;

View File

@@ -3,7 +3,11 @@ using System.Xml.Linq;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using octo_fiesta.Services; using octo_fiesta.Services;
using octo_fiesta.Services.Local; using octo_fiesta.Services.Local;

View File

@@ -0,0 +1,20 @@
namespace octo_fiesta.Models.Domain;
/// <summary>
/// Represents an album
/// </summary>
public class Album
{
public string Id { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Artist { get; set; } = string.Empty;
public string? ArtistId { get; set; }
public int? Year { get; set; }
public int? SongCount { get; set; }
public string? CoverArtUrl { get; set; }
public string? Genre { get; set; }
public bool IsLocal { get; set; }
public string? ExternalProvider { get; set; }
public string? ExternalId { get; set; }
public List<Song> Songs { get; set; } = new();
}

View File

@@ -0,0 +1,15 @@
namespace octo_fiesta.Models.Domain;
/// <summary>
/// Represents an artist
/// </summary>
public class Artist
{
public string Id { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string? ImageUrl { get; set; }
public int? AlbumCount { get; set; }
public bool IsLocal { get; set; }
public string? ExternalProvider { get; set; }
public string? ExternalId { get; set; }
}

View File

@@ -1,4 +1,4 @@
namespace octo_fiesta.Models; namespace octo_fiesta.Models.Domain;
/// <summary> /// <summary>
/// Represents a song (local or external) /// Represents a song (local or external)
@@ -95,82 +95,3 @@ public class Song
/// </summary> /// </summary>
public int? ExplicitContentLyrics { get; set; } public int? ExplicitContentLyrics { get; set; }
} }
/// <summary>
/// Represents an artist
/// </summary>
public class Artist
{
public string Id { get; set; } = string.Empty;
public string Name { get; set; } = string.Empty;
public string? ImageUrl { get; set; }
public int? AlbumCount { get; set; }
public bool IsLocal { get; set; }
public string? ExternalProvider { get; set; }
public string? ExternalId { get; set; }
}
/// <summary>
/// Represents an album
/// </summary>
public class Album
{
public string Id { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string Artist { get; set; } = string.Empty;
public string? ArtistId { get; set; }
public int? Year { get; set; }
public int? SongCount { get; set; }
public string? CoverArtUrl { get; set; }
public string? Genre { get; set; }
public bool IsLocal { get; set; }
public string? ExternalProvider { get; set; }
public string? ExternalId { get; set; }
public List<Song> Songs { get; set; } = new();
}
/// <summary>
/// Search result combining local and external results
/// </summary>
public class SearchResult
{
public List<Song> Songs { get; set; } = new();
public List<Album> Albums { get; set; } = new();
public List<Artist> Artists { get; set; } = new();
}
/// <summary>
/// Download status of a song
/// </summary>
public enum DownloadStatus
{
NotStarted,
InProgress,
Completed,
Failed
}
/// <summary>
/// Information about an ongoing or completed download
/// </summary>
public class DownloadInfo
{
public string SongId { get; set; } = string.Empty;
public string ExternalId { get; set; } = string.Empty;
public string ExternalProvider { get; set; } = string.Empty;
public DownloadStatus Status { get; set; }
public double Progress { get; set; } // 0.0 to 1.0
public string? LocalPath { get; set; }
public string? ErrorMessage { get; set; }
public DateTime StartedAt { get; set; }
public DateTime? CompletedAt { get; set; }
}
/// <summary>
/// Subsonic library scan status
/// </summary>
public class ScanStatus
{
public bool Scanning { get; set; }
public int? Count { get; set; }
}

View File

@@ -0,0 +1,17 @@
namespace octo_fiesta.Models.Download;
/// <summary>
/// Information about an ongoing or completed download
/// </summary>
public class DownloadInfo
{
public string SongId { get; set; } = string.Empty;
public string ExternalId { get; set; } = string.Empty;
public string ExternalProvider { get; set; } = string.Empty;
public DownloadStatus Status { get; set; }
public double Progress { get; set; } // 0.0 to 1.0
public string? LocalPath { get; set; }
public string? ErrorMessage { get; set; }
public DateTime StartedAt { get; set; }
public DateTime? CompletedAt { get; set; }
}

View File

@@ -0,0 +1,12 @@
namespace octo_fiesta.Models.Download;
/// <summary>
/// Download status of a song
/// </summary>
public enum DownloadStatus
{
NotStarted,
InProgress,
Completed,
Failed
}

View File

@@ -0,0 +1,13 @@
namespace octo_fiesta.Models.Search;
using octo_fiesta.Models.Domain;
/// <summary>
/// Search result combining local and external results
/// </summary>
public class SearchResult
{
public List<Song> Songs { get; set; } = new();
public List<Album> Albums { get; set; } = new();
public List<Artist> Artists { get; set; } = new();
}

View File

@@ -1,4 +1,4 @@
namespace octo_fiesta.Models; namespace octo_fiesta.Models.Settings;
/// <summary> /// <summary>
/// Configuration for the Deezer downloader and metadata service /// Configuration for the Deezer downloader and metadata service

View File

@@ -1,4 +1,4 @@
namespace octo_fiesta.Models; namespace octo_fiesta.Models.Settings;
/// <summary> /// <summary>
/// Configuration for the Qobuz downloader and metadata service /// Configuration for the Qobuz downloader and metadata service

View File

@@ -1,4 +1,4 @@
namespace octo_fiesta.Models; namespace octo_fiesta.Models.Settings;
/// <summary> /// <summary>
/// Download mode for tracks /// Download mode for tracks

View File

@@ -0,0 +1,10 @@
namespace octo_fiesta.Models.Subsonic;
/// <summary>
/// Subsonic library scan status
/// </summary>
public class ScanStatus
{
public bool Scanning { get; set; }
public int? Count { get; set; }
}

View File

@@ -1,4 +1,4 @@
using octo_fiesta.Models; using octo_fiesta.Models.Settings;
using octo_fiesta.Services; using octo_fiesta.Services;
using octo_fiesta.Services.Deezer; using octo_fiesta.Services.Deezer;
using octo_fiesta.Services.Qobuz; using octo_fiesta.Services.Qobuz;

View File

@@ -1,4 +1,8 @@
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using octo_fiesta.Services.Local; using octo_fiesta.Services.Local;
using octo_fiesta.Services.Deezer; using octo_fiesta.Services.Deezer;
using TagLib; using TagLib;

View File

@@ -4,7 +4,11 @@ using System.Text.Json;
using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Modes; using Org.BouncyCastle.Crypto.Modes;
using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Parameters;
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using octo_fiesta.Services.Local; using octo_fiesta.Services.Local;
using octo_fiesta.Services.Common; using octo_fiesta.Services.Common;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;

View File

@@ -1,4 +1,8 @@
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using System.Text.Json; using System.Text.Json;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;

View File

@@ -1,7 +1,7 @@
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using octo_fiesta.Models; using octo_fiesta.Models.Settings;
using octo_fiesta.Services.Validation; using octo_fiesta.Services.Validation;
namespace octo_fiesta.Services.Deezer; namespace octo_fiesta.Services.Deezer;

View File

@@ -1,4 +1,8 @@
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
namespace octo_fiesta.Services; namespace octo_fiesta.Services;

View File

@@ -1,4 +1,8 @@
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
namespace octo_fiesta.Services; namespace octo_fiesta.Services;

View File

@@ -1,4 +1,8 @@
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
namespace octo_fiesta.Services.Local; namespace octo_fiesta.Services.Local;

View File

@@ -1,6 +1,10 @@
using System.Text.Json; using System.Text.Json;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using octo_fiesta.Services; using octo_fiesta.Services;
namespace octo_fiesta.Services.Local; namespace octo_fiesta.Services.Local;

View File

@@ -1,7 +1,11 @@
using System.Security.Cryptography; using System.Security.Cryptography;
using System.Text; using System.Text;
using System.Text.Json; using System.Text.Json;
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using octo_fiesta.Services.Local; using octo_fiesta.Services.Local;
using octo_fiesta.Services.Common; using octo_fiesta.Services.Common;
using octo_fiesta.Services.Deezer; using octo_fiesta.Services.Deezer;

View File

@@ -1,4 +1,8 @@
using octo_fiesta.Models; using octo_fiesta.Models.Domain;
using octo_fiesta.Models.Settings;
using octo_fiesta.Models.Download;
using octo_fiesta.Models.Search;
using octo_fiesta.Models.Subsonic;
using System.Text.Json; using System.Text.Json;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;

View File

@@ -1,5 +1,5 @@
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using octo_fiesta.Models; using octo_fiesta.Models.Settings;
using octo_fiesta.Services.Validation; using octo_fiesta.Services.Validation;
namespace octo_fiesta.Services.Qobuz; namespace octo_fiesta.Services.Qobuz;

View File

@@ -1,5 +1,5 @@
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using octo_fiesta.Models; using octo_fiesta.Models.Settings;
using octo_fiesta.Services.Deezer; using octo_fiesta.Services.Deezer;
using octo_fiesta.Services.Qobuz; using octo_fiesta.Services.Qobuz;

View File

@@ -1,5 +1,5 @@
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using octo_fiesta.Models; using octo_fiesta.Models.Settings;
namespace octo_fiesta.Services.Validation; namespace octo_fiesta.Services.Validation;

View File

@@ -1,5 +1,5 @@
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using octo_fiesta.Models; using octo_fiesta.Models.Settings;
namespace octo_fiesta.Services.Validation; namespace octo_fiesta.Services.Validation;