using System; using System.IO; using EFCoreSecondLevelCacheInterceptor; using MediaBrowser.Common.Configuration; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; namespace Jellyfin.Server.Implementations.Extensions; /// /// Extensions for the interface. /// public static class ServiceCollectionExtensions { /// /// Adds the interface to the service collection with second level caching enabled. /// /// An instance of the interface. /// The updated service collection. public static IServiceCollection AddJellyfinDbContext(this IServiceCollection serviceCollection) { serviceCollection.AddEFSecondLevelCache(options => options.UseMemoryCacheProvider() .CacheAllQueries(CacheExpirationMode.Sliding, TimeSpan.FromMinutes(10)) .UseCacheKeyPrefix("EF_") // Don't cache null values. Remove this optional setting if it's not necessary. .SkipCachingResults(result => result.Value is null or EFTableRows { RowsCount: 0 })); serviceCollection.AddPooledDbContextFactory((serviceProvider, opt) => { var applicationPaths = serviceProvider.GetRequiredService(); opt.UseSqlite($"Filename={Path.Combine(applicationPaths.DataPath, "jellyfin.db")}") .AddInterceptors(serviceProvider.GetRequiredService()); }); return serviceCollection; } }