Compare commits
29 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| df035a069d | |||
| 4e6bf45701 | |||
| 2415f288f7 | |||
| 94e46a04a7 | |||
| 0535515b11 | |||
| 401c24f599 | |||
| 41e737f3ec | |||
| aca106bfe9 | |||
| 72081ca13d | |||
| 9c9ad0f88e | |||
| 90fb90d0be | |||
| 7a9981b872 | |||
| 2ba6c44ae8 | |||
| 31d8aa1fc4 | |||
| d6cd89ecd0 | |||
| dce22a558f | |||
| 1abf61a05f | |||
| 4f651fc239 | |||
| 421a8cc092 | |||
| 9bcb8501ab | |||
| bf51bff748 | |||
| 8d3f014b29 | |||
| e7c8d202cc | |||
| c5c5937978 | |||
| 96150a54e3 | |||
| aa0ad68251 | |||
| 81f8a702de | |||
| 372d97885f | |||
| dff8539e8b |
+1
-3
@@ -31,8 +31,6 @@ obj/
|
||||
lib/
|
||||
/installer-output/
|
||||
installer-output/
|
||||
/wwwroot/*
|
||||
wwwroot/*
|
||||
# Publish profiles (anywhere in project)
|
||||
/Properties/PublishProfiles/
|
||||
Properties/PublishProfiles/
|
||||
@@ -42,7 +40,7 @@ Properties/PublishProfiles/
|
||||
# Ignore schema directories (database schema dumps)
|
||||
**/schema/
|
||||
schema/
|
||||
|
||||
[Rr]eports/
|
||||
# Ignore .idea IDE directory
|
||||
**/.idea/
|
||||
.idea/
|
||||
|
||||
@@ -45,11 +45,13 @@
|
||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Http" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Options" Version="11.0.0-preview.1.26104.118" />
|
||||
<PackageVersion Include="Microsoft.Kiota.Abstractions" Version="1.22.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
|
||||
<PackageVersion Include="MimeTypes" Version="2.5.2" />
|
||||
<PackageVersion Include="Morestachio" Version="5.0.1.670" />
|
||||
@@ -65,7 +67,7 @@
|
||||
<PackageVersion Include="Serilog.AspNetCore" Version="10.0.0" />
|
||||
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
|
||||
<PackageVersion Include="Serilog.Expressions" Version="5.0.0" />
|
||||
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.0" />
|
||||
<PackageVersion Include="Serilog.Settings.Configuration" Version="10.0.1" />
|
||||
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
|
||||
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
|
||||
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||
|
||||
@@ -32,6 +32,10 @@
|
||||
<Compile Include="../SharedVersion.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Kiota.Abstractions" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="../MediaBrowser.Common/MediaBrowser.Common.csproj" />
|
||||
<ProjectReference Include="../MediaBrowser.Model/MediaBrowser.Model.csproj" />
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Kiota.Abstractions" />
|
||||
<PackageReference Include="TagLibSharp" />
|
||||
</ItemGroup>
|
||||
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Memory" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" />
|
||||
<PackageReference Include="Microsoft.Kiota.Abstractions" />
|
||||
<PackageReference Include="prometheus-net.DotNetRuntime" />
|
||||
<PackageReference Include="DotNet.Glob" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
<PackageReference Include="Jellyfin.Sdk" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.Authorization" />
|
||||
<PackageReference Include="Microsoft.Extensions.Http" />
|
||||
<PackageReference Include="Microsoft.Kiota.Abstractions" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.ReDoc" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -18,6 +18,7 @@ using MediaBrowser.Controller.Configuration;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using JellyfinDbProviderFactory = System.Func<System.IServiceProvider, Jellyfin.Database.Implementations.IJellyfinDatabaseProvider>;
|
||||
|
||||
/// <summary>
|
||||
@@ -25,6 +26,35 @@ using JellyfinDbProviderFactory = System.Func<System.IServiceProvider, Jellyfin.
|
||||
/// </summary>
|
||||
public static class ServiceCollectionExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Determines whether detailed EF Core logging should be enabled based on the configured log level.
|
||||
/// </summary>
|
||||
/// <param name="configuration">The application configuration.</param>
|
||||
/// <returns>True if the log level for Microsoft.EntityFrameworkCore.Database.Command is Debug or lower; otherwise false.</returns>
|
||||
private static bool ShouldEnableDetailedEFCoreLogging(IConfiguration configuration)
|
||||
{
|
||||
// Check if detailed EF Core logging is explicitly enabled in configuration
|
||||
// Read the log level override for Entity Framework Core command logging
|
||||
var efCoreLogLevelString = configuration["Serilog:MinimumLevel:Override:Microsoft.EntityFrameworkCore.Database.Command"];
|
||||
|
||||
if (string.IsNullOrWhiteSpace(efCoreLogLevelString))
|
||||
{
|
||||
// If not explicitly set, check the default minimum level
|
||||
efCoreLogLevelString = configuration["Serilog:MinimumLevel:Default"] ?? "Information";
|
||||
}
|
||||
|
||||
// Parse the log level string to LogLevel enum
|
||||
if (Enum.TryParse<LogLevel>(efCoreLogLevelString, ignoreCase: true, out var logLevel))
|
||||
{
|
||||
// Enable detailed logging if the level is Debug or lower (more verbose)
|
||||
// LogLevel order: Trace=0, Debug=1, Information=2, Warning=3, Error=4, Critical=5, None=6
|
||||
return logLevel <= LogLevel.Debug;
|
||||
}
|
||||
|
||||
// Default to false if we can't parse the log level
|
||||
return false;
|
||||
}
|
||||
|
||||
private static IEnumerable<Type> DatabaseProviderTypes()
|
||||
{
|
||||
yield return typeof(PostgresDatabaseProvider);
|
||||
@@ -169,13 +199,15 @@ public static class ServiceCollectionExtensions
|
||||
var lockingBehavior = serviceProvider.GetRequiredService<IEntityFrameworkCoreLockingBehavior>();
|
||||
lockingBehavior.Initialise(opt);
|
||||
|
||||
// Enable SQL query logging when log level is Debug
|
||||
var loggerFactory = serviceProvider.GetService<Microsoft.Extensions.Logging.ILoggerFactory>();
|
||||
if (loggerFactory != null)
|
||||
opt.UseLoggerFactory(loggerFactory);
|
||||
|
||||
// Only enable sensitive data logging and detailed errors if the EF Core command log level
|
||||
// is set to Debug or lower, respecting the logging configuration from logging.json
|
||||
if (ShouldEnableDetailedEFCoreLogging(configuration))
|
||||
{
|
||||
opt.UseLoggerFactory(loggerFactory)
|
||||
.EnableSensitiveDataLogging()
|
||||
.EnableDetailedErrors();
|
||||
opt.EnableSensitiveDataLogging()
|
||||
.EnableDetailedErrors();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
<ItemGroup>
|
||||
<PackageReference Include="AsyncKeyedLock" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" />
|
||||
<PackageReference Include="Microsoft.Kiota.Abstractions" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
@@ -3,12 +3,12 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Jellyfin.Data.Queries;
|
||||
using Jellyfin.Extensions.Dapper;
|
||||
using Jellyfin.Database.Implementations;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
using MediaBrowser.Controller.Plugins;
|
||||
using MediaBrowser.Controller.Session;
|
||||
using MediaBrowser.Model.Tasks;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.ScheduledTasks
|
||||
@@ -19,17 +19,17 @@ namespace Jellyfin.Server.Implementations.ScheduledTasks
|
||||
public class PostgresPeriodicTuner : IScheduledTask, IConfigurableScheduledTask
|
||||
{
|
||||
private readonly ILogger<PostgresPeriodicTuner> _logger;
|
||||
private readonly IDbContext _dbContext;
|
||||
private readonly IDbContextFactory<JellyfinDbContext> _dbContextFactory;
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="PostgresPeriodicTuner"/> class.
|
||||
/// </summary>
|
||||
/// <param name="logger">The logger.</param>
|
||||
/// <param name="dbContext">The database context.</param>
|
||||
public PostgresPeriodicTuner(ILogger<PostgresPeriodicTuner> logger, IDbContext dbContext)
|
||||
/// <param name="dbContextFactory">The database context factory.</param>
|
||||
public PostgresPeriodicTuner(ILogger<PostgresPeriodicTuner> logger, IDbContextFactory<JellyfinDbContext> dbContextFactory)
|
||||
{
|
||||
_logger = logger;
|
||||
_dbContext = dbContext;
|
||||
_dbContextFactory = dbContextFactory;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
@@ -56,15 +56,17 @@ namespace Jellyfin.Server.Implementations.ScheduledTasks
|
||||
/// <summary>
|
||||
/// Executes the task.
|
||||
/// </summary>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <param name="progress">The progress.</param>
|
||||
/// <param name="cancellationToken">The cancellation token.</param>
|
||||
/// <returns>A <see cref="Task"/> representing the asynchronous operation.</returns>
|
||||
public async Task ExecuteAsync(CancellationToken cancellationToken, IProgress<double> progress)
|
||||
public async Task ExecuteAsync(IProgress<double> progress, CancellationToken cancellationToken)
|
||||
{
|
||||
_logger.LogInformation("PostgreSQL Periodic Tuner task started.");
|
||||
|
||||
try
|
||||
{
|
||||
await using var dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
|
||||
|
||||
const string DeadTupleQuery = @"
|
||||
SELECT
|
||||
relname AS TableName,
|
||||
@@ -76,7 +78,7 @@ namespace Jellyfin.Server.Implementations.ScheduledTasks
|
||||
ORDER BY
|
||||
n_dead_tup DESC;";
|
||||
|
||||
var tablesToVacuum = (await _dbContext.QueryAsync<(string TableName, long DeadTuples)>(DeadTupleQuery)).ToList();
|
||||
var tablesToVacuum = (await dbContext.Database.SqlQueryRaw<(string TableName, long DeadTuples)>(DeadTupleQuery).ToListAsync(cancellationToken).ConfigureAwait(false)).ToList();
|
||||
|
||||
if (tablesToVacuum.Count == 0)
|
||||
{
|
||||
@@ -96,7 +98,7 @@ namespace Jellyfin.Server.Implementations.ScheduledTasks
|
||||
|
||||
try
|
||||
{
|
||||
await _dbContext.ExecuteAsync($"VACUUM ANALYZE \"{table.TableName}\"");
|
||||
await dbContext.Database.ExecuteSqlInterpolatedAsync($"VACUUM ANALYZE \"{table.TableName}\"", cancellationToken).ConfigureAwait(false);
|
||||
_logger.LogInformation("Successfully vacuumed and analyzed table {TableName}.", table.TableName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -129,7 +131,7 @@ namespace Jellyfin.Server.Implementations.ScheduledTasks
|
||||
{
|
||||
new TaskTriggerInfo
|
||||
{
|
||||
Type = TaskTriggerInfo.TriggerInterval,
|
||||
Type = TaskTriggerInfoType.IntervalTrigger,
|
||||
IntervalTicks = TimeSpan.FromHours(24).Ticks
|
||||
}
|
||||
};
|
||||
|
||||
@@ -16,6 +16,9 @@
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<ApplicationIcon>Jellyfin.Server.ico</ApplicationIcon>
|
||||
<IsPackable>true</IsPackable>
|
||||
<EnableDefaultContentItems>false</EnableDefaultContentItems>
|
||||
<!-- Enable assembly binding redirects in runtimeconfig.json -->
|
||||
<GenerateRuntimeConfigurationFiles>true</GenerateRuntimeConfigurationFiles>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -71,7 +74,11 @@
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CommandLineParser" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" />
|
||||
<PackageReference Include="Microsoft.Kiota.Abstractions" />
|
||||
<PackageReference Include="Morestachio" />
|
||||
<PackageReference Include="prometheus-net" />
|
||||
<PackageReference Include="prometheus-net.AspNetCore" />
|
||||
@@ -86,6 +93,7 @@
|
||||
<!-- SQLite package for migration routines only (SQLite -> PostgreSQL) -->
|
||||
<PackageReference Include="Microsoft.Data.Sqlite" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyModel" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -100,37 +108,37 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="wwwroot\api-docs\redoc\custom.css">
|
||||
<!-- Web content and static files -->
|
||||
<None Include="wwwroot\**\*.*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Link>wwwroot\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
<None Update="wwwroot\api-docs\swagger\custom.css">
|
||||
<None Include="wwwroot\*.*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Link>wwwroot\%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
<None Update="wwwroot\api-docs\jellyfin.svg">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
<None Update="ServerSetupApp/index.mstemplate.html">
|
||||
<!-- ServerSetupApp files -->
|
||||
<None Include="ServerSetupApp\index.mstemplate.html">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!-- SQL initialization scripts for PostgreSQL -->
|
||||
<None Include="sql\**\*.sql">
|
||||
<None Include="..\scripts\sql\**\*.sql">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Pack>false</Pack>
|
||||
<Link>sql\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
<!-- Utility scripts (excluding SQL files) -->
|
||||
<None Include="..\scripts\**\*" Exclude="..\scripts\sql\**\*.sql">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Link>scripts\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Post-build event to ensure SQL files are copied -->
|
||||
<Target Name="CopySQLFiles" AfterTargets="AfterBuild">
|
||||
<ItemGroup>
|
||||
<SQLFiles Include="$(MSBuildProjectDirectory)\sql\**\*.sql" />
|
||||
</ItemGroup>
|
||||
<Message Importance="high" Text="Copying SQL files to $(OutDir)sql\" />
|
||||
<Copy SourceFiles="@(SQLFiles)" DestinationFiles="@(SQLFiles->'$(OutDir)sql\%(RecursiveDir)%(Filename)%(Extension)')" SkipUnchangedFiles="true" />
|
||||
<Message Importance="high" Text="✅ SQL files copied to output directory: $(OutDir)sql\" />
|
||||
</Target>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -0,0 +1,140 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<!-- ProjectGuid is only included as a requirement for SonarQube analysis -->
|
||||
<PropertyGroup>
|
||||
<NoWarn>$(NoWarn);CA1024;CA1031;CA1032;CA1034;CA1054;CA1055;CA1056;CA1062;CA1308;CA1303;CA1305;CA1508;CA1722;CA1724;CA1805;CA1813;CA1815;CA1816;CA1819;CA1821;CA1822;CA1823;CA1824;CA1825;CA1826;CA1830;CA1836;CA1839;CA1840;CA1841;CA1859;CA1861;CA1873;CA1911;CA2000;CA2007;CA2016;CA2025;CA2026;CA2100;CA2101;CA2102;CA2201;CA2202;CA2207;CA2208;CA2219;CA2220;CA2222;CA2225;CA2226;CA2230;CA2231;CA2234;CA2241;CA2242;CA2243;CA2244;CA2245;CA2246;CA2247;CA2248;CA2249;CA2250;CA2253;CA3001;CA3002;CA3003;CA3004;CA3005;CA3006;CA3007;CA3008;CA3009;CA3010;CA3011;CA3012;CA3061;CA3062;CA5359;CA5360;CA5361;CA5362;CA5363;CA5364;CA5365;CA5366;CA5367;CA5368;CA5369;CA5370;CA5371;CA5372;CA5373;CA5374;CA5375;CA5376;CA5377;CA5378;CA5379;CA5380;CA5381;CA5382;CA5383;CA5384;CA5385;CA5386;CA5387;CA5388;CA5389;CA5390;CA5391;CA5392;CA5393;CA5394;CA5395;CA5396;CA5397;CA5398;CA5399;CA5400;CA5401;CA5402;CA5403;NU1903;CA1848;CA1515;CA1812;CA1849;CA1860;CA1867;CA1517;CS1061;CS0103</NoWarn>
|
||||
<ProjectGuid>{07E39F42-A2C6-4B32-AF8C-725F957A73FF}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup>
|
||||
<NoWarn>$(NoWarn);CA1024;CA1031;CA1032;CA1034;CA1054;CA1055;CA1056;CA1062;CA1308;CA1303;CA1305;CA1508;CA1722;CA1724;CA1805;CA1813;CA1815;CA1816;CA1819;CA1821;CA1822;CA1823;CA1824;CA1825;CA1826;CA1830;CA1836;CA1839;CA1840;CA1841;CA1859;CA1861;CA1873;CA1911;CA2000;CA2007;CA2016;CA2025;CA2026;CA2100;CA2101;CA2102;CA2201;CA2202;CA2207;CA2208;CA2219;CA2220;CA2222;CA2225;CA2226;CA2230;CA2231;CA2234;CA2241;CA2242;CA2243;CA2244;CA2245;CA2246;CA2247;CA2248;CA2249;CA2250;CA2253;CA3001;CA3002;CA3003;CA3004;CA3005;CA3006;CA3007;CA3008;CA3009;CA3010;CA3011;CA3012;CA3061;CA3062;CA5359;CA5360;CA5361;CA5362;CA5363;CA5364;CA5365;CA5366;CA5367;CA5368;CA5369;CA5370;CA5371;CA5372;CA5373;CA5374;CA5375;CA5376;CA5377;CA5378;CA5379;CA5380;CA5381;CA5382;CA5383;CA5384;CA5385;CA5386;CA5387;CA5388;CA5389;CA5390;CA5391;CA5392;CA5393;CA5394;CA5395;CA5396;CA5397;CA5398;CA5399;CA5400;CA5401;CA5402;CA5403;NU1903;CA1848;CA1515;CA1812;CA1849;CA1860;CA1867;CA1517;CS1061;CS0103</NoWarn>
|
||||
<AssemblyName>jellyfin</AssemblyName>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net11.0</TargetFramework>
|
||||
<ServerGarbageCollection>false</ServerGarbageCollection>
|
||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
<ApplicationIcon>Jellyfin.Server.ico</ApplicationIcon>
|
||||
<IsPackable>true</IsPackable>
|
||||
<EnableDefaultContentItems>false</EnableDefaultContentItems>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="Filters/**/*.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Include="..\SharedVersion.cs" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Content Include="Jellyfin.Server.ico" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources/Configuration/*" />
|
||||
</ItemGroup>
|
||||
|
||||
<!-- Code Analyzers -->
|
||||
<ItemGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<PackageReference Include="IDisposableAnalyzers">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Jellyfin.Sdk" />
|
||||
<PackageReference Include="Microsoft.CodeAnalysis.BannedApiAnalyzers">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design">
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="SerilogAnalyzer" PrivateAssets="All" />
|
||||
<PackageReference Include="StyleCop.Analyzers" PrivateAssets="All" />
|
||||
<PackageReference Include="SmartAnalyzers.MultithreadingAnalyzer" PrivateAssets="All" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Remove="startup.json.example" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Include="startup.json.linux">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</None>
|
||||
<None Include="startup.json.windows">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="CommandLineParser" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyModel" />
|
||||
<PackageReference Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" />
|
||||
<PackageReference Include="Microsoft.Kiota.Abstractions" />
|
||||
<PackageReference Include="Morestachio" />
|
||||
<PackageReference Include="prometheus-net" />
|
||||
<PackageReference Include="prometheus-net.AspNetCore" />
|
||||
<PackageReference Include="Serilog.AspNetCore" />
|
||||
<PackageReference Include="Serilog.Enrichers.Thread" />
|
||||
<PackageReference Include="Serilog.Expressions" />
|
||||
<PackageReference Include="Serilog.Settings.Configuration" />
|
||||
<PackageReference Include="Serilog.Sinks.Async" />
|
||||
<PackageReference Include="Serilog.Sinks.Console" />
|
||||
<PackageReference Include="Serilog.Sinks.File" />
|
||||
<PackageReference Include="Serilog.Sinks.Graylog" />
|
||||
<!-- SQLite package for migration routines only (SQLite -> PostgreSQL) -->
|
||||
<PackageReference Include="Microsoft.Data.Sqlite" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\src\Jellyfin.Drawing\Jellyfin.Drawing.csproj" />
|
||||
<ProjectReference Include="..\Emby.Server.Implementations\Emby.Server.Implementations.csproj" />
|
||||
<ProjectReference Include="..\src\Jellyfin.Drawing.Skia\Jellyfin.Drawing.Skia.csproj" />
|
||||
<ProjectReference Include="..\src\Jellyfin.LiveTv\Jellyfin.LiveTv.csproj" />
|
||||
<ProjectReference Include="..\Jellyfin.Server.Implementations\Jellyfin.Server.Implementations.csproj" />
|
||||
<ProjectReference Include="..\src\Jellyfin.MediaEncoding.Hls\Jellyfin.MediaEncoding.Hls.csproj" />
|
||||
<ProjectReference Include="..\src\Jellyfin.Database\Jellyfin.Database.Implementations\Jellyfin.Database.Implementations.csproj" />
|
||||
<ProjectReference Include="..\src\Jellyfin.Database\Jellyfin.Database.Providers.Postgres\Jellyfin.Database.Providers.Postgres.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!-- Web content and static files -->
|
||||
<None Include="wwwroot\**\*.*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Link>wwwroot\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
<None Include="wwwroot\*.*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Link>wwwroot\%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
<!-- ServerSetupApp files -->
|
||||
<None Include="ServerSetupApp\index.mstemplate.html">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</None>
|
||||
<!-- Runtime configuration for binding redirects -->
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<!-- SQL initialization scripts for PostgreSQL -->
|
||||
<None Include="..\scripts\sql\**\*.sql">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Link>sql\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
<!-- Utility scripts (excluding SQL files) -->
|
||||
<None Include="..\scripts\**\*" Exclude="..\scripts\sql\**\*.sql">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
<Link>scripts\%(RecursiveDir)%(Filename)%(Extension)</Link>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<NameOfLastUsedPublishProfile>D:\Projects\pgsql-jellyfin\Jellyfin.Server\Properties\PublishProfiles\SelfContained-Linux-x64.pubxml</NameOfLastUsedPublishProfile>
|
||||
<NameOfLastUsedPublishProfile>D:\Projects\pgsql-jellyfin\Jellyfin.Server\Properties\PublishProfiles\SelfContained-Win-x64.pubxml</NameOfLastUsedPublishProfile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
||||
@@ -5,7 +5,7 @@
|
||||
"Override": {
|
||||
"Microsoft": "Warning",
|
||||
"System": "Warning",
|
||||
"Microsoft.EntityFrameworkCore.Database.Command": "Information"
|
||||
"Microsoft.EntityFrameworkCore.Database.Command": "Error"
|
||||
}
|
||||
},
|
||||
"WriteTo": [
|
||||
|
||||
@@ -0,0 +1,407 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# SYNOPSIS
|
||||
# Automated weekly performance monitoring for Jellyfin PostgreSQL database
|
||||
#
|
||||
# DESCRIPTION
|
||||
# This script:
|
||||
# 1. Runs comprehensive diagnostics
|
||||
# 2. Analyzes slow queries
|
||||
# 3. Tracks index usage over time
|
||||
# 4. Generates weekly performance reports
|
||||
# 5. Optionally runs VACUUM ANALYZE on tables with high dead tuples
|
||||
# 6. Can be scheduled via cron
|
||||
#
|
||||
# USAGE
|
||||
# ./Weekly-Performance-Monitor.sh [OPTIONS]
|
||||
#
|
||||
# OPTIONS
|
||||
# -o, --output-directory DIR Directory to save reports (default: reports/weekly)
|
||||
# -e, --email-report If specified, emails the report (requires email configuration)
|
||||
# -c, --compare-with-previous Compare current stats with previous week
|
||||
# -a, --auto-vacuum-analyze Enable auto vacuum analyze
|
||||
# --dead-tuple-threshold NUM Minimum dead tuples to trigger vacuum (default: 100)
|
||||
# --dead-tuple-percent-threshold NUM Minimum dead tuple percentage to trigger vacuum (default: 0.02)
|
||||
#
|
||||
# EXAMPLE
|
||||
# ./Weekly-Performance-Monitor.sh
|
||||
# ./Weekly-Performance-Monitor.sh -o "/reports/jellyfin" -c
|
||||
# ./Weekly-Performance-Monitor.sh -a --dead-tuple-threshold 10000 --dead-tuple-percent-threshold 20
|
||||
#
|
||||
# CRON JOB EXAMPLE
|
||||
# # Run every Monday at 6am
|
||||
# 0 6 * * 1 /path/to/Weekly-Performance-Monitor.sh -a
|
||||
#
|
||||
|
||||
# ============================================================================
|
||||
# Default Configuration
|
||||
# ============================================================================
|
||||
OUTPUT_DIRECTORY="reports/weekly"
|
||||
EMAIL_REPORT=false
|
||||
COMPARE_WITH_PREVIOUS=false
|
||||
AUTO_VACUUM_ANALYZE=false
|
||||
DEAD_TUPLE_THRESHOLD=100
|
||||
DEAD_TUPLE_PERCENT_THRESHOLD=0.02
|
||||
|
||||
# ============================================================================
|
||||
# Helper Functions
|
||||
# ============================================================================
|
||||
|
||||
# Color definitions
|
||||
CYAN='\033[0;36m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
GRAY='\033[0;90m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
write_color_output() {
|
||||
local message="$1"
|
||||
local color="$2"
|
||||
echo -e "${color}${message}${NC}"
|
||||
}
|
||||
|
||||
get_report_timestamp() {
|
||||
date +"%Y-%m-%d_%H%M%S"
|
||||
}
|
||||
|
||||
get_week_number() {
|
||||
date +%V
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# Script Argument Parsing
|
||||
# ============================================================================
|
||||
while [[ "$#" -gt 0 ]]; do
|
||||
case $1 in
|
||||
-o|--output-directory) OUTPUT_DIRECTORY="$2"; shift ;;
|
||||
-e|--email-report) EMAIL_REPORT=true ;;
|
||||
-c|--compare-with-previous) COMPARE_WITH_PREVIOUS=true ;;
|
||||
-a|--auto-vacuum-analyze) AUTO_VACUUM_ANALYZE=true ;;
|
||||
--dead-tuple-threshold) DEAD_TUPLE_THRESHOLD="$2"; shift ;;
|
||||
--dead-tuple-percent-threshold) DEAD_TUPLE_PERCENT_THRESHOLD="$2"; shift ;;
|
||||
*) write_color_output "Unknown parameter passed: $1" "$RED"; exit 1 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
|
||||
# ============================================================================
|
||||
# Configuration
|
||||
# ============================================================================
|
||||
|
||||
set -e # Exit on error
|
||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
||||
SQL_DIR="$PROJECT_ROOT/sql"
|
||||
|
||||
# Load database configuration
|
||||
source "./db-config.sh"
|
||||
|
||||
# ============================================================================
|
||||
# Functions
|
||||
# ============================================================================
|
||||
|
||||
test_database_connection() {
|
||||
write_color_output "\nTesting database connection..." "$CYAN"
|
||||
|
||||
if PGPASSWORD=$DB_PASS $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "SELECT version();" > /dev/null 2>&1; then
|
||||
write_color_output "[OK] Database connection successful" "$GREEN"
|
||||
return 0
|
||||
else
|
||||
write_color_output "[ERROR] Database connection failed" "$RED"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
invoke_diagnostic_report() {
|
||||
local output_file="$1"
|
||||
write_color_output "\nRunning comprehensive diagnostics..." "$CYAN"
|
||||
|
||||
run_sql_files_from_dir "$SQL_DIR/diagnostics" "$output_file"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
write_color_output "[OK] Diagnostics completed: $output_file" "$GREEN"
|
||||
else
|
||||
write_color_output "[WARN] Diagnostics completed with warnings" "$YELLOW"
|
||||
fi
|
||||
}
|
||||
|
||||
get_index_usage_stats() {
|
||||
local output_file="$1"
|
||||
write_color_output "\nGathering index usage statistics..." "$CYAN"
|
||||
|
||||
local query="
|
||||
SELECT
|
||||
schemaname,
|
||||
relname AS tablename,
|
||||
indexrelname,
|
||||
idx_scan,
|
||||
idx_tup_read,
|
||||
idx_tup_fetch,
|
||||
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
||||
FROM pg_stat_user_indexes
|
||||
WHERE schemaname IN ('library', 'users', 'authentication', 'displaypreferences', 'activitylog')
|
||||
ORDER BY schemaname, relname, idx_scan DESC;
|
||||
"
|
||||
|
||||
if PGPASSWORD=$DB_PASS $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "$query" > "$output_file" 2>&1; then
|
||||
write_color_output "[OK] Index stats gathered: $output_file" "$GREEN"
|
||||
else
|
||||
write_color_output "[WARN] Index stats completed with warnings" "$YELLOW"
|
||||
fi
|
||||
}
|
||||
|
||||
get_table_size_stats() {
|
||||
local output_file="$1"
|
||||
write_color_output "\nGathering table size statistics..." "$CYAN"
|
||||
|
||||
local query="
|
||||
SELECT
|
||||
schemaname,
|
||||
relname,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname)) AS total_size,
|
||||
pg_size_pretty(pg_relation_size(schemaname||'.'||relname)) AS table_size,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname) - pg_relation_size(schemaname||'.'||relname)) AS index_size,
|
||||
n_live_tup AS row_count,
|
||||
n_dead_tup AS dead_rows,
|
||||
ROUND(100.0 * n_dead_tup / NULLIF(n_live_tup, 0), 2) AS dead_pct
|
||||
FROM pg_stat_user_tables
|
||||
WHERE schemaname IN ('library', 'users', 'authentication', 'displaypreferences', 'activitylog')
|
||||
ORDER BY pg_total_relation_size(schemaname||'.'||relname) DESC;
|
||||
"
|
||||
|
||||
if PGPASSWORD=$DB_PASS $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "$query" > "$output_file" 2>&1; then
|
||||
write_color_output "[OK] Table size stats gathered: $output_file" "$GREEN"
|
||||
else
|
||||
write_color_output "[WARN] Table size stats completed with warnings" "$YELLOW"
|
||||
fi
|
||||
}
|
||||
|
||||
invoke_conditional_vacuum_analyze() {
|
||||
local min_dead_tuples="$1"
|
||||
local min_dead_percent="$2"
|
||||
|
||||
write_color_output "\nChecking for tables that need VACUUM ANALYZE..." "$CYAN"
|
||||
write_color_output "Thresholds: dead tuples >= $min_dead_tuples and dead percent >= $min_dead_percent" "$GRAY"
|
||||
|
||||
local table_query="
|
||||
SELECT
|
||||
format('%I.%I', schemaname, relname) AS qualified_table,
|
||||
n_dead_tup,
|
||||
ROUND(100.0 * n_dead_tup / NULLIF(n_live_tup, 0), 2) AS dead_pct
|
||||
FROM pg_stat_user_tables
|
||||
WHERE schemaname IN ('library', 'users', 'authentication', 'displaypreferences', 'activitylog')
|
||||
AND n_live_tup > 0
|
||||
AND n_dead_tup >= $min_dead_tuples
|
||||
AND (100.0 * n_dead_tup / NULLIF(n_live_tup, 0)) >= $min_dead_percent
|
||||
ORDER BY n_dead_tup DESC;
|
||||
"
|
||||
|
||||
tables=$(PGPASSWORD=$DB_PASS $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -A -F "|" -c "$table_query")
|
||||
|
||||
if [ -z "$tables" ]; then
|
||||
write_color_output "[OK] No tables exceeded dead tuple thresholds" "$GREEN"
|
||||
return
|
||||
fi
|
||||
|
||||
write_color_output "Found $(echo "$tables" | wc -l) table(s) requiring VACUUM ANALYZE" "$YELLOW"
|
||||
|
||||
while IFS= read -r line; do
|
||||
qualified_table=$(echo "$line" | cut -d'|' -f1)
|
||||
dead_tuples=$(echo "$line" | cut -d'|' -f2)
|
||||
dead_percent=$(echo "$line" | cut -d'|' -f3)
|
||||
|
||||
write_color_output "Running VACUUM ANALYZE on $qualified_table (dead tuples: $dead_tuples, dead percent: $dead_percent)" "$CYAN"
|
||||
|
||||
if PGPASSWORD=$DB_PASS $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "VACUUM (ANALYZE, VERBOSE) $qualified_table;"; then
|
||||
write_color_output "[OK] VACUUM ANALYZE completed for $qualified_table" "$GREEN"
|
||||
else
|
||||
write_color_output "[ERROR] VACUUM ANALYZE failed for $qualified_table" "$RED"
|
||||
fi
|
||||
done <<< "$tables"
|
||||
}
|
||||
|
||||
compare_with_previous() {
|
||||
local current_report="$1"
|
||||
local output_dir="$2"
|
||||
|
||||
write_color_output "\nComparing with previous week's report..." "$CYAN"
|
||||
|
||||
previous_report=$(find "$output_dir" -name "diagnostics_*.txt" ! -name "$(basename "$current_report")" -printf '%T@ %p\n' | sort -n | tail -1 | cut -d' ' -f2-)
|
||||
|
||||
if [ -z "$previous_report" ]; then
|
||||
write_color_output "[WARN] No previous reports found for comparison" "$YELLOW"
|
||||
return
|
||||
fi
|
||||
|
||||
write_color_output "Comparing with: $(basename "$previous_report")" "$CYAN"
|
||||
|
||||
# TODO: Add detailed comparison logic
|
||||
write_color_output "[OK] Comparison data available" "$GREEN"
|
||||
write_color_output " Current: $current_report" "$GRAY"
|
||||
write_color_output " Previous: $previous_report" "$GRAY"
|
||||
}
|
||||
|
||||
new_summary_report() {
|
||||
local output_dir="$1"
|
||||
local timestamp="$2"
|
||||
|
||||
write_color_output "\nGenerating summary report..." "$CYAN"
|
||||
|
||||
local summary_file="$output_dir/summary_$timestamp.txt"
|
||||
|
||||
cat > "$summary_file" <<EOF
|
||||
================================================================================
|
||||
JELLYFIN DATABASE WEEKLY PERFORMANCE SUMMARY
|
||||
================================================================================
|
||||
Report Date: $(date +"%Y-%m-%d %H:%M:%S")
|
||||
Database: $DB_NAME at $DB_HOST
|
||||
Week Number: $(get_week_number)
|
||||
================================================================================
|
||||
|
||||
REPORTS GENERATED:
|
||||
* diagnostics_$timestamp.txt : Full diagnostic report
|
||||
* index_usage_$timestamp.txt : Index usage statistics
|
||||
* table_sizes_$timestamp.txt : Table size and bloat info
|
||||
* summary_$timestamp.txt : This summary
|
||||
|
||||
================================================================================
|
||||
QUICK HEALTH CHECK:
|
||||
================================================================================
|
||||
|
||||
To view critical issues check diagnostics file for:
|
||||
* Section 5: TABLES WITH HIGH SEQUENTIAL SCANS
|
||||
* Section 8: UNUSED OR RARELY USED INDEXES
|
||||
* Section 10: SLOWEST QUERIES
|
||||
|
||||
To identify slow queries check query_analysis file for:
|
||||
* Section 2: TOP 20 SLOWEST QUERIES (by max execution time)
|
||||
* Section 5: BASEITEMS TABLE QUERIES ANALYSIS
|
||||
|
||||
================================================================================
|
||||
RECOMMENDED ACTIONS:
|
||||
================================================================================
|
||||
|
||||
* Review slow queries taking longer than 10 seconds
|
||||
* Check if new indexes are being utilized
|
||||
* Look for tables with many sequential scans
|
||||
* Monitor cache hit ratio (should be above 95 percent)
|
||||
* Check for tables with high dead tuples percentage (need VACUUM)
|
||||
|
||||
================================================================================
|
||||
AUTOMATION SETUP:
|
||||
================================================================================
|
||||
|
||||
To schedule this script weekly, add the following to your crontab:
|
||||
0 6 * * 1 /path/to/$(basename "$0")
|
||||
|
||||
================================================================================
|
||||
NEXT REPORT: $(date -d "+7 days" +"%Y-%m-%d")
|
||||
================================================================================
|
||||
EOF
|
||||
|
||||
write_color_output "[OK] Summary generated: $summary_file" "$GREEN"
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# Helper Functions
|
||||
# ============================================================================
|
||||
|
||||
run_sql_files_from_dir() {
|
||||
local sql_dir="$1"
|
||||
local output_file="$2"
|
||||
|
||||
if [ ! -d "$sql_dir" ]; then
|
||||
write_color_output "[ERROR] Directory not found: $sql_dir" "$RED"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# Clear the output file before running scripts
|
||||
> "$output_file"
|
||||
|
||||
for sql_file in "$sql_dir"/*.sql; do
|
||||
echo -e "\n---\n-- Executing: $(basename "$sql_file")\n---\n" >> "$output_file"
|
||||
write_color_output "Running SQL file: $(basename "$sql_file")" "$CYAN"
|
||||
if PGPASSWORD=$DB_PASS $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -f "$sql_file" >> "$output_file" 2>&1; then
|
||||
write_color_output "[OK] Successfully executed $(basename "$sql_file")" "$GREEN"
|
||||
else
|
||||
write_color_output "[WARN] Completed with warnings: $(basename "$sql_file")" "$YELLOW"
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# Main Execution
|
||||
# ============================================================================
|
||||
|
||||
write_color_output "\n${CYAN}========================================${NC}"
|
||||
write_color_output "Jellyfin Database Weekly Monitor" "$CYAN"
|
||||
write_color_output "========================================${NC}"
|
||||
write_color_output "Database: $DB_NAME" "$YELLOW"
|
||||
write_color_output "Host: $DB_HOST" "$YELLOW"
|
||||
write_color_output "Week: $(get_week_number)" "$YELLOW"
|
||||
write_color_output "Date: $(date +'%Y-%m-%d %H:%M:%S')" "$YELLOW"
|
||||
write_color_output "========================================\n${NC}"
|
||||
|
||||
# Create output directory
|
||||
report_dir="./$OUTPUT_DIRECTORY"
|
||||
mkdir -p "$report_dir"
|
||||
write_color_output "Created report directory: $report_dir" "$GREEN"
|
||||
|
||||
# Generate timestamp for this run
|
||||
timestamp=$(get_report_timestamp)
|
||||
|
||||
# Test connection
|
||||
if ! test_database_connection; then
|
||||
write_color_output "\n[ERROR] Cannot connect to database. Exiting." "$RED"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Run diagnostics
|
||||
diagnostics_file="$report_dir/diagnostics_$timestamp.txt"
|
||||
invoke_diagnostic_report "$diagnostics_file"
|
||||
|
||||
# Gather index usage stats
|
||||
index_usage_file="$report_dir/index_usage_$timestamp.txt"
|
||||
get_index_usage_stats "$index_usage_file"
|
||||
|
||||
# Gather table size stats
|
||||
table_sizes_file="$report_dir/table_sizes_$timestamp.txt"
|
||||
get_table_size_stats "$table_sizes_file"
|
||||
|
||||
# Optionally vacuum/analyze tables
|
||||
if [ "$AUTO_VACUUM_ANALYZE" = true ]; then
|
||||
invoke_conditional_vacuum_analyze "$DEAD_TUPLE_THRESHOLD" "$DEAD_TUPLE_PERCENT_THRESHOLD"
|
||||
fi
|
||||
|
||||
# Compare with previous week
|
||||
if [ "$COMPARE_WITH_PREVIOUS" = true ]; then
|
||||
compare_with_previous "$diagnostics_file" "$report_dir"
|
||||
fi
|
||||
|
||||
# Generate summary
|
||||
new_summary_report "$report_dir" "$timestamp"
|
||||
|
||||
# Cleanup old reports (keep last 12 weeks)
|
||||
write_color_output "\nCleaning up old reports (keeping last 12 weeks)..." "$CYAN"
|
||||
find "$report_dir" -type f -mtime +84 -delete
|
||||
write_color_output "[OK] Cleanup complete" "$GREEN"
|
||||
|
||||
write_color_output "\n${GREEN}========================================${NC}"
|
||||
write_color_output "[OK] WEEKLY MONITORING COMPLETE" "$GREEN"
|
||||
write_color_output "========================================${NC}"
|
||||
write_color_output "Reports saved to: $report_dir" "$YELLOW"
|
||||
write_color_output "Summary: summary_$timestamp.txt" "$YELLOW"
|
||||
write_color_output "\nNext steps:" "$CYAN"
|
||||
write_color_output "1. Review summary_$timestamp.txt" "$NC"
|
||||
write_color_output "2. Check for critical issues in diagnostics report" "$NC"
|
||||
write_color_output "3. Analyze slow queries in query_analysis report" "$NC"
|
||||
write_color_output "========================================\n${NC}"
|
||||
|
||||
# Email report if requested
|
||||
if [ "$EMAIL_REPORT" = true ]; then
|
||||
write_color_output "[WARN] Email functionality not yet implemented" "$YELLOW"
|
||||
write_color_output " Configure a mail client like 'mail' or 'sendmail'" "$GRAY"
|
||||
fi
|
||||
|
||||
exit 0
|
||||
@@ -0,0 +1,78 @@
|
||||
#!/bin/bash
|
||||
# Database Configuration
|
||||
# Edit this file to change which database commands run against
|
||||
|
||||
# Database connection settings
|
||||
PSQL_PATH="/usr/bin/psql"
|
||||
DB_USER="jellyfin"
|
||||
DB_NAME="jellyfin_test2" # ← Change this to switch databases
|
||||
DB_HOST="192.168.129.253"
|
||||
DB_PORT="6432"
|
||||
|
||||
# Export for use in other scripts
|
||||
export PSQL_PATH
|
||||
export DB_USER
|
||||
export DB_NAME
|
||||
export DB_HOST
|
||||
export DB_PORT
|
||||
|
||||
# Helper function to run psql commands
|
||||
invoke_psql() {
|
||||
local query=""
|
||||
local file=""
|
||||
local output_file=""
|
||||
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-q|--query)
|
||||
query="$2"
|
||||
shift 2
|
||||
;;
|
||||
-f|--file)
|
||||
file="$2"
|
||||
shift 2
|
||||
;;
|
||||
-o|--output-file)
|
||||
output_file="$2"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
local base_cmd="$PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME"
|
||||
local cmd=""
|
||||
|
||||
if [ -n "$file" ]; then
|
||||
cmd="$base_cmd -f \"$file\""
|
||||
elif [ -n "$query" ]; then
|
||||
cmd="$base_cmd -c \"$query\""
|
||||
else
|
||||
echo "Must provide either --query or --file parameter"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if [ -n "$output_file" ]; then
|
||||
cmd+=" > \"$output_file\""
|
||||
fi
|
||||
|
||||
echo -e "\e[36mConnecting to: $DB_NAME@$DB_HOST as $DB_USER\e[0m"
|
||||
eval "$cmd"
|
||||
}
|
||||
|
||||
# Display current configuration
|
||||
echo -e "\e[36m========================================\e[0m"
|
||||
echo -e "\e[36mDatabase Configuration Loaded\e[0m"
|
||||
echo -e "\e[36m========================================\e[0m"
|
||||
echo -e "\e[33mDatabase: $DB_NAME\e[0m"
|
||||
echo -e "\e[33mUser: $DB_USER\e[0m"
|
||||
echo -e "\e[33mHost: $DB_HOST\e[0m"
|
||||
echo -e "\e[33mPort: $DB_PORT\e[0m"
|
||||
echo -e "\e[36m========================================\e[0m"
|
||||
echo ""
|
||||
echo -e "\e[90mTo change database, edit: db-config.sh\e[0m"
|
||||
echo -e "\e[90mThen run: source db-config.sh\e[0m"
|
||||
echo ""
|
||||
+37
-3
@@ -6,7 +6,8 @@
|
||||
Sets up automated weekly performance monitoring via Windows Task Scheduler
|
||||
|
||||
.DESCRIPTION
|
||||
Creates a scheduled task to run Weekly-Performance-Monitor.ps1 every Monday at 6 AM
|
||||
Creates a scheduled task to run Weekly-Performance-Monitor.ps1 every Monday at 6 AM.
|
||||
Can optionally enable conditional VACUUM ANALYZE based on dead tuple thresholds.
|
||||
|
||||
.PARAMETER Uninstall
|
||||
Remove the scheduled task
|
||||
@@ -17,12 +18,24 @@
|
||||
.PARAMETER DayOfWeek
|
||||
Day of week to run (default: Monday)
|
||||
|
||||
.PARAMETER EnableAutoVacuumAnalyze
|
||||
Enable conditional VACUUM ANALYZE for tables above dead tuple thresholds
|
||||
|
||||
.PARAMETER DeadTupleThreshold
|
||||
Minimum dead tuples before VACUUM ANALYZE runs (default: 10000)
|
||||
|
||||
.PARAMETER DeadTuplePercentThreshold
|
||||
Minimum dead tuple percentage before VACUUM ANALYZE runs (default: 20)
|
||||
|
||||
.EXAMPLE
|
||||
.\Setup-Weekly-Monitor.ps1
|
||||
|
||||
.EXAMPLE
|
||||
.\Setup-Weekly-Monitor.ps1 -TaskTime "3am" -DayOfWeek Sunday
|
||||
|
||||
.EXAMPLE
|
||||
.\Setup-Weekly-Monitor.ps1 -EnableAutoVacuumAnalyze -DeadTupleThreshold 10000 -DeadTuplePercentThreshold 20
|
||||
|
||||
.EXAMPLE
|
||||
.\Setup-Weekly-Monitor.ps1 -Uninstall
|
||||
#>
|
||||
@@ -37,7 +50,18 @@ param (
|
||||
|
||||
[Parameter()]
|
||||
[ValidateSet('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday')]
|
||||
[string]$DayOfWeek = 'Monday'
|
||||
[string]$DayOfWeek = 'Monday',
|
||||
|
||||
[Parameter()]
|
||||
[switch]$EnableAutoVacuumAnalyze,
|
||||
|
||||
[Parameter()]
|
||||
[ValidateRange(1, [int]::MaxValue)]
|
||||
[int]$DeadTupleThreshold = 10000,
|
||||
|
||||
[Parameter()]
|
||||
[ValidateRange(0.01, 100.0)]
|
||||
[double]$DeadTuplePercentThreshold = 20.0
|
||||
)
|
||||
|
||||
$ErrorActionPreference = "Stop"
|
||||
@@ -104,6 +128,11 @@ Write-ColorOutput "Configuration:" -Color Cyan
|
||||
Write-ColorOutput " Task Name: $TaskName" -Color White
|
||||
Write-ColorOutput " Script: $MonitorScript" -Color White
|
||||
Write-ColorOutput " Schedule: Every $DayOfWeek at $TaskTime" -Color White
|
||||
if ($EnableAutoVacuumAnalyze) {
|
||||
Write-ColorOutput " Auto VACUUM ANALYZE: Enabled (dead tuples >= $DeadTupleThreshold, dead percent >= $DeadTuplePercentThreshold)" -Color White
|
||||
} else {
|
||||
Write-ColorOutput " Auto VACUUM ANALYZE: Disabled" -Color White
|
||||
}
|
||||
Write-ColorOutput ""
|
||||
|
||||
# Remove existing task if present
|
||||
@@ -116,9 +145,14 @@ if ($existingTask) {
|
||||
# Create scheduled task action
|
||||
Write-ColorOutput "Creating scheduled task..." -Color Cyan
|
||||
|
||||
$scriptArguments = "-NoProfile -ExecutionPolicy Bypass -File `"$MonitorScript`""
|
||||
if ($EnableAutoVacuumAnalyze) {
|
||||
$scriptArguments += " -AutoVacuumAnalyze -DeadTupleThreshold $DeadTupleThreshold -DeadTuplePercentThreshold $DeadTuplePercentThreshold"
|
||||
}
|
||||
|
||||
$action = New-ScheduledTaskAction `
|
||||
-Execute "PowerShell.exe" `
|
||||
-Argument "-NoProfile -ExecutionPolicy Bypass -File `"$MonitorScript`""
|
||||
-Argument $scriptArguments
|
||||
|
||||
# Create trigger
|
||||
$trigger = New-ScheduledTaskTrigger `
|
||||
+97
-10
@@ -10,7 +10,8 @@
|
||||
2. Analyzes slow queries
|
||||
3. Tracks index usage over time
|
||||
4. Generates weekly performance reports
|
||||
5. Can be scheduled via Task Scheduler
|
||||
5. Optionally runs VACUUM ANALYZE on tables with high dead tuples
|
||||
6. Can be scheduled via Task Scheduler
|
||||
|
||||
.PARAMETER OutputDirectory
|
||||
Directory to save reports (default: reports/weekly)
|
||||
@@ -27,6 +28,9 @@
|
||||
.EXAMPLE
|
||||
.\Weekly-Performance-Monitor.ps1 -OutputDirectory "C:\Reports\Jellyfin" -CompareWithPrevious
|
||||
|
||||
.EXAMPLE
|
||||
.\Weekly-Performance-Monitor.ps1 -AutoVacuumAnalyze -DeadTupleThreshold 10000 -DeadTuplePercentThreshold 20
|
||||
|
||||
.EXAMPLE
|
||||
# Schedule weekly via Task Scheduler
|
||||
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Path\To\Weekly-Performance-Monitor.ps1"
|
||||
@@ -47,7 +51,18 @@ param (
|
||||
[switch]$EmailReport,
|
||||
|
||||
[Parameter()]
|
||||
[switch]$CompareWithPrevious
|
||||
[switch]$CompareWithPrevious,
|
||||
|
||||
[Parameter()]
|
||||
[switch]$AutoVacuumAnalyze,
|
||||
|
||||
[Parameter()]
|
||||
[ValidateRange(1, [int]::MaxValue)]
|
||||
[int]$DeadTupleThreshold = 100,
|
||||
|
||||
[Parameter()]
|
||||
[ValidateRange(0.01, 100.0)]
|
||||
[double]$DeadTuplePercentThreshold = 0.02
|
||||
)
|
||||
|
||||
# ============================================================================
|
||||
@@ -154,15 +169,15 @@ function Get-IndexUsageStats {
|
||||
$query = @"
|
||||
SELECT
|
||||
schemaname,
|
||||
tablename,
|
||||
indexname,
|
||||
relname AS tablename,
|
||||
indexrelname,
|
||||
idx_scan,
|
||||
idx_tup_read,
|
||||
idx_tup_fetch,
|
||||
pg_size_pretty(pg_relation_size(indexrelid)) AS index_size
|
||||
FROM pg_stat_user_indexes
|
||||
WHERE schemaname IN ('library', 'users', 'authentication', 'displaypreferences', 'activitylog')
|
||||
ORDER BY schemaname, tablename, idx_scan DESC;
|
||||
ORDER BY schemaname, relname, idx_scan DESC;
|
||||
"@
|
||||
|
||||
try {
|
||||
@@ -189,16 +204,16 @@ function Get-TableSizeStats {
|
||||
$query = @"
|
||||
SELECT
|
||||
schemaname,
|
||||
tablename,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS total_size,
|
||||
pg_size_pretty(pg_relation_size(schemaname||'.'||tablename)) AS table_size,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename) - pg_relation_size(schemaname||'.'||tablename)) AS index_size,
|
||||
relname,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname)) AS total_size,
|
||||
pg_size_pretty(pg_relation_size(schemaname||'.'||relname)) AS table_size,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||relname) - pg_relation_size(schemaname||'.'||relname)) AS index_size,
|
||||
n_live_tup AS row_count,
|
||||
n_dead_tup AS dead_rows,
|
||||
ROUND(100.0 * n_dead_tup / NULLIF(n_live_tup, 0), 2) AS dead_pct
|
||||
FROM pg_stat_user_tables
|
||||
WHERE schemaname IN ('library', 'users', 'authentication', 'displaypreferences', 'activitylog')
|
||||
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
|
||||
ORDER BY pg_total_relation_size(schemaname||'.'||relname) DESC;
|
||||
"@
|
||||
|
||||
try {
|
||||
@@ -217,6 +232,67 @@ ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
|
||||
}
|
||||
}
|
||||
|
||||
function Invoke-ConditionalVacuumAnalyze {
|
||||
param(
|
||||
[int]$MinDeadTuples,
|
||||
[double]$MinDeadPercent
|
||||
)
|
||||
|
||||
Write-ColorOutput "`nChecking for tables that need VACUUM ANALYZE..." -Color Cyan
|
||||
Write-ColorOutput "Thresholds: dead tuples >= $MinDeadTuples and dead percent >= $MinDeadPercent" -Color Gray
|
||||
|
||||
$tableQuery = @"
|
||||
SELECT
|
||||
format('%I.%I', schemaname, relname) AS qualified_table,
|
||||
n_dead_tup,
|
||||
ROUND(100.0 * n_dead_tup / NULLIF(n_live_tup, 0), 2) AS dead_pct
|
||||
FROM pg_stat_user_tables
|
||||
WHERE schemaname IN ('library', 'users', 'authentication', 'displaypreferences', 'activitylog')
|
||||
AND n_live_tup > 0
|
||||
AND n_dead_tup >= $MinDeadTuples
|
||||
AND (100.0 * n_dead_tup / NULLIF(n_live_tup, 0)) >= $MinDeadPercent
|
||||
ORDER BY n_dead_tup DESC;
|
||||
"@
|
||||
|
||||
try {
|
||||
$tables = & $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -t -A -F "|" -c $tableQuery 2>&1
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-ColorOutput "[ERROR] Failed to evaluate dead tuple thresholds: $tables" -Color Red
|
||||
return $false
|
||||
}
|
||||
|
||||
$tableLines = @($tables | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
|
||||
if ($tableLines.Count -eq 0) {
|
||||
Write-ColorOutput "[OK] No tables exceeded dead tuple thresholds" -Color Green
|
||||
return $true
|
||||
}
|
||||
|
||||
Write-ColorOutput "Found $($tableLines.Count) table(s) requiring VACUUM ANALYZE" -Color Yellow
|
||||
|
||||
foreach ($line in $tableLines) {
|
||||
$parts = $line -split "\|", 3
|
||||
$qualifiedTable = $parts[0].Trim()
|
||||
$deadTuples = if ($parts.Count -ge 2) { $parts[1].Trim() } else { "unknown" }
|
||||
$deadPercent = if ($parts.Count -ge 3) { $parts[2].Trim() } else { "unknown" }
|
||||
|
||||
Write-ColorOutput "Running VACUUM ANALYZE on $qualifiedTable (dead tuples: $deadTuples, dead percent: $deadPercent)" -Color Cyan
|
||||
|
||||
$vacuumResult = & $PSQL_PATH -h $DB_HOST -p $DB_PORT -U $DB_USER -d $DB_NAME -c "VACUUM (ANALYZE, VERBOSE) $qualifiedTable;" 2>&1
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
Write-ColorOutput "[ERROR] VACUUM ANALYZE failed for $qualifiedTable : $vacuumResult" -Color Red
|
||||
return $false
|
||||
}
|
||||
|
||||
Write-ColorOutput "[OK] VACUUM ANALYZE completed for $qualifiedTable" -Color Green
|
||||
}
|
||||
|
||||
return $true
|
||||
} catch {
|
||||
Write-ColorOutput "[ERROR] Conditional VACUUM ANALYZE failed: $_" -Color Red
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
function Compare-WithPrevious {
|
||||
param(
|
||||
[string]$CurrentReport,
|
||||
@@ -361,6 +437,17 @@ Get-IndexUsageStats -OutputFile $indexUsageFile | Out-Null
|
||||
$tableSizesFile = Join-Path $reportDir "table_sizes_$timestamp.txt"
|
||||
Get-TableSizeStats -OutputFile $tableSizesFile | Out-Null
|
||||
|
||||
# Optionally vacuum/analyze tables that exceed dead tuple thresholds
|
||||
if ($AutoVacuumAnalyze) {
|
||||
$vacuumSuccess = Invoke-ConditionalVacuumAnalyze `
|
||||
-MinDeadTuples $DeadTupleThreshold `
|
||||
-MinDeadPercent $DeadTuplePercentThreshold
|
||||
|
||||
if (-not $vacuumSuccess) {
|
||||
Write-ColorOutput "[WARN] Conditional VACUUM ANALYZE encountered errors" -Color Yellow
|
||||
}
|
||||
}
|
||||
|
||||
# Compare with previous week if requested
|
||||
if ($CompareWithPrevious) {
|
||||
Compare-WithPrevious -CurrentReport $diagnosticsFile -OutputDirectory $reportDir
|
||||
@@ -4,9 +4,9 @@
|
||||
# Database connection settings
|
||||
$PSQL_PATH = "C:\Program Files\PostgreSQL\18\bin\psql.exe"
|
||||
$DB_USER = "jellyfin"
|
||||
$DB_NAME = "jellyfin" # ← Change this to switch databases
|
||||
$DB_HOST = "192.168.129.163"
|
||||
$DB_PORT = "5432"
|
||||
$DB_NAME = "jellyfin_test2" # ← Change this to switch databases
|
||||
$DB_HOST = "192.168.129.253"
|
||||
$DB_PORT = "6432"
|
||||
|
||||
# Export for use in other scripts
|
||||
$global:PSQL_PATH = $PSQL_PATH
|
||||
@@ -1,216 +0,0 @@
|
||||
-- Combined Performance Indexes Script
|
||||
-- This combines both base and supplementary indexes into one script
|
||||
-- Run this on a fresh database after InitialCreate migration
|
||||
|
||||
\echo '========================================';
|
||||
\echo 'Creating All Performance Indexes';
|
||||
\echo '========================================';
|
||||
\echo '';
|
||||
|
||||
-- ============================================================================
|
||||
-- PART 1: Base Performance Indexes (18 total)
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Part 1: Adding base performance indexes (18)...';
|
||||
\echo '';
|
||||
|
||||
-- BaseItems Performance Indexes (9)
|
||||
\echo 'Creating BaseItems performance indexes...';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_communityrating_idx
|
||||
ON library."BaseItems" ("CommunityRating" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_datecreated_idx
|
||||
ON library."BaseItems" ("DateCreated" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_datemodified_idx
|
||||
ON library."BaseItems" ("DateModified" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_parentid_idx
|
||||
ON library."BaseItems" ("ParentId", "Type");
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_premieredate_idx
|
||||
ON library."BaseItems" ("PremiereDate" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_productionyear_idx
|
||||
ON library."BaseItems" ("ProductionYear" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_seriespresentationuniquekey_idx
|
||||
ON library."BaseItems" ("SeriesPresentationUniqueKey", "IndexNumber", "ParentIndexNumber");
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_sortname_idx
|
||||
ON library."BaseItems" ("SortName");
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitems_topparentid_idx
|
||||
ON library."BaseItems" ("TopParentId", "Type");
|
||||
|
||||
\echo '✓ BaseItems indexes created (9)';
|
||||
|
||||
-- BaseItemProviders Performance Indexes (2)
|
||||
\echo 'Creating BaseItemProviders performance indexes...';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitemproviders_providerid_idx
|
||||
ON library."BaseItemProviders" ("ProviderId", "ItemId");
|
||||
|
||||
CREATE INDEX IF NOT EXISTS baseitemproviders_providervalue_idx
|
||||
ON library."BaseItemProviders" ("ProviderValue", "ProviderId");
|
||||
|
||||
\echo '✓ BaseItemProviders indexes created (2)';
|
||||
|
||||
-- MediaStreamInfos Performance Indexes (2)
|
||||
\echo 'Creating MediaStreamInfos performance indexes...';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS mediastreaminfos_codec_idx
|
||||
ON library."MediaStreamInfos" ("Codec");
|
||||
|
||||
CREATE INDEX IF NOT EXISTS mediastreaminfos_itemid_idx
|
||||
ON library."MediaStreamInfos" ("ItemId", "StreamType");
|
||||
|
||||
\echo '✓ MediaStreamInfos indexes created (2)';
|
||||
|
||||
-- PeopleBaseItemMap Performance Indexes (2)
|
||||
\echo 'Creating PeopleBaseItemMap performance indexes...';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS peoplebaseitemmap_itemid_idx
|
||||
ON library."PeopleBaseItemMap" ("ItemId", "PeopleId");
|
||||
|
||||
CREATE INDEX IF NOT EXISTS peoplebaseitemmap_peopleid_idx
|
||||
ON library."PeopleBaseItemMap" ("PeopleId", "ItemId");
|
||||
|
||||
\echo '✓ PeopleBaseItemMap indexes created (2)';
|
||||
|
||||
-- UserData Performance Indexes (3)
|
||||
\echo 'Creating UserData performance indexes...';
|
||||
|
||||
CREATE INDEX IF NOT EXISTS userdata_lastplayeddate_idx
|
||||
ON library."UserData" ("LastPlayedDate" DESC);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS userdata_userid_isfavorite_idx
|
||||
ON library."UserData" ("UserId", "IsFavorite");
|
||||
|
||||
CREATE INDEX IF NOT EXISTS userdata_userid_played_idx
|
||||
ON library."UserData" ("UserId", "Played");
|
||||
|
||||
\echo '✓ UserData indexes created (3)';
|
||||
|
||||
\echo '';
|
||||
\echo '✓ Part 1 Complete: 18 base performance indexes created';
|
||||
\echo '';
|
||||
|
||||
-- ============================================================================
|
||||
-- PART 2: Supplementary Performance Indexes (5 total)
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Part 2: Adding supplementary performance indexes (5)...';
|
||||
\echo '';
|
||||
|
||||
-- BaseItems Supplementary Indexes (3)
|
||||
\echo 'Creating BaseItems supplementary indexes...';
|
||||
|
||||
-- Index: idx_baseitems_type_isvirtualitem_topparentid
|
||||
CREATE INDEX IF NOT EXISTS idx_baseitems_type_isvirtualitem_topparentid
|
||||
ON library."BaseItems" ("Type", "IsVirtualItem", "TopParentId")
|
||||
WHERE "BaseItems"."IsVirtualItem" = false;
|
||||
|
||||
-- Index: idx_baseitems_topparentid_isfolder
|
||||
CREATE INDEX IF NOT EXISTS idx_baseitems_topparentid_isfolder
|
||||
ON library."BaseItems" ("TopParentId", "IsFolder", "IsVirtualItem")
|
||||
WHERE "BaseItems"."TopParentId" IS NOT NULL;
|
||||
|
||||
-- Index: idx_baseitems_datecreated_filtered
|
||||
CREATE INDEX IF NOT EXISTS idx_baseitems_datecreated_filtered
|
||||
ON library."BaseItems" ("DateCreated" DESC, "Type", "IsVirtualItem")
|
||||
WHERE "BaseItems"."DateCreated" IS NOT NULL AND "BaseItems"."IsVirtualItem" = false;
|
||||
|
||||
\echo '✓ BaseItems supplementary indexes created (3)';
|
||||
|
||||
-- ItemValuesMap Supplementary Index (1)
|
||||
\echo 'Creating ItemValuesMap supplementary index...';
|
||||
|
||||
-- Index: idx_itemvaluesmap_itemvalueid_itemid
|
||||
CREATE INDEX IF NOT EXISTS idx_itemvaluesmap_itemvalueid_itemid
|
||||
ON library."ItemValuesMap" ("ItemValueId", "ItemId");
|
||||
|
||||
\echo '✓ ItemValuesMap supplementary index created (1)';
|
||||
|
||||
-- ActivityLogs Supplementary Index (1)
|
||||
\echo 'Creating ActivityLogs supplementary index...';
|
||||
|
||||
-- Index: idx_activitylogs_userid_datecreated
|
||||
-- Note: Only creates if ActivityLogs table exists
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'activitylog'
|
||||
AND table_name = 'ActivityLogs'
|
||||
) THEN
|
||||
CREATE INDEX IF NOT EXISTS idx_activitylogs_userid_datecreated
|
||||
ON activitylog."ActivityLogs" ("UserId", "DateCreated" DESC)
|
||||
WHERE "ActivityLogs"."UserId" IS NOT NULL;
|
||||
RAISE NOTICE '✓ Created idx_activitylogs_userid_datecreated';
|
||||
ELSE
|
||||
RAISE NOTICE '⚠ ActivityLogs table not found, skipping';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
\echo '✓ ActivityLogs supplementary index created (1)';
|
||||
|
||||
\echo '';
|
||||
\echo '✓ Part 2 Complete: 5 supplementary indexes created';
|
||||
\echo '';
|
||||
|
||||
-- ============================================================================
|
||||
-- Update Statistics
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Updating table statistics...';
|
||||
|
||||
ANALYZE library."BaseItems";
|
||||
ANALYZE library."BaseItemProviders";
|
||||
ANALYZE library."MediaStreamInfos";
|
||||
ANALYZE library."PeopleBaseItemMap";
|
||||
ANALYZE library."UserData";
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'activitylog'
|
||||
AND table_name = 'ActivityLogs'
|
||||
) THEN
|
||||
ANALYZE activitylog."ActivityLogs";
|
||||
RAISE NOTICE '✓ ActivityLogs statistics updated';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
\echo '✓ Statistics updated';
|
||||
|
||||
-- ============================================================================
|
||||
-- Summary
|
||||
-- ============================================================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo '✓ All Performance Indexes Created!';
|
||||
\echo '========================================';
|
||||
\echo '';
|
||||
\echo 'Summary:';
|
||||
\echo ' Base Indexes: 18';
|
||||
\echo ' - BaseItems: 9';
|
||||
\echo ' - BaseItemProviders: 2';
|
||||
\echo ' - MediaStreamInfos: 2';
|
||||
\echo ' - PeopleBaseItemMap: 2';
|
||||
\echo ' - UserData: 3';
|
||||
\echo '';
|
||||
\echo ' Supplementary Indexes: 5';
|
||||
\echo ' - BaseItems: 3';
|
||||
\echo ' - ItemValuesMap: 1';
|
||||
\echo ' - ActivityLogs: 1';
|
||||
\echo '';
|
||||
\echo ' Total Indexes Added: 23';
|
||||
\echo '';
|
||||
\echo 'Performance improvement: 70-90% faster queries!';
|
||||
\echo '';
|
||||
\echo 'Next: Restart Jellyfin to see improvements.';
|
||||
\echo '========================================';
|
||||
@@ -1,201 +0,0 @@
|
||||
-- PostgreSQL Performance Indexes for Jellyfin
|
||||
-- Run this script to improve query performance
|
||||
-- Safe to run multiple times (uses IF NOT EXISTS)
|
||||
|
||||
\timing on
|
||||
\echo 'Creating performance indexes for Jellyfin PostgreSQL database...'
|
||||
|
||||
-- ============================================================================
|
||||
-- BaseItems Table Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Creating indexes on BaseItems table...'
|
||||
|
||||
-- Index for filtering by type and virtual items (improves library filtering)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_type_isvirtual
|
||||
ON library."BaseItems" (Type, BaseItems.IsVirtualItem)
|
||||
WHERE IsVirtualItem = false;
|
||||
|
||||
-- Index for parent-child relationships (improves hierarchy queries)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_parent_type
|
||||
ON library."BaseItems" (BaseItems.ParentId, Type)
|
||||
WHERE ParentId IS NOT NULL;
|
||||
|
||||
-- Index for date-based queries (recently added items, sorting)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_datecreated
|
||||
ON library."BaseItems" (BaseItems.DateCreated DESC)
|
||||
WHERE DateCreated IS NOT NULL;
|
||||
|
||||
-- Index for date modified (sync operations)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_datemodified
|
||||
ON library."BaseItems" (BaseItems.DateModified DESC)
|
||||
WHERE DateModified IS NOT NULL;
|
||||
|
||||
-- Index for sorting by name (alphabetical browsing)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_sortname
|
||||
ON library."BaseItems" (BaseItems.SortName)
|
||||
WHERE SortName IS NOT NULL;
|
||||
|
||||
-- Index for TopParent lookups (library organization)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_topparent_type
|
||||
ON library."BaseItems" (BaseItems.TopParentId, Type)
|
||||
WHERE TopParentId IS NOT NULL;
|
||||
|
||||
-- Index for premiere date (upcoming/recent content)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_premieredate
|
||||
ON library."BaseItems" (BaseItems.PremiereDate DESC)
|
||||
WHERE PremiereDate IS NOT NULL;
|
||||
|
||||
-- Index for production year (decade/year filtering)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_productionyear
|
||||
ON library."BaseItems" (BaseItems.ProductionYear DESC)
|
||||
WHERE ProductionYear IS NOT NULL;
|
||||
|
||||
-- Index for community rating (sorting by rating)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_rating
|
||||
ON library."BaseItems" (BaseItems.CommunityRating DESC NULLS LAST);
|
||||
|
||||
-- Index for series episodes
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitems_series_episode
|
||||
ON library."BaseItems" (BaseItems.SeriesPresentationUniqueKey, BaseItems.IndexNumber, BaseItems.ParentIndexNumber)
|
||||
WHERE Type = 'MediaBrowser.Controller.Entities.TV.Episode';
|
||||
|
||||
-- ============================================================================
|
||||
-- BaseItemProviders Table Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Creating indexes on BaseItemProviders table...'
|
||||
|
||||
-- Index for provider value lookups (IMDb, TMDB, etc.)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitem_providers_value
|
||||
ON library."BaseItemProviders" (ProviderValue, ProviderId);
|
||||
|
||||
-- Index for finding all items by provider (reverse lookup)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_baseitem_providers_id
|
||||
ON library."BaseItemProviders" (ProviderId, ItemId);
|
||||
|
||||
-- ============================================================================
|
||||
-- UserData Table Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Creating indexes on UserData table...'
|
||||
|
||||
-- Index for finding user's watched items
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_userdata_user_played
|
||||
ON library."UserData" (UserId, Played);
|
||||
|
||||
-- Index for finding user's favorite items
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_userdata_user_favorite
|
||||
ON library."UserData" (UserId, IsFavorite)
|
||||
WHERE IsFavorite = true;
|
||||
|
||||
-- Index for last played date
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_userdata_lastplayed
|
||||
ON library."UserData" (LastPlayedDate DESC)
|
||||
WHERE LastPlayedDate IS NOT NULL;
|
||||
|
||||
-- ============================================================================
|
||||
-- PeopleBaseItemMap Table Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Creating indexes on PeopleBaseItemMap table...'
|
||||
|
||||
-- Index for finding all items for a person
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_people_items_person
|
||||
ON library."PeopleBaseItemMap" (PeopleId, ItemId);
|
||||
|
||||
-- Index for finding all people for an item (already covered by FK, but explicit)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_people_items_item
|
||||
ON library."PeopleBaseItemMap" (ItemId, PeopleId);
|
||||
|
||||
-- ============================================================================
|
||||
-- ItemValuesMap Table Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Creating indexes on ItemValuesMap table...'
|
||||
|
||||
-- Index for finding items by value (genres, tags, etc.)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_itemvalues_map_value
|
||||
ON library."ItemValuesMap" (ItemValueId, ItemId);
|
||||
|
||||
-- ============================================================================
|
||||
-- ActivityLog Table Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Creating indexes on ActivityLog table...'
|
||||
|
||||
-- Index for date filtering (recent activity)
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_activitylog_date
|
||||
ON activitylog."ActivityLog" (DateCreated DESC);
|
||||
|
||||
-- Index for user activity
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_activitylog_user
|
||||
ON activitylog."ActivityLog" (UserId, DateCreated DESC)
|
||||
WHERE UserId IS NOT NULL;
|
||||
|
||||
-- ============================================================================
|
||||
-- MediaStreamInfos Table Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Creating indexes on MediaStreamInfos table...'
|
||||
|
||||
-- Index for finding streams by item and type
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_mediastreams_item_type
|
||||
ON library."MediaStreamInfos" (ItemId, Type);
|
||||
|
||||
-- Index for codec searches
|
||||
CREATE INDEX CONCURRENTLY IF NOT EXISTS idx_mediastreams_codec
|
||||
ON library."MediaStreamInfos" (Codec)
|
||||
WHERE Codec IS NOT NULL;
|
||||
|
||||
-- ============================================================================
|
||||
-- Analyze Tables
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Analyzing tables to update statistics...'
|
||||
|
||||
ANALYZE library."BaseItems";
|
||||
ANALYZE library."BaseItemProviders";
|
||||
ANALYZE library."UserData";
|
||||
ANALYZE library."PeopleBaseItemMap";
|
||||
ANALYZE library."ItemValuesMap";
|
||||
ANALYZE library."MediaStreamInfos";
|
||||
|
||||
-- Analyze ActivityLog if it exists
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'activitylog'
|
||||
AND table_name = 'ActivityLog'
|
||||
) THEN
|
||||
ANALYZE activitylog."ActivityLog";
|
||||
RAISE NOTICE 'ActivityLog analyzed';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- Report Index Usage
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Current index usage statistics:'
|
||||
|
||||
SELECT
|
||||
schemaname,
|
||||
relname as tablename,
|
||||
indexrelname as indexname,
|
||||
pg_size_pretty(pg_relation_size(indexrelid)) as index_size,
|
||||
idx_scan as times_used,
|
||||
idx_tup_read as rows_read,
|
||||
idx_tup_fetch as rows_fetched
|
||||
FROM pg_stat_user_indexes
|
||||
WHERE schemaname IN ('library', 'activitylog', 'users', 'authentication', 'displaypreferences')
|
||||
ORDER BY schemaname, relname, indexrelname;
|
||||
|
||||
\echo ''
|
||||
\echo 'Index creation complete!'
|
||||
\echo ''
|
||||
\echo 'Note: CONCURRENTLY builds indexes without blocking writes, but takes longer.'
|
||||
\echo 'Monitor progress with: SELECT * FROM pg_stat_progress_create_index;'
|
||||
\echo ''
|
||||
\echo 'After indexing, restart Jellyfin to clear connection pools.'
|
||||
@@ -1,220 +0,0 @@
|
||||
-- PostgreSQL Performance Indexes for Jellyfin
|
||||
-- Based on actual schema analysis
|
||||
-- Run this script to add supplementary performance indexes
|
||||
-- Safe to run multiple times
|
||||
|
||||
\timing on
|
||||
\echo '========================================';
|
||||
\echo 'Jellyfin PostgreSQL Supplementary Indexes';
|
||||
\echo '========================================';
|
||||
\echo '';
|
||||
\echo 'Your schema already has comprehensive indexes from EF Core migrations.';
|
||||
\echo 'This script adds only missing supplementary indexes.';
|
||||
\echo '';
|
||||
|
||||
-- ============================================================================
|
||||
-- Check Existing Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Analyzing existing indexes...';
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
idx_count int;
|
||||
BEGIN
|
||||
SELECT count(*) INTO idx_count
|
||||
FROM pg_indexes
|
||||
WHERE schemaname = 'library' AND tablename = 'BaseItems';
|
||||
|
||||
RAISE NOTICE 'Found % existing indexes on BaseItems table', idx_count;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- BaseItems - Add Only Missing Supplementary Indexes
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Adding supplementary BaseItems indexes...';
|
||||
|
||||
-- Composite index for filtered library browsing (type + virtual + parent)
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_indexes
|
||||
WHERE schemaname = 'library'
|
||||
AND tablename = 'BaseItems'
|
||||
AND indexname = 'idx_baseitems_type_isvirtualitem_topparentid'
|
||||
) THEN
|
||||
CREATE INDEX CONCURRENTLY idx_baseitems_type_isvirtualitem_topparentid
|
||||
ON library."BaseItems" ("Type", "IsVirtualItem", "TopParentId")
|
||||
WHERE "IsVirtualItem" = false;
|
||||
RAISE NOTICE 'Created idx_baseitems_type_isvirtualitem_topparentid';
|
||||
ELSE
|
||||
RAISE NOTICE 'Index idx_baseitems_type_isvirtualitem_topparentid already exists';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Index for folder hierarchy queries
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_indexes
|
||||
WHERE schemaname = 'library'
|
||||
AND tablename = 'BaseItems'
|
||||
AND indexname = 'idx_baseitems_topparentid_isfolder'
|
||||
) THEN
|
||||
CREATE INDEX CONCURRENTLY idx_baseitems_topparentid_isfolder
|
||||
ON library."BaseItems" ("TopParentId", "IsFolder", "IsVirtualItem")
|
||||
WHERE "TopParentId" IS NOT NULL;
|
||||
RAISE NOTICE 'Created idx_baseitems_topparentid_isfolder';
|
||||
ELSE
|
||||
RAISE NOTICE 'Index idx_baseitems_topparentid_isfolder already exists';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- Index for recently added content with filters
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_indexes
|
||||
WHERE schemaname = 'library'
|
||||
AND tablename = 'BaseItems'
|
||||
AND indexname = 'idx_baseitems_datecreated_filtered'
|
||||
) THEN
|
||||
CREATE INDEX CONCURRENTLY idx_baseitems_datecreated_filtered
|
||||
ON library."BaseItems" ("DateCreated" DESC, "Type", "IsVirtualItem")
|
||||
WHERE "DateCreated" IS NOT NULL AND "IsVirtualItem" = false;
|
||||
RAISE NOTICE 'Created idx_baseitems_datecreated_filtered';
|
||||
ELSE
|
||||
RAISE NOTICE 'Index idx_baseitems_datecreated_filtered already exists';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- ItemValuesMap - Add Reverse Lookup Index
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Checking ItemValuesMap indexes...';
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_indexes
|
||||
WHERE schemaname = 'library'
|
||||
AND tablename = 'ItemValuesMap'
|
||||
AND indexname = 'idx_itemvaluesmap_itemvalueid_itemid'
|
||||
) THEN
|
||||
CREATE INDEX CONCURRENTLY idx_itemvaluesmap_itemvalueid_itemid
|
||||
ON library."ItemValuesMap" ("ItemValueId", "ItemId");
|
||||
RAISE NOTICE 'Created idx_itemvaluesmap_itemvalueid_itemid';
|
||||
ELSE
|
||||
RAISE NOTICE 'Index idx_itemvaluesmap_itemvalueid_itemid already exists';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- ActivityLogs - Add User-Specific Index
|
||||
-- (Note: Table is ActivityLogs, not ActivityLog)
|
||||
-- ============================================================================
|
||||
|
||||
\echo 'Checking ActivityLogs indexes...';
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'activitylog'
|
||||
AND table_name = 'ActivityLogs'
|
||||
) THEN
|
||||
IF NOT EXISTS (
|
||||
SELECT 1 FROM pg_indexes
|
||||
WHERE schemaname = 'activitylog'
|
||||
AND tablename = 'ActivityLogs'
|
||||
AND indexname = 'idx_activitylogs_userid_datecreated'
|
||||
) THEN
|
||||
CREATE INDEX CONCURRENTLY idx_activitylogs_userid_datecreated
|
||||
ON activitylog."ActivityLogs" ("UserId", "DateCreated" DESC)
|
||||
WHERE "UserId" IS NOT NULL;
|
||||
RAISE NOTICE 'Created idx_activitylogs_userid_datecreated';
|
||||
ELSE
|
||||
RAISE NOTICE 'Index idx_activitylogs_userid_datecreated already exists';
|
||||
END IF;
|
||||
ELSE
|
||||
RAISE NOTICE 'ActivityLogs table not found (expected: activitylog.ActivityLogs)';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
-- ============================================================================
|
||||
-- Analyze Tables to Update Statistics
|
||||
-- ============================================================================
|
||||
|
||||
\echo '';
|
||||
\echo 'Updating table statistics...';
|
||||
|
||||
ANALYZE library."BaseItems";
|
||||
ANALYZE library."BaseItemProviders";
|
||||
ANALYZE library."UserData";
|
||||
ANALYZE library."PeopleBaseItemMap";
|
||||
ANALYZE library."ItemValuesMap";
|
||||
ANALYZE library."ItemValues";
|
||||
ANALYZE library."MediaStreamInfos";
|
||||
ANALYZE library."Peoples";
|
||||
ANALYZE library."Chapters";
|
||||
ANALYZE library."KeyframeData";
|
||||
|
||||
DO $$
|
||||
BEGIN
|
||||
IF EXISTS (
|
||||
SELECT 1 FROM information_schema.tables
|
||||
WHERE table_schema = 'activitylog'
|
||||
AND table_name = 'ActivityLogs'
|
||||
) THEN
|
||||
ANALYZE activitylog."ActivityLogs";
|
||||
RAISE NOTICE 'ActivityLogs statistics updated';
|
||||
END IF;
|
||||
END $$;
|
||||
|
||||
\echo 'Statistics updated.';
|
||||
|
||||
-- ============================================================================
|
||||
-- Report Current Index Status
|
||||
-- ============================================================================
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo 'Index Usage Report';
|
||||
\echo '========================================';
|
||||
|
||||
-- Show all indexes and their usage
|
||||
SELECT
|
||||
schemaname,
|
||||
relname as tablename,
|
||||
indexrelname as indexname,
|
||||
pg_size_pretty(pg_relation_size(indexrelid)) as index_size,
|
||||
idx_scan as times_used,
|
||||
idx_tup_read as rows_read,
|
||||
idx_tup_fetch as rows_fetched,
|
||||
CASE
|
||||
WHEN idx_scan = 0 THEN 'UNUSED'
|
||||
WHEN idx_scan < 10 THEN 'RARELY USED'
|
||||
WHEN idx_scan < 100 THEN 'OCCASIONALLY USED'
|
||||
ELSE 'FREQUENTLY USED'
|
||||
END as usage_category
|
||||
FROM pg_stat_user_indexes
|
||||
WHERE schemaname IN ('library', 'activitylog', 'users', 'authentication', 'displaypreferences')
|
||||
ORDER BY schemaname, relname, idx_scan DESC;
|
||||
|
||||
\echo '';
|
||||
\echo '========================================';
|
||||
\echo 'Summary';
|
||||
\echo '========================================';
|
||||
\echo 'Your database already had comprehensive indexes from EF Core migrations.';
|
||||
\echo 'Added supplementary composite indexes for specific query patterns.';
|
||||
\echo '';
|
||||
\echo 'Next steps:';
|
||||
\echo '1. Monitor performance with: psql -U jellyfin -d jellyfin -f sql/diagnostics.sql';
|
||||
\echo '2. Check query plans for slow queries';
|
||||
\echo '3. Consider removing rarely-used indexes after 30 days';
|
||||
\echo '4. Restart Jellyfin to clear connection pools';
|
||||
\echo '';
|
||||
\echo 'See SCHEMA_ANALYSIS.md for detailed index information.';
|
||||
\echo '========================================';
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[4665,7184,10092,15141,27046,37522,49427,71808,83518],{7184:function(a,e,t){"use strict";t(89336),t(36947),t(95021),t(53819),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.width,r=i&&a.matchPatterns[i]||a.matchPatterns[a.defaultMatchWidth],n=e.match(r);if(!n)return null;var l,o=n[0],d=i&&a.parsePatterns[i]||a.parsePatterns[a.defaultParseWidth],u=Array.isArray(d)?function(a){for(var e=0;e<a.length;e++)if(a[e].test(o))return e}(d):function(a){for(var e in a)if(a.hasOwnProperty(e)&&a[e].test(o))return e}(d);return l=a.valueCallback?a.valueCallback(u):u,{value:l=t.valueCallback?t.valueCallback(l):l,rest:e.slice(o.length)}}},a.exports=e.default},10092:function(a,e,t){"use strict";t(36947),t(96054);var i=t(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=i(t(7184)),n={ordinalNumber:(0,i(t(83518)).default)({matchPattern:/^(\d+)(º)?/i,parsePattern:/\d+/i,valueCallback:function(a){return parseInt(a,10)}}),era:(0,r.default)({matchPatterns:{narrow:/^(aC|dC)/i,abbreviated:/^(a\.?\s?C\.?|a\.?\s?e\.?\s?v\.?|d\.?\s?C\.?|e\.?\s?v\.?)/i,wide:/^(avanti Cristo|avanti Era Volgare|dopo Cristo|Era Volgare)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^a/i,/^(d|e)/i]},defaultParseWidth:"any"}),quarter:(0,r.default)({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^t[1234]/i,wide:/^[1234](º)? trimestre/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(a){return a+1}}),month:(0,r.default)({matchPatterns:{narrow:/^[gfmalsond]/i,abbreviated:/^(gen|feb|mar|apr|mag|giu|lug|ago|set|ott|nov|dic)/i,wide:/^(gennaio|febbraio|marzo|aprile|maggio|giugno|luglio|agosto|settembre|ottobre|novembre|dicembre)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^g/i,/^f/i,/^m/i,/^a/i,/^m/i,/^g/i,/^l/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ge/i,/^f/i,/^mar/i,/^ap/i,/^mag/i,/^gi/i,/^l/i,/^ag/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:(0,r.default)({matchPatterns:{narrow:/^[dlmgvs]/i,short:/^(do|lu|ma|me|gi|ve|sa)/i,abbreviated:/^(dom|lun|mar|mer|gio|ven|sab)/i,wide:/^(domenica|luned[i|ì]|marted[i|ì]|mercoled[i|ì]|gioved[i|ì]|venerd[i|ì]|sabato)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^d/i,/^l/i,/^m/i,/^m/i,/^g/i,/^v/i,/^s/i],any:[/^d/i,/^l/i,/^ma/i,/^me/i,/^g/i,/^v/i,/^s/i]},defaultParseWidth:"any"}),dayPeriod:(0,r.default)({matchPatterns:{narrow:/^(a|m\.|p|mezzanotte|mezzogiorno|(di|del) (mattina|pomeriggio|sera|notte))/i,any:/^([ap]\.?\s?m\.?|mezzanotte|mezzogiorno|(di|del) (mattina|pomeriggio|sera|notte))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mezza/i,noon:/^mezzo/i,morning:/mattina/i,afternoon:/pomeriggio/i,evening:/sera/i,night:/notte/i}},defaultParseWidth:"any"})};e.default=n,a.exports=e.default},83518:function(a,e,t){"use strict";t(89336),t(36947),t(95021),t(53819),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){return function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=e.match(a.matchPattern);if(!i)return null;var r=i[0],n=e.match(a.parsePattern);if(!n)return null;var l=a.valueCallback?a.valueCallback(n[0]):n[0];return{value:l=t.valueCallback?t.valueCallback(l):l,rest:e.slice(r.length)}}},a.exports=e.default},96784:function(a){a.exports=function(a){return a&&a.__esModule?a:{default:a}},a.exports.__esModule=!0,a.exports.default=a.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[10393],{10393:function(o,n,e){e(36947),e(95021),e(93062),Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var t={lessThanXSeconds:{one:{standalone:"manje od 1 sekunde",withPrepositionAgo:"manje od 1 sekunde",withPrepositionIn:"manje od 1 sekundu"},dual:"manje od {{count}} sekunde",other:"manje od {{count}} sekundi"},xSeconds:{one:{standalone:"1 sekunda",withPrepositionAgo:"1 sekunde",withPrepositionIn:"1 sekundu"},dual:"{{count}} sekunde",other:"{{count}} sekundi"},halfAMinute:"pola minute",lessThanXMinutes:{one:{standalone:"manje od 1 minute",withPrepositionAgo:"manje od 1 minute",withPrepositionIn:"manje od 1 minutu"},dual:"manje od {{count}} minute",other:"manje od {{count}} minuta"},xMinutes:{one:{standalone:"1 minuta",withPrepositionAgo:"1 minute",withPrepositionIn:"1 minutu"},dual:"{{count}} minute",other:"{{count}} minuta"},aboutXHours:{one:{standalone:"oko 1 sat",withPrepositionAgo:"oko 1 sat",withPrepositionIn:"oko 1 sat"},dual:"oko {{count}} sata",other:"oko {{count}} sati"},xHours:{one:{standalone:"1 sat",withPrepositionAgo:"1 sat",withPrepositionIn:"1 sat"},dual:"{{count}} sata",other:"{{count}} sati"},xDays:{one:{standalone:"1 dan",withPrepositionAgo:"1 dan",withPrepositionIn:"1 dan"},dual:"{{count}} dana",other:"{{count}} dana"},aboutXWeeks:{one:{standalone:"oko 1 sedmicu",withPrepositionAgo:"oko 1 sedmicu",withPrepositionIn:"oko 1 sedmicu"},dual:"oko {{count}} sedmice",other:"oko {{count}} sedmice"},xWeeks:{one:{standalone:"1 sedmicu",withPrepositionAgo:"1 sedmicu",withPrepositionIn:"1 sedmicu"},dual:"{{count}} sedmice",other:"{{count}} sedmice"},aboutXMonths:{one:{standalone:"oko 1 mjesec",withPrepositionAgo:"oko 1 mjesec",withPrepositionIn:"oko 1 mjesec"},dual:"oko {{count}} mjeseca",other:"oko {{count}} mjeseci"},xMonths:{one:{standalone:"1 mjesec",withPrepositionAgo:"1 mjesec",withPrepositionIn:"1 mjesec"},dual:"{{count}} mjeseca",other:"{{count}} mjeseci"},aboutXYears:{one:{standalone:"oko 1 godinu",withPrepositionAgo:"oko 1 godinu",withPrepositionIn:"oko 1 godinu"},dual:"oko {{count}} godine",other:"oko {{count}} godina"},xYears:{one:{standalone:"1 godina",withPrepositionAgo:"1 godine",withPrepositionIn:"1 godinu"},dual:"{{count}} godine",other:"{{count}} godina"},overXYears:{one:{standalone:"preko 1 godinu",withPrepositionAgo:"preko 1 godinu",withPrepositionIn:"preko 1 godinu"},dual:"preko {{count}} godine",other:"preko {{count}} godina"},almostXYears:{one:{standalone:"gotovo 1 godinu",withPrepositionAgo:"gotovo 1 godinu",withPrepositionIn:"gotovo 1 godinu"},dual:"gotovo {{count}} godine",other:"gotovo {{count}} godina"}};n.default=function(o,n,e){var i,s=t[o];return i="string"==typeof s?s:1===n?null!=e&&e.addSuffix?e.comparison&&e.comparison>0?s.one.withPrepositionIn:s.one.withPrepositionAgo:s.one.standalone:n%10>1&&n%10<5&&"1"!==String(n).substr(-2,1)?s.dual.replace("{{count}}",String(n)):s.other.replace("{{count}}",String(n)),null!=e&&e.addSuffix?e.comparison&&e.comparison>0?"za "+i:"prije "+i:i},o.exports=n.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[10455],{10455:function(e,t,o){o(36947),o(95021),o(93062),Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n={lessThanXSeconds:{standalone:{one:"vähem kui üks sekund",other:"vähem kui {{count}} sekundit"},withPreposition:{one:"vähem kui ühe sekundi",other:"vähem kui {{count}} sekundi"}},xSeconds:{standalone:{one:"üks sekund",other:"{{count}} sekundit"},withPreposition:{one:"ühe sekundi",other:"{{count}} sekundi"}},halfAMinute:{standalone:"pool minutit",withPreposition:"poole minuti"},lessThanXMinutes:{standalone:{one:"vähem kui üks minut",other:"vähem kui {{count}} minutit"},withPreposition:{one:"vähem kui ühe minuti",other:"vähem kui {{count}} minuti"}},xMinutes:{standalone:{one:"üks minut",other:"{{count}} minutit"},withPreposition:{one:"ühe minuti",other:"{{count}} minuti"}},aboutXHours:{standalone:{one:"umbes üks tund",other:"umbes {{count}} tundi"},withPreposition:{one:"umbes ühe tunni",other:"umbes {{count}} tunni"}},xHours:{standalone:{one:"üks tund",other:"{{count}} tundi"},withPreposition:{one:"ühe tunni",other:"{{count}} tunni"}},xDays:{standalone:{one:"üks päev",other:"{{count}} päeva"},withPreposition:{one:"ühe päeva",other:"{{count}} päeva"}},aboutXWeeks:{standalone:{one:"umbes üks nädal",other:"umbes {{count}} nädalat"},withPreposition:{one:"umbes ühe nädala",other:"umbes {{count}} nädala"}},xWeeks:{standalone:{one:"üks nädal",other:"{{count}} nädalat"},withPreposition:{one:"ühe nädala",other:"{{count}} nädala"}},aboutXMonths:{standalone:{one:"umbes üks kuu",other:"umbes {{count}} kuud"},withPreposition:{one:"umbes ühe kuu",other:"umbes {{count}} kuu"}},xMonths:{standalone:{one:"üks kuu",other:"{{count}} kuud"},withPreposition:{one:"ühe kuu",other:"{{count}} kuu"}},aboutXYears:{standalone:{one:"umbes üks aasta",other:"umbes {{count}} aastat"},withPreposition:{one:"umbes ühe aasta",other:"umbes {{count}} aasta"}},xYears:{standalone:{one:"üks aasta",other:"{{count}} aastat"},withPreposition:{one:"ühe aasta",other:"{{count}} aasta"}},overXYears:{standalone:{one:"rohkem kui üks aasta",other:"rohkem kui {{count}} aastat"},withPreposition:{one:"rohkem kui ühe aasta",other:"rohkem kui {{count}} aasta"}},almostXYears:{standalone:{one:"peaaegu üks aasta",other:"peaaegu {{count}} aastat"},withPreposition:{one:"peaaegu ühe aasta",other:"peaaegu {{count}} aasta"}}};t.default=function(e,t,o){var a,u=null!=o&&o.addSuffix?n[e].withPreposition:n[e].standalone;return a="string"==typeof u?u:1===t?u.one:u.other.replace("{{count}}",String(t)),null!=o&&o.addSuffix?o.comparison&&o.comparison>0?a+" pärast":a+" eest":a},e.exports=t.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[1051,4665,7184,15141,27046,37522,49427,71808,83518],{1051:function(t,a,e){"use strict";e(36947),e(96054);var r=e(96784).default;Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var i=r(e(83518)),n=r(e(7184)),l={ordinalNumber:(0,i.default)({matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:function(t){return parseInt(t,10)}}),era:(0,n.default)({matchPatterns:{narrow:/[قب]/,abbreviated:/[قب]\.م\./,wide:/(قبل|بعد) الميلاد/},defaultMatchWidth:"wide",parsePatterns:{any:[/قبل/,/بعد/]},defaultParseWidth:"any"}),quarter:(0,n.default)({matchPatterns:{narrow:/^[1234]/i,abbreviated:/ر[1234]/,wide:/الربع (الأول|الثاني|الثالث|الرابع)/},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(t){return t+1}}),month:(0,n.default)({matchPatterns:{narrow:/^[جفمأسند]/,abbreviated:/^(جانفي|فيفري|مارس|أفريل|ماي|جوان|جويلية|أوت|سبتمبر|أكتوبر|نوفمبر|ديسمبر)/,wide:/^(جانفي|فيفري|مارس|أفريل|ماي|جوان|جويلية|أوت|سبتمبر|أكتوبر|نوفمبر|ديسمبر)/},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^ج/i,/^ف/i,/^م/i,/^أ/i,/^م/i,/^ج/i,/^ج/i,/^أ/i,/^س/i,/^أ/i,/^ن/i,/^د/i],any:[/^جانفي/i,/^فيفري/i,/^مارس/i,/^أفريل/i,/^ماي/i,/^جوان/i,/^جويلية/i,/^أوت/i,/^سبتمبر/i,/^أكتوبر/i,/^نوفمبر/i,/^ديسمبر/i]},defaultParseWidth:"any"}),day:(0,n.default)({matchPatterns:{narrow:/^[حنثرخجس]/i,short:/^(أحد|اثنين|ثلاثاء|أربعاء|خميس|جمعة|سبت)/i,abbreviated:/^(أحد|اثنين|ثلاثاء|أربعاء|خميس|جمعة|سبت)/i,wide:/^(الأحد|الاثنين|الثلاثاء|الأربعاء|الخميس|الجمعة|السبت)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^ح/i,/^ن/i,/^ث/i,/^ر/i,/^خ/i,/^ج/i,/^س/i],wide:[/^الأحد/i,/^الاثنين/i,/^الثلاثاء/i,/^الأربعاء/i,/^الخميس/i,/^الجمعة/i,/^السبت/i],any:[/^أح/i,/^اث/i,/^ث/i,/^أر/i,/^خ/i,/^ج/i,/^س/i]},defaultParseWidth:"any"}),dayPeriod:(0,n.default)({matchPatterns:{narrow:/^(ص|ع|ن ل|ل|(في|مع) (صباح|قايلة|عشية|ليل))/,any:/^([صع]|نص الليل|قايلة|(في|مع) (صباح|قايلة|عشية|ليل))/},defaultMatchWidth:"any",parsePatterns:{any:{am:/^ص/,pm:/^ع/,midnight:/نص الليل/,noon:/قايلة/,afternoon:/بعد القايلة/,morning:/صباح/,evening:/عشية/,night:/ليل/}},defaultParseWidth:"any"})};a.default=l,t.exports=a.default},7184:function(t,a,e){"use strict";e(89336),e(36947),e(95021),e(53819),Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(t){return function(a){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=e.width,i=r&&t.matchPatterns[r]||t.matchPatterns[t.defaultMatchWidth],n=a.match(i);if(!n)return null;var l,u=n[0],d=r&&t.parsePatterns[r]||t.parsePatterns[t.defaultParseWidth],s=Array.isArray(d)?function(t){for(var a=0;a<t.length;a++)if(t[a].test(u))return a}(d):function(t){for(var a in t)if(t.hasOwnProperty(a)&&t[a].test(u))return a}(d);return l=t.valueCallback?t.valueCallback(s):s,{value:l=e.valueCallback?e.valueCallback(l):l,rest:a.slice(u.length)}}},t.exports=a.default},83518:function(t,a,e){"use strict";e(89336),e(36947),e(95021),e(53819),Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(t){return function(a){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=a.match(t.matchPattern);if(!r)return null;var i=r[0],n=a.match(t.parsePattern);if(!n)return null;var l=t.valueCallback?t.valueCallback(n[0]):n[0];return{value:l=e.valueCallback?e.valueCallback(l):l,rest:a.slice(i.length)}}},t.exports=a.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[9387,10540,19863,31768,42244,75101,94160,97482],{10540:function(e,t,n){"use strict";n(94),n(36947);var a=n(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=a(n(94160)),i={ordinalNumber:function(e,t){var n=Number(e);switch(String(null==t?void 0:t.unit)){case"year":return"".concat(n,"年");case"quarter":return"第".concat(n,"四半期");case"month":return"".concat(n,"月");case"week":return"第".concat(n,"週");case"date":return"".concat(n,"日");case"hour":return"".concat(n,"時");case"minute":return"".concat(n,"分");case"second":return"".concat(n,"秒");default:return"".concat(n)}},era:(0,r.default)({values:{narrow:["BC","AC"],abbreviated:["紀元前","西暦"],wide:["紀元前","西暦"]},defaultWidth:"wide"}),quarter:(0,r.default)({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["第1四半期","第2四半期","第3四半期","第4四半期"]},defaultWidth:"wide",argumentCallback:function(e){return Number(e)-1}}),month:(0,r.default)({values:{narrow:["1","2","3","4","5","6","7","8","9","10","11","12"],abbreviated:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"],wide:["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"]},defaultWidth:"wide"}),day:(0,r.default)({values:{narrow:["日","月","火","水","木","金","土"],short:["日","月","火","水","木","金","土"],abbreviated:["日","月","火","水","木","金","土"],wide:["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"]},defaultWidth:"wide"}),dayPeriod:(0,r.default)({values:{narrow:{am:"午前",pm:"午後",midnight:"深夜",noon:"正午",morning:"朝",afternoon:"午後",evening:"夜",night:"深夜"},abbreviated:{am:"午前",pm:"午後",midnight:"深夜",noon:"正午",morning:"朝",afternoon:"午後",evening:"夜",night:"深夜"},wide:{am:"午前",pm:"午後",midnight:"深夜",noon:"正午",morning:"朝",afternoon:"午後",evening:"夜",night:"深夜"}},defaultWidth:"wide",formattingValues:{narrow:{am:"午前",pm:"午後",midnight:"深夜",noon:"正午",morning:"朝",afternoon:"午後",evening:"夜",night:"深夜"},abbreviated:{am:"午前",pm:"午後",midnight:"深夜",noon:"正午",morning:"朝",afternoon:"午後",evening:"夜",night:"深夜"},wide:{am:"午前",pm:"午後",midnight:"深夜",noon:"正午",morning:"朝",afternoon:"午後",evening:"夜",night:"深夜"}},defaultFormattingWidth:"wide"})};t.default=i,e.exports=t.default},94160:function(e,t,n){"use strict";n(44962),n(36947),n(78557),n(82367),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(t,n){var a;if("formatting"===(null!=n&&n.context?String(n.context):"standalone")&&e.formattingValues){var r=e.defaultFormattingWidth||e.defaultWidth,i=null!=n&&n.width?String(n.width):r;a=e.formattingValues[i]||e.formattingValues[r]}else{var o=e.defaultWidth,u=null!=n&&n.width?String(n.width):e.defaultWidth;a=e.values[u]||e.values[o]}return a[e.argumentCallback?e.argumentCallback(t):t]}},e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[10807,33188],{10564:function(e){function t(o){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(o)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},33188:function(e,t,o){"use strict";o(36947),o(78557),o(73687);var n=o(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){(0,s.default)(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||"object"===(0,r.default)(e)&&"[object Date]"===t?new Date(e.getTime()):"number"==typeof e||"[object Number]"===t?new Date(e):("string"!=typeof e&&"[object String]"!==t||"undefined"==typeof console||(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"),console.warn((new Error).stack)),new Date(NaN))};var r=n(o(10564)),s=n(o(23058));e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[11061,17486,21933,37658,39867,44314,62248,95105],{11061:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=u(d(37658)),a={date:(0,l.default)({formats:{full:"EEEE, y. 'gada' d. MMMM",long:"y. 'gada' d. MMMM",medium:"dd.MM.y.",short:"dd.MM.y."},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} 'plkst.' {{time}}",long:"{{date}} 'plkst.' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})};e.default=a,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[1161],{1161:function(t,n,e){"use strict";e.d(n,{Q3:function(){return f}}),e(29305),e(32733),e(84701),e(81678),e(2623),e(24776),e(14382),e(69892),e(84734),e(44962),e(89336),e(4754),e(10849),e(58551),e(70389),e(94),e(33087),e(36947),e(36457),e(88908),e(26437),e(83810),e(52697),e(78557),e(96054),e(90076),e(95021),e(73687),e(83994),e(23630),e(82367);var r=e(63696),u=e(28601);function i(t,n){(null==n||n>t.length)&&(n=t.length);for(var e=0,r=Array(n);e<n;e++)r[e]=t[e];return r}function o(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:500,e=arguments.length>2?arguments[2]:void 0,i=(0,r.useRef)();!function(t){var n=(0,r.useRef)(t);n.current=t,(0,r.useEffect)((function(){return function(){n.current()}}),[])}((function(){i.current&&i.current.cancel()}));var o=(0,r.useMemo)((function(){var r=u(t,n,e),o=function(){return r.apply(void 0,arguments)};return o.cancel=function(){r.cancel()},o.isPending=function(){return!!i.current},o.flush=function(){return r.flush()},o}),[t,n,e]);return(0,r.useEffect)((function(){i.current=u(t,n,e)}),[t,n,e]),o}function f(t,n,e){var u,f,c,a=null!==(u=null==e?void 0:e.equalityFn)&&void 0!==u?u:function(t,n){return t===n},l=t instanceof Function?t():t,s=(f=(0,r.useState)(l),c=2,function(t){if(Array.isArray(t))return t}(f)||function(t,n){var e=null==t?null:"undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(null!=e){var r,u,i,o,f=[],c=!0,a=!1;try{if(i=(e=e.call(t)).next,0===n){if(Object(e)!==e)return;c=!1}else for(;!(c=(r=i.call(e)).done)&&(f.push(r.value),f.length!==n);c=!0);}catch(t){a=!0,u=t}finally{try{if(!c&&null!=e.return&&(o=e.return(),Object(o)!==o))return}finally{if(a)throw u}}return f}}(f,c)||function(t,n){if(t){if("string"==typeof t)return i(t,n);var e={}.toString.call(t).slice(8,-1);return"Object"===e&&t.constructor&&(e=t.constructor.name),"Map"===e||"Set"===e?Array.from(t):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?i(t,n):void 0}}(f,c)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()),v=s[0],y=s[1],p=(0,r.useRef)(l),d=o(y,n,e);return a(p.current,l)||(d(l),p.current=l),[v,d]}"undefined"!=typeof window?r.useLayoutEffect:r.useEffect},28601:function(t,n,e){var r=/^\s+|\s+$/g,u=/^[-+]0x[0-9a-f]+$/i,i=/^0b[01]+$/i,o=/^0o[0-7]+$/i,f=parseInt,c="object"==typeof e.g&&e.g&&e.g.Object===Object&&e.g,a="object"==typeof self&&self&&self.Object===Object&&self,l=c||a||Function("return this")(),s=Object.prototype.toString,v=Math.max,y=Math.min,p=function(){return l.Date.now()};function d(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function b(t){if("number"==typeof t)return t;if(function(t){return"symbol"==typeof t||function(t){return!!t&&"object"==typeof t}(t)&&"[object Symbol]"==s.call(t)}(t))return NaN;if(d(t)){var n="function"==typeof t.valueOf?t.valueOf():t;t=d(n)?n+"":n}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(r,"");var e=i.test(t);return e||o.test(t)?f(t.slice(2),e?2:8):u.test(t)?NaN:+t}t.exports=function(t,n,e){var r,u,i,o,f,c,a=0,l=!1,s=!1,m=!0;if("function"!=typeof t)throw new TypeError("Expected a function");function h(n){var e=r,i=u;return r=u=void 0,a=n,o=t.apply(i,e)}function g(t){var e=t-c;return void 0===c||e>=n||e<0||s&&t-a>=i}function j(){var t=p();if(g(t))return w(t);f=setTimeout(j,function(t){var e=n-(t-c);return s?y(e,i-(t-a)):e}(t))}function w(t){return f=void 0,m&&r?h(t):(r=u=void 0,o)}function O(){var t=p(),e=g(t);if(r=arguments,u=this,c=t,e){if(void 0===f)return function(t){return a=t,f=setTimeout(j,n),l?h(t):o}(c);if(s)return f=setTimeout(j,n),h(c)}return void 0===f&&(f=setTimeout(j,n)),o}return n=b(n)||0,d(e)&&(l=!!e.leading,i=(s="maxWait"in e)?v(b(e.maxWait)||0,n):i,m="trailing"in e?!!e.trailing:m),O.cancel=function(){void 0!==f&&clearTimeout(f),a=0,r=c=u=f=void 0},O.flush=function(){return void 0===f?o:w(p())},O}}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[11762],{11762:function(e,n,o){o(36947),o(95021),o(93062),Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var r={lessThanXSeconds:{one:"minder dan een seconde",other:"minder dan {{count}} seconden"},xSeconds:{one:"1 seconde",other:"{{count}} seconden"},halfAMinute:"een halve minuut",lessThanXMinutes:{one:"minder dan een minuut",other:"minder dan {{count}} minuten"},xMinutes:{one:"een minuut",other:"{{count}} minuten"},aboutXHours:{one:"ongeveer 1 uur",other:"ongeveer {{count}} uur"},xHours:{one:"1 uur",other:"{{count}} uur"},xDays:{one:"1 dag",other:"{{count}} dagen"},aboutXWeeks:{one:"ongeveer 1 week",other:"ongeveer {{count}} weken"},xWeeks:{one:"1 week",other:"{{count}} weken"},aboutXMonths:{one:"ongeveer 1 maand",other:"ongeveer {{count}} maanden"},xMonths:{one:"1 maand",other:"{{count}} maanden"},aboutXYears:{one:"ongeveer 1 jaar",other:"ongeveer {{count}} jaar"},xYears:{one:"1 jaar",other:"{{count}} jaar"},overXYears:{one:"meer dan 1 jaar",other:"meer dan {{count}} jaar"},almostXYears:{one:"bijna 1 jaar",other:"bijna {{count}} jaar"}};n.default=function(e,n,o){var t,a=r[e];return t="string"==typeof a?a:1===n?a.one:a.other.replace("{{count}}",String(n)),null!=o&&o.addSuffix?o.comparison&&o.comparison>0?"over "+t:t+" geleden":t},e.exports=n.default}}]);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[12323],{12323:function(e,t,u){u(36947),Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n={lastWeek:function(e){var t=e.getUTCDay(),u="'läschte";return 2!==t&&4!==t||(u+="n"),u+"' eeee 'um' p"},yesterday:"'gëschter um' p",today:"'haut um' p",tomorrow:"'moien um' p",nextWeek:"eeee 'um' p",other:"P"};t.default=function(e,t,u,r){var o=n[e];return"function"==typeof o?o(t):o},e.exports=t.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
[dir=ltr] .guideProviderSelectListings{margin:0 0 0 .5em}[dir=rtl] .guideProviderSelectListings{margin:0 .5em 0 0}
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[12394],{12394:function(e,s,u){u.r(s)}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[12519],{12519:function(a,t,e){e.r(t),e.d(t,{buildChapterCards:function(){return u}}),e(24776),e(14382),e(78557);var n=e(22696),c=e.n(n),r=e(67430),i=e(98320),d=e(76542),o=e(46782),s=e(34789),l=!s.A.slow&&!s.A.edge;function v(a,t,e,n,r,d,o){var s=r.width,l=r.coverImage,v=function(a,t,e,n,c){var r=a.Id,i=t.ImageTag;return i?c.getScaledImageUrl(r,{maxWidth:n,tag:i,type:"Chapter",index:e}):null}(a,e,n,s||400,t),u="cardContent cardContent-shadow cardImageContainer chapterCardImageContainer";l&&(u+=" coveredImage");var p=' data-action="play" data-isfolder="'.concat(a.IsFolder,'" data-id="').concat(a.Id,'" data-serverid="').concat(a.ServerId,'" data-type="').concat(a.Type,'" data-mediatype="').concat(a.MediaType,'" data-positionticks="').concat(e.StartPositionTicks,'"'),h=v?'<div class="'.concat(u,' lazy" data-src="').concat(v,'">'):'<div class="'.concat(u,'">');v||(h+='<span class="material-icons cardImageIcon local_movies" aria-hidden="true"></span>');var C="";return C+='<div class="cardText">'.concat(c()(e.Name),"</div>"),C+='<div class="cardText">'.concat(i.Ay.getDisplayRunningTime(e.StartPositionTicks),"</div>"),'<button type="button" class="'.concat(d,'"').concat(p,'><div class="').concat("cardBox",'"><div class="').concat("cardScalable",'"><div class="cardPadder-').concat(o,'"></div>').concat(h,'</div><div class="innerCardFooter">').concat(C,"</div></div></div></button>")}function u(a,t,e){if(e.parentContainer){if(!document.body.contains(e.parentContainer))return;if(!t.length)return void e.parentContainer.classList.add("hide");e.parentContainer.classList.remove("hide")}var n=function(a,t,e){var n,c="card itemAction chapterCard";o.A.tv&&(c+=" show-focus",l&&(c+=" show-animation"));var i=((null===(n=(a.MediaSources||[])[0])||void 0===n?void 0:n.MediaStreams)||[]).filter((function(a){return"Video"===a.Type}))[0]||{},d=e.backdropShape||"backdrop";i.Width&&i.Height&&i.Width/i.Height<=1.2&&(d=e.squareShape||"square"),c+=" ".concat(d,"Card"),(e.block||e.rows)&&(c+=" block");for(var s="",u=0,p=r.tF.getApiClient(a.ServerId),h=0,C=t.length;h<C;h++)e.rows&&0===u&&(s+='<div class="cardColumn">'),s+=v(a,p,t[h],h,e,c,d),u++,e.rows&&u>=e.rows&&(u=0,s+="</div>");return s}(a,t,e);e.itemsContainer.innerHTML=n,d.default.lazyChildren(e.itemsContainer)}t.default={buildChapterCards:u}}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[12557,17486,21933,37658,39867,44314,62248,95105],{12557:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=u(d(37658)),a={date:(0,l.default)({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} 'عند' {{time}}",long:"{{date}} 'عند' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})};e.default=a,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[9387,12849,19863,31768,42244,75101,94160,97482],{12849:function(e,t,n){"use strict";n(94),n(36947);var a=n(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=a(n(94160)),r={ordinalNumber:function(e){var t=Number(e);return 1===t?t+"-ლი":t+"-ე"},era:(0,i.default)({values:{narrow:["ჩ.წ-მდე","ჩ.წ"],abbreviated:["ჩვ.წ-მდე","ჩვ.წ"],wide:["ჩვენს წელთაღრიცხვამდე","ჩვენი წელთაღრიცხვით"]},defaultWidth:"wide"}),quarter:(0,i.default)({values:{narrow:["1","2","3","4"],abbreviated:["1-ლი კვ","2-ე კვ","3-ე კვ","4-ე კვ"],wide:["1-ლი კვარტალი","2-ე კვარტალი","3-ე კვარტალი","4-ე კვარტალი"]},defaultWidth:"wide",argumentCallback:function(e){return e-1}}),month:(0,i.default)({values:{narrow:["ია","თე","მა","აპ","მს","ვნ","ვლ","აგ","სე","ოქ","ნო","დე"],abbreviated:["იან","თებ","მარ","აპრ","მაი","ივნ","ივლ","აგვ","სექ","ოქტ","ნოე","დეკ"],wide:["იანვარი","თებერვალი","მარტი","აპრილი","მაისი","ივნისი","ივლისი","აგვისტო","სექტემბერი","ოქტომბერი","ნოემბერი","დეკემბერი"]},defaultWidth:"wide"}),day:(0,i.default)({values:{narrow:["კვ","ორ","სა","ოთ","ხუ","პა","შა"],short:["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],abbreviated:["კვი","ორშ","სამ","ოთხ","ხუთ","პარ","შაბ"],wide:["კვირა","ორშაბათი","სამშაბათი","ოთხშაბათი","ხუთშაბათი","პარასკევი","შაბათი"]},defaultWidth:"wide"}),dayPeriod:(0,i.default)({values:{narrow:{am:"a",pm:"p",midnight:"შუაღამე",noon:"შუადღე",morning:"დილა",afternoon:"საღამო",evening:"საღამო",night:"ღამე"},abbreviated:{am:"AM",pm:"PM",midnight:"შუაღამე",noon:"შუადღე",morning:"დილა",afternoon:"საღამო",evening:"საღამო",night:"ღამე"},wide:{am:"a.m.",pm:"p.m.",midnight:"შუაღამე",noon:"შუადღე",morning:"დილა",afternoon:"საღამო",evening:"საღამო",night:"ღამე"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"შუაღამით",noon:"შუადღისას",morning:"დილით",afternoon:"ნაშუადღევს",evening:"საღამოს",night:"ღამით"},abbreviated:{am:"AM",pm:"PM",midnight:"შუაღამით",noon:"შუადღისას",morning:"დილით",afternoon:"ნაშუადღევს",evening:"საღამოს",night:"ღამით"},wide:{am:"a.m.",pm:"p.m.",midnight:"შუაღამით",noon:"შუადღისას",morning:"დილით",afternoon:"ნაშუადღევს",evening:"საღამოს",night:"ღამით"}},defaultFormattingWidth:"wide"})};t.default=r,e.exports=t.default},94160:function(e,t,n){"use strict";n(44962),n(36947),n(78557),n(82367),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(t,n){var a;if("formatting"===(null!=n&&n.context?String(n.context):"standalone")&&e.formattingValues){var i=e.defaultFormattingWidth||e.defaultWidth,r=null!=n&&n.width?String(n.width):i;a=e.formattingValues[r]||e.formattingValues[i]}else{var d=e.defaultWidth,o=null!=n&&n.width?String(n.width):e.defaultWidth;a=e.values[o]||e.values[d]}return a[e.argumentCallback?e.argumentCallback(t):t]}},e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[1286,17486,21933,37658,39867,44314,62248,95105],{1286:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=u(d(37658)),f={date:(0,l.default)({formats:{full:"EEEE d MMMM y",long:"d MMMM y",medium:"d MMM y",short:"y-MM-dd"},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"'kl'. HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} 'kl.' {{time}}",long:"{{date}} 'kl.' {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},defaultWidth:"full"})};e.default=f,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[13135,17486,21933,37658,39867,44314,62248,95105],{13135:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=u(d(37658)),a={date:(0,l.default)({formats:{full:"y'年'M'月'd'日' EEEE",long:"y'年'M'月'd'日'",medium:"yyyy-MM-dd",short:"yy-MM-dd"},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"zzzz a h:mm:ss",long:"z a h:mm:ss",medium:"a h:mm:ss",short:"a h:mm"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},defaultWidth:"full"})};e.default=a,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[13231],{13231:function(u,e,t){t(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r={lastWeek:function(u){switch(u.getUTCDay()){case 0:return"'prošlu nedjelju u' p";case 3:return"'prošlu srijedu u' p";case 6:return"'prošlu subotu u' p";default:return"'prošli' EEEE 'u' p"}},yesterday:"'jučer u' p",today:"'danas u' p",tomorrow:"'sutra u' p",nextWeek:function(u){switch(u.getUTCDay()){case 0:return"'iduću nedjelju u' p";case 3:return"'iduću srijedu u' p";case 6:return"'iduću subotu u' p";default:return"'prošli' EEEE 'u' p"}},other:"P"};e.default=function(u,e,t,n){var a=r[u];return"function"==typeof a?a(e):a},u.exports=e.default}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,2 @@
|
||||
.mediaInfoItem{padding:0}[dir=ltr] .mediaInfoItem{margin:0 1em 0 0}[dir=rtl] .mediaInfoItem{margin:0 0 0 1em}.mediaInfoText{-webkit-align-items:center;align-items:center;border-radius:.25em;display:-webkit-flex;display:flex;font-size:92%;margin:0 .5em 0 0;padding:.22em .5em;white-space:nowrap}.mediaInfoText-upper{text-transform:uppercase}.mediaInfoIconItem{font-size:1.6em;height:auto;margin-right:.6em;width:auto}[dir=ltr] .mediaInfoItem:last-child{margin-right:0}[dir=rtl] .mediaInfoItem:last-child{margin-left:0}.starRatingContainer{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;vertical-align:middle}.starIcon{color:#f2b01e;font-size:1.4em;height:auto!important;margin-right:.125em;width:auto!important}.mediaInfoCriticRating{-webkit-align-items:center;align-items:center;background-repeat:no-repeat;background-size:auto 1.2em;display:-webkit-flex;display:flex;min-height:1.2em}[dir=ltr] .mediaInfoCriticRating{background-position:0;padding-left:1.5em}[dir=rtl] .mediaInfoCriticRating{background-position:100%;padding-right:1.5em}.mediaInfoCriticRatingFresh{background-image:url(assets/img/fresh.svg)}.mediaInfoCriticRatingRotten{background-image:url(assets/img/rotten.svg)}.mediaInfoProgramAttribute{border-radius:.15em;font-size:80%;padding:.16em .6em;text-transform:uppercase}.closedCaptionMediaInfoText{font-weight:700}
|
||||
.btnFilterWithIndicator{position:relative}.filterIndicator{-webkit-align-items:center;align-items:center;background:#03a9f4;border-radius:100em;box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);color:#fff;display:-webkit-flex;display:flex;font-size:60%;font-weight:700;height:1.8em;-webkit-justify-content:center;justify-content:center;position:absolute;right:2px;top:2px;width:1.8em;z-index:1}
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[9387,13356,19863,31768,42244,75101,94160,97482],{13356:function(e,t,n){"use strict";n(94),n(36947);var a=n(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var i=a(n(94160)),o={ordinalNumber:function(e,t){var n=Number(e);return String(n)},era:(0,i.default)({values:{narrow:["aC","dC"],abbreviated:["a.C.","d.C."],wide:["avanti Cristo","dopo Cristo"]},defaultWidth:"wide"}),quarter:(0,i.default)({values:{narrow:["1","2","3","4"],abbreviated:["T1","T2","T3","T4"],wide:["1º trimestre","2º trimestre","3º trimestre","4º trimestre"]},defaultWidth:"wide",argumentCallback:function(e){return e-1}}),month:(0,i.default)({values:{narrow:["G","F","M","A","M","G","L","A","S","O","N","D"],abbreviated:["gen","feb","mar","apr","mag","giu","lug","ago","set","ott","nov","dic"],wide:["gennaio","febbraio","marzo","aprile","maggio","giugno","luglio","agosto","settembre","ottobre","novembre","dicembre"]},defaultWidth:"wide"}),day:(0,i.default)({values:{narrow:["D","L","M","M","G","V","S"],short:["dom","lun","mar","mer","gio","ven","sab"],abbreviated:["dom","lun","mar","mer","gio","ven","sab"],wide:["domenica","lunedì","martedì","mercoledì","giovedì","venerdì","sabato"]},defaultWidth:"wide"}),dayPeriod:(0,i.default)({values:{narrow:{am:"m.",pm:"p.",midnight:"mezzanotte",noon:"mezzogiorno",morning:"mattina",afternoon:"pomeriggio",evening:"sera",night:"notte"},abbreviated:{am:"AM",pm:"PM",midnight:"mezzanotte",noon:"mezzogiorno",morning:"mattina",afternoon:"pomeriggio",evening:"sera",night:"notte"},wide:{am:"AM",pm:"PM",midnight:"mezzanotte",noon:"mezzogiorno",morning:"mattina",afternoon:"pomeriggio",evening:"sera",night:"notte"}},defaultWidth:"wide",formattingValues:{narrow:{am:"m.",pm:"p.",midnight:"mezzanotte",noon:"mezzogiorno",morning:"di mattina",afternoon:"del pomeriggio",evening:"di sera",night:"di notte"},abbreviated:{am:"AM",pm:"PM",midnight:"mezzanotte",noon:"mezzogiorno",morning:"di mattina",afternoon:"del pomeriggio",evening:"di sera",night:"di notte"},wide:{am:"AM",pm:"PM",midnight:"mezzanotte",noon:"mezzogiorno",morning:"di mattina",afternoon:"del pomeriggio",evening:"di sera",night:"di notte"}},defaultFormattingWidth:"wide"})};t.default=o,e.exports=t.default},94160:function(e,t,n){"use strict";n(44962),n(36947),n(78557),n(82367),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(t,n){var a;if("formatting"===(null!=n&&n.context?String(n.context):"standalone")&&e.formattingValues){var i=e.defaultFormattingWidth||e.defaultWidth,o=null!=n&&n.width?String(n.width):i;a=e.formattingValues[o]||e.formattingValues[i]}else{var r=e.defaultWidth,d=null!=n&&n.width?String(n.width):e.defaultWidth;a=e.values[d]||e.values[r]}return a[e.argumentCallback?e.argumentCallback(t):t]}},e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[1367,17486,21933,37658,39867,44314,62248,95105],{1367:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=u(d(37658)),f={date:(0,l.default)({formats:{full:"EEEE, do MMMM y",long:"do MMMM y",medium:"do MMM y",short:"dd.MM.y"},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})};e.default=f,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[13734],{13734:function(n,e,o){o(36947),o(95021),o(93062),Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={lessThanXSeconds:{one:"mwens pase yon segond",other:"mwens pase {{count}} segond"},xSeconds:{one:"1 segond",other:"{{count}} segond"},halfAMinute:"30 segond",lessThanXMinutes:{one:"mwens pase yon minit",other:"mwens pase {{count}} minit"},xMinutes:{one:"1 minit",other:"{{count}} minit"},aboutXHours:{one:"anviwon inè",other:"anviwon {{count}} è"},xHours:{one:"1 lè",other:"{{count}} lè"},xDays:{one:"1 jou",other:"{{count}} jou"},aboutXWeeks:{one:"anviwon 1 semèn",other:"anviwon {{count}} semèn"},xWeeks:{one:"1 semèn",other:"{{count}} semèn"},aboutXMonths:{one:"anviwon 1 mwa",other:"anviwon {{count}} mwa"},xMonths:{one:"1 mwa",other:"{{count}} mwa"},aboutXYears:{one:"anviwon 1 an",other:"anviwon {{count}} an"},xYears:{one:"1 an",other:"{{count}} an"},overXYears:{one:"plis pase 1 an",other:"plis pase {{count}} an"},almostXYears:{one:"prèske 1 an",other:"prèske {{count}} an"}};e.default=function(n,e,o){var s,a=t[n];return s="string"==typeof a?a:1===e?a.one:a.other.replace("{{count}}",String(e)),null!=o&&o.addSuffix?o.comparison&&o.comparison>0?"nan "+s:"sa fè "+s:s},n.exports=e.default}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[10807,13960,33188],{10564:function(e){function t(o){return e.exports=t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e.exports.__esModule=!0,e.exports.default=e.exports,t(o)}e.exports=t,e.exports.__esModule=!0,e.exports.default=e.exports},13141:function(e,t,o){"use strict";o(36947);var r=o(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var n=r(o(56974));function u(e,t,o){var r="eeee p";return(0,n.default)(e,t,o)?r:e.getTime()>t.getTime()?"'下个'"+r:"'上个'"+r}var s={lastWeek:u,yesterday:"'昨天' p",today:"'今天' p",tomorrow:"'明天' p",nextWeek:u,other:"PP p"};t.default=function(e,t,o,r){var n=s[e];return"function"==typeof n?n(t,o,r):n},e.exports=t.default},33188:function(e,t,o){"use strict";o(36947),o(78557),o(73687);var r=o(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){(0,u.default)(1,arguments);var t=Object.prototype.toString.call(e);return e instanceof Date||"object"===(0,n.default)(e)&&"[object Date]"===t?new Date(e.getTime()):"number"==typeof e||"[object Number]"===t?new Date(e):("string"!=typeof e&&"[object String]"!==t||"undefined"==typeof console||(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments"),console.warn((new Error).stack)),new Date(NaN))};var n=r(o(10564)),u=r(o(23058));e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[14112,17486,21933,37658,39867,44314,62248,95105],{14112:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var a=u(d(37658)),l={date:(0,a.default)({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:(0,a.default)({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:(0,a.default)({formats:{full:"{{date}} 'aig' {{time}}",long:"{{date}} 'aig' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})};e.default=l,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,5 @@
|
||||
@-webkit-keyframes fadein{0%{opacity:0}to{opacity:1}}@keyframes fadein{0%{opacity:0}to{opacity:1}}.lazy-image-fadein{-webkit-animation:fadein .5s;animation:fadein .5s;opacity:1}.lazy-image-fadein-fast{-webkit-animation:fadein .1s;animation:fadein .1s;opacity:1}.lazy-hidden,.lazy-hidden-children *{opacity:0}.blurhash-canvas{bottom:0;height:100%;left:0;pointer-events:none;position:absolute;right:0;top:0;width:100%}
|
||||
.actionSheet{border:none;border-radius:.1em!important;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;max-height:84%;padding:0}.actionsheet-not-fullscreen{max-height:90%;max-width:90%}.actionsheet-fullscreen{border-radius:0!important;max-height:none}.actionSheetContent-centered{-webkit-align-items:center;align-items:center;text-align:center}.actionSheetContent{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:center;justify-content:center;margin:0!important;overflow:hidden;padding:.4em 0!important}.actionSheetMenuItem{border-radius:0;box-shadow:none;-webkit-flex-shrink:0;flex-shrink:0;font-weight:inherit;margin:0}.actionSheetMenuItem:focus{-webkit-transform:none!important;transform:none!important}[dir=ltr] .actionsheetListItemBody{padding:.4em 1em .4em .6em!important}[dir=rtl] .actionsheetListItemBody{padding:.4em .6em .4em 1em!important}.actionSheetItemText{display:-webkit-flex;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:flex-start;justify-content:flex-start;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.actionSheetItemAsideText{display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;font-size:90%;-webkit-justify-content:flex-end;justify-content:flex-end;opacity:.7}[dir=ltr] .actionSheetItemAsideText{margin-left:5em;margin-right:.5em}[dir=rtl] .actionSheetItemAsideText{margin-left:.5em;margin-right:5em}.actionSheetScroller{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;margin-bottom:0!important;width:100%}.actionSheetScroller-tv{max-height:64%;max-width:60%;width:auto}.actionsheetDivider{-webkit-flex-shrink:0;flex-shrink:0;height:.07em;margin:.25em 0}.actionSheetTitle{margin:.6em 0 .7em!important}.actionSheetText,.actionSheetTitle{-webkit-flex-grow:0;flex-grow:0;padding:0 .75rem}.actionSheetText{margin-top:0}.actionsheetMenuItemIcon{padding:0!important}[dir=ltr] .actionsheetMenuItemIcon{margin:0 .85em 0 .45em!important}[dir=rtl] .actionsheetMenuItemIcon{margin:0 .45em 0 .85em!important}.actionsheet-xlargeFont{font-size:112%!important}.btnCloseActionSheet{position:fixed;top:.75em}[dir=ltr] .btnCloseActionSheet{left:.5em}[dir=rtl] .btnCloseActionSheet{right:.5em}
|
||||
.appfooter{bottom:0;contain:layout style;left:0;padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right);position:fixed;right:0;transition:-webkit-transform .18s linear;transition:transform .18s linear;transition:transform .18s linear,-webkit-transform .18s linear;z-index:1201!important}.appfooter:empty{padding:0}.appfooter.headroom--unpinned{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}
|
||||
.nowPlayingBarInfoContainer{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;height:100%;overflow:hidden;width:40%}.nowPlayingBar{contain:layout style;cursor:pointer;text-align:center;transition:-webkit-transform .2s ease-out;transition:transform .2s ease-out;transition:transform .2s ease-out,-webkit-transform .2s ease-out;will-change:transform}.nowPlayingBar-hidden{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.nowPlayingBarTop{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:4.2em;-webkit-justify-content:center;justify-content:center;position:relative}.mediaButton,.nowPlayingBarUserDataButtons .btnUserItemRating{margin:0;text-align:center;vertical-align:middle}.mediaButton{font-size:120%}.nowPlayingBar .nowPlayingImage{background-position:50%;background-repeat:no-repeat;background-size:contain;-webkit-flex-shrink:0;flex-shrink:0;height:70%;width:4.2em}.nowPlayingBarText{-webkit-flex-grow:1;flex-grow:1;font-size:92%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}[dir=ltr] .nowPlayingBarText{margin-left:.5em;margin-right:1em;text-align:left}[dir=rtl] .nowPlayingBarText{margin-left:1em;margin-right:.5em;text-align:right}.nowPlayingBarCenter{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:center;justify-content:center;position:absolute;text-align:center;vertical-align:middle;z-index:2}.nowPlayingBarPositionContainer{left:0;position:absolute!important;right:0;top:-.56em;z-index:1}.headroom--unpinned .nowPlayingBarPositionContainer,.noMediaProgress .nowPlayingBarPositionContainer{display:none}.nowPlayingBarRight{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;-webkit-justify-content:flex-end;justify-content:flex-end;position:relative;z-index:2}[dir=ltr] .nowPlayingBarRight{margin:0 .5em 0 auto}[dir=rtl] .nowPlayingBarRight{margin:0 auto 0 .5em}.nowPlayingBarCurrentTime{display:inline-block;padding-left:1.5em;text-align:center;vertical-align:middle}[dir=ltr] .nowPlayingBarVolumeSliderContainer{margin-right:2em}[dir=rtl] .nowPlayingBarVolumeSliderContainer{margin-left:2em}.nowPlayingBarUserDataButtons{display:inline-block}.nowPlayingBarPositionSlider::-webkit-slider-thumb{height:1.2em!important;width:1.2em!important}@media (max-width:70em){.nowPlayingBarRight .nowPlayingBarUserDataButtons{display:none}}@media (max-width:66em){.nowPlayingBar .btnShuffleQueue,.toggleRepeatButton{display:none!important}}@media (max-width:80em){.nowPlayingBarCenter .nowPlayingBarCurrentTime,.nowPlayingBarCenter .stopButton{display:none!important}.nowPlayingBarInfoContainer{width:45%}}.layout-desktop .nowPlayingBarRight .playPauseButton,.layout-mobile .nowPlayingBarRight button:not(.playPauseButton):not(.nextTrackButton),.layout-mobile .nowPlayingBarRight div,.layout-mobile .nowPlayingBarRight input,.layout-tv .nowPlayingBarRight .playPauseButton{display:none}@media (max-width:56em){.nowPlayingBarCenter{display:none!important}}@media (max-width:60em){.nowPlayingBarRight .nowPlayingBarVolumeSliderContainer{display:none!important}.nowPlayingBarInfoContainer{width:100%}}@media (max-width:24em){.nowPlayingBar .muteButton,.nowPlayingBar .unmuteButton{display:none}}
|
||||
.mdl-slider{-webkit-align-self:center;align-self:center;-webkit-appearance:none;appearance:none;background:transparent;color:#00a4dc;cursor:pointer;height:150%;margin:0;outline:0;-webkit-user-select:none;-ms-user-select:none;user-select:none;width:100%;z-index:1;-webkit-tap-highlight-color:rgba(0,0,0,0);display:block;font-size:inherit}.mdl-slider::-moz-focus-outer{border:0}.mdl-slider::-ms-tooltip{display:none}.mdl-slider::-webkit-slider-runnable-track{background:transparent}.mdl-slider::-ms-track{background:none;border:none;color:transparent;height:.2em;width:100%}.mdl-slider::-ms-fill-lower,.mdl-slider::-ms-fill-upper{display:none}.slider-browser-edge{margin-left:-.16em;margin-right:-.16em;width:150%}.mdl-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;background:#00a4dc;border:none;border-radius:50%;box-sizing:border-box;height:1.08em;pointer-events:none;-webkit-transition:.2s;transition:.2s;width:1.08em}.mdl-slider-hoverthumb:hover::-webkit-slider-thumb,.mdl-slider.show-focus:focus::-webkit-slider-thumb{-webkit-transform:scale(1.3);transform:scale(1.3)}.mdl-slider::-moz-range-thumb{appearance:none;background:#00a4dc;background-image:none;border:none;border-radius:50%;box-sizing:border-box;height:1.08em;-moz-transition:.2s;transition:.2s;width:1.08em}.mdl-slider-hoverthumb:hover::-moz-range-thumb,.mdl-slider.show-focus:focus::-moz-range-thumb{transform:scale(1.3)}.mdl-slider::-ms-thumb{appearance:none;background:#00a4dc;border:none;border-radius:50%;box-sizing:border-box;height:1.4em;transform:scale(.771429);-ms-transition:.2s;transition:.2s;width:1.4em}.mdl-slider-hoverthumb:hover::-ms-thumb,.mdl-slider.show-focus:focus::-ms-thumb{transform:none}.mdl-slider[disabled]::-webkit-slider-thumb{display:none}.mdl-slider[disabled]::-moz-range-thumb{display:none}.mdl-slider[disabled]::-ms-thumb{display:none}.mdl-slider-container{background:none;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;height:1.25em;position:relative}.mdl-slider-background-flex-container{box-sizing:border-box;padding:0 .54em;position:absolute;top:50%;width:100%}[dir=ltr] .mdl-slider-background-flex-container{left:0}[dir=rtl] .mdl-slider-background-flex-container{right:0}.mdl-slider-background-flex{background:hsla(0,0%,100%,.3);border:0;display:-webkit-flex;display:flex;height:.2em;margin-top:-.1em;overflow:hidden;padding:0;top:50%;width:100%}[dir=ltr] .mdl-slider-background-flex{left:0}[dir=rtl] .mdl-slider-background-flex{right:0}.mdl-slider-background-flex-inner{position:relative;width:100%}.mdl-slider-background-lower{background-color:#00a4dc;bottom:0;position:absolute;top:0;width:0}[dir=ltr] .mdl-slider-background-lower{left:0}[dir=rtl] .mdl-slider-background-lower{right:0}.mdl-slider-background-lower-clear{background-color:transparent}.mdl-slider-background-lower-withtransform{-webkit-transform:scaleX(0);transform:scaleX(0);-webkit-transform-origin:left center;transform-origin:left center;width:100%}.mdl-slider-background-upper{background:#666;background:hsla(0,0%,100%,.4);bottom:0;left:0;position:absolute;top:0;width:0}.sliderBubbleTrack{left:0;margin:0 .54em;position:absolute;right:0}.sliderBubble{-webkit-align-items:center;align-items:center;background:#282828;color:#fff;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;left:0;position:absolute;top:0;-webkit-transform:translate3d(-50%,-120%,0);transform:translate3d(-50%,-120%,0);z-index:1}.sliderBubbleText{margin:0;padding:.5em .75em}.sliderContainer-settings{margin-bottom:1.8em;position:relative}.sliderContainer-settings .mdl-slider-container{height:2.83em}.sliderLabel{display:block;margin-bottom:.25em}.sliderMarkerContainer{left:0;margin:0 .54em;position:absolute;right:0}.sliderMarker{height:12px;position:absolute;-webkit-transform:translate3d(0,25%,0);transform:translate3d(0,25%,0);width:2px}.sliderMarker.unwatched{background-color:hsla(0,0%,100%,.3)}.sliderMarker.watched{background-color:#00a4dc}
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,3 @@
|
||||
.actionSheet{border:none;border-radius:.1em!important;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;max-height:84%;padding:0}.actionsheet-not-fullscreen{max-height:90%;max-width:90%}.actionsheet-fullscreen{border-radius:0!important;max-height:none}.actionSheetContent-centered{-webkit-align-items:center;align-items:center;text-align:center}.actionSheetContent{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:center;justify-content:center;margin:0!important;overflow:hidden;padding:.4em 0!important}.actionSheetMenuItem{border-radius:0;box-shadow:none;-webkit-flex-shrink:0;flex-shrink:0;font-weight:inherit;margin:0}.actionSheetMenuItem:focus{-webkit-transform:none!important;transform:none!important}[dir=ltr] .actionsheetListItemBody{padding:.4em 1em .4em .6em!important}[dir=rtl] .actionsheetListItemBody{padding:.4em .6em .4em 1em!important}.actionSheetItemText{display:-webkit-flex;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:flex-start;justify-content:flex-start;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.actionSheetItemAsideText{display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;font-size:90%;-webkit-justify-content:flex-end;justify-content:flex-end;opacity:.7}[dir=ltr] .actionSheetItemAsideText{margin-left:5em;margin-right:.5em}[dir=rtl] .actionSheetItemAsideText{margin-left:.5em;margin-right:5em}.actionSheetScroller{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;margin-bottom:0!important;width:100%}.actionSheetScroller-tv{max-height:64%;max-width:60%;width:auto}.actionsheetDivider{-webkit-flex-shrink:0;flex-shrink:0;height:.07em;margin:.25em 0}.actionSheetTitle{margin:.6em 0 .7em!important}.actionSheetText,.actionSheetTitle{-webkit-flex-grow:0;flex-grow:0;padding:0 .75rem}.actionSheetText{margin-top:0}.actionsheetMenuItemIcon{padding:0!important}[dir=ltr] .actionsheetMenuItemIcon{margin:0 .85em 0 .45em!important}[dir=rtl] .actionsheetMenuItemIcon{margin:0 .45em 0 .85em!important}.actionsheet-xlargeFont{font-size:112%!important}.btnCloseActionSheet{position:fixed;top:.75em}[dir=ltr] .btnCloseActionSheet{left:.5em}[dir=rtl] .btnCloseActionSheet{right:.5em}
|
||||
.emby-select{box-sizing:border-box;display:block;font-family:inherit;font-size:110%;font-weight:inherit;margin:0;margin-bottom:0!important;outline:none!important;-webkit-tap-highlight-color:rgba(0,0,0,0);width:100%}[dir=ltr] .emby-select{padding:.5em 1.9em .5em .5em}[dir=rtl] .emby-select{padding:.5em .5em .5em 1.9em}.emby-select[disabled]{-webkit-appearance:none;appearance:none;background:none!important;border-color:transparent!important;color:inherit!important}.emby-select::-moz-focus-inner{border:0}.selectContainer-inline>.emby-select{font-size:inherit}[dir=ltr] .selectContainer-inline>.emby-select{padding:.3em 1.9em .3em .5em}[dir=rtl] .selectContainer-inline>.emby-select{padding:.3em .5em .3em 1.9em}.selectContainer-inline>.emby-select[disabled]{padding-left:0;padding-right:0}.emby-select-focusscale{-webkit-transform-origin:center center;transform-origin:center center;transition:-webkit-transform .18s ease-out!important;transition:transform .18s ease-out!important;transition:transform .18s ease-out,-webkit-transform .18s ease-out!important}.emby-select-focusscale:focus{-webkit-transform:scale(1.04);transform:scale(1.04);z-index:1}.emby-select+.fieldDescription{margin-top:.25em}.selectContainer{margin-bottom:1.8em;position:relative}.selectContainer-inline{-webkit-align-items:center;align-items:center;display:-webkit-inline-flex;display:inline-flex;margin-bottom:0}.selectLabel{display:block;margin-bottom:.25em}.selectContainer-inline>.selectLabel{-webkit-flex-shrink:0;flex-shrink:0;margin-bottom:0;margin-right:.5em}.trackSelections>.selectContainer{margin:.4em 0}.emby-select-withcolor{-webkit-appearance:none;appearance:none;border-radius:.2em}.selectArrowContainer{color:inherit;pointer-events:none;position:absolute;top:.2em}[dir=ltr] .selectArrowContainer{right:.3em}[dir=rtl] .selectArrowContainer{left:.3em}.selectContainer-inline>.selectArrowContainer{bottom:.24em;font-size:90%;top:auto}.emby-select[disabled]+.selectArrowContainer{display:none}.selectArrow{font-size:1.7em;margin-top:1.2em}.emby-select-iconbutton{-webkit-align-self:flex-end;align-self:flex-end}
|
||||
[dir=ltr] .guideProviderSelectListings{margin:0 0 0 .5em}[dir=rtl] .guideProviderSelectListings{margin:0 .5em 0 0}
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[14553],{14553:function(e,t,r){r(36947),Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var u={lastWeek:"eeee 'dernier à' p",yesterday:"'hier à' p",today:"'aujourd’hui à' p",tomorrow:"'demain à' p'",nextWeek:"eeee 'prochain à' p",other:"P"};t.default=function(e,t,r,a){return u[e]},e.exports=t.default}}]);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[4665,7184,15126,15141,27046,37522,49427,71808,83518],{7184:function(i,a,t){"use strict";t(89336),t(36947),t(95021),t(53819),Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(i){return function(a){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=t.width,r=e&&i.matchPatterns[e]||i.matchPatterns[i.defaultMatchWidth],n=a.match(r);if(!n)return null;var l,u=n[0],d=e&&i.parsePatterns[e]||i.parsePatterns[i.defaultParseWidth],s=Array.isArray(d)?function(i){for(var a=0;a<i.length;a++)if(i[a].test(u))return a}(d):function(i){for(var a in i)if(i.hasOwnProperty(a)&&i[a].test(u))return a}(d);return l=i.valueCallback?i.valueCallback(s):s,{value:l=t.valueCallback?t.valueCallback(l):l,rest:a.slice(u.length)}}},i.exports=a.default},15126:function(i,a,t){"use strict";t(36947),t(96054);var e=t(96784).default;Object.defineProperty(a,"__esModule",{value:!0}),a.default=void 0;var r=e(t(7184)),n={ordinalNumber:(0,e(t(83518)).default)({matchPattern:/\d+/i,parsePattern:/\d+/i,valueCallback:function(i){return parseInt(i,10)}}),era:(0,r.default)({matchPatterns:{narrow:/^(нтө|нт)/i,abbreviated:/^(нтө|нт)/i,wide:/^(нийтийн тооллын өмнө|нийтийн тооллын)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^(нтө|нийтийн тооллын өмнө)/i,/^(нт|нийтийн тооллын)/i]},defaultParseWidth:"any"}),quarter:(0,r.default)({matchPatterns:{narrow:/^(iv|iii|ii|i)/i,abbreviated:/^(iv|iii|ii|i) улирал/i,wide:/^[1-4]-р улирал/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^(i(\s|$)|1)/i,/^(ii(\s|$)|2)/i,/^(iii(\s|$)|3)/i,/^(iv(\s|$)|4)/i]},defaultParseWidth:"any",valueCallback:function(i){return i+1}}),month:(0,r.default)({matchPatterns:{narrow:/^(xii|xi|x|ix|viii|vii|vi|v|iv|iii|ii|i)/i,abbreviated:/^(1-р сар|2-р сар|3-р сар|4-р сар|5-р сар|6-р сар|7-р сар|8-р сар|9-р сар|10-р сар|11-р сар|12-р сар)/i,wide:/^(нэгдүгээр сар|хоёрдугаар сар|гуравдугаар сар|дөрөвдүгээр сар|тавдугаар сар|зургаадугаар сар|долоодугаар сар|наймдугаар сар|есдүгээр сар|аравдугаар сар|арван нэгдүгээр сар|арван хоёрдугаар сар)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^i$/i,/^ii$/i,/^iii$/i,/^iv$/i,/^v$/i,/^vi$/i,/^vii$/i,/^viii$/i,/^ix$/i,/^x$/i,/^xi$/i,/^xii$/i],any:[/^(1|нэгдүгээр)/i,/^(2|хоёрдугаар)/i,/^(3|гуравдугаар)/i,/^(4|дөрөвдүгээр)/i,/^(5|тавдугаар)/i,/^(6|зургаадугаар)/i,/^(7|долоодугаар)/i,/^(8|наймдугаар)/i,/^(9|есдүгээр)/i,/^(10|аравдугаар)/i,/^(11|арван нэгдүгээр)/i,/^(12|арван хоёрдугаар)/i]},defaultParseWidth:"any"}),day:(0,r.default)({matchPatterns:{narrow:/^[ндмлпбб]/i,short:/^(ня|да|мя|лх|пү|ба|бя)/i,abbreviated:/^(ням|дав|мяг|лха|пүр|баа|бям)/i,wide:/^(ням|даваа|мягмар|лхагва|пүрэв|баасан|бямба)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^н/i,/^д/i,/^м/i,/^л/i,/^п/i,/^б/i,/^б/i],any:[/^ня/i,/^да/i,/^мя/i,/^лх/i,/^пү/i,/^ба/i,/^бя/i]},defaultParseWidth:"any"}),dayPeriod:(0,r.default)({matchPatterns:{narrow:/^(ү\.ө\.|ү\.х\.|шөнө дунд|үд дунд|өглөө|өдөр|орой|шөнө)/i,any:/^(ү\.ө\.|ү\.х\.|шөнө дунд|үд дунд|өглөө|өдөр|орой|шөнө)/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^ү\.ө\./i,pm:/^ү\.х\./i,midnight:/^шөнө дунд/i,noon:/^үд дунд/i,morning:/өглөө/i,afternoon:/өдөр/i,evening:/орой/i,night:/шөнө/i}},defaultParseWidth:"any"})};a.default=n,i.exports=a.default},83518:function(i,a,t){"use strict";t(89336),t(36947),t(95021),t(53819),Object.defineProperty(a,"__esModule",{value:!0}),a.default=function(i){return function(a){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},e=a.match(i.matchPattern);if(!e)return null;var r=e[0],n=a.match(i.parsePattern);if(!n)return null;var l=i.valueCallback?i.valueCallback(n[0]):n[0];return{value:l=t.valueCallback?t.valueCallback(l):l,rest:a.slice(r.length)}}},i.exports=a.default},96784:function(i){i.exports=function(i){return i&&i.__esModule?i:{default:i}},i.exports.__esModule=!0,i.exports.default=i.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[4665,7184,15141,27046,37522,49427,71808,83518],{7184:function(e,t,a){"use strict";a(89336),a(36947),a(95021),a(53819),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=a.width,l=r&&e.matchPatterns[r]||e.matchPatterns[e.defaultMatchWidth],u=t.match(l);if(!u)return null;var n,c=u[0],s=r&&e.parsePatterns[r]||e.parsePatterns[e.defaultParseWidth],f=Array.isArray(s)?function(e){for(var t=0;t<e.length;t++)if(e[t].test(c))return t}(s):function(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t].test(c))return t}(s);return n=e.valueCallback?e.valueCallback(f):f,{value:n=a.valueCallback?a.valueCallback(n):n,rest:t.slice(c.length)}}},e.exports=t.default},83518:function(e,t,a){"use strict";a(89336),a(36947),a(95021),a(53819),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(t){var a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=t.match(e.matchPattern);if(!r)return null;var l=r[0],u=t.match(e.parsePattern);if(!u)return null;var n=e.valueCallback?e.valueCallback(u[0]):u[0];return{value:n=a.valueCallback?a.valueCallback(n):n,rest:t.slice(l.length)}}},e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[4665,7184,15141,15190,27046,37522,49427,71808,83518],{7184:function(a,e,i){"use strict";i(89336),i(36947),i(95021),i(53819),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){return function(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=i.width,r=t&&a.matchPatterns[t]||a.matchPatterns[a.defaultMatchWidth],n=e.match(r);if(!n)return null;var u,l=n[0],$=t&&a.parsePatterns[t]||a.parsePatterns[a.defaultParseWidth],d=Array.isArray($)?function(a){for(var e=0;e<a.length;e++)if(a[e].test(l))return e}($):function(a){for(var e in a)if(a.hasOwnProperty(e)&&a[e].test(l))return e}($);return u=a.valueCallback?a.valueCallback(d):d,{value:u=i.valueCallback?i.valueCallback(u):u,rest:e.slice(l.length)}}},a.exports=e.default},15190:function(a,e,i){"use strict";i(36947),i(96054);var t=i(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var r=t(i(7184)),n={ordinalNumber:(0,t(i(83518)).default)({matchPattern:/^(\d+)(-?(ci|inci|nci|uncu|üncü|ncı))?/i,parsePattern:/\d+/i,valueCallback:function(a){return parseInt(a,10)}}),era:(0,r.default)({matchPatterns:{narrow:/^(b|a)$/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)$/i,wide:/^(bizim eradan əvvəl|bizim era)$/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b$/i,/^(a|c)$/i]},defaultParseWidth:"any"}),quarter:(0,r.default)({matchPatterns:{narrow:/^[1234]$/i,abbreviated:/^K[1234]$/i,wide:/^[1234](ci)? kvartal$/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(a){return a+1}}),month:(0,r.default)({matchPatterns:{narrow:/^[(?-i)yfmaisond]$/i,abbreviated:/^(Yan|Fev|Mar|Apr|May|İyun|İyul|Avq|Sen|Okt|Noy|Dek)$/i,wide:/^(Yanvar|Fevral|Mart|Aprel|May|İyun|İyul|Avgust|Sentyabr|Oktyabr|Noyabr|Dekabr)$/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^[(?-i)y]$/i,/^[(?-i)f]$/i,/^[(?-i)m]$/i,/^[(?-i)a]$/i,/^[(?-i)m]$/i,/^[(?-i)i]$/i,/^[(?-i)i]$/i,/^[(?-i)a]$/i,/^[(?-i)s]$/i,/^[(?-i)o]$/i,/^[(?-i)n]$/i,/^[(?-i)d]$/i],abbreviated:[/^Yan$/i,/^Fev$/i,/^Mar$/i,/^Apr$/i,/^May$/i,/^İyun$/i,/^İyul$/i,/^Avg$/i,/^Sen$/i,/^Okt$/i,/^Noy$/i,/^Dek$/i],wide:[/^Yanvar$/i,/^Fevral$/i,/^Mart$/i,/^Aprel$/i,/^May$/i,/^İyun$/i,/^İyul$/i,/^Avgust$/i,/^Sentyabr$/i,/^Oktyabr$/i,/^Noyabr$/i,/^Dekabr$/i]},defaultParseWidth:"narrow"}),day:(0,r.default)({matchPatterns:{narrow:/^(B\.|B\.e|Ç\.a|Ç\.|C\.a|C\.|Ş\.)$/i,short:/^(B\.|B\.e|Ç\.a|Ç\.|C\.a|C\.|Ş\.)$/i,abbreviated:/^(Baz\.e|Çər|Çər\.a|Cüm|Cüm\.a|Şə)$/i,wide:/^(Bazar|Bazar ertəsi|Çərşənbə axşamı|Çərşənbə|Cümə axşamı|Cümə|Şənbə)$/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^B\.$/i,/^B\.e$/i,/^Ç\.a$/i,/^Ç\.$/i,/^C\.a$/i,/^C\.$/i,/^Ş\.$/i],abbreviated:[/^Baz$/i,/^Baz\.e$/i,/^Çər\.a$/i,/^Çər$/i,/^Cüm\.a$/i,/^Cüm$/i,/^Şə$/i],wide:[/^Bazar$/i,/^Bazar ertəsi$/i,/^Çərşənbə axşamı$/i,/^Çərşənbə$/i,/^Cümə axşamı$/i,/^Cümə$/i,/^Şənbə$/i],any:[/^B\.$/i,/^B\.e$/i,/^Ç\.a$/i,/^Ç\.$/i,/^C\.a$/i,/^C\.$/i,/^Ş\.$/i]},defaultParseWidth:"any"}),dayPeriod:(0,r.default)({matchPatterns:{narrow:/^(a|p|gecəyarı|gün|səhər|gündüz|axşam|gecə)$/i,any:/^(am|pm|a\.m\.|p\.m\.|AM|PM|gecəyarı|gün|səhər|gündüz|axşam|gecə)$/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a$/i,pm:/^p$/i,midnight:/^gecəyarı$/i,noon:/^gün$/i,morning:/səhər$/i,afternoon:/gündüz$/i,evening:/axşam$/i,night:/gecə$/i}},defaultParseWidth:"any"})};e.default=n,a.exports=e.default},83518:function(a,e,i){"use strict";i(89336),i(36947),i(95021),i(53819),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(a){return function(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},t=e.match(a.matchPattern);if(!t)return null;var r=t[0],n=e.match(a.parsePattern);if(!n)return null;var u=a.valueCallback?a.valueCallback(n[0]):n[0];return{value:u=i.valueCallback?i.valueCallback(u):u,rest:e.slice(r.length)}}},a.exports=e.default},96784:function(a){a.exports=function(a){return a&&a.__esModule?a:{default:a}},a.exports.__esModule=!0,a.exports.default=a.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[15605],{15605:function(t,e,a){a.r(e);var i=a(10736),r=a(5898),s=a(67430),n=a(44797),d=a(10353);function l(){var t=this,e=t.getAttribute("data-id"),a=t.getAttribute("data-serverid"),i=s.tF.getApiClient(a),r=this.getAttribute("data-likes");r="true"===r||"false"!==r&&null,function(t,e,a,i,r){return e.updateFavoriteStatus(e.getCurrentUserId(),a,!r)}(0,i,e,0,"true"===this.getAttribute("data-isfavorite")).then((function(e){c(t,e.Likes,e.IsFavorite)}))}function u(t,e,a){a.ItemId===this.getAttribute("data-id")&&c(this,a.Likes,a.IsFavorite)}function c(t,e,a,i){var r=t.querySelector(".material-icons");a?(r&&(r.classList.add("favorite"),r.classList.add("ratingbutton-icon-withrating")),t.classList.add("ratingbutton-withrating")):(r&&(r.classList.add("favorite"),r.classList.remove("ratingbutton-icon-withrating")),t.classList.remove("ratingbutton-withrating")),!1!==i&&(t.setAttribute("data-isfavorite",a),t.setAttribute("data-likes",null===e?"":e)),o(t,a)}function o(t,e){t.title=e?r.Ay.translate("Favorite"):r.Ay.translate("AddToFavorites");var a=t.querySelector(".button-text");a&&(a.innerText=t.title)}function h(t){var e,a,r;t.removeEventListener("click",l),(r=(e=t)[a="UserDataChanged"])&&(n.A.off(i.default,a,r),e[a]=null)}function b(t){var e,a,r;h(t),t.addEventListener("click",l),e=t,a="UserDataChanged",r=u.bind(e),n.A.on(i.default,a,r),e[a]=r}var v=Object.create(d.A);v.createdCallback=function(){d.A.createdCallback&&d.A.createdCallback.call(this)},v.attachedCallback=function(){d.A.attachedCallback&&d.A.attachedCallback.call(this);var t=this.getAttribute("data-id"),e=this.getAttribute("data-serverid");if(t&&e){var a=this.getAttribute("data-likes");c(this,a="true"===a||"false"!==a&&null,"true"===this.getAttribute("data-isfavorite"),!1),b(this)}else o(this)},v.detachedCallback=function(){d.A.detachedCallback&&d.A.detachedCallback.call(this),h(this)},v.setItem=function(t){if(t){this.setAttribute("data-id",t.Id),this.setAttribute("data-serverid",t.ServerId);var e=t.UserData||{};c(this,e.Likes,e.IsFavorite),b(this)}else this.removeAttribute("data-id"),this.removeAttribute("data-serverid"),this.removeAttribute("data-likes"),this.removeAttribute("data-isfavorite"),h(this)},document.registerElement("emby-ratingbutton",{prototype:v,extends:"button"})}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[15889],{15889:function(e,o,t){t(36947),Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0;var r={lastWeek:"'vorige' eeee 'om' p",yesterday:"'gisteren om' p",today:"'vandaag om' p",tomorrow:"'morgen om' p",nextWeek:"eeee 'om' p",other:"P"};o.default=function(e,o,t,a){return r[e]},e.exports=o.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[16235,17486,21933,37658,39867,44314,62248,95105],{16235:function(t,e,u){"use strict";u(36947);var d=u(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=d(u(37658)),a={date:(0,l.default)({formats:{full:"EEEE, d MMMM, y",long:"d MMMM, y",medium:"d MMM, y",short:"d/M/yy"},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"hh:mm:ss a zzzz",long:"hh:mm:ss a z",medium:"hh:mm:ss a",short:"hh:mm a"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},defaultWidth:"full"})};e.default=a,t.exports=e.default},37658:function(t,e,u){"use strict";u(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},u=e.width?String(e.width):t.defaultWidth;return t.formats[u]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[16327,17486,21933,37658,39867,44314,62248,95105],{16327:function(t,e,u){"use strict";u(36947);var d=u(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var f=d(u(37658)),l={date:(0,f.default)({formats:{full:"EEEE, do MMMM, y",long:"do MMMM, y",medium:"d MMM, y",short:"dd/MM/yyyy"},defaultWidth:"full"}),time:(0,f.default)({formats:{full:"H:mm:ss zzzz",long:"H:mm:ss z",medium:"H:mm:ss",short:"H:mm"},defaultWidth:"full"}),dateTime:(0,f.default)({formats:{any:"{{date}}, {{time}}"},defaultWidth:"any"})};e.default=l,t.exports=e.default},37658:function(t,e,u){"use strict";u(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},u=e.width?String(e.width):t.defaultWidth;return t.formats[u]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[16504],{16504:function(e,t,o){o(36947),Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var u={lastWeek:"eeee 'tuần trước vào lúc' p",yesterday:"'hôm qua vào lúc' p",today:"'hôm nay vào lúc' p",tomorrow:"'ngày mai vào lúc' p",nextWeek:"eeee 'tới vào lúc' p",other:"P"};t.default=function(e,t,o,a){return u[e]},e.exports=t.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[16526],{16526:function(o,e,t){t(36947),t(95021),t(93062),Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var n={lessThanXSeconds:{one:"น้อยกว่า 1 วินาที",other:"น้อยกว่า {{count}} วินาที"},xSeconds:{one:"1 วินาที",other:"{{count}} วินาที"},halfAMinute:"ครึ่งนาที",lessThanXMinutes:{one:"น้อยกว่า 1 นาที",other:"น้อยกว่า {{count}} นาที"},xMinutes:{one:"1 นาที",other:"{{count}} นาที"},aboutXHours:{one:"ประมาณ 1 ชั่วโมง",other:"ประมาณ {{count}} ชั่วโมง"},xHours:{one:"1 ชั่วโมง",other:"{{count}} ชั่วโมง"},xDays:{one:"1 วัน",other:"{{count}} วัน"},aboutXWeeks:{one:"ประมาณ 1 สัปดาห์",other:"ประมาณ {{count}} สัปดาห์"},xWeeks:{one:"1 สัปดาห์",other:"{{count}} สัปดาห์"},aboutXMonths:{one:"ประมาณ 1 เดือน",other:"ประมาณ {{count}} เดือน"},xMonths:{one:"1 เดือน",other:"{{count}} เดือน"},aboutXYears:{one:"ประมาณ 1 ปี",other:"ประมาณ {{count}} ปี"},xYears:{one:"1 ปี",other:"{{count}} ปี"},overXYears:{one:"มากกว่า 1 ปี",other:"มากกว่า {{count}} ปี"},almostXYears:{one:"เกือบ 1 ปี",other:"เกือบ {{count}} ปี"}};e.default=function(o,e,t){var u,r=n[o];return u="string"==typeof r?r:1===e?r.one:r.other.replace("{{count}}",String(e)),null!=t&&t.addSuffix?t.comparison&&t.comparison>0?"halfAMinute"===o?"ใน"+u:"ใน "+u:u+"ที่ผ่านมา":u},o.exports=e.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[16566],{16566:function(e,t,l){l(36947),Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r={lastWeek:"'sidste' eeee 'kl.' p",yesterday:"'i går kl.' p",today:"'i dag kl.' p",tomorrow:"'i morgen kl.' p",nextWeek:"'på' eeee 'kl.' p",other:"P"};t.default=function(e,t,l,o){return r[e]},e.exports=t.default}}]);
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[16914],{16914:function(e,o,t){t(36947),t(95021),t(93062),Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0;var n={lessThanXSeconds:{one:"më pak se një sekondë",other:"më pak se {{count}} sekonda"},xSeconds:{one:"1 sekondë",other:"{{count}} sekonda"},halfAMinute:"gjysëm minuti",lessThanXMinutes:{one:"më pak se një minute",other:"më pak se {{count}} minuta"},xMinutes:{one:"1 minutë",other:"{{count}} minuta"},aboutXHours:{one:"rreth 1 orë",other:"rreth {{count}} orë"},xHours:{one:"1 orë",other:"{{count}} orë"},xDays:{one:"1 ditë",other:"{{count}} ditë"},aboutXWeeks:{one:"rreth 1 javë",other:"rreth {{count}} javë"},xWeeks:{one:"1 javë",other:"{{count}} javë"},aboutXMonths:{one:"rreth 1 muaj",other:"rreth {{count}} muaj"},xMonths:{one:"1 muaj",other:"{{count}} muaj"},aboutXYears:{one:"rreth 1 vit",other:"rreth {{count}} vite"},xYears:{one:"1 vit",other:"{{count}} vite"},overXYears:{one:"mbi 1 vit",other:"mbi {{count}} vite"},almostXYears:{one:"pothuajse 1 vit",other:"pothuajse {{count}} vite"}};o.default=function(e,o,t){var r,u=n[e];return r="string"==typeof u?u:1===o?u.one:u.other.replace("{{count}}",String(o)),null!=t&&t.addSuffix?t.comparison&&t.comparison>0?"në "+r:r+" më parë":r},e.exports=o.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[9387,17133,19863,31768,42244,75101,94160,97482],{17133:function(e,t,a){"use strict";a(94),a(36947);var u=a(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=u(a(94160)),d={ordinalNumber:function(e,t){var a=Number(e),u=a%100;if(u>20||u<10)switch(u%10){case 1:return a+"-ви";case 2:return a+"-ри";case 7:case 8:return a+"-ми"}return a+"-ти"},era:(0,r.default)({values:{narrow:["пр.н.е.","н.е."],abbreviated:["пред н. е.","н. е."],wide:["пред нашата ера","нашата ера"]},defaultWidth:"wide"}),quarter:(0,r.default)({values:{narrow:["1","2","3","4"],abbreviated:["1-ви кв.","2-ри кв.","3-ти кв.","4-ти кв."],wide:["1-ви квартал","2-ри квартал","3-ти квартал","4-ти квартал"]},defaultWidth:"wide",argumentCallback:function(e){return e-1}}),month:(0,r.default)({values:{abbreviated:["јан","фев","мар","апр","мај","јун","јул","авг","септ","окт","ноем","дек"],wide:["јануари","февруари","март","април","мај","јуни","јули","август","септември","октомври","ноември","декември"]},defaultWidth:"wide"}),day:(0,r.default)({values:{narrow:["Н","П","В","С","Ч","П","С"],short:["не","по","вт","ср","че","пе","са"],abbreviated:["нед","пон","вто","сре","чет","пет","саб"],wide:["недела","понеделник","вторник","среда","четврток","петок","сабота"]},defaultWidth:"wide"}),dayPeriod:(0,r.default)({values:{wide:{am:"претпладне",pm:"попладне",midnight:"полноќ",noon:"напладне",morning:"наутро",afternoon:"попладне",evening:"навечер",night:"ноќе"}},defaultWidth:"wide"})};t.default=d,e.exports=t.default},94160:function(e,t,a){"use strict";a(44962),a(36947),a(78557),a(82367),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(t,a){var u;if("formatting"===(null!=a&&a.context?String(a.context):"standalone")&&e.formattingValues){var r=e.defaultFormattingWidth||e.defaultWidth,d=null!=a&&a.width?String(a.width):r;u=e.formattingValues[d]||e.formattingValues[r]}else{var n=e.defaultWidth,i=null!=a&&a.width?String(a.width):e.defaultWidth;u=e.values[i]||e.values[n]}return u[e.argumentCallback?e.argumentCallback(t):t]}},e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[17290,17486,21933,37658,39867,44314,62248,95105],{17290:function(t,e,u){"use strict";u(36947);var d=u(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=d(u(37658)),f={date:(0,l.default)({formats:{full:"EEEE, d. MMMM yyyy.",long:"d. MMMM yyyy.",medium:"d. MMM yy.",short:"dd. MM. yy."},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"HH:mm:ss (zzzz)",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} 'u' {{time}}",long:"{{date}} 'u' {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},defaultWidth:"full"})};e.default=f,t.exports=e.default},37658:function(t,e,u){"use strict";u(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},u=e.width?String(e.width):t.defaultWidth;return t.formats[u]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[17355,17486,21933,37658,39867,44314,62248,95105],{17355:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var a=u(d(37658)),l={date:(0,a.default)({formats:{full:"EEEE, d MMMM yyyy",long:"d MMMM yyyy",medium:"d MMM yyyy",short:"dd/MM/yyyy"},defaultWidth:"full"}),time:(0,a.default)({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:(0,a.default)({formats:{full:"{{date}} 'am' {{time}}",long:"{{date}} 'am' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})};e.default=l,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.recordingDialog-imageContainer{-webkit-flex-shrink:0;flex-shrink:0;padding:1em 1em 1em 0;width:25%}.recordingDialog-img{width:100%}.recordingDialog-itemName{margin-top:.7em}.recordingDetailsContainer{display:-webkit-flex;display:flex}.recordingDetails{-webkit-flex-grow:1;flex-grow:1}.recordingDetailText{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[17486,21933,37658,39867,44314,62248,95105],{37658:function(e,t,u){"use strict";u(36947),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},u=t.width?String(t.width):e.defaultWidth;return e.formats[u]||e.formats[e.defaultWidth]}},e.exports=t.default},96784:function(e){e.exports=function(e){return e&&e.__esModule?e:{default:e}},e.exports.__esModule=!0,e.exports.default=e.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[4665,7184,15141,17864,27046,37522,49427,71808,83518],{7184:function(a,t,e){"use strict";e(89336),e(36947),e(95021),e(53819),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(a){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=e.width,r=i&&a.matchPatterns[i]||a.matchPatterns[a.defaultMatchWidth],n=t.match(r);if(!n)return null;var l,u=n[0],d=i&&a.parsePatterns[i]||a.parsePatterns[a.defaultParseWidth],s=Array.isArray(d)?function(a){for(var t=0;t<a.length;t++)if(a[t].test(u))return t}(d):function(a){for(var t in a)if(a.hasOwnProperty(t)&&a[t].test(u))return t}(d);return l=a.valueCallback?a.valueCallback(s):s,{value:l=e.valueCallback?e.valueCallback(l):l,rest:t.slice(u.length)}}},a.exports=t.default},17864:function(a,t,e){"use strict";e(36947),e(96054);var i=e(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=i(e(7184)),n={ordinalNumber:(0,i(e(83518)).default)({matchPattern:/^(\d+)(ος|η|ο)?/i,parsePattern:/\d+/i,valueCallback:function(a){return parseInt(a,10)}}),era:(0,r.default)({matchPatterns:{narrow:/^(πΧ|μΧ)/i,abbreviated:/^(π\.?\s?χ\.?|π\.?\s?κ\.?\s?χ\.?|μ\.?\s?χ\.?|κ\.?\s?χ\.?)/i,wide:/^(προ Χριστο(ύ|υ)|πριν απ(ό|ο) την Κοιν(ή|η) Χρονολογ(ί|ι)α|μετ(ά|α) Χριστ(ό|ο)ν|Κοιν(ή|η) Χρονολογ(ί|ι)α)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^π/i,/^(μ|κ)/i]},defaultParseWidth:"any"}),quarter:(0,r.default)({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^τ[1234]/i,wide:/^[1234]ο? τρ(ί|ι)μηνο/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(a){return a+1}}),month:(0,r.default)({matchPatterns:{narrow:/^[ιφμαμιιασονδ]/i,abbreviated:/^(ιαν|φεβ|μ[άα]ρ|απρ|μ[άα][ιΐ]|ιο[ύυ]ν|ιο[ύυ]λ|α[ύυ]γ|σεπ|οκτ|νο[έε]|δεκ)/i,wide:/^(μ[άα][ιΐ]|α[ύυ]γο[υύ]στ)(ος|ου)|(ιανου[άα]ρ|φεβρου[άα]ρ|μ[άα]ρτ|απρ[ίι]λ|ιο[ύυ]ν|ιο[ύυ]λ|σεπτ[έε]μβρ|οκτ[ώω]βρ|νο[έε]μβρ|δεκ[έε]μβρ)(ιος|ίου)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^ι/i,/^φ/i,/^μ/i,/^α/i,/^μ/i,/^ι/i,/^ι/i,/^α/i,/^σ/i,/^ο/i,/^ν/i,/^δ/i],any:[/^ια/i,/^φ/i,/^μ[άα]ρ/i,/^απ/i,/^μ[άα][ιΐ]/i,/^ιο[ύυ]ν/i,/^ιο[ύυ]λ/i,/^α[ύυ]/i,/^σ/i,/^ο/i,/^ν/i,/^δ/i]},defaultParseWidth:"any"}),day:(0,r.default)({matchPatterns:{narrow:/^[κδτπσ]/i,short:/^(κυ|δε|τρ|τε|π[εέ]|π[αά]|σ[αά])/i,abbreviated:/^(κυρ|δευ|τρι|τετ|πεμ|παρ|σαβ)/i,wide:/^(κυριακ(ή|η)|δευτ(έ|ε)ρα|τρ(ί|ι)τη|τετ(ά|α)ρτη|π(έ|ε)μπτη|παρασκευ(ή|η)|σ(ά|α)ββατο)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^κ/i,/^δ/i,/^τ/i,/^τ/i,/^π/i,/^π/i,/^σ/i],any:[/^κ/i,/^δ/i,/^τρ/i,/^τε/i,/^π[εέ]/i,/^π[αά]/i,/^σ/i]},defaultParseWidth:"any"}),dayPeriod:(0,r.default)({matchPatterns:{narrow:/^(πμ|μμ|μεσ(ά|α)νυχτα|μεσημ(έ|ε)ρι|πρω(ί|ι)|απ(ό|ο)γευμα|βρ(ά|α)δυ|ν(ύ|υ)χτα)/i,any:/^([πμ]\.?\s?μ\.?|μεσ(ά|α)νυχτα|μεσημ(έ|ε)ρι|πρω(ί|ι)|απ(ό|ο)γευμα|βρ(ά|α)δυ|ν(ύ|υ)χτα)/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^πμ|π\.\s?μ\./i,pm:/^μμ|μ\.\s?μ\./i,midnight:/^μεσάν/i,noon:/^μεσημ(έ|ε)/i,morning:/πρω(ί|ι)/i,afternoon:/απ(ό|ο)γευμα/i,evening:/βρ(ά|α)δυ/i,night:/ν(ύ|υ)χτα/i}},defaultParseWidth:"any"})};t.default=n,a.exports=t.default},83518:function(a,t,e){"use strict";e(89336),e(36947),e(95021),e(53819),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(a){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.match(a.matchPattern);if(!i)return null;var r=i[0],n=t.match(a.parsePattern);if(!n)return null;var l=a.valueCallback?a.valueCallback(n[0]):n[0];return{value:l=e.valueCallback?e.valueCallback(l):l,rest:t.slice(r.length)}}},a.exports=t.default},96784:function(a){a.exports=function(a){return a&&a.__esModule?a:{default:a}},a.exports.__esModule=!0,a.exports.default=a.exports}}]);
|
||||
@@ -0,0 +1,3 @@
|
||||
.alphaPicker{-webkit-align-self:center;align-self:center;display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;text-align:center}.alphaPicker-vertical{line-height:1}.alphaPicker-fixed{bottom:5.5em;position:fixed}@supports(width:max(1px,1px)){.alphaPicker-fixed{bottom:max(env(safe-area-inset-bottom),5.5em)}}.alphaPickerRow{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-flex-direction:row;flex-direction:row;-webkit-justify-content:center;justify-content:center}.alphaPickerRow-vertical{-webkit-flex-direction:column;flex-direction:column}.alphaPickerButton{border:0!important;border-radius:.1em;cursor:pointer;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-shrink:0;flex-shrink:0;font-family:inherit;font-size:inherit;font-weight:400;margin:0;min-width:0;min-width:auto;outline:none!important;padding:.1em .4em;vertical-align:middle;width:auto}@media (max-height:50em){.alphaPicker-fixed{bottom:5em}@supports(width:max(1px,1px)){.alphaPicker-fixed{bottom:max(env(safe-area-inset-bottom),5em)}}.alphaPickerButton-vertical{padding-bottom:1px!important;padding-top:1px!important}}@media (max-height:49em){.alphaPicker-vertical{font-size:94%}}@media (max-height:44em){.alphaPicker-vertical{font-size:90%}.alphaPickerButton-vertical{padding-bottom:0!important;padding-top:0!important}}@media (max-height:37em){.alphaPicker-vertical{font-size:82%}}@media (max-height:32em){.alphaPicker-vertical{font-size:74%}}.alphaPicker-vertical.alphaPicker-tv{font-size:86%}.alphaPickerButton-tv.alphaPickerButton-vertical{padding:0}.alphaPickerButton-vertical{display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;text-align:center;width:1.5em}.alphaPickerButtonIcon{font-size:100%!important}.alphaPicker-fixed.alphaPicker-tv{bottom:1%}@supports(width:max(1px,1px)){.alphaPicker-fixed.alphaPicker-tv{bottom:max(env(safe-area-inset-bottom),1%)}}[dir=ltr] .alphaPicker-fixed-right{right:.4em}@supports(width:max(1px,1px)){[dir=ltr] .alphaPicker-fixed-right{right:max(env(safe-area-inset-right),.4em)}}[dir=rtl] .alphaPicker-fixed-right{left:.4em}@supports(width:max(1px,1px)){[dir=rtl] .alphaPicker-fixed-right{left:max(env(safe-area-inset-left),.4em)}}@media (min-width:62.5em){[dir=ltr] .alphaPicker-fixed-right{right:1em}@supports(width:max(1px,1px)){[dir=ltr] .alphaPicker-fixed-right{right:max(env(safe-area-inset-right),1em)}}[dir=rtl] .alphaPicker-fixed-right{left:1em}@supports(width:max(1px,1px)){[dir=rtl] .alphaPicker-fixed-right{left:max(env(safe-area-inset-left),1em)}}}@media (max-height:31.25em){.alphaPicker-fixed{display:none!important}}
|
||||
.mediaInfoItem{padding:0}[dir=ltr] .mediaInfoItem{margin:0 1em 0 0}[dir=rtl] .mediaInfoItem{margin:0 0 0 1em}.mediaInfoText{-webkit-align-items:center;align-items:center;border-radius:.25em;display:-webkit-flex;display:flex;font-size:92%;margin:0 .5em 0 0;padding:.22em .5em;white-space:nowrap}.mediaInfoText-upper{text-transform:uppercase}.mediaInfoIconItem{font-size:1.6em;height:auto;margin-right:.6em;width:auto}[dir=ltr] .mediaInfoItem:last-child{margin-right:0}[dir=rtl] .mediaInfoItem:last-child{margin-left:0}.starRatingContainer{-webkit-align-items:center;align-items:center;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;vertical-align:middle}.starIcon{color:#f2b01e;font-size:1.4em;height:auto!important;margin-right:.125em;width:auto!important}.mediaInfoCriticRating{-webkit-align-items:center;align-items:center;background-repeat:no-repeat;background-size:auto 1.2em;display:-webkit-flex;display:flex;min-height:1.2em}[dir=ltr] .mediaInfoCriticRating{background-position:0;padding-left:1.5em}[dir=rtl] .mediaInfoCriticRating{background-position:100%;padding-right:1.5em}.mediaInfoCriticRatingFresh{background-image:url(assets/img/fresh.svg)}.mediaInfoCriticRatingRotten{background-image:url(assets/img/rotten.svg)}.mediaInfoProgramAttribute{border-radius:.15em;font-size:80%;padding:.16em .6em;text-transform:uppercase}.closedCaptionMediaInfoText{font-weight:700}
|
||||
.btnFilterWithIndicator{position:relative}.filterIndicator{-webkit-align-items:center;align-items:center;background:#03a9f4;border-radius:100em;box-shadow:0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12),0 2px 4px -1px rgba(0,0,0,.2);color:#fff;display:-webkit-flex;display:flex;font-size:60%;font-weight:700;height:1.8em;-webkit-justify-content:center;justify-content:center;position:absolute;right:2px;top:2px;width:1.8em;z-index:1}
|
||||
@@ -0,0 +1,6 @@
|
||||
.actionSheet{border:none;border-radius:.1em!important;display:-webkit-flex;display:flex;-webkit-justify-content:center;justify-content:center;max-height:84%;padding:0}.actionsheet-not-fullscreen{max-height:90%;max-width:90%}.actionsheet-fullscreen{border-radius:0!important;max-height:none}.actionSheetContent-centered{-webkit-align-items:center;align-items:center;text-align:center}.actionSheetContent{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:center;justify-content:center;margin:0!important;overflow:hidden;padding:.4em 0!important}.actionSheetMenuItem{border-radius:0;box-shadow:none;-webkit-flex-shrink:0;flex-shrink:0;font-weight:inherit;margin:0}.actionSheetMenuItem:focus{-webkit-transform:none!important;transform:none!important}[dir=ltr] .actionsheetListItemBody{padding:.4em 1em .4em .6em!important}[dir=rtl] .actionsheetListItemBody{padding:.4em .6em .4em 1em!important}.actionSheetItemText{display:-webkit-flex;display:flex;-webkit-flex-grow:1;flex-grow:1;-webkit-justify-content:flex-start;justify-content:flex-start;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.actionSheetItemAsideText{display:-webkit-flex;display:flex;-webkit-flex-shrink:0;flex-shrink:0;font-size:90%;-webkit-justify-content:flex-end;justify-content:flex-end;opacity:.7}[dir=ltr] .actionSheetItemAsideText{margin-left:5em;margin-right:.5em}[dir=rtl] .actionSheetItemAsideText{margin-left:.5em;margin-right:5em}.actionSheetScroller{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;margin-bottom:0!important;width:100%}.actionSheetScroller-tv{max-height:64%;max-width:60%;width:auto}.actionsheetDivider{-webkit-flex-shrink:0;flex-shrink:0;height:.07em;margin:.25em 0}.actionSheetTitle{margin:.6em 0 .7em!important}.actionSheetText,.actionSheetTitle{-webkit-flex-grow:0;flex-grow:0;padding:0 .75rem}.actionSheetText{margin-top:0}.actionsheetMenuItemIcon{padding:0!important}[dir=ltr] .actionsheetMenuItemIcon{margin:0 .85em 0 .45em!important}[dir=rtl] .actionsheetMenuItemIcon{margin:0 .45em 0 .85em!important}.actionsheet-xlargeFont{font-size:112%!important}.btnCloseActionSheet{position:fixed;top:.75em}[dir=ltr] .btnCloseActionSheet{left:.5em}[dir=rtl] .btnCloseActionSheet{right:.5em}
|
||||
.emby-select{box-sizing:border-box;display:block;font-family:inherit;font-size:110%;font-weight:inherit;margin:0;margin-bottom:0!important;outline:none!important;-webkit-tap-highlight-color:rgba(0,0,0,0);width:100%}[dir=ltr] .emby-select{padding:.5em 1.9em .5em .5em}[dir=rtl] .emby-select{padding:.5em .5em .5em 1.9em}.emby-select[disabled]{-webkit-appearance:none;appearance:none;background:none!important;border-color:transparent!important;color:inherit!important}.emby-select::-moz-focus-inner{border:0}.selectContainer-inline>.emby-select{font-size:inherit}[dir=ltr] .selectContainer-inline>.emby-select{padding:.3em 1.9em .3em .5em}[dir=rtl] .selectContainer-inline>.emby-select{padding:.3em .5em .3em 1.9em}.selectContainer-inline>.emby-select[disabled]{padding-left:0;padding-right:0}.emby-select-focusscale{-webkit-transform-origin:center center;transform-origin:center center;transition:-webkit-transform .18s ease-out!important;transition:transform .18s ease-out!important;transition:transform .18s ease-out,-webkit-transform .18s ease-out!important}.emby-select-focusscale:focus{-webkit-transform:scale(1.04);transform:scale(1.04);z-index:1}.emby-select+.fieldDescription{margin-top:.25em}.selectContainer{margin-bottom:1.8em;position:relative}.selectContainer-inline{-webkit-align-items:center;align-items:center;display:-webkit-inline-flex;display:inline-flex;margin-bottom:0}.selectLabel{display:block;margin-bottom:.25em}.selectContainer-inline>.selectLabel{-webkit-flex-shrink:0;flex-shrink:0;margin-bottom:0;margin-right:.5em}.trackSelections>.selectContainer{margin:.4em 0}.emby-select-withcolor{-webkit-appearance:none;appearance:none;border-radius:.2em}.selectArrowContainer{color:inherit;pointer-events:none;position:absolute;top:.2em}[dir=ltr] .selectArrowContainer{right:.3em}[dir=rtl] .selectArrowContainer{left:.3em}.selectContainer-inline>.selectArrowContainer{bottom:.24em;font-size:90%;top:auto}.emby-select[disabled]+.selectArrowContainer{display:none}.selectArrow{font-size:1.7em;margin-top:1.2em}.emby-select-iconbutton{-webkit-align-self:flex-end;align-self:flex-end}
|
||||
.emby-textarea{box-sizing:border-box;color:inherit;display:block;font-family:inherit;font-size:110%;font-weight:inherit;margin:0;margin-bottom:0!important;outline:none!important;padding:.35em .25em;-webkit-tap-highlight-color:rgba(0,0,0,0);min-height:2.5em;width:100%}.emby-textarea::-moz-focus-inner{border:0}.textareaLabel{display:inline-block;margin-bottom:.25em;transition:all .2s ease-out}.emby-textarea+.fieldDescription{margin-top:.25em}
|
||||
[dir=ltr] .raised.btnImageOptionsForType{margin-left:1.5em}[dir=rtl] .raised.btnImageOptionsForType{margin-right:1.5em}
|
||||
.mdl-switch{-webkit-align-items:center;align-items:center;box-sizing:border-box;display:-webkit-inline-flex;display:inline-flex;margin:0;overflow:visible;padding:0;position:relative;vertical-align:middle;width:100%;z-index:1;-webkit-touch-callout:none;-webkit-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-justify-content:flex-end;justify-content:flex-end;-webkit-user-select:none;-ms-user-select:none;user-select:none}.toggleContainer{margin-bottom:1.8em}.mdl-switch__input{-webkit-appearance:none;appearance:none;border:none;height:0;margin:0;opacity:0;padding:0;width:0}.mdl-switch__trackContainer{position:relative;width:2.9em}.mdl-switch__track{background:hsla(0,0%,50%,.5);border-radius:1em;cursor:pointer;height:1em}.mdl-switch__input:checked+.mdl-switch__label+.mdl-switch__trackContainer>.mdl-switch__track{background:rgba(0,164,220,.5)}.mdl-switch__input[disabled]+.mdl-switch__label+.mdl-switch__trackContainer>.mdl-switch__track{background:rgba(0,0,0,.12);cursor:auto}.mdl-switch__thumb{-webkit-align-items:center;align-items:center;background:#999;border-radius:50%;box-shadow:0 2px 2px 0 rgba(0,0,0,.14),0 3px 1px -2px rgba(0,0,0,.2),0 1px 5px 0 rgba(0,0,0,.12);cursor:pointer;display:-webkit-flex;display:flex;height:1.44em;-webkit-justify-content:center;justify-content:center;position:absolute;top:-.25em;transition-duration:.28s;transition-property:left;transition-timing-function:cubic-bezier(.4,0,.2,1);width:1.44em}[dir=ltr] .mdl-switch__thumb{left:0}[dir=rtl] .mdl-switch__thumb{right:0}.mdl-switch__input:checked+.mdl-switch__label+.mdl-switch__trackContainer>.mdl-switch__thumb{background:#00a4dc;box-shadow:0 3px .28em 0 rgba(0,0,0,.14),0 3px 3px -2px rgba(0,0,0,.2),0 1px .56em 0 rgba(0,0,0,.12);left:1.466em}.mdl-switch__input[disabled]+.mdl-switch__label+.mdl-switch__trackContainer>.mdl-switch__thumb{background:#bdbdbd;cursor:auto}.mdl-switch__focus-helper{background-color:transparent;border-radius:50%;box-sizing:border-box;display:inline-block;height:.6em;left:50%;position:absolute;top:50%;-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);width:.6em}.mdl-switch__input:focus+.mdl-switch__label+.mdl-switch__trackContainer .mdl-switch__focus-helper{box-shadow:0 0 0 1.39em rgba(0,0,0,.05)}.mdl-switch__input:checked:focus+.mdl-switch__label+.mdl-switch__trackContainer .mdl-switch__focus-helper{background-color:rgba(0,164,220,.26);box-shadow:0 0 0 1.39em rgba(0,164,220,.26)}.mdl-switch__label{-webkit-align-items:center;align-items:center;cursor:pointer;display:-webkit-inline-flex;display:inline-flex;margin:0;margin-left:.7em}.mdl-switch__input[disabled] .mdl-switch__label{color:#bdbdbd;cursor:auto}
|
||||
[dir=ltr] .fab.btnAddFolder.submit{margin-left:1em}[dir=rtl] .fab.btnAddFolder.submit{margin-right:1em}[dir=ltr] .listItem.listItem-border.lnkPath{padding-left:.5em}[dir=rtl] .listItem.listItem-border.lnkPath{padding-right:.5em}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
|
||||
.playerStats{background:rgba(28,28,28,.8);border-radius:.3em;color:#fff;position:absolute;top:5em}[dir=ltr] .playerStats{left:1.5em}[dir=rtl] .playerStats{right:1.5em}.playerStats-tv{top:4em}.playerStats-content{font-size:84%;position:relative}.playerStats-content-tv{font-size:60%}.playerStats-closeButton{color:#ccc;position:absolute;right:.25em;top:.25em;z-index:1}.playerStats-stats{display:-webkit-flex;display:flex;-webkit-flex-direction:column;flex-direction:column;max-width:50em;overflow:hidden}[dir=ltr] .playerStats-stats{padding:0 3em 1em 1em}[dir=rtl] .playerStats-stats{padding:0 1em 1em 3em}.playerStats-stat{display:-webkit-flex;display:flex}[dir=ltr] .playerStats-stat{margin-left:1em}[dir=rtl] .playerStats-stat{margin-right:1em}.playerStats-stat-label{font-weight:500}[dir=ltr] .playerStats-stat-label{margin:0 .5em 0 0}[dir=rtl] .playerStats-stat-label{margin:0 0 0 .5em}[dir=ltr] .playerStats-stat-header{margin:1em 1em 0 0}[dir=rtl] .playerStats-stat-header{margin:1em 0 0 1em}.playerStats-stat-value{color:#ddd}
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[18395],{18395:function(e,t,a){a(36947),Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var o={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};t.default=function(e,t,a,r){return o[e]},e.exports=t.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[18591],{18591:function(n,e,o){o(36947),o(95021),o(93062),Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var a={lessThanXSeconds:{one:"inqas minn sekonda",other:"inqas minn {{count}} sekondi"},xSeconds:{one:"sekonda",other:"{{count}} sekondi"},halfAMinute:"nofs minuta",lessThanXMinutes:{one:"inqas minn minuta",other:"inqas minn {{count}} minuti"},xMinutes:{one:"minuta",other:"{{count}} minuti"},aboutXHours:{one:"madwar siegħa",other:"madwar {{count}} siegħat"},xHours:{one:"siegħa",other:"{{count}} siegħat"},xDays:{one:"ġurnata",other:"{{count}} ġranet"},aboutXWeeks:{one:"madwar ġimgħa",other:"madwar {{count}} ġimgħat"},xWeeks:{one:"ġimgħa",other:"{{count}} ġimgħat"},aboutXMonths:{one:"madwar xahar",other:"madwar {{count}} xhur"},xMonths:{one:"xahar",other:"{{count}} xhur"},aboutXYears:{one:"madwar sena",two:"madwar sentejn",other:"madwar {{count}} snin"},xYears:{one:"sena",two:"sentejn",other:"{{count}} snin"},overXYears:{one:"aktar minn sena",two:"aktar minn sentejn",other:"aktar minn {{count}} snin"},almostXYears:{one:"kważi sena",two:"kważi sentejn",other:"kważi {{count}} snin"}};e.default=function(n,e,o){var t,s=a[n];return t="string"==typeof s?s:1===e?s.one:2===e&&s.two?s.two:s.other.replace("{{count}}",String(e)),null!=o&&o.addSuffix?o.comparison&&o.comparison>0?"f'"+t:t+" ilu":t},n.exports=e.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[18934],{18934:function(o,n,t){t(36947),t(95021),t(93062),Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var e={lessThanXSeconds:{one:{regular:"mniej niż sekunda",past:"mniej niż sekundę",future:"mniej niż sekundę"},twoFour:"mniej niż {{count}} sekundy",other:"mniej niż {{count}} sekund"},xSeconds:{one:{regular:"sekunda",past:"sekundę",future:"sekundę"},twoFour:"{{count}} sekundy",other:"{{count}} sekund"},halfAMinute:{one:"pół minuty",twoFour:"pół minuty",other:"pół minuty"},lessThanXMinutes:{one:{regular:"mniej niż minuta",past:"mniej niż minutę",future:"mniej niż minutę"},twoFour:"mniej niż {{count}} minuty",other:"mniej niż {{count}} minut"},xMinutes:{one:{regular:"minuta",past:"minutę",future:"minutę"},twoFour:"{{count}} minuty",other:"{{count}} minut"},aboutXHours:{one:{regular:"około godziny",past:"około godziny",future:"około godzinę"},twoFour:"około {{count}} godziny",other:"około {{count}} godzin"},xHours:{one:{regular:"godzina",past:"godzinę",future:"godzinę"},twoFour:"{{count}} godziny",other:"{{count}} godzin"},xDays:{one:{regular:"dzień",past:"dzień",future:"1 dzień"},twoFour:"{{count}} dni",other:"{{count}} dni"},aboutXWeeks:{one:"około tygodnia",twoFour:"około {{count}} tygodni",other:"około {{count}} tygodni"},xWeeks:{one:"tydzień",twoFour:"{{count}} tygodnie",other:"{{count}} tygodni"},aboutXMonths:{one:"około miesiąc",twoFour:"około {{count}} miesiące",other:"około {{count}} miesięcy"},xMonths:{one:"miesiąc",twoFour:"{{count}} miesiące",other:"{{count}} miesięcy"},aboutXYears:{one:"około rok",twoFour:"około {{count}} lata",other:"około {{count}} lat"},xYears:{one:"rok",twoFour:"{{count}} lata",other:"{{count}} lat"},overXYears:{one:"ponad rok",twoFour:"ponad {{count}} lata",other:"ponad {{count}} lat"},almostXYears:{one:"prawie rok",twoFour:"prawie {{count}} lata",other:"prawie {{count}} lat"}};function u(o,n,t){var e=function(o,n){if(1===n)return o.one;var t=n%100;if(t<=20&&t>10)return o.other;var e=t%10;return e>=2&&e<=4?o.twoFour:o.other}(o,n);return("string"==typeof e?e:e[t]).replace("{{count}}",String(n))}n.default=function(o,n,t){var r=e[o];return null!=t&&t.addSuffix?t.comparison&&t.comparison>0?"za "+u(r,n,"future"):u(r,n,"past")+" temu":u(r,n,"regular")},o.exports=n.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[1912,4665,7184,15141,27046,37522,49427,71808,83518],{1912:function(a,t,e){"use strict";e(36947),e(96054);var i=e(96784).default;Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r=i(e(7184)),n={ordinalNumber:(0,i(e(83518)).default)({matchPattern:/^(\d+)(º)?/i,parsePattern:/\d+/i,valueCallback:function(a){return parseInt(a,10)}}),era:(0,r.default)({matchPatterns:{narrow:/^(q|w)/i,abbreviated:/^(q\.?\s?k\.?|b\.?\s?c\.?\s?e\.?|w\.?\s?k\.?)/i,wide:/^(qabel kristu|before common era|wara kristu|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^(q|b)/i,/^(w|c)/i]},defaultParseWidth:"any"}),quarter:(0,r.default)({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^k[1234]/i,wide:/^[1234](\.)? kwart/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(a){return a+1}}),month:(0,r.default)({matchPatterns:{narrow:/^[jfmaglsond]/i,abbreviated:/^(jan|fra|mar|apr|mej|ġun|lul|aww|set|ott|nov|diċ)/i,wide:/^(jannar|frar|marzu|april|mejju|ġunju|lulju|awwissu|settembru|ottubru|novembru|diċembru)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^ġ/i,/^l/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^mej/i,/^ġ/i,/^l/i,/^aw/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:(0,r.default)({matchPatterns:{narrow:/^[ħteġs]/i,short:/^(ħa|tn|tl|er|ħa|ġi|si)/i,abbreviated:/^(ħad|tne|tli|erb|ħam|ġim|sib)/i,wide:/^(il-ħadd|it-tnejn|it-tlieta|l-erbgħa|il-ħamis|il-ġimgħa|is-sibt)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^ħ/i,/^t/i,/^t/i,/^e/i,/^ħ/i,/^ġ/i,/^s/i],any:[/^(il-)?ħad/i,/^(it-)?tn/i,/^(it-)?tl/i,/^(l-)?er/i,/^(il-)?ham/i,/^(il-)?ġi/i,/^(is-)?si/i]},defaultParseWidth:"any"}),dayPeriod:(0,r.default)({matchPatterns:{narrow:/^(a|p|f'nofsillejl|f'nofsinhar|(ta') (għodwa|wara nofsinhar|filgħaxija|lejl))/i,any:/^([ap]\.?\s?m\.?|f'nofsillejl|f'nofsinhar|(ta') (għodwa|wara nofsinhar|filgħaxija|lejl))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^f'nofsillejl/i,noon:/^f'nofsinhar/i,morning:/għodwa/i,afternoon:/wara(\s.*)nofsinhar/i,evening:/filgħaxija/i,night:/lejl/i}},defaultParseWidth:"any"})};t.default=n,a.exports=t.default},7184:function(a,t,e){"use strict";e(89336),e(36947),e(95021),e(53819),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(a){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=e.width,r=i&&a.matchPatterns[i]||a.matchPatterns[a.defaultMatchWidth],n=t.match(r);if(!n)return null;var l,u=n[0],s=i&&a.parsePatterns[i]||a.parsePatterns[a.defaultParseWidth],d=Array.isArray(s)?function(a){for(var t=0;t<a.length;t++)if(a[t].test(u))return t}(s):function(a){for(var t in a)if(a.hasOwnProperty(t)&&a[t].test(u))return t}(s);return l=a.valueCallback?a.valueCallback(d):d,{value:l=e.valueCallback?e.valueCallback(l):l,rest:t.slice(u.length)}}},a.exports=t.default},83518:function(a,t,e){"use strict";e(89336),e(36947),e(95021),e(53819),Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(a){return function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=t.match(a.matchPattern);if(!i)return null;var r=i[0],n=t.match(a.parsePattern);if(!n)return null;var l=a.valueCallback?a.valueCallback(n[0]):n[0];return{value:l=e.valueCallback?e.valueCallback(l):l,rest:t.slice(r.length)}}},a.exports=t.default},96784:function(a){a.exports=function(a){return a&&a.__esModule?a:{default:a}},a.exports.__esModule=!0,a.exports.default=a.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[19187],{19187:function(e,o,t){t(36947),Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0;var a={lastWeek:"'afgelopen' eeee 'om' p",yesterday:"'gisteren om' p",today:"'vandaag om' p",tomorrow:"'morgen om' p",nextWeek:"eeee 'om' p",other:"P"};o.default=function(e,o,t,n){return a[e]},e.exports=o.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[19292],{19292:function(e,o,t){t(36947),t(78557),t(95021),t(73687),t(93062),Object.defineProperty(o,"__esModule",{value:!0}),o.default=void 0;var n={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"a second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"a minute",other:"{{count}} minutes"},aboutXHours:{one:"about an hour",other:"about {{count}} hours"},xHours:{one:"an hour",other:"{{count}} hours"},xDays:{one:"a day",other:"{{count}} days"},aboutXWeeks:{one:"about a week",other:"about {{count}} weeks"},xWeeks:{one:"a week",other:"{{count}} weeks"},aboutXMonths:{one:"about a month",other:"about {{count}} months"},xMonths:{one:"a month",other:"{{count}} months"},aboutXYears:{one:"about a year",other:"about {{count}} years"},xYears:{one:"a year",other:"{{count}} years"},overXYears:{one:"over a year",other:"over {{count}} years"},almostXYears:{one:"almost a year",other:"almost {{count}} years"}};o.default=function(e,o,t){var a,s=n[e];return a="string"==typeof s?s:1===o?s.one:s.other.replace("{{count}}",o.toString()),null!=t&&t.addSuffix?t.comparison&&t.comparison>0?"in "+a:a+" ago":a},e.exports=o.default}}]);
|
||||
@@ -0,0 +1 @@
|
||||
"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[19842],{19842:function(e,t,n){n.r(t),n(29305),n(32733),n(84701),n(81678),n(44962),n(4754),n(94),n(36947),n(78557),n(83994),n(82367);var r=n(36300),i=n(44797);function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function a(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,u(r.key),r)}}function u(e){var t=function(e){if("object"!=o(e)||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=o(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==o(t)?t:t+""}function l(e){return e.changedTouches||e.targetTouches||e.touches}var s=function(){return e=function e(t,n){var o,a,u,s,c,v;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e);var h=this,f=(n=n||{}).swipeXThreshold||50,p=n.swipeYThreshold||50,y=n.ignoreTagNames||[],d=function(e){var t=l(e)[0];if(o=null,a=0,u=0,s=null,c=null,v=!1,t){var n=t.target;if(r.Ay.parentWithTag(n,y))return;o=n,a=t.clientX,u=t.clientY}},m=function(e){var t="touchmove"===e.type;if(o){var r,y,d,m,b=l(e)[0];b?(d=b.clientX||0,m=b.clientY||0,r=d-(a||0),y=m-(u||0)):(r=0,y=0);var g=null==s?r:r-s,w=null==c?y:y-c;s=r,c=y,r>f&&Math.abs(y)<30?i.A.trigger(h,"swiperight",[o]):r<0-f&&Math.abs(y)<30?i.A.trigger(h,"swipeleft",[o]):(y<0-p||v)&&Math.abs(r)<30?(v=!0,i.A.trigger(h,"swipeup",[o,{deltaY:y,deltaX:r,clientX:d,clientY:m,currentDeltaX:g,currentDeltaY:w}])):(y>p||v)&&Math.abs(r)<30&&(v=!0,i.A.trigger(h,"swipedown",[o,{deltaY:y,deltaX:r,clientX:d,clientY:m,currentDeltaX:g,currentDeltaY:w}])),t&&n.preventDefaultOnMove&&e.preventDefault()}t||(o=null,a=0,u=0,s=null,c=null,v=!1)};this.touchStart=d,this.touchEnd=m,r.Ay.addEventListener(t,"touchstart",d,{passive:!0}),n.triggerOnMove&&r.Ay.addEventListener(t,"touchmove",m,{passive:!n.preventDefaultOnMove}),r.Ay.addEventListener(t,"touchend",m,{passive:!0}),r.Ay.addEventListener(t,"touchcancel",m,{passive:!0})},(t=[{key:"destroy",value:function(){var e=this.elem;if(e){var t=this.touchStart,n=this.touchEnd;r.Ay.removeEventListener(e,"touchstart",t,{passive:!0}),r.Ay.removeEventListener(e,"touchmove",n,{passive:!0}),r.Ay.removeEventListener(e,"touchend",n,{passive:!0}),r.Ay.removeEventListener(e,"touchcancel",n,{passive:!0})}this.touchStart=null,this.touchEnd=null,this.elem=null}}])&&a(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t}();t.default=s}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[1986,17486,21933,37658,39867,44314,62248,95105],{1986:function(t,e,d){"use strict";d(36947);var u=d(96784).default;Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var l=u(d(37658)),f={date:(0,l.default)({formats:{full:"EEEE, 'ngày' d MMMM 'năm' y",long:"'ngày' d MMMM 'năm' y",medium:"d MMM 'năm' y",short:"dd/MM/y"},defaultWidth:"full"}),time:(0,l.default)({formats:{full:"HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},defaultWidth:"full"}),dateTime:(0,l.default)({formats:{full:"{{date}} {{time}}",long:"{{date}} {{time}}",medium:"{{date}} {{time}}",short:"{{date}} {{time}}"},defaultWidth:"full"})};e.default=f,t.exports=e.default},37658:function(t,e,d){"use strict";d(36947),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},d=e.width?String(e.width):t.defaultWidth;return t.formats[d]||t.formats[t.defaultWidth]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
@@ -0,0 +1 @@
|
||||
(self.webpackChunk=self.webpackChunk||[]).push([[9387,19863,31768,42244,75101,94160,97482],{94160:function(t,e,u){"use strict";u(44962),u(36947),u(78557),u(82367),Object.defineProperty(e,"__esModule",{value:!0}),e.default=function(t){return function(e,u){var n;if("formatting"===(null!=u&&u.context?String(u.context):"standalone")&&t.formattingValues){var a=t.defaultFormattingWidth||t.defaultWidth,l=null!=u&&u.width?String(u.width):a;n=t.formattingValues[l]||t.formattingValues[a]}else{var r=t.defaultWidth,i=null!=u&&u.width?String(u.width):t.defaultWidth;n=t.values[i]||t.values[r]}return n[t.argumentCallback?t.argumentCallback(e):e]}},t.exports=e.default},96784:function(t){t.exports=function(t){return t&&t.__esModule?t:{default:t}},t.exports.__esModule=!0,t.exports.default=t.exports}}]);
|
||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user