diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs
index 8a2301d2d6..aa8a3d212a 100644
--- a/Emby.Drawing/ImageProcessor.cs
+++ b/Emby.Drawing/ImageProcessor.cs
@@ -352,8 +352,13 @@ namespace Emby.Drawing
}
///
- public string GetImageCacheTag(User user)
+ public string? GetImageCacheTag(User user)
{
+ if (user.ProfileImage == null)
+ {
+ return null;
+ }
+
return (user.ProfileImage.Path + user.ProfileImage.LastModified.Ticks).GetMD5()
.ToString("N", CultureInfo.InvariantCulture);
}
diff --git a/Jellyfin.Api/Controllers/ImageController.cs b/Jellyfin.Api/Controllers/ImageController.cs
index a50d6e46bf..b016f24500 100644
--- a/Jellyfin.Api/Controllers/ImageController.cs
+++ b/Jellyfin.Api/Controllers/ImageController.cs
@@ -196,6 +196,11 @@ namespace Jellyfin.Api.Controllers
}
var user = _userManager.GetUserById(userId);
+ if (user?.ProfileImage == null)
+ {
+ return NoContent();
+ }
+
try
{
System.IO.File.Delete(user.ProfileImage.Path);
@@ -235,6 +240,11 @@ namespace Jellyfin.Api.Controllers
}
var user = _userManager.GetUserById(userId);
+ if (user?.ProfileImage == null)
+ {
+ return NoContent();
+ }
+
try
{
System.IO.File.Delete(user.ProfileImage.Path);
@@ -1469,7 +1479,7 @@ namespace Jellyfin.Api.Controllers
[FromQuery] int? imageIndex)
{
var user = _userManager.GetUserById(userId);
- if (user == null)
+ if (user?.ProfileImage == null)
{
return NotFound();
}
diff --git a/Jellyfin.Api/Controllers/StartupController.cs b/Jellyfin.Api/Controllers/StartupController.cs
index d9cb34557b..a01a617fc0 100644
--- a/Jellyfin.Api/Controllers/StartupController.cs
+++ b/Jellyfin.Api/Controllers/StartupController.cs
@@ -132,7 +132,10 @@ namespace Jellyfin.Api.Controllers
{
var user = _userManager.Users.First();
- user.Username = startupUserDto.Name;
+ if (startupUserDto.Name != null)
+ {
+ user.Username = startupUserDto.Name;
+ }
await _userManager.UpdateUserAsync(user).ConfigureAwait(false);
diff --git a/Jellyfin.Data/Entities/AccessSchedule.cs b/Jellyfin.Data/Entities/AccessSchedule.cs
index 72bca061da..9ac0666ac3 100644
--- a/Jellyfin.Data/Entities/AccessSchedule.cs
+++ b/Jellyfin.Data/Entities/AccessSchedule.cs
@@ -1,5 +1,4 @@
using System;
-using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Xml.Serialization;
using Jellyfin.Data.Enums;
@@ -33,8 +32,6 @@ namespace Jellyfin.Data.Entities
/// Identity, Indexed, Required.
///
[XmlIgnore]
- [Key]
- [Required]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; protected set; }
@@ -42,28 +39,24 @@ namespace Jellyfin.Data.Entities
/// Gets or sets the id of the associated user.
///
[XmlIgnore]
- [Required]
public Guid UserId { get; protected set; }
///
/// Gets or sets the day of week.
///
/// The day of week.
- [Required]
public DynamicDayOfWeek DayOfWeek { get; set; }
///
/// Gets or sets the start hour.
///
/// The start hour.
- [Required]
public double StartHour { get; set; }
///
/// Gets or sets the end hour.
///
/// The end hour.
- [Required]
public double EndHour { get; set; }
///
diff --git a/Jellyfin.Data/Entities/ActivityLog.cs b/Jellyfin.Data/Entities/ActivityLog.cs
index 80e32db30e..e4534e8b5e 100644
--- a/Jellyfin.Data/Entities/ActivityLog.cs
+++ b/Jellyfin.Data/Entities/ActivityLog.cs
@@ -50,7 +50,6 @@ namespace Jellyfin.Data.Entities
///
/// Required, Max length = 512.
///
- [Required]
[MaxLength(512)]
[StringLength(512)]
public string Name { get; set; }
@@ -63,7 +62,7 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(512)]
[StringLength(512)]
- public string Overview { get; set; }
+ public string? Overview { get; set; }
///
/// Gets or sets the short overview.
@@ -73,7 +72,7 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(512)]
[StringLength(512)]
- public string ShortOverview { get; set; }
+ public string? ShortOverview { get; set; }
///
/// Gets or sets the type.
@@ -81,7 +80,6 @@ namespace Jellyfin.Data.Entities
///
/// Required, Max length = 256.
///
- [Required]
[MaxLength(256)]
[StringLength(256)]
public string Type { get; set; }
@@ -102,7 +100,7 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(256)]
[StringLength(256)]
- public string ItemId { get; set; }
+ public string? ItemId { get; set; }
///
/// Gets or sets the date created. This should be in UTC.
diff --git a/Jellyfin.Data/Entities/CustomItemDisplayPreferences.cs b/Jellyfin.Data/Entities/CustomItemDisplayPreferences.cs
index d407180d46..cc46248c75 100644
--- a/Jellyfin.Data/Entities/CustomItemDisplayPreferences.cs
+++ b/Jellyfin.Data/Entities/CustomItemDisplayPreferences.cs
@@ -57,7 +57,6 @@ namespace Jellyfin.Data.Entities
///
/// Required. Max Length = 32.
///
- [Required]
[MaxLength(32)]
[StringLength(32)]
public string Client { get; set; }
@@ -68,7 +67,6 @@ namespace Jellyfin.Data.Entities
///
/// Required.
///
- [Required]
public string Key { get; set; }
///
@@ -77,7 +75,6 @@ namespace Jellyfin.Data.Entities
///
/// Required.
///
- [Required]
public string Value { get; set; }
}
}
diff --git a/Jellyfin.Data/Entities/DisplayPreferences.cs b/Jellyfin.Data/Entities/DisplayPreferences.cs
index d186deb293..64cd6812a4 100644
--- a/Jellyfin.Data/Entities/DisplayPreferences.cs
+++ b/Jellyfin.Data/Entities/DisplayPreferences.cs
@@ -30,8 +30,6 @@ namespace Jellyfin.Data.Entities
SkipBackwardLength = 10000;
ScrollDirection = ScrollDirection.Horizontal;
ChromecastVersion = ChromecastVersion.Stable;
- DashboardTheme = string.Empty;
- TvHome = string.Empty;
HomeSections = new HashSet();
}
@@ -67,7 +65,6 @@ namespace Jellyfin.Data.Entities
///
/// Required. Max Length = 32.
///
- [Required]
[MaxLength(32)]
[StringLength(32)]
public string Client { get; set; }
@@ -138,14 +135,14 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(32)]
[StringLength(32)]
- public string DashboardTheme { get; set; }
+ public string? DashboardTheme { get; set; }
///
/// Gets or sets the tv home screen.
///
[MaxLength(32)]
[StringLength(32)]
- public string TvHome { get; set; }
+ public string? TvHome { get; set; }
///
/// Gets or sets the home sections.
diff --git a/Jellyfin.Data/Entities/Group.cs b/Jellyfin.Data/Entities/Group.cs
index 8c45dde928..b14e22b7b3 100644
--- a/Jellyfin.Data/Entities/Group.cs
+++ b/Jellyfin.Data/Entities/Group.cs
@@ -46,7 +46,6 @@ namespace Jellyfin.Data.Entities
///
/// Required, Max length = 255.
///
- [Required]
[MaxLength(255)]
[StringLength(255)]
public string Name { get; set; }
diff --git a/Jellyfin.Data/Entities/HomeSection.cs b/Jellyfin.Data/Entities/HomeSection.cs
index 0620462602..5adc52491c 100644
--- a/Jellyfin.Data/Entities/HomeSection.cs
+++ b/Jellyfin.Data/Entities/HomeSection.cs
@@ -15,7 +15,6 @@ namespace Jellyfin.Data.Entities
///
/// Identity. Required.
///
- [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; protected set; }
diff --git a/Jellyfin.Data/Entities/ImageInfo.cs b/Jellyfin.Data/Entities/ImageInfo.cs
index f9ae1a955f..e0c37047d8 100644
--- a/Jellyfin.Data/Entities/ImageInfo.cs
+++ b/Jellyfin.Data/Entities/ImageInfo.cs
@@ -39,7 +39,6 @@ namespace Jellyfin.Data.Entities
///
/// Required.
///
- [Required]
[MaxLength(512)]
[StringLength(512)]
public string Path { get; set; }
diff --git a/Jellyfin.Data/Entities/ItemDisplayPreferences.cs b/Jellyfin.Data/Entities/ItemDisplayPreferences.cs
index f0a04f8ea6..4bfeb2fa30 100644
--- a/Jellyfin.Data/Entities/ItemDisplayPreferences.cs
+++ b/Jellyfin.Data/Entities/ItemDisplayPreferences.cs
@@ -59,7 +59,6 @@ namespace Jellyfin.Data.Entities
///
/// Required. Max Length = 32.
///
- [Required]
[MaxLength(32)]
[StringLength(32)]
public string Client { get; set; }
@@ -99,7 +98,6 @@ namespace Jellyfin.Data.Entities
///
/// Required.
///
- [Required]
[MaxLength(64)]
[StringLength(64)]
public string SortBy { get; set; }
diff --git a/Jellyfin.Data/Entities/Libraries/Artwork.cs b/Jellyfin.Data/Entities/Libraries/Artwork.cs
index df28ce7374..84a524de2c 100644
--- a/Jellyfin.Data/Entities/Libraries/Artwork.cs
+++ b/Jellyfin.Data/Entities/Libraries/Artwork.cs
@@ -44,7 +44,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 65535.
///
- [Required]
[MaxLength(65535)]
[StringLength(65535)]
public string Path { get; set; }
diff --git a/Jellyfin.Data/Entities/Libraries/BookMetadata.cs b/Jellyfin.Data/Entities/Libraries/BookMetadata.cs
index 8b0c965306..1ff4327b01 100644
--- a/Jellyfin.Data/Entities/Libraries/BookMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/BookMetadata.cs
@@ -1,7 +1,6 @@
#pragma warning disable CA2227
using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations.Schema;
using Jellyfin.Data.Interfaces;
namespace Jellyfin.Data.Entities.Libraries
@@ -32,7 +31,6 @@ namespace Jellyfin.Data.Entities.Libraries
public virtual ICollection Publishers { get; protected set; }
///
- [NotMapped]
public ICollection Companies => Publishers;
}
}
diff --git a/Jellyfin.Data/Entities/Libraries/Chapter.cs b/Jellyfin.Data/Entities/Libraries/Chapter.cs
index f253143d74..11f53ae20a 100644
--- a/Jellyfin.Data/Entities/Libraries/Chapter.cs
+++ b/Jellyfin.Data/Entities/Libraries/Chapter.cs
@@ -45,7 +45,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Name { get; set; }
+ public string? Name { get; set; }
///
/// Gets or sets the language.
@@ -54,7 +54,6 @@ namespace Jellyfin.Data.Entities.Libraries
/// Required, Min length = 3, Max length = 3
/// ISO-639-3 3-character language codes.
///
- [Required]
[MinLength(3)]
[MaxLength(3)]
[StringLength(3)]
diff --git a/Jellyfin.Data/Entities/Libraries/Collection.cs b/Jellyfin.Data/Entities/Libraries/Collection.cs
index 39eded752d..d230eeb2fe 100644
--- a/Jellyfin.Data/Entities/Libraries/Collection.cs
+++ b/Jellyfin.Data/Entities/Libraries/Collection.cs
@@ -37,7 +37,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Name { get; set; }
+ public string? Name { get; set; }
///
[ConcurrencyCheck]
diff --git a/Jellyfin.Data/Entities/Libraries/CollectionItem.cs b/Jellyfin.Data/Entities/Libraries/CollectionItem.cs
index 1157de442b..e19362bdf1 100644
--- a/Jellyfin.Data/Entities/Libraries/CollectionItem.cs
+++ b/Jellyfin.Data/Entities/Libraries/CollectionItem.cs
@@ -9,6 +9,15 @@ namespace Jellyfin.Data.Entities.Libraries
///
public class CollectionItem : IHasConcurrencyToken
{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The library item.
+ public CollectionItem(LibraryItem libraryItem)
+ {
+ LibraryItem = libraryItem;
+ }
+
///
/// Gets or sets the id.
///
@@ -36,7 +45,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// TODO check if this properly updated Dependant and has the proper principal relationship.
///
- public virtual CollectionItem Next { get; set; }
+ public virtual CollectionItem? Next { get; set; }
///
/// Gets or sets the previous item in the collection.
@@ -44,7 +53,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// TODO check if this properly updated Dependant and has the proper principal relationship.
///
- public virtual CollectionItem Previous { get; set; }
+ public virtual CollectionItem? Previous { get; set; }
///
public void OnSavingChanges()
diff --git a/Jellyfin.Data/Entities/Libraries/Company.cs b/Jellyfin.Data/Entities/Libraries/Company.cs
index 499ba3800a..09050bb522 100644
--- a/Jellyfin.Data/Entities/Libraries/Company.cs
+++ b/Jellyfin.Data/Entities/Libraries/Company.cs
@@ -18,6 +18,7 @@ namespace Jellyfin.Data.Entities.Libraries
public Company()
{
CompanyMetadata = new HashSet();
+ ChildCompanies = new HashSet();
}
///
@@ -44,7 +45,6 @@ namespace Jellyfin.Data.Entities.Libraries
public virtual ICollection ChildCompanies { get; protected set; }
///
- [NotMapped]
public ICollection Companies => ChildCompanies;
///
diff --git a/Jellyfin.Data/Entities/Libraries/CompanyMetadata.cs b/Jellyfin.Data/Entities/Libraries/CompanyMetadata.cs
index 86642b38a5..a29f08c7f6 100644
--- a/Jellyfin.Data/Entities/Libraries/CompanyMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/CompanyMetadata.cs
@@ -24,7 +24,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(65535)]
[StringLength(65535)]
- public string Description { get; set; }
+ public string? Description { get; set; }
///
/// Gets or sets the headquarters.
@@ -34,7 +34,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(255)]
[StringLength(255)]
- public string Headquarters { get; set; }
+ public string? Headquarters { get; set; }
///
/// Gets or sets the country code.
@@ -44,7 +44,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(2)]
[StringLength(2)]
- public string Country { get; set; }
+ public string? Country { get; set; }
///
/// Gets or sets the homepage.
@@ -54,6 +54,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Homepage { get; set; }
+ public string? Homepage { get; set; }
}
}
diff --git a/Jellyfin.Data/Entities/Libraries/CustomItemMetadata.cs b/Jellyfin.Data/Entities/Libraries/CustomItemMetadata.cs
index a69a8eafa4..af2393870f 100644
--- a/Jellyfin.Data/Entities/Libraries/CustomItemMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/CustomItemMetadata.cs
@@ -1,5 +1,3 @@
-using System;
-
namespace Jellyfin.Data.Entities.Libraries
{
///
diff --git a/Jellyfin.Data/Entities/Libraries/EpisodeMetadata.cs b/Jellyfin.Data/Entities/Libraries/EpisodeMetadata.cs
index 5662decdb8..b0ef11e0f2 100644
--- a/Jellyfin.Data/Entities/Libraries/EpisodeMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/EpisodeMetadata.cs
@@ -24,7 +24,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Outline { get; set; }
+ public string? Outline { get; set; }
///
/// Gets or sets the plot.
@@ -34,7 +34,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(65535)]
[StringLength(65535)]
- public string Plot { get; set; }
+ public string? Plot { get; set; }
///
/// Gets or sets the tagline.
@@ -44,6 +44,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Tagline { get; set; }
+ public string? Tagline { get; set; }
}
}
diff --git a/Jellyfin.Data/Entities/Libraries/Genre.cs b/Jellyfin.Data/Entities/Libraries/Genre.cs
index befa75550a..9f3d650283 100644
--- a/Jellyfin.Data/Entities/Libraries/Genre.cs
+++ b/Jellyfin.Data/Entities/Libraries/Genre.cs
@@ -33,7 +33,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Indexed, Required, Max length = 255.
///
- [Required]
[MaxLength(255)]
[StringLength(255)]
public string Name { get; set; }
diff --git a/Jellyfin.Data/Entities/Libraries/ItemMetadata.cs b/Jellyfin.Data/Entities/Libraries/ItemMetadata.cs
index a0efa66e46..d12e011a8b 100644
--- a/Jellyfin.Data/Entities/Libraries/ItemMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/ItemMetadata.cs
@@ -57,7 +57,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 1024.
///
- [Required]
[MaxLength(1024)]
[StringLength(1024)]
public string Title { get; set; }
@@ -70,7 +69,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string OriginalTitle { get; set; }
+ public string? OriginalTitle { get; set; }
///
/// Gets or sets the sort title.
@@ -80,7 +79,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string SortTitle { get; set; }
+ public string? SortTitle { get; set; }
///
/// Gets or sets the language.
@@ -89,7 +88,6 @@ namespace Jellyfin.Data.Entities.Libraries
/// Required, Min length = 3, Max length = 3.
/// ISO-639-3 3-character language codes.
///
- [Required]
[MinLength(3)]
[MaxLength(3)]
[StringLength(3)]
diff --git a/Jellyfin.Data/Entities/Libraries/Library.cs b/Jellyfin.Data/Entities/Libraries/Library.cs
index 3ec4341a48..e453849020 100644
--- a/Jellyfin.Data/Entities/Libraries/Library.cs
+++ b/Jellyfin.Data/Entities/Libraries/Library.cs
@@ -1,4 +1,3 @@
-using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Jellyfin.Data.Interfaces;
@@ -14,14 +13,11 @@ namespace Jellyfin.Data.Entities.Libraries
/// Initializes a new instance of the class.
///
/// The name of the library.
- public Library(string name)
+ /// The path of the library.
+ public Library(string name, string path)
{
- if (string.IsNullOrWhiteSpace(name))
- {
- throw new ArgumentNullException(nameof(name));
- }
-
Name = name;
+ Path = path;
}
///
@@ -39,7 +35,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 128.
///
- [Required]
[MaxLength(128)]
[StringLength(128)]
public string Name { get; set; }
@@ -50,7 +45,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required.
///
- [Required]
public string Path { get; set; }
///
diff --git a/Jellyfin.Data/Entities/Libraries/LibraryItem.cs b/Jellyfin.Data/Entities/Libraries/LibraryItem.cs
index 504b9c853b..67ffad944b 100644
--- a/Jellyfin.Data/Entities/Libraries/LibraryItem.cs
+++ b/Jellyfin.Data/Entities/Libraries/LibraryItem.cs
@@ -44,7 +44,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required.
///
- [Required]
public virtual Library Library { get; set; }
///
diff --git a/Jellyfin.Data/Entities/Libraries/MediaFile.cs b/Jellyfin.Data/Entities/Libraries/MediaFile.cs
index 7f64978e24..f3e2fe6539 100644
--- a/Jellyfin.Data/Entities/Libraries/MediaFile.cs
+++ b/Jellyfin.Data/Entities/Libraries/MediaFile.cs
@@ -47,7 +47,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 65535.
///
- [Required]
[MaxLength(65535)]
[StringLength(65535)]
public string Path { get; set; }
diff --git a/Jellyfin.Data/Entities/Libraries/MetadataProvider.cs b/Jellyfin.Data/Entities/Libraries/MetadataProvider.cs
index 20de5bf4bb..fb2587882d 100644
--- a/Jellyfin.Data/Entities/Libraries/MetadataProvider.cs
+++ b/Jellyfin.Data/Entities/Libraries/MetadataProvider.cs
@@ -39,7 +39,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 1024.
///
- [Required]
[MaxLength(1024)]
[StringLength(1024)]
public string Name { get; set; }
diff --git a/Jellyfin.Data/Entities/Libraries/MetadataProviderId.cs b/Jellyfin.Data/Entities/Libraries/MetadataProviderId.cs
index 12672dd25b..2a9c904c88 100644
--- a/Jellyfin.Data/Entities/Libraries/MetadataProviderId.cs
+++ b/Jellyfin.Data/Entities/Libraries/MetadataProviderId.cs
@@ -14,7 +14,8 @@ namespace Jellyfin.Data.Entities.Libraries
/// Initializes a new instance of the class.
///
/// The provider id.
- public MetadataProviderId(string providerId)
+ /// The metadata provider.
+ public MetadataProviderId(string providerId, MetadataProvider metadataProvider)
{
if (string.IsNullOrEmpty(providerId))
{
@@ -22,6 +23,7 @@ namespace Jellyfin.Data.Entities.Libraries
}
ProviderId = providerId;
+ MetadataProvider = metadataProvider;
}
///
@@ -39,7 +41,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 255.
///
- [Required]
[MaxLength(255)]
[StringLength(255)]
public string ProviderId { get; set; }
diff --git a/Jellyfin.Data/Entities/Libraries/MovieMetadata.cs b/Jellyfin.Data/Entities/Libraries/MovieMetadata.cs
index 8cf7ca6a7f..fb181dea60 100644
--- a/Jellyfin.Data/Entities/Libraries/MovieMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/MovieMetadata.cs
@@ -2,7 +2,6 @@
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
-using System.ComponentModel.DataAnnotations.Schema;
using Jellyfin.Data.Interfaces;
namespace Jellyfin.Data.Entities.Libraries
@@ -30,7 +29,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Outline { get; set; }
+ public string? Outline { get; set; }
///
/// Gets or sets the tagline.
@@ -40,7 +39,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Tagline { get; set; }
+ public string? Tagline { get; set; }
///
/// Gets or sets the plot.
@@ -50,7 +49,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(65535)]
[StringLength(65535)]
- public string Plot { get; set; }
+ public string? Plot { get; set; }
///
/// Gets or sets the country code.
@@ -60,7 +59,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(2)]
[StringLength(2)]
- public string Country { get; set; }
+ public string? Country { get; set; }
///
/// Gets or sets the studios that produced this movie.
@@ -68,7 +67,6 @@ namespace Jellyfin.Data.Entities.Libraries
public virtual ICollection Studios { get; protected set; }
///
- [NotMapped]
public ICollection Companies => Studios;
}
}
diff --git a/Jellyfin.Data/Entities/Libraries/MusicAlbumMetadata.cs b/Jellyfin.Data/Entities/Libraries/MusicAlbumMetadata.cs
index 9e44e550af..3080bd692d 100644
--- a/Jellyfin.Data/Entities/Libraries/MusicAlbumMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/MusicAlbumMetadata.cs
@@ -28,7 +28,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(255)]
[StringLength(255)]
- public string Barcode { get; set; }
+ public string? Barcode { get; set; }
///
/// Gets or sets the label number.
@@ -38,7 +38,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(255)]
[StringLength(255)]
- public string LabelNumber { get; set; }
+ public string? LabelNumber { get; set; }
///
/// Gets or sets the country code.
@@ -48,7 +48,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(2)]
[StringLength(2)]
- public string Country { get; set; }
+ public string? Country { get; set; }
///
/// Gets or sets a collection containing the labels.
diff --git a/Jellyfin.Data/Entities/Libraries/Person.cs b/Jellyfin.Data/Entities/Libraries/Person.cs
index cc4b9e0f9f..159bd47be7 100644
--- a/Jellyfin.Data/Entities/Libraries/Person.cs
+++ b/Jellyfin.Data/Entities/Libraries/Person.cs
@@ -46,7 +46,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 1024.
///
- [Required]
[MaxLength(1024)]
[StringLength(1024)]
public string Name { get; set; }
@@ -59,7 +58,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(256)]
[StringLength(256)]
- public string SourceId { get; set; }
+ public string? SourceId { get; set; }
///
/// Gets or sets the date added.
diff --git a/Jellyfin.Data/Entities/Libraries/PersonRole.cs b/Jellyfin.Data/Entities/Libraries/PersonRole.cs
index 3ae2e4a685..988aa84bae 100644
--- a/Jellyfin.Data/Entities/Libraries/PersonRole.cs
+++ b/Jellyfin.Data/Entities/Libraries/PersonRole.cs
@@ -17,9 +17,12 @@ namespace Jellyfin.Data.Entities.Libraries
/// Initializes a new instance of the class.
///
/// The role type.
- public PersonRole(PersonRoleType type)
+ /// The person.
+ public PersonRole(PersonRoleType type, Person person)
{
Type = type;
+ Person = person;
+ Artwork = new HashSet();
Sources = new HashSet();
}
@@ -40,7 +43,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Role { get; set; }
+ public string? Role { get; set; }
///
/// Gets or sets the person's role type.
@@ -60,7 +63,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required.
///
- [Required]
public virtual Person Person { get; set; }
///
diff --git a/Jellyfin.Data/Entities/Libraries/Rating.cs b/Jellyfin.Data/Entities/Libraries/Rating.cs
index 0ea933fd79..6862012a80 100644
--- a/Jellyfin.Data/Entities/Libraries/Rating.cs
+++ b/Jellyfin.Data/Entities/Libraries/Rating.cs
@@ -48,7 +48,7 @@ namespace Jellyfin.Data.Entities.Libraries
/// Gets or sets the rating type.
/// If this is null it's the internal user rating.
///
- public virtual RatingSource RatingType { get; set; }
+ public virtual RatingSource? RatingType { get; set; }
///
public void OnSavingChanges()
diff --git a/Jellyfin.Data/Entities/Libraries/RatingSource.cs b/Jellyfin.Data/Entities/Libraries/RatingSource.cs
index 7e1a5a8f46..ae0d806ff0 100644
--- a/Jellyfin.Data/Entities/Libraries/RatingSource.cs
+++ b/Jellyfin.Data/Entities/Libraries/RatingSource.cs
@@ -37,7 +37,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Name { get; set; }
+ public string? Name { get; set; }
///
/// Gets or sets the minimum value.
@@ -62,7 +62,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Gets or sets the metadata source.
///
- public virtual MetadataProviderId Source { get; set; }
+ public virtual MetadataProviderId? Source { get; set; }
///
public void OnSavingChanges()
diff --git a/Jellyfin.Data/Entities/Libraries/Release.cs b/Jellyfin.Data/Entities/Libraries/Release.cs
index 1871e0f10b..21d4039793 100644
--- a/Jellyfin.Data/Entities/Libraries/Release.cs
+++ b/Jellyfin.Data/Entities/Libraries/Release.cs
@@ -45,7 +45,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
/// Required, Max length = 1024.
///
- [Required]
[MaxLength(1024)]
[StringLength(1024)]
public string Name { get; set; }
diff --git a/Jellyfin.Data/Entities/Libraries/SeasonMetadata.cs b/Jellyfin.Data/Entities/Libraries/SeasonMetadata.cs
index 61714f9095..da40a075f5 100644
--- a/Jellyfin.Data/Entities/Libraries/SeasonMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/SeasonMetadata.cs
@@ -24,6 +24,6 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Outline { get; set; }
+ public string? Outline { get; set; }
}
}
diff --git a/Jellyfin.Data/Entities/Libraries/SeriesMetadata.cs b/Jellyfin.Data/Entities/Libraries/SeriesMetadata.cs
index e1acd2d457..730deccaed 100644
--- a/Jellyfin.Data/Entities/Libraries/SeriesMetadata.cs
+++ b/Jellyfin.Data/Entities/Libraries/SeriesMetadata.cs
@@ -30,7 +30,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Outline { get; set; }
+ public string? Outline { get; set; }
///
/// Gets or sets the plot.
@@ -40,7 +40,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(65535)]
[StringLength(65535)]
- public string Plot { get; set; }
+ public string? Plot { get; set; }
///
/// Gets or sets the tagline.
@@ -50,7 +50,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(1024)]
[StringLength(1024)]
- public string Tagline { get; set; }
+ public string? Tagline { get; set; }
///
/// Gets or sets the country code.
@@ -60,7 +60,7 @@ namespace Jellyfin.Data.Entities.Libraries
///
[MaxLength(2)]
[StringLength(2)]
- public string Country { get; set; }
+ public string? Country { get; set; }
///
/// Gets or sets a collection containing the networks.
@@ -68,7 +68,6 @@ namespace Jellyfin.Data.Entities.Libraries
public virtual ICollection Networks { get; protected set; }
///
- [NotMapped]
public ICollection Companies => Networks;
}
}
diff --git a/Jellyfin.Data/Entities/Preference.cs b/Jellyfin.Data/Entities/Preference.cs
index 40f2f8ede9..a8813ab88d 100644
--- a/Jellyfin.Data/Entities/Preference.cs
+++ b/Jellyfin.Data/Entities/Preference.cs
@@ -46,7 +46,6 @@ namespace Jellyfin.Data.Entities
///
/// Required, Max length = 65535.
///
- [Required]
[MaxLength(65535)]
[StringLength(65535)]
public string Value { get; set; }
diff --git a/Jellyfin.Data/Entities/User.cs b/Jellyfin.Data/Entities/User.cs
index 28e12adde6..9aa8091640 100644
--- a/Jellyfin.Data/Entities/User.cs
+++ b/Jellyfin.Data/Entities/User.cs
@@ -51,6 +51,7 @@ namespace Jellyfin.Data.Entities
PasswordResetProviderId = passwordResetProviderId;
AccessSchedules = new HashSet();
+ DisplayPreferences = new HashSet();
ItemDisplayPreferences = new HashSet();
// Groups = new HashSet();
Permissions = new HashSet();
@@ -92,7 +93,6 @@ namespace Jellyfin.Data.Entities
///
/// Required, Max length = 255.
///
- [Required]
[MaxLength(255)]
[StringLength(255)]
public string Username { get; set; }
@@ -105,7 +105,7 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(65535)]
[StringLength(65535)]
- public string Password { get; set; }
+ public string? Password { get; set; }
///
/// Gets or sets the user's easy password, or null if none is set.
@@ -115,7 +115,7 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(65535)]
[StringLength(65535)]
- public string EasyPassword { get; set; }
+ public string? EasyPassword { get; set; }
///
/// Gets or sets a value indicating whether the user must update their password.
@@ -133,7 +133,7 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(255)]
[StringLength(255)]
- public string AudioLanguagePreference { get; set; }
+ public string? AudioLanguagePreference { get; set; }
///
/// Gets or sets the authentication provider id.
@@ -141,7 +141,6 @@ namespace Jellyfin.Data.Entities
///
/// Required, Max length = 255.
///
- [Required]
[MaxLength(255)]
[StringLength(255)]
public string AuthenticationProviderId { get; set; }
@@ -152,7 +151,6 @@ namespace Jellyfin.Data.Entities
///
/// Required, Max length = 255.
///
- [Required]
[MaxLength(255)]
[StringLength(255)]
public string PasswordResetProviderId { get; set; }
@@ -209,7 +207,7 @@ namespace Jellyfin.Data.Entities
///
[MaxLength(255)]
[StringLength(255)]
- public string SubtitleLanguagePreference { get; set; }
+ public string? SubtitleLanguagePreference { get; set; }
///
/// Gets or sets a value indicating whether missing episodes should be displayed.
@@ -304,7 +302,7 @@ namespace Jellyfin.Data.Entities
/// Gets or sets the user's profile image. Can be null.
///
// [ForeignKey("UserId")]
- public virtual ImageInfo ProfileImage { get; set; }
+ public virtual ImageInfo? ProfileImage { get; set; }
///
/// Gets or sets the user's display preferences.
@@ -312,8 +310,7 @@ namespace Jellyfin.Data.Entities
///
/// Required.
///
- [Required]
- public virtual DisplayPreferences DisplayPreferences { get; set; }
+ public virtual ICollection DisplayPreferences { get; set; }
///
/// Gets or sets the level of sync play permissions this user has.
diff --git a/Jellyfin.Data/Jellyfin.Data.csproj b/Jellyfin.Data/Jellyfin.Data.csproj
index a8ac45645f..a2b6f074e4 100644
--- a/Jellyfin.Data/Jellyfin.Data.csproj
+++ b/Jellyfin.Data/Jellyfin.Data.csproj
@@ -5,6 +5,7 @@
false
true
true
+ enable
true
true
true
diff --git a/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs b/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs
index 0340248bbd..aa6015caae 100644
--- a/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs
+++ b/Jellyfin.Server.Implementations/Events/Consumers/Session/PlaybackStartLogger.cs
@@ -86,7 +86,7 @@ namespace Jellyfin.Server.Implementations.Events.Consumers.Session
return name;
}
- private static string? GetPlaybackNotificationType(string mediaType)
+ private static string GetPlaybackNotificationType(string mediaType)
{
if (string.Equals(mediaType, MediaType.Audio, StringComparison.OrdinalIgnoreCase))
{
@@ -98,7 +98,7 @@ namespace Jellyfin.Server.Implementations.Events.Consumers.Session
return NotificationType.VideoPlayback.ToString();
}
- return null;
+ return "Playback";
}
}
}
diff --git a/Jellyfin.Server.Implementations/Users/UserManager.cs b/Jellyfin.Server.Implementations/Users/UserManager.cs
index 76d1389caf..b400a0dd1b 100644
--- a/Jellyfin.Server.Implementations/Users/UserManager.cs
+++ b/Jellyfin.Server.Implementations/Users/UserManager.cs
@@ -184,8 +184,8 @@ namespace Jellyfin.Server.Implementations.Users
var user = new User(
name,
- _defaultAuthenticationProvider.GetType().FullName,
- _defaultPasswordResetProvider.GetType().FullName)
+ _defaultAuthenticationProvider.GetType().FullName!,
+ _defaultPasswordResetProvider.GetType().FullName!)
{
InternalId = max + 1
};
@@ -444,7 +444,7 @@ namespace Jellyfin.Server.Implementations.Users
{
var providerId = authenticationProvider.GetType().FullName;
- if (!string.Equals(providerId, user.AuthenticationProviderId, StringComparison.OrdinalIgnoreCase))
+ if (providerId != null && !string.Equals(providerId, user.AuthenticationProviderId, StringComparison.OrdinalIgnoreCase))
{
user.AuthenticationProviderId = providerId;
await UpdateUserAsync(user).ConfigureAwait(false);
diff --git a/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs b/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
index 33f039c394..6d318d2329 100644
--- a/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
+++ b/Jellyfin.Server/Migrations/Routines/MigrateUserDb.cs
@@ -1,7 +1,5 @@
using System;
-using System.Globalization;
using System.IO;
-using System.Linq;
using Emby.Server.Implementations.Data;
using Emby.Server.Implementations.Serialization;
using Jellyfin.Data.Entities;
@@ -104,7 +102,7 @@ namespace Jellyfin.Server.Migrations.Routines
_ => policy.LoginAttemptsBeforeLockout
};
- var user = new User(mockup.Name, policy.AuthenticationProviderId, policy.PasswordResetProviderId)
+ var user = new User(mockup.Name, policy.AuthenticationProviderId!, policy.PasswordResetProviderId!)
{
Id = entry[1].ReadGuidFromBlob(),
InternalId = entry[0].ToInt64(),
diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
index 935a790312..142cebd0c0 100644
--- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs
+++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
@@ -61,7 +61,7 @@ namespace MediaBrowser.Controller.Drawing
string GetImageCacheTag(BaseItem item, ChapterInfo info);
- string GetImageCacheTag(User user);
+ string? GetImageCacheTag(User user);
///
/// Processes the image.
diff --git a/tests/Jellyfin.Api.Tests/TestHelpers.cs b/tests/Jellyfin.Api.Tests/TestHelpers.cs
index f27cdf7b63..c1549561db 100644
--- a/tests/Jellyfin.Api.Tests/TestHelpers.cs
+++ b/tests/Jellyfin.Api.Tests/TestHelpers.cs
@@ -26,8 +26,8 @@ namespace Jellyfin.Api.Tests
{
var user = new User(
"jellyfin",
- typeof(DefaultAuthenticationProvider).FullName,
- typeof(DefaultPasswordResetProvider).FullName);
+ typeof(DefaultAuthenticationProvider).FullName!,
+ typeof(DefaultPasswordResetProvider).FullName!);
// Set administrator flag.
user.SetPermission(PermissionKind.IsAdministrator, role.Equals(UserRoles.Administrator, StringComparison.OrdinalIgnoreCase));