aboutsummaryrefslogtreecommitdiff
path: root/Jellyfin.Data
diff options
context:
space:
mode:
authorcrobibero <cody@robibe.ro>2020-06-20 15:56:42 -0600
committercrobibero <cody@robibe.ro>2020-06-20 15:56:42 -0600
commit3329b08b40bb7d7e98264969c1b4c9e356fbdec2 (patch)
treefbbaa4e95adf35533f037ae18490d908eff5a608 /Jellyfin.Data
parent7a77b9928f2c8326e85629d3c900e86c3b26342a (diff)
parent576ffeb2a99e79caf0035eb9166436d1e0161d2c (diff)
Merge remote-tracking branch 'upstream/api-migration' into api-playlist
Diffstat (limited to 'Jellyfin.Data')
-rw-r--r--Jellyfin.Data/DayOfWeekHelper.cs65
-rw-r--r--Jellyfin.Data/Entities/AccessSchedule.cs91
-rw-r--r--Jellyfin.Data/Entities/ActivityLog.cs154
-rw-r--r--Jellyfin.Data/Entities/Artwork.cs195
-rw-r--r--Jellyfin.Data/Entities/Book.cs69
-rw-r--r--Jellyfin.Data/Entities/BookMetadata.cs107
-rw-r--r--Jellyfin.Data/Entities/Chapter.cs263
-rw-r--r--Jellyfin.Data/Entities/Collection.cs120
-rw-r--r--Jellyfin.Data/Entities/CollectionItem.cs143
-rw-r--r--Jellyfin.Data/Entities/Company.cs137
-rw-r--r--Jellyfin.Data/Entities/CompanyMetadata.cs216
-rw-r--r--Jellyfin.Data/Entities/CustomItem.cs68
-rw-r--r--Jellyfin.Data/Entities/CustomItemMetadata.cs67
-rw-r--r--Jellyfin.Data/Entities/Episode.cs110
-rw-r--r--Jellyfin.Data/Entities/EpisodeMetadata.cs179
-rw-r--r--Jellyfin.Data/Entities/Genre.cs152
-rw-r--r--Jellyfin.Data/Entities/Group.cs122
-rw-r--r--Jellyfin.Data/Entities/ImageInfo.cs30
-rw-r--r--Jellyfin.Data/Entities/Library.cs147
-rw-r--r--Jellyfin.Data/Entities/LibraryItem.cs170
-rw-r--r--Jellyfin.Data/Entities/LibraryRoot.cs192
-rw-r--r--Jellyfin.Data/Entities/MediaFile.cs200
-rw-r--r--Jellyfin.Data/Entities/MediaFileStream.cs149
-rw-r--r--Jellyfin.Data/Entities/Metadata.cs380
-rw-r--r--Jellyfin.Data/Entities/MetadataProvider.cs147
-rw-r--r--Jellyfin.Data/Entities/MetadataProviderId.cs179
-rw-r--r--Jellyfin.Data/Entities/Movie.cs69
-rw-r--r--Jellyfin.Data/Entities/MovieMetadata.cs223
-rw-r--r--Jellyfin.Data/Entities/MusicAlbum.cs68
-rw-r--r--Jellyfin.Data/Entities/MusicAlbumMetadata.cs187
-rw-r--r--Jellyfin.Data/Entities/Permission.cs97
-rw-r--r--Jellyfin.Data/Entities/Person.cs302
-rw-r--r--Jellyfin.Data/Entities/PersonRole.cs209
-rw-r--r--Jellyfin.Data/Entities/Photo.cs68
-rw-r--r--Jellyfin.Data/Entities/PhotoMetadata.cs68
-rw-r--r--Jellyfin.Data/Entities/Preference.cs95
-rw-r--r--Jellyfin.Data/Entities/ProviderMapping.cs117
-rw-r--r--Jellyfin.Data/Entities/Rating.cs187
-rw-r--r--Jellyfin.Data/Entities/RatingSource.cs231
-rw-r--r--Jellyfin.Data/Entities/Release.cs188
-rw-r--r--Jellyfin.Data/Entities/Season.cs111
-rw-r--r--Jellyfin.Data/Entities/SeasonMetadata.cs106
-rw-r--r--Jellyfin.Data/Entities/Series.cs159
-rw-r--r--Jellyfin.Data/Entities/SeriesMetadata.cs223
-rw-r--r--Jellyfin.Data/Entities/Track.cs112
-rw-r--r--Jellyfin.Data/Entities/TrackMetadata.cs68
-rw-r--r--Jellyfin.Data/Entities/User.cs507
-rw-r--r--Jellyfin.Data/Enums/ArtKind.cs11
-rw-r--r--Jellyfin.Data/Enums/DynamicDayOfWeek.cs18
-rw-r--r--Jellyfin.Data/Enums/MediaFileKind.cs11
-rw-r--r--Jellyfin.Data/Enums/PermissionKind.cs113
-rw-r--r--Jellyfin.Data/Enums/PersonRoleType.cs18
-rw-r--r--Jellyfin.Data/Enums/PreferenceKind.cs68
-rw-r--r--Jellyfin.Data/Enums/SubtitlePlaybackMode.cs13
-rw-r--r--Jellyfin.Data/Enums/SyncPlayAccess.cs23
-rw-r--r--Jellyfin.Data/Enums/UnratedItem.cs17
-rw-r--r--Jellyfin.Data/IHasPermissions.cs31
-rw-r--r--Jellyfin.Data/ISavingChanges.cs9
-rw-r--r--Jellyfin.Data/Jellyfin.Data.csproj27
59 files changed, 7606 insertions, 0 deletions
diff --git a/Jellyfin.Data/DayOfWeekHelper.cs b/Jellyfin.Data/DayOfWeekHelper.cs
new file mode 100644
index 0000000000..32a41368db
--- /dev/null
+++ b/Jellyfin.Data/DayOfWeekHelper.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using Jellyfin.Data.Enums;
+
+namespace Jellyfin.Data
+{
+ public static class DayOfWeekHelper
+ {
+ public static List<DayOfWeek> GetDaysOfWeek(DynamicDayOfWeek day)
+ {
+ var days = new List<DayOfWeek>(7);
+
+ if (day == DynamicDayOfWeek.Sunday
+ || day == DynamicDayOfWeek.Weekend
+ || day == DynamicDayOfWeek.Everyday)
+ {
+ days.Add(DayOfWeek.Sunday);
+ }
+
+ if (day == DynamicDayOfWeek.Monday
+ || day == DynamicDayOfWeek.Weekday
+ || day == DynamicDayOfWeek.Everyday)
+ {
+ days.Add(DayOfWeek.Monday);
+ }
+
+ if (day == DynamicDayOfWeek.Tuesday
+ || day == DynamicDayOfWeek.Weekday
+ || day == DynamicDayOfWeek.Everyday)
+ {
+ days.Add(DayOfWeek.Tuesday);
+ }
+
+ if (day == DynamicDayOfWeek.Wednesday
+ || day == DynamicDayOfWeek.Weekday
+ || day == DynamicDayOfWeek.Everyday)
+ {
+ days.Add(DayOfWeek.Wednesday);
+ }
+
+ if (day == DynamicDayOfWeek.Thursday
+ || day == DynamicDayOfWeek.Weekday
+ || day == DynamicDayOfWeek.Everyday)
+ {
+ days.Add(DayOfWeek.Thursday);
+ }
+
+ if (day == DynamicDayOfWeek.Friday
+ || day == DynamicDayOfWeek.Weekday
+ || day == DynamicDayOfWeek.Everyday)
+ {
+ days.Add(DayOfWeek.Friday);
+ }
+
+ if (day == DynamicDayOfWeek.Saturday
+ || day == DynamicDayOfWeek.Weekend
+ || day == DynamicDayOfWeek.Everyday)
+ {
+ days.Add(DayOfWeek.Saturday);
+ }
+
+ return days;
+ }
+ }
+}
diff --git a/Jellyfin.Data/Entities/AccessSchedule.cs b/Jellyfin.Data/Entities/AccessSchedule.cs
new file mode 100644
index 0000000000..7d1b76a3f8
--- /dev/null
+++ b/Jellyfin.Data/Entities/AccessSchedule.cs
@@ -0,0 +1,91 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Text.Json.Serialization;
+using System.Xml.Serialization;
+using Jellyfin.Data.Enums;
+
+namespace Jellyfin.Data.Entities
+{
+ /// <summary>
+ /// An entity representing a user's access schedule.
+ /// </summary>
+ public class AccessSchedule
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="AccessSchedule"/> class.
+ /// </summary>
+ /// <param name="dayOfWeek">The day of the week.</param>
+ /// <param name="startHour">The start hour.</param>
+ /// <param name="endHour">The end hour.</param>
+ /// <param name="userId">The associated user's id.</param>
+ public AccessSchedule(DynamicDayOfWeek dayOfWeek, double startHour, double endHour, Guid userId)
+ {
+ UserId = userId;
+ DayOfWeek = dayOfWeek;
+ StartHour = startHour;
+ EndHour = endHour;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="AccessSchedule"/> class.
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected AccessSchedule()
+ {
+ }
+
+ /// <summary>
+ /// Gets or sets the id of this instance.
+ /// </summary>
+ /// <remarks>
+ /// Identity, Indexed, Required.
+ /// </remarks>
+ [XmlIgnore]
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets the id of the associated user.
+ /// </summary>
+ [XmlIgnore]
+ [Required]
+ public Guid UserId { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets the day of week.
+ /// </summary>
+ /// <value>The day of week.</value>
+ [Required]
+ public DynamicDayOfWeek DayOfWeek { get; set; }
+
+ /// <summary>
+ /// Gets or sets the start hour.
+ /// </summary>
+ /// <value>The start hour.</value>
+ [Required]
+ public double StartHour { get; set; }
+
+ /// <summary>
+ /// Gets or sets the end hour.
+ /// </summary>
+ /// <value>The end hour.</value>
+ [Required]
+ public double EndHour { get; set; }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="dayOfWeek">The day of the week.</param>
+ /// <param name="startHour">The start hour.</param>
+ /// <param name="endHour">The end hour.</param>
+ /// <param name="userId">The associated user's id.</param>
+ /// <returns>The newly created instance.</returns>
+ public static AccessSchedule Create(DynamicDayOfWeek dayOfWeek, double startHour, double endHour, Guid userId)
+ {
+ return new AccessSchedule(dayOfWeek, startHour, endHour, userId);
+ }
+ }
+}
diff --git a/Jellyfin.Data/Entities/ActivityLog.cs b/Jellyfin.Data/Entities/ActivityLog.cs
new file mode 100644
index 0000000000..522c206640
--- /dev/null
+++ b/Jellyfin.Data/Entities/ActivityLog.cs
@@ -0,0 +1,154 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using Microsoft.Extensions.Logging;
+
+namespace Jellyfin.Data.Entities
+{
+ /// <summary>
+ /// An entity referencing an activity log entry.
+ /// </summary>
+ public partial class ActivityLog : ISavingChanges
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ActivityLog"/> class.
+ /// Public constructor with required data.
+ /// </summary>
+ /// <param name="name">The name.</param>
+ /// <param name="type">The type.</param>
+ /// <param name="userId">The user id.</param>
+ public ActivityLog(string name, string type, Guid userId)
+ {
+ if (string.IsNullOrEmpty(name))
+ {
+ throw new ArgumentNullException(nameof(name));
+ }
+
+ if (string.IsNullOrEmpty(type))
+ {
+ throw new ArgumentNullException(nameof(type));
+ }
+
+ this.Name = name;
+ this.Type = type;
+ this.UserId = userId;
+ this.DateCreated = DateTime.UtcNow;
+ this.LogSeverity = LogLevel.Trace;
+
+ Init();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ActivityLog"/> class.
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected ActivityLog()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="name">The name.</param>
+ /// <param name="type">The type.</param>
+ /// <param name="userId">The user's id.</param>
+ /// <returns>The new <see cref="ActivityLog"/> instance.</returns>
+ public static ActivityLog Create(string name, string type, Guid userId)
+ {
+ return new ActivityLog(name, type, userId);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Gets or sets the identity of this instance.
+ /// This is the key in the backing database.
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets the name.
+ /// Required, Max length = 512.
+ /// </summary>
+ [Required]
+ [MaxLength(512)]
+ [StringLength(512)]
+ public string Name { get; set; }
+
+ /// <summary>
+ /// Gets or sets the overview.
+ /// Max length = 512.
+ /// </summary>
+ [MaxLength(512)]
+ [StringLength(512)]
+ public string Overview { get; set; }
+
+ /// <summary>
+ /// Gets or sets the short overview.
+ /// Max length = 512.
+ /// </summary>
+ [MaxLength(512)]
+ [StringLength(512)]
+ public string ShortOverview { get; set; }
+
+ /// <summary>
+ /// Gets or sets the type.
+ /// Required, Max length = 256.
+ /// </summary>
+ [Required]
+ [MaxLength(256)]
+ [StringLength(256)]
+ public string Type { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user id.
+ /// Required.
+ /// </summary>
+ [Required]
+ public Guid UserId { get; set; }
+
+ /// <summary>
+ /// Gets or sets the item id.
+ /// Max length = 256.
+ /// </summary>
+ [MaxLength(256)]
+ [StringLength(256)]
+ public string ItemId { get; set; }
+
+ /// <summary>
+ /// Gets or sets the date created. This should be in UTC.
+ /// Required.
+ /// </summary>
+ [Required]
+ public DateTime DateCreated { get; set; }
+
+ /// <summary>
+ /// Gets or sets the log severity. Default is <see cref="LogLevel.Trace"/>.
+ /// Required.
+ /// </summary>
+ [Required]
+ public LogLevel LogSeverity { get; set; }
+
+ /// <summary>
+ /// Gets or sets the row version.
+ /// Required, ConcurrencyToken.
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ partial void Init();
+
+ /// <inheritdoc />
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+ }
+}
diff --git a/Jellyfin.Data/Entities/Artwork.cs b/Jellyfin.Data/Entities/Artwork.cs
new file mode 100644
index 0000000000..bf3029368a
--- /dev/null
+++ b/Jellyfin.Data/Entities/Artwork.cs
@@ -0,0 +1,195 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Artwork
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Artwork()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Artwork CreateArtworkUnsafe()
+ {
+ return new Artwork();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="path"></param>
+ /// <param name="kind"></param>
+ /// <param name="_metadata0"></param>
+ /// <param name="_personrole1"></param>
+ public Artwork(string path, Enums.ArtKind kind, Metadata _metadata0, PersonRole _personrole1)
+ {
+ if (string.IsNullOrEmpty(path)) throw new ArgumentNullException(nameof(path));
+ this.Path = path;
+
+ this.Kind = kind;
+
+ if (_metadata0 == null) throw new ArgumentNullException(nameof(_metadata0));
+ _metadata0.Artwork.Add(this);
+
+ if (_personrole1 == null) throw new ArgumentNullException(nameof(_personrole1));
+ _personrole1.Artwork = this;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="path"></param>
+ /// <param name="kind"></param>
+ /// <param name="_metadata0"></param>
+ /// <param name="_personrole1"></param>
+ public static Artwork Create(string path, Enums.ArtKind kind, Metadata _metadata0, PersonRole _personrole1)
+ {
+ return new Artwork(path, kind, _metadata0, _personrole1);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Path
+ /// </summary>
+ protected string _Path;
+ /// <summary>
+ /// When provided in a partial class, allows value of Path to be changed before setting.
+ /// </summary>
+ partial void SetPath(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Path to be changed before returning.
+ /// </summary>
+ partial void GetPath(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 65535
+ /// </summary>
+ [Required]
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Path
+ {
+ get
+ {
+ string value = _Path;
+ GetPath(ref value);
+ return (_Path = value);
+ }
+ set
+ {
+ string oldValue = _Path;
+ SetPath(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Path = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Kind
+ /// </summary>
+ internal Enums.ArtKind _Kind;
+ /// <summary>
+ /// When provided in a partial class, allows value of Kind to be changed before setting.
+ /// </summary>
+ partial void SetKind(Enums.ArtKind oldValue, ref Enums.ArtKind newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Kind to be changed before returning.
+ /// </summary>
+ partial void GetKind(ref Enums.ArtKind result);
+
+ /// <summary>
+ /// Indexed, Required
+ /// </summary>
+ [Required]
+ public Enums.ArtKind Kind
+ {
+ get
+ {
+ Enums.ArtKind value = _Kind;
+ GetKind(ref value);
+ return (_Kind = value);
+ }
+ set
+ {
+ Enums.ArtKind oldValue = _Kind;
+ SetKind(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Kind = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Book.cs b/Jellyfin.Data/Entities/Book.cs
new file mode 100644
index 0000000000..42d24e31d5
--- /dev/null
+++ b/Jellyfin.Data/Entities/Book.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Book : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Book()
+ {
+ BookMetadata = new HashSet<BookMetadata>();
+ Releases = new HashSet<Release>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Book CreateBookUnsafe()
+ {
+ return new Book();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public Book(Guid urlid, DateTime dateadded)
+ {
+ this.UrlId = urlid;
+
+ this.BookMetadata = new HashSet<BookMetadata>();
+ this.Releases = new HashSet<Release>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public static Book Create(Guid urlid, DateTime dateadded)
+ {
+ return new Book(urlid, dateadded);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("BookMetadata_BookMetadata_Id")]
+ public virtual ICollection<BookMetadata> BookMetadata { get; protected set; }
+
+ [ForeignKey("Release_Releases_Id")]
+ public virtual ICollection<Release> Releases { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/BookMetadata.cs b/Jellyfin.Data/Entities/BookMetadata.cs
new file mode 100644
index 0000000000..d52fe76051
--- /dev/null
+++ b/Jellyfin.Data/Entities/BookMetadata.cs
@@ -0,0 +1,107 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class BookMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected BookMetadata()
+ {
+ Publishers = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static BookMetadata CreateBookMetadataUnsafe()
+ {
+ return new BookMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_book0"></param>
+ public BookMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Book _book0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_book0 == null) throw new ArgumentNullException(nameof(_book0));
+ _book0.BookMetadata.Add(this);
+
+ this.Publishers = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_book0"></param>
+ public static BookMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Book _book0)
+ {
+ return new BookMetadata(title, language, dateadded, datemodified, _book0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for ISBN
+ /// </summary>
+ protected long? _ISBN;
+ /// <summary>
+ /// When provided in a partial class, allows value of ISBN to be changed before setting.
+ /// </summary>
+ partial void SetISBN(long? oldValue, ref long? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of ISBN to be changed before returning.
+ /// </summary>
+ partial void GetISBN(ref long? result);
+
+ public long? ISBN
+ {
+ get
+ {
+ long? value = _ISBN;
+ GetISBN(ref value);
+ return (_ISBN = value);
+ }
+ set
+ {
+ long? oldValue = _ISBN;
+ SetISBN(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _ISBN = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("Company_Publishers_Id")]
+ public virtual ICollection<Company> Publishers { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Chapter.cs b/Jellyfin.Data/Entities/Chapter.cs
new file mode 100644
index 0000000000..d48cb9b627
--- /dev/null
+++ b/Jellyfin.Data/Entities/Chapter.cs
@@ -0,0 +1,263 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Chapter
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Chapter()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Chapter CreateChapterUnsafe()
+ {
+ return new Chapter();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="timestart"></param>
+ /// <param name="_release0"></param>
+ public Chapter(string language, long timestart, Release _release0)
+ {
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ this.TimeStart = timestart;
+
+ if (_release0 == null) throw new ArgumentNullException(nameof(_release0));
+ _release0.Chapters.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="timestart"></param>
+ /// <param name="_release0"></param>
+ public static Chapter Create(string language, long timestart, Release _release0)
+ {
+ return new Chapter(language, timestart, _release0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ protected string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Language
+ /// </summary>
+ protected string _Language;
+ /// <summary>
+ /// When provided in a partial class, allows value of Language to be changed before setting.
+ /// </summary>
+ partial void SetLanguage(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Language to be changed before returning.
+ /// </summary>
+ partial void GetLanguage(ref string result);
+
+ /// <summary>
+ /// Required, Min length = 3, Max length = 3
+ /// ISO-639-3 3-character language codes
+ /// </summary>
+ [Required]
+ [MinLength(3)]
+ [MaxLength(3)]
+ [StringLength(3)]
+ public string Language
+ {
+ get
+ {
+ string value = _Language;
+ GetLanguage(ref value);
+ return (_Language = value);
+ }
+ set
+ {
+ string oldValue = _Language;
+ SetLanguage(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Language = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for TimeStart
+ /// </summary>
+ protected long _TimeStart;
+ /// <summary>
+ /// When provided in a partial class, allows value of TimeStart to be changed before setting.
+ /// </summary>
+ partial void SetTimeStart(long oldValue, ref long newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of TimeStart to be changed before returning.
+ /// </summary>
+ partial void GetTimeStart(ref long result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public long TimeStart
+ {
+ get
+ {
+ long value = _TimeStart;
+ GetTimeStart(ref value);
+ return (_TimeStart = value);
+ }
+ set
+ {
+ long oldValue = _TimeStart;
+ SetTimeStart(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _TimeStart = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for TimeEnd
+ /// </summary>
+ protected long? _TimeEnd;
+ /// <summary>
+ /// When provided in a partial class, allows value of TimeEnd to be changed before setting.
+ /// </summary>
+ partial void SetTimeEnd(long? oldValue, ref long? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of TimeEnd to be changed before returning.
+ /// </summary>
+ partial void GetTimeEnd(ref long? result);
+
+ public long? TimeEnd
+ {
+ get
+ {
+ long? value = _TimeEnd;
+ GetTimeEnd(ref value);
+ return (_TimeEnd = value);
+ }
+ set
+ {
+ long? oldValue = _TimeEnd;
+ SetTimeEnd(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _TimeEnd = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Collection.cs b/Jellyfin.Data/Entities/Collection.cs
new file mode 100644
index 0000000000..e2fa3a5bd3
--- /dev/null
+++ b/Jellyfin.Data/Entities/Collection.cs
@@ -0,0 +1,120 @@
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Collection
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor
+ /// </summary>
+ public Collection()
+ {
+ CollectionItem = new LinkedList<CollectionItem>();
+
+ Init();
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ protected string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("CollectionItem_CollectionItem_Id")]
+ public virtual ICollection<CollectionItem> CollectionItem { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/CollectionItem.cs b/Jellyfin.Data/Entities/CollectionItem.cs
new file mode 100644
index 0000000000..4a3d066396
--- /dev/null
+++ b/Jellyfin.Data/Entities/CollectionItem.cs
@@ -0,0 +1,143 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class CollectionItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected CollectionItem()
+ {
+ // NOTE: This class has one-to-one associations with CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static CollectionItem CreateCollectionItemUnsafe()
+ {
+ return new CollectionItem();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="_collection0"></param>
+ /// <param name="_collectionitem1"></param>
+ /// <param name="_collectionitem2"></param>
+ public CollectionItem(Collection _collection0, CollectionItem _collectionitem1, CollectionItem _collectionitem2)
+ {
+ // NOTE: This class has one-to-one associations with CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ if (_collection0 == null) throw new ArgumentNullException(nameof(_collection0));
+ _collection0.CollectionItem.Add(this);
+
+ if (_collectionitem1 == null) throw new ArgumentNullException(nameof(_collectionitem1));
+ _collectionitem1.Next = this;
+
+ if (_collectionitem2 == null) throw new ArgumentNullException(nameof(_collectionitem2));
+ _collectionitem2.Previous = this;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="_collection0"></param>
+ /// <param name="_collectionitem1"></param>
+ /// <param name="_collectionitem2"></param>
+ public static CollectionItem Create(Collection _collection0, CollectionItem _collectionitem1, CollectionItem _collectionitem2)
+ {
+ return new CollectionItem(_collection0, _collectionitem1, _collectionitem2);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [ForeignKey("LibraryItem_Id")]
+ public virtual LibraryItem LibraryItem { get; set; }
+
+ /// <remarks>
+ /// TODO check if this properly updated dependant and has the proper principal relationship
+ /// </remarks>
+ [ForeignKey("CollectionItem_Next_Id")]
+ public virtual CollectionItem Next { get; set; }
+
+ /// <remarks>
+ /// TODO check if this properly updated dependant and has the proper principal relationship
+ /// </remarks>
+ [ForeignKey("CollectionItem_Previous_Id")]
+ public virtual CollectionItem Previous { get; set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Company.cs b/Jellyfin.Data/Entities/Company.cs
new file mode 100644
index 0000000000..0650271c65
--- /dev/null
+++ b/Jellyfin.Data/Entities/Company.cs
@@ -0,0 +1,137 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Company
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Company()
+ {
+ CompanyMetadata = new HashSet<CompanyMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Company CreateCompanyUnsafe()
+ {
+ return new Company();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="_moviemetadata0"></param>
+ /// <param name="_seriesmetadata1"></param>
+ /// <param name="_musicalbummetadata2"></param>
+ /// <param name="_bookmetadata3"></param>
+ /// <param name="_company4"></param>
+ public Company(MovieMetadata _moviemetadata0, SeriesMetadata _seriesmetadata1, MusicAlbumMetadata _musicalbummetadata2, BookMetadata _bookmetadata3, Company _company4)
+ {
+ if (_moviemetadata0 == null) throw new ArgumentNullException(nameof(_moviemetadata0));
+ _moviemetadata0.Studios.Add(this);
+
+ if (_seriesmetadata1 == null) throw new ArgumentNullException(nameof(_seriesmetadata1));
+ _seriesmetadata1.Networks.Add(this);
+
+ if (_musicalbummetadata2 == null) throw new ArgumentNullException(nameof(_musicalbummetadata2));
+ _musicalbummetadata2.Labels.Add(this);
+
+ if (_bookmetadata3 == null) throw new ArgumentNullException(nameof(_bookmetadata3));
+ _bookmetadata3.Publishers.Add(this);
+
+ if (_company4 == null) throw new ArgumentNullException(nameof(_company4));
+ _company4.Parent = this;
+
+ this.CompanyMetadata = new HashSet<CompanyMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="_moviemetadata0"></param>
+ /// <param name="_seriesmetadata1"></param>
+ /// <param name="_musicalbummetadata2"></param>
+ /// <param name="_bookmetadata3"></param>
+ /// <param name="_company4"></param>
+ public static Company Create(MovieMetadata _moviemetadata0, SeriesMetadata _seriesmetadata1, MusicAlbumMetadata _musicalbummetadata2, BookMetadata _bookmetadata3, Company _company4)
+ {
+ return new Company(_moviemetadata0, _seriesmetadata1, _musicalbummetadata2, _bookmetadata3, _company4);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("CompanyMetadata_CompanyMetadata_Id")]
+ public virtual ICollection<CompanyMetadata> CompanyMetadata { get; protected set; }
+ [ForeignKey("Company_Parent_Id")]
+ public virtual Company Parent { get; set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/CompanyMetadata.cs b/Jellyfin.Data/Entities/CompanyMetadata.cs
new file mode 100644
index 0000000000..b3ec9c1a7f
--- /dev/null
+++ b/Jellyfin.Data/Entities/CompanyMetadata.cs
@@ -0,0 +1,216 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class CompanyMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected CompanyMetadata()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static CompanyMetadata CreateCompanyMetadataUnsafe()
+ {
+ return new CompanyMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_company0"></param>
+ public CompanyMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Company _company0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_company0 == null) throw new ArgumentNullException(nameof(_company0));
+ _company0.CompanyMetadata.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_company0"></param>
+ public static CompanyMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Company _company0)
+ {
+ return new CompanyMetadata(title, language, dateadded, datemodified, _company0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Description
+ /// </summary>
+ protected string _Description;
+ /// <summary>
+ /// When provided in a partial class, allows value of Description to be changed before setting.
+ /// </summary>
+ partial void SetDescription(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Description to be changed before returning.
+ /// </summary>
+ partial void GetDescription(ref string result);
+
+ /// <summary>
+ /// Max length = 65535
+ /// </summary>
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Description
+ {
+ get
+ {
+ string value = _Description;
+ GetDescription(ref value);
+ return (_Description = value);
+ }
+ set
+ {
+ string oldValue = _Description;
+ SetDescription(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Description = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Headquarters
+ /// </summary>
+ protected string _Headquarters;
+ /// <summary>
+ /// When provided in a partial class, allows value of Headquarters to be changed before setting.
+ /// </summary>
+ partial void SetHeadquarters(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Headquarters to be changed before returning.
+ /// </summary>
+ partial void GetHeadquarters(ref string result);
+
+ /// <summary>
+ /// Max length = 255
+ /// </summary>
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string Headquarters
+ {
+ get
+ {
+ string value = _Headquarters;
+ GetHeadquarters(ref value);
+ return (_Headquarters = value);
+ }
+ set
+ {
+ string oldValue = _Headquarters;
+ SetHeadquarters(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Headquarters = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Country
+ /// </summary>
+ protected string _Country;
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before setting.
+ /// </summary>
+ partial void SetCountry(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before returning.
+ /// </summary>
+ partial void GetCountry(ref string result);
+
+ /// <summary>
+ /// Max length = 2
+ /// </summary>
+ [MaxLength(2)]
+ [StringLength(2)]
+ public string Country
+ {
+ get
+ {
+ string value = _Country;
+ GetCountry(ref value);
+ return (_Country = value);
+ }
+ set
+ {
+ string oldValue = _Country;
+ SetCountry(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Country = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Homepage
+ /// </summary>
+ protected string _Homepage;
+ /// <summary>
+ /// When provided in a partial class, allows value of Homepage to be changed before setting.
+ /// </summary>
+ partial void SetHomepage(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Homepage to be changed before returning.
+ /// </summary>
+ partial void GetHomepage(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Homepage
+ {
+ get
+ {
+ string value = _Homepage;
+ GetHomepage(ref value);
+ return (_Homepage = value);
+ }
+ set
+ {
+ string oldValue = _Homepage;
+ SetHomepage(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Homepage = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/CustomItem.cs b/Jellyfin.Data/Entities/CustomItem.cs
new file mode 100644
index 0000000000..2006717bf2
--- /dev/null
+++ b/Jellyfin.Data/Entities/CustomItem.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class CustomItem : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected CustomItem()
+ {
+ CustomItemMetadata = new HashSet<CustomItemMetadata>();
+ Releases = new HashSet<Release>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static CustomItem CreateCustomItemUnsafe()
+ {
+ return new CustomItem();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public CustomItem(Guid urlid, DateTime dateadded)
+ {
+ this.UrlId = urlid;
+
+ this.CustomItemMetadata = new HashSet<CustomItemMetadata>();
+ this.Releases = new HashSet<Release>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public static CustomItem Create(Guid urlid, DateTime dateadded)
+ {
+ return new CustomItem(urlid, dateadded);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("CustomItemMetadata_CustomItemMetadata_Id")]
+ public virtual ICollection<CustomItemMetadata> CustomItemMetadata { get; protected set; }
+
+ [ForeignKey("Release_Releases_Id")]
+ public virtual ICollection<Release> Releases { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/CustomItemMetadata.cs b/Jellyfin.Data/Entities/CustomItemMetadata.cs
new file mode 100644
index 0000000000..e09e4467ac
--- /dev/null
+++ b/Jellyfin.Data/Entities/CustomItemMetadata.cs
@@ -0,0 +1,67 @@
+using System;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class CustomItemMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected CustomItemMetadata()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static CustomItemMetadata CreateCustomItemMetadataUnsafe()
+ {
+ return new CustomItemMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_customitem0"></param>
+ public CustomItemMetadata(string title, string language, DateTime dateadded, DateTime datemodified, CustomItem _customitem0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_customitem0 == null) throw new ArgumentNullException(nameof(_customitem0));
+ _customitem0.CustomItemMetadata.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_customitem0"></param>
+ public static CustomItemMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, CustomItem _customitem0)
+ {
+ return new CustomItemMetadata(title, language, dateadded, datemodified, _customitem0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Episode.cs b/Jellyfin.Data/Entities/Episode.cs
new file mode 100644
index 0000000000..6f6baa14de
--- /dev/null
+++ b/Jellyfin.Data/Entities/Episode.cs
@@ -0,0 +1,110 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Episode : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Episode()
+ {
+ // NOTE: This class has one-to-one associations with LibraryRoot, LibraryItem and CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ Releases = new HashSet<Release>();
+ EpisodeMetadata = new HashSet<EpisodeMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Episode CreateEpisodeUnsafe()
+ {
+ return new Episode();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ /// <param name="_season0"></param>
+ public Episode(Guid urlid, DateTime dateadded, Season _season0)
+ {
+ // NOTE: This class has one-to-one associations with LibraryRoot, LibraryItem and CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ this.UrlId = urlid;
+
+ if (_season0 == null) throw new ArgumentNullException(nameof(_season0));
+ _season0.Episodes.Add(this);
+
+ this.Releases = new HashSet<Release>();
+ this.EpisodeMetadata = new HashSet<EpisodeMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ /// <param name="_season0"></param>
+ public static Episode Create(Guid urlid, DateTime dateadded, Season _season0)
+ {
+ return new Episode(urlid, dateadded, _season0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for EpisodeNumber
+ /// </summary>
+ protected int? _EpisodeNumber;
+ /// <summary>
+ /// When provided in a partial class, allows value of EpisodeNumber to be changed before setting.
+ /// </summary>
+ partial void SetEpisodeNumber(int? oldValue, ref int? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of EpisodeNumber to be changed before returning.
+ /// </summary>
+ partial void GetEpisodeNumber(ref int? result);
+
+ public int? EpisodeNumber
+ {
+ get
+ {
+ int? value = _EpisodeNumber;
+ GetEpisodeNumber(ref value);
+ return (_EpisodeNumber = value);
+ }
+ set
+ {
+ int? oldValue = _EpisodeNumber;
+ SetEpisodeNumber(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _EpisodeNumber = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("Release_Releases_Id")]
+ public virtual ICollection<Release> Releases { get; protected set; }
+ [ForeignKey("EpisodeMetadata_EpisodeMetadata_Id")]
+ public virtual ICollection<EpisodeMetadata> EpisodeMetadata { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/EpisodeMetadata.cs b/Jellyfin.Data/Entities/EpisodeMetadata.cs
new file mode 100644
index 0000000000..e5431bf223
--- /dev/null
+++ b/Jellyfin.Data/Entities/EpisodeMetadata.cs
@@ -0,0 +1,179 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class EpisodeMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected EpisodeMetadata()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static EpisodeMetadata CreateEpisodeMetadataUnsafe()
+ {
+ return new EpisodeMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_episode0"></param>
+ public EpisodeMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Episode _episode0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_episode0 == null) throw new ArgumentNullException(nameof(_episode0));
+ _episode0.EpisodeMetadata.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_episode0"></param>
+ public static EpisodeMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Episode _episode0)
+ {
+ return new EpisodeMetadata(title, language, dateadded, datemodified, _episode0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Outline
+ /// </summary>
+ protected string _Outline;
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before setting.
+ /// </summary>
+ partial void SetOutline(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before returning.
+ /// </summary>
+ partial void GetOutline(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Outline
+ {
+ get
+ {
+ string value = _Outline;
+ GetOutline(ref value);
+ return (_Outline = value);
+ }
+ set
+ {
+ string oldValue = _Outline;
+ SetOutline(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Outline = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Plot
+ /// </summary>
+ protected string _Plot;
+ /// <summary>
+ /// When provided in a partial class, allows value of Plot to be changed before setting.
+ /// </summary>
+ partial void SetPlot(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Plot to be changed before returning.
+ /// </summary>
+ partial void GetPlot(ref string result);
+
+ /// <summary>
+ /// Max length = 65535
+ /// </summary>
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Plot
+ {
+ get
+ {
+ string value = _Plot;
+ GetPlot(ref value);
+ return (_Plot = value);
+ }
+ set
+ {
+ string oldValue = _Plot;
+ SetPlot(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Plot = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Tagline
+ /// </summary>
+ protected string _Tagline;
+ /// <summary>
+ /// When provided in a partial class, allows value of Tagline to be changed before setting.
+ /// </summary>
+ partial void SetTagline(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Tagline to be changed before returning.
+ /// </summary>
+ partial void GetTagline(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Tagline
+ {
+ get
+ {
+ string value = _Tagline;
+ GetTagline(ref value);
+ return (_Tagline = value);
+ }
+ set
+ {
+ string oldValue = _Tagline;
+ SetTagline(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Tagline = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Genre.cs b/Jellyfin.Data/Entities/Genre.cs
new file mode 100644
index 0000000000..38f289a8e3
--- /dev/null
+++ b/Jellyfin.Data/Entities/Genre.cs
@@ -0,0 +1,152 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Genre
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Genre()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Genre CreateGenreUnsafe()
+ {
+ return new Genre();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="_metadata0"></param>
+ public Genre(string name, Metadata _metadata0)
+ {
+ if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
+ this.Name = name;
+
+ if (_metadata0 == null) throw new ArgumentNullException(nameof(_metadata0));
+ _metadata0.Genres.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="_metadata0"></param>
+ public static Genre Create(string name, Metadata _metadata0)
+ {
+ return new Genre(name, _metadata0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ internal string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Indexed, Required, Max length = 255
+ /// </summary>
+ [Required]
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Group.cs b/Jellyfin.Data/Entities/Group.cs
new file mode 100644
index 0000000000..5cbb126f9d
--- /dev/null
+++ b/Jellyfin.Data/Entities/Group.cs
@@ -0,0 +1,122 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Linq;
+using Jellyfin.Data.Enums;
+
+namespace Jellyfin.Data.Entities
+{
+ /// <summary>
+ /// An entity representing a group.
+ /// </summary>
+ public partial class Group : IHasPermissions, ISavingChanges
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Group"/> class.
+ /// Public constructor with required data.
+ /// </summary>
+ /// <param name="name">The name of the group.</param>
+ public Group(string name)
+ {
+ if (string.IsNullOrEmpty(name))
+ {
+ throw new ArgumentNullException(nameof(name));
+ }
+
+ Name = name;
+ Id = Guid.NewGuid();
+
+ Permissions = new HashSet<Permission>();
+ ProviderMappings = new HashSet<ProviderMapping>();
+ Preferences = new HashSet<Preference>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Group"/> class.
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Group()
+ {
+ Init();
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Gets or sets the id of this group.
+ /// </summary>
+ /// <remarks>
+ /// Identity, Indexed, Required.
+ /// </remarks>
+ [Key]
+ [Required]
+ public Guid Id { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets the group's name.
+ /// </summary>
+ /// <remarks>
+ /// Required, Max length = 255.
+ /// </remarks>
+ [Required]
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string Name { get; set; }
+
+ /// <summary>
+ /// Gets or sets the row version.
+ /// </summary>
+ /// <remarks>
+ /// Required, Concurrency Token.
+ /// </remarks>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("Permission_GroupPermissions_Id")]
+ public virtual ICollection<Permission> Permissions { get; protected set; }
+
+ [ForeignKey("ProviderMapping_ProviderMappings_Id")]
+ public virtual ICollection<ProviderMapping> ProviderMappings { get; protected set; }
+
+ [ForeignKey("Preference_Preferences_Id")]
+ public virtual ICollection<Preference> Preferences { get; protected set; }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="name">The name of this group</param>
+ public static Group Create(string name)
+ {
+ return new Group(name);
+ }
+
+ /// <inheritdoc/>
+ public bool HasPermission(PermissionKind kind)
+ {
+ return Permissions.First(p => p.Kind == kind).Value;
+ }
+
+ /// <inheritdoc/>
+ public void SetPermission(PermissionKind kind, bool value)
+ {
+ Permissions.First(p => p.Kind == kind).Value = value;
+ }
+
+ partial void Init();
+ }
+}
diff --git a/Jellyfin.Data/Entities/ImageInfo.cs b/Jellyfin.Data/Entities/ImageInfo.cs
new file mode 100644
index 0000000000..64e36a791a
--- /dev/null
+++ b/Jellyfin.Data/Entities/ImageInfo.cs
@@ -0,0 +1,30 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public class ImageInfo
+ {
+ public ImageInfo(string path)
+ {
+ Path = path;
+ LastModified = DateTime.UtcNow;
+ }
+
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id { get; protected set; }
+
+ public Guid? UserId { get; protected set; }
+
+ [Required]
+ [MaxLength(512)]
+ [StringLength(512)]
+ public string Path { get; set; }
+
+ [Required]
+ public DateTime LastModified { get; set; }
+ }
+}
diff --git a/Jellyfin.Data/Entities/Library.cs b/Jellyfin.Data/Entities/Library.cs
new file mode 100644
index 0000000000..c11c09e916
--- /dev/null
+++ b/Jellyfin.Data/Entities/Library.cs
@@ -0,0 +1,147 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Library
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Library()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Library CreateLibraryUnsafe()
+ {
+ return new Library();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="name"></param>
+ public Library(string name)
+ {
+ if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
+ this.Name = name;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="name"></param>
+ public static Library Create(string name)
+ {
+ return new Library(name);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ protected string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 1024
+ /// </summary>
+ [Required]
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/LibraryItem.cs b/Jellyfin.Data/Entities/LibraryItem.cs
new file mode 100644
index 0000000000..af6c640b97
--- /dev/null
+++ b/Jellyfin.Data/Entities/LibraryItem.cs
@@ -0,0 +1,170 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public abstract partial class LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to being abstract.
+ /// </summary>
+ protected LibraryItem()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ protected LibraryItem(Guid urlid, DateTime dateadded)
+ {
+ this.UrlId = urlid;
+
+
+ Init();
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for UrlId
+ /// </summary>
+ internal Guid _UrlId;
+ /// <summary>
+ /// When provided in a partial class, allows value of UrlId to be changed before setting.
+ /// </summary>
+ partial void SetUrlId(Guid oldValue, ref Guid newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of UrlId to be changed before returning.
+ /// </summary>
+ partial void GetUrlId(ref Guid result);
+
+ /// <summary>
+ /// Indexed, Required
+ /// This is whats gets displayed in the Urls and API requests. This could also be a string.
+ /// </summary>
+ [Required]
+ public Guid UrlId
+ {
+ get
+ {
+ Guid value = _UrlId;
+ GetUrlId(ref value);
+ return (_UrlId = value);
+ }
+ set
+ {
+ Guid oldValue = _UrlId;
+ SetUrlId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _UrlId = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for DateAdded
+ /// </summary>
+ protected DateTime _DateAdded;
+ /// <summary>
+ /// When provided in a partial class, allows value of DateAdded to be changed before setting.
+ /// </summary>
+ partial void SetDateAdded(DateTime oldValue, ref DateTime newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of DateAdded to be changed before returning.
+ /// </summary>
+ partial void GetDateAdded(ref DateTime result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public DateTime DateAdded
+ {
+ get
+ {
+ DateTime value = _DateAdded;
+ GetDateAdded(ref value);
+ return (_DateAdded = value);
+ }
+ internal set
+ {
+ DateTime oldValue = _DateAdded;
+ SetDateAdded(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _DateAdded = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [ForeignKey("LibraryRoot_Id")]
+ public virtual LibraryRoot LibraryRoot { get; set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/LibraryRoot.cs b/Jellyfin.Data/Entities/LibraryRoot.cs
new file mode 100644
index 0000000000..bbc23e1c96
--- /dev/null
+++ b/Jellyfin.Data/Entities/LibraryRoot.cs
@@ -0,0 +1,192 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class LibraryRoot
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected LibraryRoot()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static LibraryRoot CreateLibraryRootUnsafe()
+ {
+ return new LibraryRoot();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="path">Absolute Path</param>
+ public LibraryRoot(string path)
+ {
+ if (string.IsNullOrEmpty(path)) throw new ArgumentNullException(nameof(path));
+ this.Path = path;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="path">Absolute Path</param>
+ public static LibraryRoot Create(string path)
+ {
+ return new LibraryRoot(path);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Path
+ /// </summary>
+ protected string _Path;
+ /// <summary>
+ /// When provided in a partial class, allows value of Path to be changed before setting.
+ /// </summary>
+ partial void SetPath(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Path to be changed before returning.
+ /// </summary>
+ partial void GetPath(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 65535
+ /// Absolute Path
+ /// </summary>
+ [Required]
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Path
+ {
+ get
+ {
+ string value = _Path;
+ GetPath(ref value);
+ return (_Path = value);
+ }
+ set
+ {
+ string oldValue = _Path;
+ SetPath(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Path = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for NetworkPath
+ /// </summary>
+ protected string _NetworkPath;
+ /// <summary>
+ /// When provided in a partial class, allows value of NetworkPath to be changed before setting.
+ /// </summary>
+ partial void SetNetworkPath(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of NetworkPath to be changed before returning.
+ /// </summary>
+ partial void GetNetworkPath(ref string result);
+
+ /// <summary>
+ /// Max length = 65535
+ /// Absolute network path, for example for transcoding sattelites.
+ /// </summary>
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string NetworkPath
+ {
+ get
+ {
+ string value = _NetworkPath;
+ GetNetworkPath(ref value);
+ return (_NetworkPath = value);
+ }
+ set
+ {
+ string oldValue = _NetworkPath;
+ SetNetworkPath(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _NetworkPath = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [ForeignKey("Library_Id")]
+ public virtual Library Library { get; set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/MediaFile.cs b/Jellyfin.Data/Entities/MediaFile.cs
new file mode 100644
index 0000000000..719539e5c2
--- /dev/null
+++ b/Jellyfin.Data/Entities/MediaFile.cs
@@ -0,0 +1,200 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class MediaFile
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected MediaFile()
+ {
+ MediaFileStreams = new HashSet<MediaFileStream>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static MediaFile CreateMediaFileUnsafe()
+ {
+ return new MediaFile();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="path">Relative to the LibraryRoot</param>
+ /// <param name="kind"></param>
+ /// <param name="_release0"></param>
+ public MediaFile(string path, Enums.MediaFileKind kind, Release _release0)
+ {
+ if (string.IsNullOrEmpty(path)) throw new ArgumentNullException(nameof(path));
+ this.Path = path;
+
+ this.Kind = kind;
+
+ if (_release0 == null) throw new ArgumentNullException(nameof(_release0));
+ _release0.MediaFiles.Add(this);
+
+ this.MediaFileStreams = new HashSet<MediaFileStream>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="path">Relative to the LibraryRoot</param>
+ /// <param name="kind"></param>
+ /// <param name="_release0"></param>
+ public static MediaFile Create(string path, Enums.MediaFileKind kind, Release _release0)
+ {
+ return new MediaFile(path, kind, _release0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Path
+ /// </summary>
+ protected string _Path;
+ /// <summary>
+ /// When provided in a partial class, allows value of Path to be changed before setting.
+ /// </summary>
+ partial void SetPath(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Path to be changed before returning.
+ /// </summary>
+ partial void GetPath(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 65535
+ /// Relative to the LibraryRoot
+ /// </summary>
+ [Required]
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Path
+ {
+ get
+ {
+ string value = _Path;
+ GetPath(ref value);
+ return (_Path = value);
+ }
+ set
+ {
+ string oldValue = _Path;
+ SetPath(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Path = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Kind
+ /// </summary>
+ protected Enums.MediaFileKind _Kind;
+ /// <summary>
+ /// When provided in a partial class, allows value of Kind to be changed before setting.
+ /// </summary>
+ partial void SetKind(Enums.MediaFileKind oldValue, ref Enums.MediaFileKind newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Kind to be changed before returning.
+ /// </summary>
+ partial void GetKind(ref Enums.MediaFileKind result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public Enums.MediaFileKind Kind
+ {
+ get
+ {
+ Enums.MediaFileKind value = _Kind;
+ GetKind(ref value);
+ return (_Kind = value);
+ }
+ set
+ {
+ Enums.MediaFileKind oldValue = _Kind;
+ SetKind(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Kind = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("MediaFileStream_MediaFileStreams_Id")]
+ public virtual ICollection<MediaFileStream> MediaFileStreams { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/MediaFileStream.cs b/Jellyfin.Data/Entities/MediaFileStream.cs
new file mode 100644
index 0000000000..7b3399731a
--- /dev/null
+++ b/Jellyfin.Data/Entities/MediaFileStream.cs
@@ -0,0 +1,149 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class MediaFileStream
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected MediaFileStream()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static MediaFileStream CreateMediaFileStreamUnsafe()
+ {
+ return new MediaFileStream();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="streamnumber"></param>
+ /// <param name="_mediafile0"></param>
+ public MediaFileStream(int streamnumber, MediaFile _mediafile0)
+ {
+ this.StreamNumber = streamnumber;
+
+ if (_mediafile0 == null) throw new ArgumentNullException(nameof(_mediafile0));
+ _mediafile0.MediaFileStreams.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="streamnumber"></param>
+ /// <param name="_mediafile0"></param>
+ public static MediaFileStream Create(int streamnumber, MediaFile _mediafile0)
+ {
+ return new MediaFileStream(streamnumber, _mediafile0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for StreamNumber
+ /// </summary>
+ protected int _StreamNumber;
+ /// <summary>
+ /// When provided in a partial class, allows value of StreamNumber to be changed before setting.
+ /// </summary>
+ partial void SetStreamNumber(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of StreamNumber to be changed before returning.
+ /// </summary>
+ partial void GetStreamNumber(ref int result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public int StreamNumber
+ {
+ get
+ {
+ int value = _StreamNumber;
+ GetStreamNumber(ref value);
+ return (_StreamNumber = value);
+ }
+ set
+ {
+ int oldValue = _StreamNumber;
+ SetStreamNumber(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _StreamNumber = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Metadata.cs b/Jellyfin.Data/Entities/Metadata.cs
new file mode 100644
index 0000000000..467ee68226
--- /dev/null
+++ b/Jellyfin.Data/Entities/Metadata.cs
@@ -0,0 +1,380 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public abstract partial class Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to being abstract.
+ /// </summary>
+ protected Metadata()
+ {
+ PersonRoles = new HashSet<PersonRole>();
+ Genres = new HashSet<Genre>();
+ Artwork = new HashSet<Artwork>();
+ Ratings = new HashSet<Rating>();
+ Sources = new HashSet<MetadataProviderId>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ protected Metadata(string title, string language, DateTime dateadded, DateTime datemodified)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ this.PersonRoles = new HashSet<PersonRole>();
+ this.Genres = new HashSet<Genre>();
+ this.Artwork = new HashSet<Artwork>();
+ this.Ratings = new HashSet<Rating>();
+ this.Sources = new HashSet<MetadataProviderId>();
+
+ Init();
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Title
+ /// </summary>
+ protected string _Title;
+ /// <summary>
+ /// When provided in a partial class, allows value of Title to be changed before setting.
+ /// </summary>
+ partial void SetTitle(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Title to be changed before returning.
+ /// </summary>
+ partial void GetTitle(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 1024
+ /// The title or name of the object
+ /// </summary>
+ [Required]
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Title
+ {
+ get
+ {
+ string value = _Title;
+ GetTitle(ref value);
+ return (_Title = value);
+ }
+ set
+ {
+ string oldValue = _Title;
+ SetTitle(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Title = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for OriginalTitle
+ /// </summary>
+ protected string _OriginalTitle;
+ /// <summary>
+ /// When provided in a partial class, allows value of OriginalTitle to be changed before setting.
+ /// </summary>
+ partial void SetOriginalTitle(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of OriginalTitle to be changed before returning.
+ /// </summary>
+ partial void GetOriginalTitle(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string OriginalTitle
+ {
+ get
+ {
+ string value = _OriginalTitle;
+ GetOriginalTitle(ref value);
+ return (_OriginalTitle = value);
+ }
+ set
+ {
+ string oldValue = _OriginalTitle;
+ SetOriginalTitle(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _OriginalTitle = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for SortTitle
+ /// </summary>
+ protected string _SortTitle;
+ /// <summary>
+ /// When provided in a partial class, allows value of SortTitle to be changed before setting.
+ /// </summary>
+ partial void SetSortTitle(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of SortTitle to be changed before returning.
+ /// </summary>
+ partial void GetSortTitle(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string SortTitle
+ {
+ get
+ {
+ string value = _SortTitle;
+ GetSortTitle(ref value);
+ return (_SortTitle = value);
+ }
+ set
+ {
+ string oldValue = _SortTitle;
+ SetSortTitle(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _SortTitle = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Language
+ /// </summary>
+ protected string _Language;
+ /// <summary>
+ /// When provided in a partial class, allows value of Language to be changed before setting.
+ /// </summary>
+ partial void SetLanguage(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Language to be changed before returning.
+ /// </summary>
+ partial void GetLanguage(ref string result);
+
+ /// <summary>
+ /// Required, Min length = 3, Max length = 3
+ /// ISO-639-3 3-character language codes
+ /// </summary>
+ [Required]
+ [MinLength(3)]
+ [MaxLength(3)]
+ [StringLength(3)]
+ public string Language
+ {
+ get
+ {
+ string value = _Language;
+ GetLanguage(ref value);
+ return (_Language = value);
+ }
+ set
+ {
+ string oldValue = _Language;
+ SetLanguage(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Language = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for ReleaseDate
+ /// </summary>
+ protected DateTimeOffset? _ReleaseDate;
+ /// <summary>
+ /// When provided in a partial class, allows value of ReleaseDate to be changed before setting.
+ /// </summary>
+ partial void SetReleaseDate(DateTimeOffset? oldValue, ref DateTimeOffset? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of ReleaseDate to be changed before returning.
+ /// </summary>
+ partial void GetReleaseDate(ref DateTimeOffset? result);
+
+ public DateTimeOffset? ReleaseDate
+ {
+ get
+ {
+ DateTimeOffset? value = _ReleaseDate;
+ GetReleaseDate(ref value);
+ return (_ReleaseDate = value);
+ }
+ set
+ {
+ DateTimeOffset? oldValue = _ReleaseDate;
+ SetReleaseDate(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _ReleaseDate = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for DateAdded
+ /// </summary>
+ protected DateTime _DateAdded;
+ /// <summary>
+ /// When provided in a partial class, allows value of DateAdded to be changed before setting.
+ /// </summary>
+ partial void SetDateAdded(DateTime oldValue, ref DateTime newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of DateAdded to be changed before returning.
+ /// </summary>
+ partial void GetDateAdded(ref DateTime result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public DateTime DateAdded
+ {
+ get
+ {
+ DateTime value = _DateAdded;
+ GetDateAdded(ref value);
+ return (_DateAdded = value);
+ }
+ internal set
+ {
+ DateTime oldValue = _DateAdded;
+ SetDateAdded(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _DateAdded = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for DateModified
+ /// </summary>
+ protected DateTime _DateModified;
+ /// <summary>
+ /// When provided in a partial class, allows value of DateModified to be changed before setting.
+ /// </summary>
+ partial void SetDateModified(DateTime oldValue, ref DateTime newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of DateModified to be changed before returning.
+ /// </summary>
+ partial void GetDateModified(ref DateTime result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public DateTime DateModified
+ {
+ get
+ {
+ DateTime value = _DateModified;
+ GetDateModified(ref value);
+ return (_DateModified = value);
+ }
+ internal set
+ {
+ DateTime oldValue = _DateModified;
+ SetDateModified(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _DateModified = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("PersonRole_PersonRoles_Id")]
+ public virtual ICollection<PersonRole> PersonRoles { get; protected set; }
+
+ [ForeignKey("PersonRole_PersonRoles_Id")]
+ public virtual ICollection<Genre> Genres { get; protected set; }
+
+ [ForeignKey("PersonRole_PersonRoles_Id")]
+ public virtual ICollection<Artwork> Artwork { get; protected set; }
+
+ [ForeignKey("PersonRole_PersonRoles_Id")]
+ public virtual ICollection<Rating> Ratings { get; protected set; }
+
+ [ForeignKey("PersonRole_PersonRoles_Id")]
+ public virtual ICollection<MetadataProviderId> Sources { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/MetadataProvider.cs b/Jellyfin.Data/Entities/MetadataProvider.cs
new file mode 100644
index 0000000000..4e4f107fb9
--- /dev/null
+++ b/Jellyfin.Data/Entities/MetadataProvider.cs
@@ -0,0 +1,147 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class MetadataProvider
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected MetadataProvider()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static MetadataProvider CreateMetadataProviderUnsafe()
+ {
+ return new MetadataProvider();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="name"></param>
+ public MetadataProvider(string name)
+ {
+ if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
+ this.Name = name;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="name"></param>
+ public static MetadataProvider Create(string name)
+ {
+ return new MetadataProvider(name);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ protected string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 1024
+ /// </summary>
+ [Required]
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/MetadataProviderId.cs b/Jellyfin.Data/Entities/MetadataProviderId.cs
new file mode 100644
index 0000000000..926f223dea
--- /dev/null
+++ b/Jellyfin.Data/Entities/MetadataProviderId.cs
@@ -0,0 +1,179 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class MetadataProviderId
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected MetadataProviderId()
+ {
+ // NOTE: This class has one-to-one associations with MetadataProviderId.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static MetadataProviderId CreateMetadataProviderIdUnsafe()
+ {
+ return new MetadataProviderId();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="providerid"></param>
+ /// <param name="_metadata0"></param>
+ /// <param name="_person1"></param>
+ /// <param name="_personrole2"></param>
+ /// <param name="_ratingsource3"></param>
+ public MetadataProviderId(string providerid, Metadata _metadata0, Person _person1, PersonRole _personrole2, RatingSource _ratingsource3)
+ {
+ // NOTE: This class has one-to-one associations with MetadataProviderId.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ if (string.IsNullOrEmpty(providerid)) throw new ArgumentNullException(nameof(providerid));
+ this.ProviderId = providerid;
+
+ if (_metadata0 == null) throw new ArgumentNullException(nameof(_metadata0));
+ _metadata0.Sources.Add(this);
+
+ if (_person1 == null) throw new ArgumentNullException(nameof(_person1));
+ _person1.Sources.Add(this);
+
+ if (_personrole2 == null) throw new ArgumentNullException(nameof(_personrole2));
+ _personrole2.Sources.Add(this);
+
+ if (_ratingsource3 == null) throw new ArgumentNullException(nameof(_ratingsource3));
+ _ratingsource3.Source = this;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="providerid"></param>
+ /// <param name="_metadata0"></param>
+ /// <param name="_person1"></param>
+ /// <param name="_personrole2"></param>
+ /// <param name="_ratingsource3"></param>
+ public static MetadataProviderId Create(string providerid, Metadata _metadata0, Person _person1, PersonRole _personrole2, RatingSource _ratingsource3)
+ {
+ return new MetadataProviderId(providerid, _metadata0, _person1, _personrole2, _ratingsource3);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for ProviderId
+ /// </summary>
+ protected string _ProviderId;
+ /// <summary>
+ /// When provided in a partial class, allows value of ProviderId to be changed before setting.
+ /// </summary>
+ partial void SetProviderId(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of ProviderId to be changed before returning.
+ /// </summary>
+ partial void GetProviderId(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 255
+ /// </summary>
+ [Required]
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string ProviderId
+ {
+ get
+ {
+ string value = _ProviderId;
+ GetProviderId(ref value);
+ return (_ProviderId = value);
+ }
+ set
+ {
+ string oldValue = _ProviderId;
+ SetProviderId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _ProviderId = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [ForeignKey("MetadataProvider_Id")]
+ public virtual MetadataProvider MetadataProvider { get; set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Movie.cs b/Jellyfin.Data/Entities/Movie.cs
new file mode 100644
index 0000000000..b359b42fcd
--- /dev/null
+++ b/Jellyfin.Data/Entities/Movie.cs
@@ -0,0 +1,69 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Movie : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Movie()
+ {
+ Releases = new HashSet<Release>();
+ MovieMetadata = new HashSet<MovieMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Movie CreateMovieUnsafe()
+ {
+ return new Movie();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public Movie(Guid urlid, DateTime dateadded)
+ {
+ this.UrlId = urlid;
+
+ this.Releases = new HashSet<Release>();
+ this.MovieMetadata = new HashSet<MovieMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public static Movie Create(Guid urlid, DateTime dateadded)
+ {
+ return new Movie(urlid, dateadded);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("Release_Releases_Id")]
+ public virtual ICollection<Release> Releases { get; protected set; }
+
+ [ForeignKey("MovieMetadata_MovieMetadata_Id")]
+ public virtual ICollection<MovieMetadata> MovieMetadata { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/MovieMetadata.cs b/Jellyfin.Data/Entities/MovieMetadata.cs
new file mode 100644
index 0000000000..319ae94e5a
--- /dev/null
+++ b/Jellyfin.Data/Entities/MovieMetadata.cs
@@ -0,0 +1,223 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class MovieMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected MovieMetadata()
+ {
+ Studios = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static MovieMetadata CreateMovieMetadataUnsafe()
+ {
+ return new MovieMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_movie0"></param>
+ public MovieMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Movie _movie0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_movie0 == null) throw new ArgumentNullException(nameof(_movie0));
+ _movie0.MovieMetadata.Add(this);
+
+ this.Studios = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_movie0"></param>
+ public static MovieMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Movie _movie0)
+ {
+ return new MovieMetadata(title, language, dateadded, datemodified, _movie0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Outline
+ /// </summary>
+ protected string _Outline;
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before setting.
+ /// </summary>
+ partial void SetOutline(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before returning.
+ /// </summary>
+ partial void GetOutline(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Outline
+ {
+ get
+ {
+ string value = _Outline;
+ GetOutline(ref value);
+ return (_Outline = value);
+ }
+ set
+ {
+ string oldValue = _Outline;
+ SetOutline(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Outline = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Plot
+ /// </summary>
+ protected string _Plot;
+ /// <summary>
+ /// When provided in a partial class, allows value of Plot to be changed before setting.
+ /// </summary>
+ partial void SetPlot(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Plot to be changed before returning.
+ /// </summary>
+ partial void GetPlot(ref string result);
+
+ /// <summary>
+ /// Max length = 65535
+ /// </summary>
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Plot
+ {
+ get
+ {
+ string value = _Plot;
+ GetPlot(ref value);
+ return (_Plot = value);
+ }
+ set
+ {
+ string oldValue = _Plot;
+ SetPlot(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Plot = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Tagline
+ /// </summary>
+ protected string _Tagline;
+ /// <summary>
+ /// When provided in a partial class, allows value of Tagline to be changed before setting.
+ /// </summary>
+ partial void SetTagline(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Tagline to be changed before returning.
+ /// </summary>
+ partial void GetTagline(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Tagline
+ {
+ get
+ {
+ string value = _Tagline;
+ GetTagline(ref value);
+ return (_Tagline = value);
+ }
+ set
+ {
+ string oldValue = _Tagline;
+ SetTagline(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Tagline = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Country
+ /// </summary>
+ protected string _Country;
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before setting.
+ /// </summary>
+ partial void SetCountry(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before returning.
+ /// </summary>
+ partial void GetCountry(ref string result);
+
+ /// <summary>
+ /// Max length = 2
+ /// </summary>
+ [MaxLength(2)]
+ [StringLength(2)]
+ public string Country
+ {
+ get
+ {
+ string value = _Country;
+ GetCountry(ref value);
+ return (_Country = value);
+ }
+ set
+ {
+ string oldValue = _Country;
+ SetCountry(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Country = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("Company_Studios_Id")]
+ public virtual ICollection<Company> Studios { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/MusicAlbum.cs b/Jellyfin.Data/Entities/MusicAlbum.cs
new file mode 100644
index 0000000000..00cb8fe007
--- /dev/null
+++ b/Jellyfin.Data/Entities/MusicAlbum.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class MusicAlbum : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected MusicAlbum()
+ {
+ MusicAlbumMetadata = new HashSet<MusicAlbumMetadata>();
+ Tracks = new HashSet<Track>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static MusicAlbum CreateMusicAlbumUnsafe()
+ {
+ return new MusicAlbum();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public MusicAlbum(Guid urlid, DateTime dateadded)
+ {
+ this.UrlId = urlid;
+
+ this.MusicAlbumMetadata = new HashSet<MusicAlbumMetadata>();
+ this.Tracks = new HashSet<Track>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public static MusicAlbum Create(Guid urlid, DateTime dateadded)
+ {
+ return new MusicAlbum(urlid, dateadded);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("MusicAlbumMetadata_MusicAlbumMetadata_Id")]
+ public virtual ICollection<MusicAlbumMetadata> MusicAlbumMetadata { get; protected set; }
+
+ [ForeignKey("Track_Tracks_Id")]
+ public virtual ICollection<Track> Tracks { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/MusicAlbumMetadata.cs b/Jellyfin.Data/Entities/MusicAlbumMetadata.cs
new file mode 100644
index 0000000000..b52ca65646
--- /dev/null
+++ b/Jellyfin.Data/Entities/MusicAlbumMetadata.cs
@@ -0,0 +1,187 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class MusicAlbumMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected MusicAlbumMetadata()
+ {
+ Labels = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static MusicAlbumMetadata CreateMusicAlbumMetadataUnsafe()
+ {
+ return new MusicAlbumMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_musicalbum0"></param>
+ public MusicAlbumMetadata(string title, string language, DateTime dateadded, DateTime datemodified, MusicAlbum _musicalbum0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_musicalbum0 == null) throw new ArgumentNullException(nameof(_musicalbum0));
+ _musicalbum0.MusicAlbumMetadata.Add(this);
+
+ this.Labels = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_musicalbum0"></param>
+ public static MusicAlbumMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, MusicAlbum _musicalbum0)
+ {
+ return new MusicAlbumMetadata(title, language, dateadded, datemodified, _musicalbum0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Barcode
+ /// </summary>
+ protected string _Barcode;
+ /// <summary>
+ /// When provided in a partial class, allows value of Barcode to be changed before setting.
+ /// </summary>
+ partial void SetBarcode(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Barcode to be changed before returning.
+ /// </summary>
+ partial void GetBarcode(ref string result);
+
+ /// <summary>
+ /// Max length = 255
+ /// </summary>
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string Barcode
+ {
+ get
+ {
+ string value = _Barcode;
+ GetBarcode(ref value);
+ return (_Barcode = value);
+ }
+ set
+ {
+ string oldValue = _Barcode;
+ SetBarcode(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Barcode = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for LabelNumber
+ /// </summary>
+ protected string _LabelNumber;
+ /// <summary>
+ /// When provided in a partial class, allows value of LabelNumber to be changed before setting.
+ /// </summary>
+ partial void SetLabelNumber(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of LabelNumber to be changed before returning.
+ /// </summary>
+ partial void GetLabelNumber(ref string result);
+
+ /// <summary>
+ /// Max length = 255
+ /// </summary>
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string LabelNumber
+ {
+ get
+ {
+ string value = _LabelNumber;
+ GetLabelNumber(ref value);
+ return (_LabelNumber = value);
+ }
+ set
+ {
+ string oldValue = _LabelNumber;
+ SetLabelNumber(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _LabelNumber = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Country
+ /// </summary>
+ protected string _Country;
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before setting.
+ /// </summary>
+ partial void SetCountry(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before returning.
+ /// </summary>
+ partial void GetCountry(ref string result);
+
+ /// <summary>
+ /// Max length = 2
+ /// </summary>
+ [MaxLength(2)]
+ [StringLength(2)]
+ public string Country
+ {
+ get
+ {
+ string value = _Country;
+ GetCountry(ref value);
+ return (_Country = value);
+ }
+ set
+ {
+ string oldValue = _Country;
+ SetCountry(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Country = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("Company_Labels_Id")]
+ public virtual ICollection<Company> Labels { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Permission.cs b/Jellyfin.Data/Entities/Permission.cs
new file mode 100644
index 0000000000..b675e911d9
--- /dev/null
+++ b/Jellyfin.Data/Entities/Permission.cs
@@ -0,0 +1,97 @@
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using Jellyfin.Data.Enums;
+
+namespace Jellyfin.Data.Entities
+{
+ /// <summary>
+ /// An entity representing whether the associated user has a specific permission.
+ /// </summary>
+ public partial class Permission : ISavingChanges
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Permission"/> class.
+ /// Public constructor with required data.
+ /// </summary>
+ /// <param name="kind">The permission kind.</param>
+ /// <param name="value">The value of this permission.</param>
+ public Permission(PermissionKind kind, bool value)
+ {
+ Kind = kind;
+ Value = value;
+
+ Init();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Permission"/> class.
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Permission()
+ {
+ Init();
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Gets or sets the id of this permission.
+ /// </summary>
+ /// <remarks>
+ /// Identity, Indexed, Required.
+ /// </remarks>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets the type of this permission.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public PermissionKind Kind { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether the associated user has this permission.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool Value { get; set; }
+
+ /// <summary>
+ /// Gets or sets the row version.
+ /// </summary>
+ /// <remarks>
+ /// Required, ConcurrencyToken.
+ /// </remarks>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="kind">The permission kind.</param>
+ /// <param name="value">The value of this permission.</param>
+ /// <returns>The newly created instance.</returns>
+ public static Permission Create(PermissionKind kind, bool value)
+ {
+ return new Permission(kind, value);
+ }
+
+ /// <inheritdoc/>
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ partial void Init();
+ }
+}
diff --git a/Jellyfin.Data/Entities/Person.cs b/Jellyfin.Data/Entities/Person.cs
new file mode 100644
index 0000000000..d893b7e394
--- /dev/null
+++ b/Jellyfin.Data/Entities/Person.cs
@@ -0,0 +1,302 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Person
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Person()
+ {
+ Sources = new HashSet<MetadataProviderId>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Person CreatePersonUnsafe()
+ {
+ return new Person();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid"></param>
+ /// <param name="name"></param>
+ public Person(Guid urlid, string name, DateTime dateadded, DateTime datemodified)
+ {
+ this.UrlId = urlid;
+
+ if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
+ this.Name = name;
+
+ this.Sources = new HashSet<MetadataProviderId>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid"></param>
+ /// <param name="name"></param>
+ public static Person Create(Guid urlid, string name, DateTime dateadded, DateTime datemodified)
+ {
+ return new Person(urlid, name, dateadded, datemodified);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for UrlId
+ /// </summary>
+ protected Guid _UrlId;
+ /// <summary>
+ /// When provided in a partial class, allows value of UrlId to be changed before setting.
+ /// </summary>
+ partial void SetUrlId(Guid oldValue, ref Guid newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of UrlId to be changed before returning.
+ /// </summary>
+ partial void GetUrlId(ref Guid result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public Guid UrlId
+ {
+ get
+ {
+ Guid value = _UrlId;
+ GetUrlId(ref value);
+ return (_UrlId = value);
+ }
+ set
+ {
+ Guid oldValue = _UrlId;
+ SetUrlId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _UrlId = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ protected string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 1024
+ /// </summary>
+ [Required]
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for SourceId
+ /// </summary>
+ protected string _SourceId;
+ /// <summary>
+ /// When provided in a partial class, allows value of SourceId to be changed before setting.
+ /// </summary>
+ partial void SetSourceId(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of SourceId to be changed before returning.
+ /// </summary>
+ partial void GetSourceId(ref string result);
+
+ /// <summary>
+ /// Max length = 255
+ /// </summary>
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string SourceId
+ {
+ get
+ {
+ string value = _SourceId;
+ GetSourceId(ref value);
+ return (_SourceId = value);
+ }
+ set
+ {
+ string oldValue = _SourceId;
+ SetSourceId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _SourceId = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for DateAdded
+ /// </summary>
+ protected DateTime _DateAdded;
+ /// <summary>
+ /// When provided in a partial class, allows value of DateAdded to be changed before setting.
+ /// </summary>
+ partial void SetDateAdded(DateTime oldValue, ref DateTime newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of DateAdded to be changed before returning.
+ /// </summary>
+ partial void GetDateAdded(ref DateTime result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public DateTime DateAdded
+ {
+ get
+ {
+ DateTime value = _DateAdded;
+ GetDateAdded(ref value);
+ return (_DateAdded = value);
+ }
+ internal set
+ {
+ DateTime oldValue = _DateAdded;
+ SetDateAdded(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _DateAdded = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for DateModified
+ /// </summary>
+ protected DateTime _DateModified;
+ /// <summary>
+ /// When provided in a partial class, allows value of DateModified to be changed before setting.
+ /// </summary>
+ partial void SetDateModified(DateTime oldValue, ref DateTime newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of DateModified to be changed before returning.
+ /// </summary>
+ partial void GetDateModified(ref DateTime result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public DateTime DateModified
+ {
+ get
+ {
+ DateTime value = _DateModified;
+ GetDateModified(ref value);
+ return (_DateModified = value);
+ }
+ internal set
+ {
+ DateTime oldValue = _DateModified;
+ SetDateModified(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _DateModified = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("MetadataProviderId_Sources_Id")]
+ public virtual ICollection<MetadataProviderId> Sources { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/PersonRole.cs b/Jellyfin.Data/Entities/PersonRole.cs
new file mode 100644
index 0000000000..9bd12c7fb0
--- /dev/null
+++ b/Jellyfin.Data/Entities/PersonRole.cs
@@ -0,0 +1,209 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class PersonRole
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected PersonRole()
+ {
+ // NOTE: This class has one-to-one associations with PersonRole.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ Sources = new HashSet<MetadataProviderId>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static PersonRole CreatePersonRoleUnsafe()
+ {
+ return new PersonRole();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="type"></param>
+ /// <param name="_metadata0"></param>
+ public PersonRole(Enums.PersonRoleType type, Metadata _metadata0)
+ {
+ // NOTE: This class has one-to-one associations with PersonRole.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ this.Type = type;
+
+ if (_metadata0 == null) throw new ArgumentNullException(nameof(_metadata0));
+ _metadata0.PersonRoles.Add(this);
+
+ this.Sources = new HashSet<MetadataProviderId>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="type"></param>
+ /// <param name="_metadata0"></param>
+ public static PersonRole Create(Enums.PersonRoleType type, Metadata _metadata0)
+ {
+ return new PersonRole(type, _metadata0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Role
+ /// </summary>
+ protected string _Role;
+ /// <summary>
+ /// When provided in a partial class, allows value of Role to be changed before setting.
+ /// </summary>
+ partial void SetRole(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Role to be changed before returning.
+ /// </summary>
+ partial void GetRole(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Role
+ {
+ get
+ {
+ string value = _Role;
+ GetRole(ref value);
+ return (_Role = value);
+ }
+ set
+ {
+ string oldValue = _Role;
+ SetRole(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Role = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Type
+ /// </summary>
+ protected Enums.PersonRoleType _Type;
+ /// <summary>
+ /// When provided in a partial class, allows value of Type to be changed before setting.
+ /// </summary>
+ partial void SetType(Enums.PersonRoleType oldValue, ref Enums.PersonRoleType newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Type to be changed before returning.
+ /// </summary>
+ partial void GetType(ref Enums.PersonRoleType result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public Enums.PersonRoleType Type
+ {
+ get
+ {
+ Enums.PersonRoleType value = _Type;
+ GetType(ref value);
+ return (_Type = value);
+ }
+ set
+ {
+ Enums.PersonRoleType oldValue = _Type;
+ SetType(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Type = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [ForeignKey("Person_Id")]
+
+ public virtual Person Person { get; set; }
+
+ [ForeignKey("Artwork_Artwork_Id")]
+ public virtual Artwork Artwork { get; set; }
+
+ [ForeignKey("MetadataProviderId_Sources_Id")]
+ public virtual ICollection<MetadataProviderId> Sources { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Photo.cs b/Jellyfin.Data/Entities/Photo.cs
new file mode 100644
index 0000000000..7abe628913
--- /dev/null
+++ b/Jellyfin.Data/Entities/Photo.cs
@@ -0,0 +1,68 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Photo : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Photo()
+ {
+ PhotoMetadata = new HashSet<PhotoMetadata>();
+ Releases = new HashSet<Release>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Photo CreatePhotoUnsafe()
+ {
+ return new Photo();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public Photo(Guid urlid, DateTime dateadded)
+ {
+ this.UrlId = urlid;
+
+ this.PhotoMetadata = new HashSet<PhotoMetadata>();
+ this.Releases = new HashSet<Release>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public static Photo Create(Guid urlid, DateTime dateadded)
+ {
+ return new Photo(urlid, dateadded);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("PhotoMetadata_PhotoMetadata_Id")]
+ public virtual ICollection<PhotoMetadata> PhotoMetadata { get; protected set; }
+
+ [ForeignKey("Release_Releases_Id")]
+ public virtual ICollection<Release> Releases { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/PhotoMetadata.cs b/Jellyfin.Data/Entities/PhotoMetadata.cs
new file mode 100644
index 0000000000..c5502f707a
--- /dev/null
+++ b/Jellyfin.Data/Entities/PhotoMetadata.cs
@@ -0,0 +1,68 @@
+using System;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class PhotoMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected PhotoMetadata()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static PhotoMetadata CreatePhotoMetadataUnsafe()
+ {
+ return new PhotoMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_photo0"></param>
+ public PhotoMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Photo _photo0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_photo0 == null) throw new ArgumentNullException(nameof(_photo0));
+ _photo0.PhotoMetadata.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_photo0"></param>
+ public static PhotoMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Photo _photo0)
+ {
+ return new PhotoMetadata(title, language, dateadded, datemodified, _photo0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Preference.cs b/Jellyfin.Data/Entities/Preference.cs
new file mode 100644
index 0000000000..0ca9d7eff4
--- /dev/null
+++ b/Jellyfin.Data/Entities/Preference.cs
@@ -0,0 +1,95 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using Jellyfin.Data.Enums;
+
+namespace Jellyfin.Data.Entities
+{
+ /// <summary>
+ /// An entity representing a preference attached to a user or group.
+ /// </summary>
+ public class Preference : ISavingChanges
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Preference"/> class.
+ /// Public constructor with required data.
+ /// </summary>
+ /// <param name="kind">The preference kind.</param>
+ /// <param name="value">The value.</param>
+ public Preference(PreferenceKind kind, string value)
+ {
+ Kind = kind;
+ Value = value ?? throw new ArgumentNullException(nameof(value));
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="Preference"/> class.
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Preference()
+ {
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Gets or sets the id of this preference.
+ /// </summary>
+ /// <remarks>
+ /// Identity, Indexed, Required.
+ /// </remarks>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets the type of this preference.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public PreferenceKind Kind { get; protected set; }
+
+ /// <summary>
+ /// Gets or sets the value of this preference.
+ /// </summary>
+ /// <remarks>
+ /// Required, Max length = 65535.
+ /// </remarks>
+ [Required]
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Value { get; set; }
+
+ /// <summary>
+ /// Gets or sets the row version.
+ /// </summary>
+ /// <remarks>
+ /// Required, ConcurrencyToken.
+ /// </remarks>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="kind">The preference kind.</param>
+ /// <param name="value">The value.</param>
+ /// <returns>The new instance.</returns>
+ public static Preference Create(PreferenceKind kind, string value)
+ {
+ return new Preference(kind, value);
+ }
+
+ /// <inheritdoc/>
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+ }
+}
diff --git a/Jellyfin.Data/Entities/ProviderMapping.cs b/Jellyfin.Data/Entities/ProviderMapping.cs
new file mode 100644
index 0000000000..e479341ad3
--- /dev/null
+++ b/Jellyfin.Data/Entities/ProviderMapping.cs
@@ -0,0 +1,117 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class ProviderMapping
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected ProviderMapping()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static ProviderMapping CreateProviderMappingUnsafe()
+ {
+ return new ProviderMapping();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="providername"></param>
+ /// <param name="providersecrets"></param>
+ /// <param name="providerdata"></param>
+ /// <param name="_user0"></param>
+ /// <param name="_group1"></param>
+ public ProviderMapping(string providername, string providersecrets, string providerdata, User _user0, Group _group1)
+ {
+ if (string.IsNullOrEmpty(providername)) throw new ArgumentNullException(nameof(providername));
+ this.ProviderName = providername;
+
+ if (string.IsNullOrEmpty(providersecrets)) throw new ArgumentNullException(nameof(providersecrets));
+ this.ProviderSecrets = providersecrets;
+
+ if (string.IsNullOrEmpty(providerdata)) throw new ArgumentNullException(nameof(providerdata));
+ this.ProviderData = providerdata;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="providername"></param>
+ /// <param name="providersecrets"></param>
+ /// <param name="providerdata"></param>
+ /// <param name="_user0"></param>
+ /// <param name="_group1"></param>
+ public static ProviderMapping Create(string providername, string providersecrets, string providerdata, User _user0, Group _group1)
+ {
+ return new ProviderMapping(providername, providersecrets, providerdata, _user0, _group1);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id { get; protected set; }
+
+ /// <summary>
+ /// Required, Max length = 255
+ /// </summary>
+ [Required]
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string ProviderName { get; set; }
+
+ /// <summary>
+ /// Required, Max length = 65535
+ /// </summary>
+ [Required]
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string ProviderSecrets { get; set; }
+
+ /// <summary>
+ /// Required, Max length = 65535
+ /// </summary>
+ [Required]
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string ProviderData { get; set; }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Rating.cs b/Jellyfin.Data/Entities/Rating.cs
new file mode 100644
index 0000000000..f70ea8b338
--- /dev/null
+++ b/Jellyfin.Data/Entities/Rating.cs
@@ -0,0 +1,187 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Rating
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Rating()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Rating CreateRatingUnsafe()
+ {
+ return new Rating();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="value"></param>
+ /// <param name="_metadata0"></param>
+ public Rating(double value, Metadata _metadata0)
+ {
+ this.Value = value;
+
+ if (_metadata0 == null) throw new ArgumentNullException(nameof(_metadata0));
+ _metadata0.Ratings.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="value"></param>
+ /// <param name="_metadata0"></param>
+ public static Rating Create(double value, Metadata _metadata0)
+ {
+ return new Rating(value, _metadata0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Value
+ /// </summary>
+ protected double _Value;
+ /// <summary>
+ /// When provided in a partial class, allows value of Value to be changed before setting.
+ /// </summary>
+ partial void SetValue(double oldValue, ref double newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Value to be changed before returning.
+ /// </summary>
+ partial void GetValue(ref double result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public double Value
+ {
+ get
+ {
+ double value = _Value;
+ GetValue(ref value);
+ return (_Value = value);
+ }
+ set
+ {
+ double oldValue = _Value;
+ SetValue(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Value = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Votes
+ /// </summary>
+ protected int? _Votes;
+ /// <summary>
+ /// When provided in a partial class, allows value of Votes to be changed before setting.
+ /// </summary>
+ partial void SetVotes(int? oldValue, ref int? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Votes to be changed before returning.
+ /// </summary>
+ partial void GetVotes(ref int? result);
+
+ public int? Votes
+ {
+ get
+ {
+ int? value = _Votes;
+ GetVotes(ref value);
+ return (_Votes = value);
+ }
+ set
+ {
+ int? oldValue = _Votes;
+ SetVotes(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Votes = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ /// <summary>
+ /// If this is NULL it&apos;s the internal user rating.
+ /// </summary>
+ [ForeignKey("RatingSource_RatingType_Id")]
+ public virtual RatingSource RatingType { get; set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/RatingSource.cs b/Jellyfin.Data/Entities/RatingSource.cs
new file mode 100644
index 0000000000..070f1ae27e
--- /dev/null
+++ b/Jellyfin.Data/Entities/RatingSource.cs
@@ -0,0 +1,231 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ /// <summary>
+ /// This is the entity to store review ratings, not age ratings
+ /// </summary>
+ public partial class RatingSource
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected RatingSource()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static RatingSource CreateRatingSourceUnsafe()
+ {
+ return new RatingSource();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="maximumvalue"></param>
+ /// <param name="minimumvalue"></param>
+ /// <param name="_rating0"></param>
+ public RatingSource(double maximumvalue, double minimumvalue, Rating _rating0)
+ {
+ this.MaximumValue = maximumvalue;
+
+ this.MinimumValue = minimumvalue;
+
+ if (_rating0 == null) throw new ArgumentNullException(nameof(_rating0));
+ _rating0.RatingType = this;
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="maximumvalue"></param>
+ /// <param name="minimumvalue"></param>
+ /// <param name="_rating0"></param>
+ public static RatingSource Create(double maximumvalue, double minimumvalue, Rating _rating0)
+ {
+ return new RatingSource(maximumvalue, minimumvalue, _rating0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ protected string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for MaximumValue
+ /// </summary>
+ protected double _MaximumValue;
+ /// <summary>
+ /// When provided in a partial class, allows value of MaximumValue to be changed before setting.
+ /// </summary>
+ partial void SetMaximumValue(double oldValue, ref double newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of MaximumValue to be changed before returning.
+ /// </summary>
+ partial void GetMaximumValue(ref double result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public double MaximumValue
+ {
+ get
+ {
+ double value = _MaximumValue;
+ GetMaximumValue(ref value);
+ return (_MaximumValue = value);
+ }
+ set
+ {
+ double oldValue = _MaximumValue;
+ SetMaximumValue(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _MaximumValue = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for MinimumValue
+ /// </summary>
+ protected double _MinimumValue;
+ /// <summary>
+ /// When provided in a partial class, allows value of MinimumValue to be changed before setting.
+ /// </summary>
+ partial void SetMinimumValue(double oldValue, ref double newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of MinimumValue to be changed before returning.
+ /// </summary>
+ partial void GetMinimumValue(ref double result);
+
+ /// <summary>
+ /// Required
+ /// </summary>
+ [Required]
+ public double MinimumValue
+ {
+ get
+ {
+ double value = _MinimumValue;
+ GetMinimumValue(ref value);
+ return (_MinimumValue = value);
+ }
+ set
+ {
+ double oldValue = _MinimumValue;
+ SetMinimumValue(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _MinimumValue = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("MetadataProviderId_Source_Id")]
+ public virtual MetadataProviderId Source { get; set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Release.cs b/Jellyfin.Data/Entities/Release.cs
new file mode 100644
index 0000000000..d1928fcf7e
--- /dev/null
+++ b/Jellyfin.Data/Entities/Release.cs
@@ -0,0 +1,188 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Release
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Release()
+ {
+ MediaFiles = new HashSet<MediaFile>();
+ Chapters = new HashSet<Chapter>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Release CreateReleaseUnsafe()
+ {
+ return new Release();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="_movie0"></param>
+ /// <param name="_episode1"></param>
+ /// <param name="_track2"></param>
+ /// <param name="_customitem3"></param>
+ /// <param name="_book4"></param>
+ /// <param name="_photo5"></param>
+ public Release(string name, Movie _movie0, Episode _episode1, Track _track2, CustomItem _customitem3, Book _book4, Photo _photo5)
+ {
+ if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
+ this.Name = name;
+
+ if (_movie0 == null) throw new ArgumentNullException(nameof(_movie0));
+ _movie0.Releases.Add(this);
+
+ if (_episode1 == null) throw new ArgumentNullException(nameof(_episode1));
+ _episode1.Releases.Add(this);
+
+ if (_track2 == null) throw new ArgumentNullException(nameof(_track2));
+ _track2.Releases.Add(this);
+
+ if (_customitem3 == null) throw new ArgumentNullException(nameof(_customitem3));
+ _customitem3.Releases.Add(this);
+
+ if (_book4 == null) throw new ArgumentNullException(nameof(_book4));
+ _book4.Releases.Add(this);
+
+ if (_photo5 == null) throw new ArgumentNullException(nameof(_photo5));
+ _photo5.Releases.Add(this);
+
+ this.MediaFiles = new HashSet<MediaFile>();
+ this.Chapters = new HashSet<Chapter>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="_movie0"></param>
+ /// <param name="_episode1"></param>
+ /// <param name="_track2"></param>
+ /// <param name="_customitem3"></param>
+ /// <param name="_book4"></param>
+ /// <param name="_photo5"></param>
+ public static Release Create(string name, Movie _movie0, Episode _episode1, Track _track2, CustomItem _customitem3, Book _book4, Photo _photo5)
+ {
+ return new Release(name, _movie0, _episode1, _track2, _customitem3, _book4, _photo5);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Id
+ /// </summary>
+ internal int _Id;
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before setting.
+ /// </summary>
+ partial void SetId(int oldValue, ref int newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Id to be changed before returning.
+ /// </summary>
+ partial void GetId(ref int result);
+
+ /// <summary>
+ /// Identity, Indexed, Required
+ /// </summary>
+ [Key]
+ [Required]
+ [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
+ public int Id
+ {
+ get
+ {
+ int value = _Id;
+ GetId(ref value);
+ return (_Id = value);
+ }
+ protected set
+ {
+ int oldValue = _Id;
+ SetId(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Id = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Name
+ /// </summary>
+ protected string _Name;
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before setting.
+ /// </summary>
+ partial void SetName(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Name to be changed before returning.
+ /// </summary>
+ partial void GetName(ref string result);
+
+ /// <summary>
+ /// Required, Max length = 1024
+ /// </summary>
+ [Required]
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Name
+ {
+ get
+ {
+ string value = _Name;
+ GetName(ref value);
+ return (_Name = value);
+ }
+ set
+ {
+ string oldValue = _Name;
+ SetName(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Name = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Required, ConcurrenyToken
+ /// </summary>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("MediaFile_MediaFiles_Id")]
+ public virtual ICollection<MediaFile> MediaFiles { get; protected set; }
+
+ [ForeignKey("Chapter_Chapters_Id")]
+ public virtual ICollection<Chapter> Chapters { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Season.cs b/Jellyfin.Data/Entities/Season.cs
new file mode 100644
index 0000000000..96e89cde05
--- /dev/null
+++ b/Jellyfin.Data/Entities/Season.cs
@@ -0,0 +1,111 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Season : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Season()
+ {
+ // NOTE: This class has one-to-one associations with LibraryRoot, LibraryItem and CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ SeasonMetadata = new HashSet<SeasonMetadata>();
+ Episodes = new HashSet<Episode>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Season CreateSeasonUnsafe()
+ {
+ return new Season();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ /// <param name="_series0"></param>
+ public Season(Guid urlid, DateTime dateadded, Series _series0)
+ {
+ // NOTE: This class has one-to-one associations with LibraryRoot, LibraryItem and CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ this.UrlId = urlid;
+
+ if (_series0 == null) throw new ArgumentNullException(nameof(_series0));
+ _series0.Seasons.Add(this);
+
+ this.SeasonMetadata = new HashSet<SeasonMetadata>();
+ this.Episodes = new HashSet<Episode>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ /// <param name="_series0"></param>
+ public static Season Create(Guid urlid, DateTime dateadded, Series _series0)
+ {
+ return new Season(urlid, dateadded, _series0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for SeasonNumber
+ /// </summary>
+ protected int? _SeasonNumber;
+ /// <summary>
+ /// When provided in a partial class, allows value of SeasonNumber to be changed before setting.
+ /// </summary>
+ partial void SetSeasonNumber(int? oldValue, ref int? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of SeasonNumber to be changed before returning.
+ /// </summary>
+ partial void GetSeasonNumber(ref int? result);
+
+ public int? SeasonNumber
+ {
+ get
+ {
+ int? value = _SeasonNumber;
+ GetSeasonNumber(ref value);
+ return (_SeasonNumber = value);
+ }
+ set
+ {
+ int? oldValue = _SeasonNumber;
+ SetSeasonNumber(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _SeasonNumber = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("SeasonMetadata_SeasonMetadata_Id")]
+ public virtual ICollection<SeasonMetadata> SeasonMetadata { get; protected set; }
+
+ [ForeignKey("Episode_Episodes_Id")]
+ public virtual ICollection<Episode> Episodes { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/SeasonMetadata.cs b/Jellyfin.Data/Entities/SeasonMetadata.cs
new file mode 100644
index 0000000000..64ecbfbfac
--- /dev/null
+++ b/Jellyfin.Data/Entities/SeasonMetadata.cs
@@ -0,0 +1,106 @@
+using System;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class SeasonMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected SeasonMetadata()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static SeasonMetadata CreateSeasonMetadataUnsafe()
+ {
+ return new SeasonMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_season0"></param>
+ public SeasonMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Season _season0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_season0 == null) throw new ArgumentNullException(nameof(_season0));
+ _season0.SeasonMetadata.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_season0"></param>
+ public static SeasonMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Season _season0)
+ {
+ return new SeasonMetadata(title, language, dateadded, datemodified, _season0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Outline
+ /// </summary>
+ protected string _Outline;
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before setting.
+ /// </summary>
+ partial void SetOutline(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before returning.
+ /// </summary>
+ partial void GetOutline(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Outline
+ {
+ get
+ {
+ string value = _Outline;
+ GetOutline(ref value);
+ return (_Outline = value);
+ }
+ set
+ {
+ string oldValue = _Outline;
+ SetOutline(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Outline = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Series.cs b/Jellyfin.Data/Entities/Series.cs
new file mode 100644
index 0000000000..4f25c38b75
--- /dev/null
+++ b/Jellyfin.Data/Entities/Series.cs
@@ -0,0 +1,159 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Series : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Series()
+ {
+ SeriesMetadata = new HashSet<SeriesMetadata>();
+ Seasons = new HashSet<Season>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public Series(Guid urlid, DateTime dateadded)
+ {
+ this.UrlId = urlid;
+
+ this.SeriesMetadata = new HashSet<SeriesMetadata>();
+ this.Seasons = new HashSet<Season>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ public static Series Create(Guid urlid, DateTime dateadded)
+ {
+ return new Series(urlid, dateadded);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for AirsDayOfWeek
+ /// </summary>
+ protected DayOfWeek? _AirsDayOfWeek;
+ /// <summary>
+ /// When provided in a partial class, allows value of AirsDayOfWeek to be changed before setting.
+ /// </summary>
+ partial void SetAirsDayOfWeek(DayOfWeek? oldValue, ref DayOfWeek? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of AirsDayOfWeek to be changed before returning.
+ /// </summary>
+ partial void GetAirsDayOfWeek(ref DayOfWeek? result);
+
+ public DayOfWeek? AirsDayOfWeek
+ {
+ get
+ {
+ DayOfWeek? value = _AirsDayOfWeek;
+ GetAirsDayOfWeek(ref value);
+ return (_AirsDayOfWeek = value);
+ }
+ set
+ {
+ DayOfWeek? oldValue = _AirsDayOfWeek;
+ SetAirsDayOfWeek(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _AirsDayOfWeek = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for AirsTime
+ /// </summary>
+ protected DateTimeOffset? _AirsTime;
+ /// <summary>
+ /// When provided in a partial class, allows value of AirsTime to be changed before setting.
+ /// </summary>
+ partial void SetAirsTime(DateTimeOffset? oldValue, ref DateTimeOffset? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of AirsTime to be changed before returning.
+ /// </summary>
+ partial void GetAirsTime(ref DateTimeOffset? result);
+
+ /// <summary>
+ /// The time the show airs, ignore the date portion
+ /// </summary>
+ public DateTimeOffset? AirsTime
+ {
+ get
+ {
+ DateTimeOffset? value = _AirsTime;
+ GetAirsTime(ref value);
+ return (_AirsTime = value);
+ }
+ set
+ {
+ DateTimeOffset? oldValue = _AirsTime;
+ SetAirsTime(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _AirsTime = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for FirstAired
+ /// </summary>
+ protected DateTimeOffset? _FirstAired;
+ /// <summary>
+ /// When provided in a partial class, allows value of FirstAired to be changed before setting.
+ /// </summary>
+ partial void SetFirstAired(DateTimeOffset? oldValue, ref DateTimeOffset? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of FirstAired to be changed before returning.
+ /// </summary>
+ partial void GetFirstAired(ref DateTimeOffset? result);
+
+ public DateTimeOffset? FirstAired
+ {
+ get
+ {
+ DateTimeOffset? value = _FirstAired;
+ GetFirstAired(ref value);
+ return (_FirstAired = value);
+ }
+ set
+ {
+ DateTimeOffset? oldValue = _FirstAired;
+ SetFirstAired(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _FirstAired = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("SeriesMetadata_SeriesMetadata_Id")]
+ public virtual ICollection<SeriesMetadata> SeriesMetadata { get; protected set; }
+
+ [ForeignKey("Season_Seasons_Id")]
+ public virtual ICollection<Season> Seasons { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/SeriesMetadata.cs b/Jellyfin.Data/Entities/SeriesMetadata.cs
new file mode 100644
index 0000000000..52691783f6
--- /dev/null
+++ b/Jellyfin.Data/Entities/SeriesMetadata.cs
@@ -0,0 +1,223 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class SeriesMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected SeriesMetadata()
+ {
+ Networks = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static SeriesMetadata CreateSeriesMetadataUnsafe()
+ {
+ return new SeriesMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_series0"></param>
+ public SeriesMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Series _series0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_series0 == null) throw new ArgumentNullException(nameof(_series0));
+ _series0.SeriesMetadata.Add(this);
+
+ this.Networks = new HashSet<Company>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_series0"></param>
+ public static SeriesMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Series _series0)
+ {
+ return new SeriesMetadata(title, language, dateadded, datemodified, _series0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for Outline
+ /// </summary>
+ protected string _Outline;
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before setting.
+ /// </summary>
+ partial void SetOutline(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Outline to be changed before returning.
+ /// </summary>
+ partial void GetOutline(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Outline
+ {
+ get
+ {
+ string value = _Outline;
+ GetOutline(ref value);
+ return (_Outline = value);
+ }
+ set
+ {
+ string oldValue = _Outline;
+ SetOutline(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Outline = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Plot
+ /// </summary>
+ protected string _Plot;
+ /// <summary>
+ /// When provided in a partial class, allows value of Plot to be changed before setting.
+ /// </summary>
+ partial void SetPlot(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Plot to be changed before returning.
+ /// </summary>
+ partial void GetPlot(ref string result);
+
+ /// <summary>
+ /// Max length = 65535
+ /// </summary>
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Plot
+ {
+ get
+ {
+ string value = _Plot;
+ GetPlot(ref value);
+ return (_Plot = value);
+ }
+ set
+ {
+ string oldValue = _Plot;
+ SetPlot(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Plot = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Tagline
+ /// </summary>
+ protected string _Tagline;
+ /// <summary>
+ /// When provided in a partial class, allows value of Tagline to be changed before setting.
+ /// </summary>
+ partial void SetTagline(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Tagline to be changed before returning.
+ /// </summary>
+ partial void GetTagline(ref string result);
+
+ /// <summary>
+ /// Max length = 1024
+ /// </summary>
+ [MaxLength(1024)]
+ [StringLength(1024)]
+ public string Tagline
+ {
+ get
+ {
+ string value = _Tagline;
+ GetTagline(ref value);
+ return (_Tagline = value);
+ }
+ set
+ {
+ string oldValue = _Tagline;
+ SetTagline(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Tagline = value;
+ }
+ }
+ }
+
+ /// <summary>
+ /// Backing field for Country
+ /// </summary>
+ protected string _Country;
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before setting.
+ /// </summary>
+ partial void SetCountry(string oldValue, ref string newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of Country to be changed before returning.
+ /// </summary>
+ partial void GetCountry(ref string result);
+
+ /// <summary>
+ /// Max length = 2
+ /// </summary>
+ [MaxLength(2)]
+ [StringLength(2)]
+ public string Country
+ {
+ get
+ {
+ string value = _Country;
+ GetCountry(ref value);
+ return (_Country = value);
+ }
+ set
+ {
+ string oldValue = _Country;
+ SetCountry(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _Country = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+ [ForeignKey("Company_Networks_Id")]
+ public virtual ICollection<Company> Networks { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/Track.cs b/Jellyfin.Data/Entities/Track.cs
new file mode 100644
index 0000000000..079d73d2bf
--- /dev/null
+++ b/Jellyfin.Data/Entities/Track.cs
@@ -0,0 +1,112 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class Track : LibraryItem
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected Track()
+ {
+ // NOTE: This class has one-to-one associations with LibraryRoot, LibraryItem and CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ Releases = new HashSet<Release>();
+ TrackMetadata = new HashSet<TrackMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static Track CreateTrackUnsafe()
+ {
+ return new Track();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ /// <param name="_musicalbum0"></param>
+ public Track(Guid urlid, DateTime dateadded, MusicAlbum _musicalbum0)
+ {
+ // NOTE: This class has one-to-one associations with LibraryRoot, LibraryItem and CollectionItem.
+ // One-to-one associations are not validated in constructors since this causes a scenario where each one must be constructed before the other.
+
+ this.UrlId = urlid;
+
+ if (_musicalbum0 == null) throw new ArgumentNullException(nameof(_musicalbum0));
+ _musicalbum0.Tracks.Add(this);
+
+ this.Releases = new HashSet<Release>();
+ this.TrackMetadata = new HashSet<TrackMetadata>();
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="urlid">This is whats gets displayed in the Urls and API requests. This could also be a string.</param>
+ /// <param name="_musicalbum0"></param>
+ public static Track Create(Guid urlid, DateTime dateadded, MusicAlbum _musicalbum0)
+ {
+ return new Track(urlid, dateadded, _musicalbum0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Backing field for TrackNumber
+ /// </summary>
+ protected int? _TrackNumber;
+ /// <summary>
+ /// When provided in a partial class, allows value of TrackNumber to be changed before setting.
+ /// </summary>
+ partial void SetTrackNumber(int? oldValue, ref int? newValue);
+ /// <summary>
+ /// When provided in a partial class, allows value of TrackNumber to be changed before returning.
+ /// </summary>
+ partial void GetTrackNumber(ref int? result);
+
+ public int? TrackNumber
+ {
+ get
+ {
+ int? value = _TrackNumber;
+ GetTrackNumber(ref value);
+ return (_TrackNumber = value);
+ }
+ set
+ {
+ int? oldValue = _TrackNumber;
+ SetTrackNumber(oldValue, ref value);
+ if (oldValue != value)
+ {
+ _TrackNumber = value;
+ }
+ }
+ }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ [ForeignKey("Release_Releases_Id")]
+ public virtual ICollection<Release> Releases { get; protected set; }
+
+ [ForeignKey("TrackMetadata_TrackMetadata_Id")]
+ public virtual ICollection<TrackMetadata> TrackMetadata { get; protected set; }
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/TrackMetadata.cs b/Jellyfin.Data/Entities/TrackMetadata.cs
new file mode 100644
index 0000000000..86c9161f6e
--- /dev/null
+++ b/Jellyfin.Data/Entities/TrackMetadata.cs
@@ -0,0 +1,68 @@
+using System;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Jellyfin.Data.Entities
+{
+ public partial class TrackMetadata : Metadata
+ {
+ partial void Init();
+
+ /// <summary>
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected TrackMetadata()
+ {
+ Init();
+ }
+
+ /// <summary>
+ /// Replaces default constructor, since it's protected. Caller assumes responsibility for setting all required values before saving.
+ /// </summary>
+ public static TrackMetadata CreateTrackMetadataUnsafe()
+ {
+ return new TrackMetadata();
+ }
+
+ /// <summary>
+ /// Public constructor with required data
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_track0"></param>
+ public TrackMetadata(string title, string language, DateTime dateadded, DateTime datemodified, Track _track0)
+ {
+ if (string.IsNullOrEmpty(title)) throw new ArgumentNullException(nameof(title));
+ this.Title = title;
+
+ if (string.IsNullOrEmpty(language)) throw new ArgumentNullException(nameof(language));
+ this.Language = language;
+
+ if (_track0 == null) throw new ArgumentNullException(nameof(_track0));
+ _track0.TrackMetadata.Add(this);
+
+
+ Init();
+ }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="title">The title or name of the object</param>
+ /// <param name="language">ISO-639-3 3-character language codes</param>
+ /// <param name="_track0"></param>
+ public static TrackMetadata Create(string title, string language, DateTime dateadded, DateTime datemodified, Track _track0)
+ {
+ return new TrackMetadata(title, language, dateadded, datemodified, _track0);
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ }
+}
+
diff --git a/Jellyfin.Data/Entities/User.cs b/Jellyfin.Data/Entities/User.cs
new file mode 100644
index 0000000000..b89b0a8f45
--- /dev/null
+++ b/Jellyfin.Data/Entities/User.cs
@@ -0,0 +1,507 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Globalization;
+using System.Linq;
+using System.Text.Json.Serialization;
+using Jellyfin.Data.Enums;
+
+namespace Jellyfin.Data.Entities
+{
+ /// <summary>
+ /// An entity representing a user.
+ /// </summary>
+ public partial class User : IHasPermissions, ISavingChanges
+ {
+ /// <summary>
+ /// The values being delimited here are Guids, so commas work as they do not appear in Guids.
+ /// </summary>
+ private const char Delimiter = ',';
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="User"/> class.
+ /// Public constructor with required data.
+ /// </summary>
+ /// <param name="username">The username for the new user.</param>
+ /// <param name="authenticationProviderId">The Id of the user's authentication provider.</param>
+ /// <param name="passwordResetProviderId">The Id of the user's password reset provider.</param>
+ public User(string username, string authenticationProviderId, string passwordResetProviderId)
+ {
+ if (string.IsNullOrEmpty(username))
+ {
+ throw new ArgumentNullException(nameof(username));
+ }
+
+ if (string.IsNullOrEmpty(authenticationProviderId))
+ {
+ throw new ArgumentNullException(nameof(authenticationProviderId));
+ }
+
+ if (string.IsNullOrEmpty(passwordResetProviderId))
+ {
+ throw new ArgumentNullException(nameof(passwordResetProviderId));
+ }
+
+ Username = username;
+ AuthenticationProviderId = authenticationProviderId;
+ PasswordResetProviderId = passwordResetProviderId;
+
+ AccessSchedules = new HashSet<AccessSchedule>();
+ // Groups = new HashSet<Group>();
+ Permissions = new HashSet<Permission>();
+ Preferences = new HashSet<Preference>();
+ // ProviderMappings = new HashSet<ProviderMapping>();
+
+ // Set default values
+ Id = Guid.NewGuid();
+ InvalidLoginAttemptCount = 0;
+ EnableUserPreferenceAccess = true;
+ MustUpdatePassword = false;
+ DisplayMissingEpisodes = false;
+ DisplayCollectionsView = false;
+ HidePlayedInLatest = true;
+ RememberAudioSelections = true;
+ RememberSubtitleSelections = true;
+ EnableNextEpisodeAutoPlay = true;
+ EnableAutoLogin = false;
+ PlayDefaultAudioTrack = true;
+ SubtitleMode = SubtitlePlaybackMode.Default;
+ SyncPlayAccess = SyncPlayAccess.CreateAndJoinGroups;
+
+ AddDefaultPermissions();
+ AddDefaultPreferences();
+ Init();
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="User"/> class.
+ /// Default constructor. Protected due to required properties, but present because EF needs it.
+ /// </summary>
+ protected User()
+ {
+ Init();
+ }
+
+ /*************************************************************************
+ * Properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Gets or sets the Id of the user.
+ /// </summary>
+ /// <remarks>
+ /// Identity, Indexed, Required.
+ /// </remarks>
+ [Key]
+ [Required]
+ [JsonIgnore]
+ public Guid Id { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's name.
+ /// </summary>
+ /// <remarks>
+ /// Required, Max length = 255.
+ /// </remarks>
+ [Required]
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string Username { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's password, or <c>null</c> if none is set.
+ /// </summary>
+ /// <remarks>
+ /// Max length = 65535.
+ /// </remarks>
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string Password { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's easy password, or <c>null</c> if none is set.
+ /// </summary>
+ /// <remarks>
+ /// Max length = 65535.
+ /// </remarks>
+ [MaxLength(65535)]
+ [StringLength(65535)]
+ public string EasyPassword { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether the user must update their password.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool MustUpdatePassword { get; set; }
+
+ /// <summary>
+ /// Gets or sets the audio language preference.
+ /// </summary>
+ /// <remarks>
+ /// Max length = 255.
+ /// </remarks>
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string AudioLanguagePreference { get; set; }
+
+ /// <summary>
+ /// Gets or sets the authentication provider id.
+ /// </summary>
+ /// <remarks>
+ /// Required, Max length = 255.
+ /// </remarks>
+ [Required]
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string AuthenticationProviderId { get; set; }
+
+ /// <summary>
+ /// Gets or sets the password reset provider id.
+ /// </summary>
+ /// <remarks>
+ /// Required, Max length = 255.
+ /// </remarks>
+ [Required]
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string PasswordResetProviderId { get; set; }
+
+ /// <summary>
+ /// Gets or sets the invalid login attempt count.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public int InvalidLoginAttemptCount { get; set; }
+
+ /// <summary>
+ /// Gets or sets the last activity date.
+ /// </summary>
+ public DateTime? LastActivityDate { get; set; }
+
+ /// <summary>
+ /// Gets or sets the last login date.
+ /// </summary>
+ public DateTime? LastLoginDate { get; set; }
+
+ /// <summary>
+ /// Gets or sets the number of login attempts the user can make before they are locked out.
+ /// </summary>
+ public int? LoginAttemptsBeforeLockout { get; set; }
+
+ /// <summary>
+ /// Gets or sets the subtitle mode.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public SubtitlePlaybackMode SubtitleMode { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether the default audio track should be played.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool PlayDefaultAudioTrack { get; set; }
+
+ /// <summary>
+ /// Gets or sets the subtitle language preference.
+ /// </summary>
+ /// <remarks>
+ /// Max length = 255.
+ /// </remarks>
+ [MaxLength(255)]
+ [StringLength(255)]
+ public string SubtitleLanguagePreference { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether missing episodes should be displayed.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool DisplayMissingEpisodes { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether to display the collections view.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool DisplayCollectionsView { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether the user has a local password.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool EnableLocalPassword { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether the server should hide played content in "Latest".
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool HidePlayedInLatest { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether to remember audio selections on played content.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool RememberAudioSelections { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether to remember subtitle selections on played content.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool RememberSubtitleSelections { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether to enable auto-play for the next episode.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool EnableNextEpisodeAutoPlay { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether the user should auto-login.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool EnableAutoLogin { get; set; }
+
+ /// <summary>
+ /// Gets or sets a value indicating whether the user can change their preferences.
+ /// </summary>
+ /// <remarks>
+ /// Required.
+ /// </remarks>
+ [Required]
+ public bool EnableUserPreferenceAccess { get; set; }
+
+ /// <summary>
+ /// Gets or sets the maximum parental age rating.
+ /// </summary>
+ public int? MaxParentalAgeRating { get; set; }
+
+ /// <summary>
+ /// Gets or sets the remote client bitrate limit.
+ /// </summary>
+ public int? RemoteClientBitrateLimit { get; set; }
+
+ /// <summary>
+ /// Gets or sets the internal id.
+ /// This is a temporary stopgap for until the library db is migrated.
+ /// This corresponds to the value of the index of this user in the library db.
+ /// </summary>
+ [Required]
+ public long InternalId { get; set; }
+
+ /// <summary>
+ /// Gets or sets the user's profile image. Can be <c>null</c>.
+ /// </summary>
+ // [ForeignKey("UserId")]
+ public virtual ImageInfo ProfileImage { get; set; }
+
+ [Required]
+ public SyncPlayAccess SyncPlayAccess { get; set; }
+
+ /// <summary>
+ /// Gets or sets the row version.
+ /// </summary>
+ /// <remarks>
+ /// Required, Concurrency Token.
+ /// </remarks>
+ [ConcurrencyCheck]
+ [Required]
+ public uint RowVersion { get; set; }
+
+ /*************************************************************************
+ * Navigation properties
+ *************************************************************************/
+
+ /// <summary>
+ /// Gets or sets the list of access schedules this user has.
+ /// </summary>
+ public virtual ICollection<AccessSchedule> AccessSchedules { get; protected set; }
+
+ /*
+ /// <summary>
+ /// Gets or sets the list of groups this user is a member of.
+ /// </summary>
+ [ForeignKey("Group_Groups_Guid")]
+ public virtual ICollection<Group> Groups { get; protected set; }
+ */
+
+ /// <summary>
+ /// Gets or sets the list of permissions this user has.
+ /// </summary>
+ [ForeignKey("Permission_Permissions_Guid")]
+ public virtual ICollection<Permission> Permissions { get; protected set; }
+
+ /*
+ /// <summary>
+ /// Gets or sets the list of provider mappings this user has.
+ /// </summary>
+ [ForeignKey("ProviderMapping_ProviderMappings_Id")]
+ public virtual ICollection<ProviderMapping> ProviderMappings { get; protected set; }
+ */
+
+ /// <summary>
+ /// Gets or sets the list of preferences this user has.
+ /// </summary>
+ [ForeignKey("Preference_Preferences_Guid")]
+ public virtual ICollection<Preference> Preferences { get; protected set; }
+
+ /// <summary>
+ /// Static create function (for use in LINQ queries, etc.)
+ /// </summary>
+ /// <param name="username">The username for the created user.</param>
+ /// <param name="authenticationProviderId">The Id of the user's authentication provider.</param>
+ /// <param name="passwordResetProviderId">The Id of the user's password reset provider.</param>
+ /// <returns>The created instance.</returns>
+ public static User Create(string username, string authenticationProviderId, string passwordResetProviderId)
+ {
+ return new User(username, authenticationProviderId, passwordResetProviderId);
+ }
+
+ /// <inheritdoc/>
+ public void OnSavingChanges()
+ {
+ RowVersion++;
+ }
+
+ /// <summary>
+ /// Checks whether the user has the specified permission.
+ /// </summary>
+ /// <param name="kind">The permission kind.</param>
+ /// <returns><c>True</c> if the user has the specified permission.</returns>
+ public bool HasPermission(PermissionKind kind)
+ {
+ return Permissions.First(p => p.Kind == kind).Value;
+ }
+
+ /// <summary>
+ /// Sets the given permission kind to the provided value.
+ /// </summary>
+ /// <param name="kind">The permission kind.</param>
+ /// <param name="value">The value to set.</param>
+ public void SetPermission(PermissionKind kind, bool value)
+ {
+ Permissions.First(p => p.Kind == kind).Value = value;
+ }
+
+ /// <summary>
+ /// Gets the user's preferences for the given preference kind.
+ /// </summary>
+ /// <param name="preference">The preference kind.</param>
+ /// <returns>A string array containing the user's preferences.</returns>
+ public string[] GetPreference(PreferenceKind preference)
+ {
+ var val = Preferences.First(p => p.Kind == preference).Value;
+
+ return Equals(val, string.Empty) ? Array.Empty<string>() : val.Split(Delimiter);
+ }
+
+ /// <summary>
+ /// Sets the specified preference to the given value.
+ /// </summary>
+ /// <param name="preference">The preference kind.</param>
+ /// <param name="values">The values.</param>
+ public void SetPreference(PreferenceKind preference, string[] values)
+ {
+ Preferences.First(p => p.Kind == preference).Value
+ = string.Join(Delimiter.ToString(CultureInfo.InvariantCulture), values);
+ }
+
+ /// <summary>
+ /// Checks whether this user is currently allowed to use the server.
+ /// </summary>
+ /// <returns><c>True</c> if the current time is within an access schedule, or there are no access schedules.</returns>
+ public bool IsParentalScheduleAllowed()
+ {
+ return AccessSchedules.Count == 0
+ || AccessSchedules.Any(i => IsParentalScheduleAllowed(i, DateTime.UtcNow));
+ }
+
+ /// <summary>
+ /// Checks whether the provided folder is in this user's grouped folders.
+ /// </summary>
+ /// <param name="id">The Guid of the folder.</param>
+ /// <returns><c>True</c> if the folder is in the user's grouped folders.</returns>
+ public bool IsFolderGrouped(Guid id)
+ {
+ return GetPreference(PreferenceKind.GroupedFolders).Any(i => new Guid(i) == id);
+ }
+
+ private static bool IsParentalScheduleAllowed(AccessSchedule schedule, DateTime date)
+ {
+ var localTime = date.ToLocalTime();
+ var hour = localTime.TimeOfDay.TotalHours;
+
+ return DayOfWeekHelper.GetDaysOfWeek(schedule.DayOfWeek).Contains(localTime.DayOfWeek)
+ && hour >= schedule.StartHour
+ && hour <= schedule.EndHour;
+ }
+
+ // TODO: make these user configurable?
+ private void AddDefaultPermissions()
+ {
+ Permissions.Add(new Permission(PermissionKind.IsAdministrator, false));
+ Permissions.Add(new Permission(PermissionKind.IsDisabled, false));
+ Permissions.Add(new Permission(PermissionKind.IsHidden, true));
+ Permissions.Add(new Permission(PermissionKind.EnableAllChannels, true));
+ Permissions.Add(new Permission(PermissionKind.EnableAllDevices, true));
+ Permissions.Add(new Permission(PermissionKind.EnableAllFolders, true));
+ Permissions.Add(new Permission(PermissionKind.EnableContentDeletion, false));
+ Permissions.Add(new Permission(PermissionKind.EnableContentDownloading, true));
+ Permissions.Add(new Permission(PermissionKind.EnableMediaConversion, true));
+ Permissions.Add(new Permission(PermissionKind.EnableMediaPlayback, true));
+ Permissions.Add(new Permission(PermissionKind.EnablePlaybackRemuxing, true));
+ Permissions.Add(new Permission(PermissionKind.EnablePublicSharing, true));
+ Permissions.Add(new Permission(PermissionKind.EnableRemoteAccess, true));
+ Permissions.Add(new Permission(PermissionKind.EnableSyncTranscoding, true));
+ Permissions.Add(new Permission(PermissionKind.EnableAudioPlaybackTranscoding, true));
+ Permissions.Add(new Permission(PermissionKind.EnableLiveTvAccess, true));
+ Permissions.Add(new Permission(PermissionKind.EnableLiveTvManagement, true));
+ Permissions.Add(new Permission(PermissionKind.EnableSharedDeviceControl, true));
+ Permissions.Add(new Permission(PermissionKind.EnableVideoPlaybackTranscoding, true));
+ Permissions.Add(new Permission(PermissionKind.ForceRemoteSourceTranscoding, false));
+ Permissions.Add(new Permission(PermissionKind.EnableRemoteControlOfOtherUsers, false));
+ }
+
+ private void AddDefaultPreferences()
+ {
+ foreach (var val in Enum.GetValues(typeof(PreferenceKind)).Cast<PreferenceKind>())
+ {
+ Preferences.Add(new Preference(val, string.Empty));
+ }
+ }
+
+ partial void Init();
+ }
+}
diff --git a/Jellyfin.Data/Enums/ArtKind.cs b/Jellyfin.Data/Enums/ArtKind.cs
new file mode 100644
index 0000000000..6b69d68b28
--- /dev/null
+++ b/Jellyfin.Data/Enums/ArtKind.cs
@@ -0,0 +1,11 @@
+namespace Jellyfin.Data.Enums
+{
+ public enum ArtKind
+ {
+ Other,
+ Poster,
+ Banner,
+ Thumbnail,
+ Logo
+ }
+}
diff --git a/Jellyfin.Data/Enums/DynamicDayOfWeek.cs b/Jellyfin.Data/Enums/DynamicDayOfWeek.cs
new file mode 100644
index 0000000000..a33cd9d1cd
--- /dev/null
+++ b/Jellyfin.Data/Enums/DynamicDayOfWeek.cs
@@ -0,0 +1,18 @@
+#pragma warning disable CS1591
+
+namespace Jellyfin.Data.Enums
+{
+ public enum DynamicDayOfWeek
+ {
+ Sunday = 0,
+ Monday = 1,
+ Tuesday = 2,
+ Wednesday = 3,
+ Thursday = 4,
+ Friday = 5,
+ Saturday = 6,
+ Everyday = 7,
+ Weekday = 8,
+ Weekend = 9
+ }
+}
diff --git a/Jellyfin.Data/Enums/MediaFileKind.cs b/Jellyfin.Data/Enums/MediaFileKind.cs
new file mode 100644
index 0000000000..12f48c5589
--- /dev/null
+++ b/Jellyfin.Data/Enums/MediaFileKind.cs
@@ -0,0 +1,11 @@
+namespace Jellyfin.Data.Enums
+{
+ public enum MediaFileKind
+ {
+ Main,
+ Sidecar,
+ AdditionalPart,
+ AlternativeFormat,
+ AdditionalStream
+ }
+}
diff --git a/Jellyfin.Data/Enums/PermissionKind.cs b/Jellyfin.Data/Enums/PermissionKind.cs
new file mode 100644
index 0000000000..7d52008747
--- /dev/null
+++ b/Jellyfin.Data/Enums/PermissionKind.cs
@@ -0,0 +1,113 @@
+namespace Jellyfin.Data.Enums
+{
+ /// <summary>
+ /// The types of user permissions.
+ /// </summary>
+ public enum PermissionKind
+ {
+ /// <summary>
+ /// Whether the user is an administrator.
+ /// </summary>
+ IsAdministrator = 0,
+
+ /// <summary>
+ /// Whether the user is hidden.
+ /// </summary>
+ IsHidden = 1,
+
+ /// <summary>
+ /// Whether the user is disabled.
+ /// </summary>
+ IsDisabled = 2,
+
+ /// <summary>
+ /// Whether the user can control shared devices.
+ /// </summary>
+ EnableSharedDeviceControl = 3,
+
+ /// <summary>
+ /// Whether the user can access the server remotely.
+ /// </summary>
+ EnableRemoteAccess = 4,
+
+ /// <summary>
+ /// Whether the user can manage live tv.
+ /// </summary>
+ EnableLiveTvManagement = 5,
+
+ /// <summary>
+ /// Whether the user can access live tv.
+ /// </summary>
+ EnableLiveTvAccess = 6,
+
+ /// <summary>
+ /// Whether the user can play media.
+ /// </summary>
+ EnableMediaPlayback = 7,
+
+ /// <summary>
+ /// Whether the server should transcode audio for the user if requested.
+ /// </summary>
+ EnableAudioPlaybackTranscoding = 8,
+
+ /// <summary>
+ /// Whether the server should transcode video for the user if requested.
+ /// </summary>
+ EnableVideoPlaybackTranscoding = 9,
+
+ /// <summary>
+ /// Whether the user can delete content.
+ /// </summary>
+ EnableContentDeletion = 10,
+
+ /// <summary>
+ /// Whether the user can download content.
+ /// </summary>
+ EnableContentDownloading = 11,
+
+ /// <summary>
+ /// Whether to enable sync transcoding for the user.
+ /// </summary>
+ EnableSyncTranscoding = 12,
+
+ /// <summary>
+ /// Whether the user can do media conversion.
+ /// </summary>
+ EnableMediaConversion = 13,
+
+ /// <summary>
+ /// Whether the user has access to all devices.
+ /// </summary>
+ EnableAllDevices = 14,
+
+ /// <summary>
+ /// Whether the user has access to all channels.
+ /// </summary>
+ EnableAllChannels = 15,
+
+ /// <summary>
+ /// Whether the user has access to all folders.
+ /// </summary>
+ EnableAllFolders = 16,
+
+ /// <summary>
+ /// Whether to enable public sharing for the user.
+ /// </summary>
+ EnablePublicSharing = 17,
+
+ /// <summary>
+ /// Whether the user can remotely control other users.
+ /// </summary>
+ EnableRemoteControlOfOtherUsers = 18,
+
+ /// <summary>
+ /// Whether the user is permitted to do playback remuxing.
+ /// </summary>
+ EnablePlaybackRemuxing = 19,
+
+ /// <summary>
+ /// Whether the server should force transcoding on remote connections for the user.
+ /// </summary>
+ ForceRemoteSourceTranscoding = 20
+ }
+}
diff --git a/Jellyfin.Data/Enums/PersonRoleType.cs b/Jellyfin.Data/Enums/PersonRoleType.cs
new file mode 100644
index 0000000000..6e52f2c851
--- /dev/null
+++ b/Jellyfin.Data/Enums/PersonRoleType.cs
@@ -0,0 +1,18 @@
+namespace Jellyfin.Data.Enums
+{
+ public enum PersonRoleType
+ {
+ Other,
+ Director,
+ Artist,
+ OriginalArtist,
+ Actor,
+ VoiceActor,
+ Producer,
+ Remixer,
+ Conductor,
+ Composer,
+ Author,
+ Editor
+ }
+}
diff --git a/Jellyfin.Data/Enums/PreferenceKind.cs b/Jellyfin.Data/Enums/PreferenceKind.cs
new file mode 100644
index 0000000000..de8eecc734
--- /dev/null
+++ b/Jellyfin.Data/Enums/PreferenceKind.cs
@@ -0,0 +1,68 @@
+namespace Jellyfin.Data.Enums
+{
+ /// <summary>
+ /// The types of user preferences.
+ /// </summary>
+ public enum PreferenceKind
+ {
+ /// <summary>
+ /// A list of blocked tags.
+ /// </summary>
+ BlockedTags = 0,
+
+ /// <summary>
+ /// A list of blocked channels.
+ /// </summary>
+ BlockedChannels = 1,
+
+ /// <summary>
+ /// A list of blocked media folders.
+ /// </summary>
+ BlockedMediaFolders = 2,
+
+ /// <summary>
+ /// A list of enabled devices.
+ /// </summary>
+ EnabledDevices = 3,
+
+ /// <summary>
+ /// A list of enabled channels
+ /// </summary>
+ EnabledChannels = 4,
+
+ /// <summary>
+ /// A list of enabled folders.
+ /// </summary>
+ EnabledFolders = 5,
+
+ /// <summary>
+ /// A list of folders to allow content deletion from.
+ /// </summary>
+ EnableContentDeletionFromFolders = 6,
+
+ /// <summary>
+ /// A list of latest items to exclude.
+ /// </summary>
+ LatestItemExcludes = 7,
+
+ /// <summary>
+ /// A list of media to exclude.
+ /// </summary>
+ MyMediaExcludes = 8,
+
+ /// <summary>
+ /// A list of grouped folders.
+ /// </summary>
+ GroupedFolders = 9,
+
+ /// <summary>
+ /// A list of unrated items to block.
+ /// </summary>
+ BlockUnratedItems = 10,
+
+ /// <summary>
+ /// A list of ordered views.
+ /// </summary>
+ OrderedViews = 11
+ }
+}
diff --git a/Jellyfin.Data/Enums/SubtitlePlaybackMode.cs b/Jellyfin.Data/Enums/SubtitlePlaybackMode.cs
new file mode 100644
index 0000000000..c8fc211593
--- /dev/null
+++ b/Jellyfin.Data/Enums/SubtitlePlaybackMode.cs
@@ -0,0 +1,13 @@
+#pragma warning disable CS1591
+
+namespace Jellyfin.Data.Enums
+{
+ public enum SubtitlePlaybackMode
+ {
+ Default = 0,
+ Always = 1,
+ OnlyForced = 2,
+ None = 3,
+ Smart = 4
+ }
+}
diff --git a/Jellyfin.Data/Enums/SyncPlayAccess.cs b/Jellyfin.Data/Enums/SyncPlayAccess.cs
new file mode 100644
index 0000000000..8c13b37a13
--- /dev/null
+++ b/Jellyfin.Data/Enums/SyncPlayAccess.cs
@@ -0,0 +1,23 @@
+namespace Jellyfin.Data.Enums
+{
+ /// <summary>
+ /// Enum SyncPlayAccess.
+ /// </summary>
+ public enum SyncPlayAccess
+ {
+ /// <summary>
+ /// User can create groups and join them.
+ /// </summary>
+ CreateAndJoinGroups = 0,
+
+ /// <summary>
+ /// User can only join already existing groups.
+ /// </summary>
+ JoinGroups = 1,
+
+ /// <summary>
+ /// SyncPlay is disabled for the user.
+ /// </summary>
+ None = 2
+ }
+}
diff --git a/Jellyfin.Data/Enums/UnratedItem.cs b/Jellyfin.Data/Enums/UnratedItem.cs
new file mode 100644
index 0000000000..5259e77394
--- /dev/null
+++ b/Jellyfin.Data/Enums/UnratedItem.cs
@@ -0,0 +1,17 @@
+#pragma warning disable CS1591
+
+namespace Jellyfin.Data.Enums
+{
+ public enum UnratedItem
+ {
+ Movie,
+ Trailer,
+ Series,
+ Music,
+ Book,
+ LiveTvChannel,
+ LiveTvProgram,
+ ChannelContent,
+ Other
+ }
+}
diff --git a/Jellyfin.Data/IHasPermissions.cs b/Jellyfin.Data/IHasPermissions.cs
new file mode 100644
index 0000000000..3be72259ad
--- /dev/null
+++ b/Jellyfin.Data/IHasPermissions.cs
@@ -0,0 +1,31 @@
+using System.Collections.Generic;
+using Jellyfin.Data.Entities;
+using Jellyfin.Data.Enums;
+
+namespace Jellyfin.Data
+{
+ /// <summary>
+ /// An abstraction representing an entity that has permissions.
+ /// </summary>
+ public interface IHasPermissions
+ {
+ /// <summary>
+ /// Gets a collection containing this entity's permissions.
+ /// </summary>
+ ICollection<Permission> Permissions { get; }
+
+ /// <summary>
+ /// Checks whether this entity has the specified permission kind.
+ /// </summary>
+ /// <param name="kind">The kind of permission.</param>
+ /// <returns><c>true</c> if this entity has the specified permission, <c>false</c> otherwise.</returns>
+ bool HasPermission(PermissionKind kind);
+
+ /// <summary>
+ /// Sets the specified permission to the provided value.
+ /// </summary>
+ /// <param name="kind">The kind of permission.</param>
+ /// <param name="value">The value to set.</param>
+ void SetPermission(PermissionKind kind, bool value);
+ }
+}
diff --git a/Jellyfin.Data/ISavingChanges.cs b/Jellyfin.Data/ISavingChanges.cs
new file mode 100644
index 0000000000..f392dae6a0
--- /dev/null
+++ b/Jellyfin.Data/ISavingChanges.cs
@@ -0,0 +1,9 @@
+#pragma warning disable CS1591
+
+namespace Jellyfin.Data
+{
+ public interface ISavingChanges
+ {
+ void OnSavingChanges();
+ }
+}
diff --git a/Jellyfin.Data/Jellyfin.Data.csproj b/Jellyfin.Data/Jellyfin.Data.csproj
new file mode 100644
index 0000000000..282ea511cf
--- /dev/null
+++ b/Jellyfin.Data/Jellyfin.Data.csproj
@@ -0,0 +1,27 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+ <PropertyGroup>
+ <TargetFrameworks>netstandard2.0;netstandard2.1</TargetFrameworks>
+ <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
+ <GenerateDocumentationFile>true</GenerateDocumentationFile>
+ </PropertyGroup>
+
+ <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
+ <CodeAnalysisRuleSet>../jellyfin.ruleset</CodeAnalysisRuleSet>
+ </PropertyGroup>
+
+ <!-- Code analysers-->
+ <ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
+ <PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="2.9.8" PrivateAssets="All" />
+ <PackageReference Include="SerilogAnalyzer" Version="0.15.0" PrivateAssets="All" />
+ <PackageReference Include="StyleCop.Analyzers" Version="1.1.118" PrivateAssets="All" />
+ <PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" PrivateAssets="All" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="3.1.5" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.5" />
+ <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="3.1.5" />
+ </ItemGroup>
+
+</Project>