mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-11-15 09:59:06 -07:00
Merge pull request #6667 from Bond-009/warn53
This commit is contained in:
commit
a01f9775ff
@ -20,7 +20,6 @@
|
|||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<AnalysisMode>AllDisabledByDefault</AnalysisMode>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<!-- Code Analyzers-->
|
<!-- Code Analyzers-->
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
<TargetFramework>net6.0</TargetFramework>
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<AnalysisMode>AllDisabledByDefault</AnalysisMode>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||||
<IncludeSymbols>true</IncludeSymbols>
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
<AnalysisMode>AllDisabledByDefault</AnalysisMode>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Stability)'=='Unstable'">
|
<PropertyGroup Condition=" '$(Stability)'=='Unstable'">
|
||||||
|
@ -306,7 +306,7 @@ namespace Emby.Server.Implementations
|
|||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public string Name => ApplicationProductName;
|
public string Name => ApplicationProductName;
|
||||||
|
|
||||||
private CertificateInfo CertificateInfo { get; set; }
|
private string CertificatePath { get; set; }
|
||||||
|
|
||||||
public X509Certificate2 Certificate { get; private set; }
|
public X509Certificate2 Certificate { get; private set; }
|
||||||
|
|
||||||
@ -548,12 +548,8 @@ namespace Emby.Server.Implementations
|
|||||||
HttpsPort = NetworkConfiguration.DefaultHttpsPort;
|
HttpsPort = NetworkConfiguration.DefaultHttpsPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
CertificateInfo = new CertificateInfo
|
CertificatePath = networkConfiguration.CertificatePath;
|
||||||
{
|
Certificate = GetCertificate(CertificatePath, networkConfiguration.CertificatePassword);
|
||||||
Path = networkConfiguration.CertificatePath,
|
|
||||||
Password = networkConfiguration.CertificatePassword
|
|
||||||
};
|
|
||||||
Certificate = GetCertificate(CertificateInfo);
|
|
||||||
|
|
||||||
RegisterServices();
|
RegisterServices();
|
||||||
|
|
||||||
@ -729,30 +725,27 @@ namespace Emby.Server.Implementations
|
|||||||
logger.LogInformation("Application directory: {ApplicationPath}", appPaths.ProgramSystemPath);
|
logger.LogInformation("Application directory: {ApplicationPath}", appPaths.ProgramSystemPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
private X509Certificate2 GetCertificate(CertificateInfo info)
|
private X509Certificate2 GetCertificate(string path, string password)
|
||||||
{
|
{
|
||||||
var certificateLocation = info?.Path;
|
if (string.IsNullOrWhiteSpace(path))
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(certificateLocation))
|
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!File.Exists(certificateLocation))
|
if (!File.Exists(path))
|
||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't use an empty string password
|
// Don't use an empty string password
|
||||||
var password = string.IsNullOrWhiteSpace(info.Password) ? null : info.Password;
|
password = string.IsNullOrWhiteSpace(password) ? null : password;
|
||||||
|
|
||||||
var localCert = new X509Certificate2(certificateLocation, password, X509KeyStorageFlags.UserKeySet);
|
var localCert = new X509Certificate2(path, password, X509KeyStorageFlags.UserKeySet);
|
||||||
// localCert.PrivateKey = PrivateKey.CreateFromFile(pvk_file).RSA;
|
|
||||||
if (!localCert.HasPrivateKey)
|
if (!localCert.HasPrivateKey)
|
||||||
{
|
{
|
||||||
Logger.LogError("No private key included in SSL cert {CertificateLocation}.", certificateLocation);
|
Logger.LogError("No private key included in SSL cert {CertificateLocation}.", path);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -760,7 +753,7 @@ namespace Emby.Server.Implementations
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.LogError(ex, "Error loading cert from {CertificateLocation}", certificateLocation);
|
Logger.LogError(ex, "Error loading cert from {CertificateLocation}", path);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -882,7 +875,7 @@ namespace Emby.Server.Implementations
|
|||||||
"http://" + i + ":" + HttpPort + "/"
|
"http://" + i + ":" + HttpPort + "/"
|
||||||
};
|
};
|
||||||
|
|
||||||
if (CertificateInfo != null)
|
if (Certificate != null)
|
||||||
{
|
{
|
||||||
prefixes.Add("https://" + i + ":" + HttpsPort + "/");
|
prefixes.Add("https://" + i + ":" + HttpsPort + "/");
|
||||||
}
|
}
|
||||||
@ -946,7 +939,7 @@ namespace Emby.Server.Implementations
|
|||||||
var newPath = networkConfig.CertificatePath;
|
var newPath = networkConfig.CertificatePath;
|
||||||
|
|
||||||
if (!string.IsNullOrWhiteSpace(newPath)
|
if (!string.IsNullOrWhiteSpace(newPath)
|
||||||
&& !string.Equals(CertificateInfo?.Path, newPath, StringComparison.Ordinal))
|
&& !string.Equals(CertificatePath, newPath, StringComparison.Ordinal))
|
||||||
{
|
{
|
||||||
if (File.Exists(newPath))
|
if (File.Exists(newPath))
|
||||||
{
|
{
|
||||||
@ -1293,11 +1286,4 @@ namespace Emby.Server.Implementations
|
|||||||
_disposed = true;
|
_disposed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class CertificateInfo
|
|
||||||
{
|
|
||||||
public string Path { get; set; }
|
|
||||||
|
|
||||||
public string Password { get; set; }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ namespace Emby.Server.Implementations.Data
|
|||||||
/// <value>The write connection.</value>
|
/// <value>The write connection.</value>
|
||||||
protected SQLiteDatabaseConnection WriteConnection { get; set; }
|
protected SQLiteDatabaseConnection WriteConnection { get; set; }
|
||||||
|
|
||||||
protected ManagedConnection GetConnection(bool _ = false)
|
protected ManagedConnection GetConnection(bool readOnly = false)
|
||||||
{
|
{
|
||||||
WriteLock.Wait();
|
WriteLock.Wait();
|
||||||
if (WriteConnection != null)
|
if (WriteConnection != null)
|
||||||
|
@ -47,11 +47,6 @@
|
|||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<!-- https://github.com/microsoft/ApplicationInsights-dotnet/issues/2047 -->
|
<!-- https://github.com/microsoft/ApplicationInsights-dotnet/issues/2047 -->
|
||||||
<NoWarn>AD0001</NoWarn>
|
<NoWarn>AD0001</NoWarn>
|
||||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release'">
|
|
||||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<!-- Code Analyzers-->
|
<!-- Code Analyzers-->
|
||||||
|
@ -65,13 +65,13 @@ namespace Emby.Server.Implementations.Images
|
|||||||
if (SupportedImages.Contains(ImageType.Primary))
|
if (SupportedImages.Contains(ImageType.Primary))
|
||||||
{
|
{
|
||||||
var primaryResult = await FetchAsync(item, ImageType.Primary, options, cancellationToken).ConfigureAwait(false);
|
var primaryResult = await FetchAsync(item, ImageType.Primary, options, cancellationToken).ConfigureAwait(false);
|
||||||
updateType = updateType | primaryResult;
|
updateType |= primaryResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SupportedImages.Contains(ImageType.Thumb))
|
if (SupportedImages.Contains(ImageType.Thumb))
|
||||||
{
|
{
|
||||||
var thumbResult = await FetchAsync(item, ImageType.Thumb, options, cancellationToken).ConfigureAwait(false);
|
var thumbResult = await FetchAsync(item, ImageType.Thumb, options, cancellationToken).ConfigureAwait(false);
|
||||||
updateType = updateType | thumbResult;
|
updateType |= thumbResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
return updateType;
|
return updateType;
|
||||||
|
@ -0,0 +1,67 @@
|
|||||||
|
#nullable disable
|
||||||
|
|
||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Jellyfin.Data.Enums;
|
||||||
|
using MediaBrowser.Common.Configuration;
|
||||||
|
using MediaBrowser.Controller.Drawing;
|
||||||
|
using MediaBrowser.Controller.Dto;
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Providers;
|
||||||
|
using MediaBrowser.Model.Entities;
|
||||||
|
using MediaBrowser.Model.IO;
|
||||||
|
using MediaBrowser.Model.Querying;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.Images
|
||||||
|
{
|
||||||
|
public abstract class BaseFolderImageProvider<T> : BaseDynamicImageProvider<T>
|
||||||
|
where T : Folder, new()
|
||||||
|
{
|
||||||
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
|
||||||
|
public BaseFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
||||||
|
: base(fileSystem, providerManager, applicationPaths, imageProcessor)
|
||||||
|
{
|
||||||
|
_libraryManager = libraryManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
|
||||||
|
{
|
||||||
|
return _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
|
{
|
||||||
|
Parent = item,
|
||||||
|
DtoOptions = new DtoOptions(true),
|
||||||
|
ImageTypes = new ImageType[] { ImageType.Primary },
|
||||||
|
OrderBy = new (string, SortOrder)[]
|
||||||
|
{
|
||||||
|
(ItemSortBy.IsFolder, SortOrder.Ascending),
|
||||||
|
(ItemSortBy.SortName, SortOrder.Ascending)
|
||||||
|
},
|
||||||
|
Limit = 1
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override string CreateImage(BaseItem item, IReadOnlyCollection<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
|
||||||
|
{
|
||||||
|
return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool Supports(BaseItem item)
|
||||||
|
{
|
||||||
|
return item is T;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override bool HasChangedByDate(BaseItem item, ItemImageInfo image)
|
||||||
|
{
|
||||||
|
if (item is MusicAlbum)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return base.HasChangedByDate(item, image);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -2,69 +2,16 @@
|
|||||||
|
|
||||||
#pragma warning disable CS1591
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using Jellyfin.Data.Enums;
|
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Dto;
|
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Entities.Audio;
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
using MediaBrowser.Controller.Providers;
|
using MediaBrowser.Controller.Providers;
|
||||||
using MediaBrowser.Model.Entities;
|
|
||||||
using MediaBrowser.Model.IO;
|
using MediaBrowser.Model.IO;
|
||||||
using MediaBrowser.Model.Querying;
|
|
||||||
|
|
||||||
namespace Emby.Server.Implementations.Images
|
namespace Emby.Server.Implementations.Images
|
||||||
{
|
{
|
||||||
public abstract class BaseFolderImageProvider<T> : BaseDynamicImageProvider<T>
|
|
||||||
where T : Folder, new()
|
|
||||||
{
|
|
||||||
protected ILibraryManager _libraryManager;
|
|
||||||
|
|
||||||
public BaseFolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
|
||||||
: base(fileSystem, providerManager, applicationPaths, imageProcessor)
|
|
||||||
{
|
|
||||||
_libraryManager = libraryManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
|
|
||||||
{
|
|
||||||
return _libraryManager.GetItemList(new InternalItemsQuery
|
|
||||||
{
|
|
||||||
Parent = item,
|
|
||||||
DtoOptions = new DtoOptions(true),
|
|
||||||
ImageTypes = new ImageType[] { ImageType.Primary },
|
|
||||||
OrderBy = new System.ValueTuple<string, SortOrder>[]
|
|
||||||
{
|
|
||||||
new System.ValueTuple<string, SortOrder>(ItemSortBy.IsFolder, SortOrder.Ascending),
|
|
||||||
new System.ValueTuple<string, SortOrder>(ItemSortBy.SortName, SortOrder.Ascending)
|
|
||||||
},
|
|
||||||
Limit = 1
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override string CreateImage(BaseItem item, IReadOnlyCollection<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType, int imageIndex)
|
|
||||||
{
|
|
||||||
return CreateSingleImage(itemsWithImages, outputPathWithoutExtension, ImageType.Primary);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool Supports(BaseItem item)
|
|
||||||
{
|
|
||||||
return item is T;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override bool HasChangedByDate(BaseItem item, ItemImageInfo image)
|
|
||||||
{
|
|
||||||
if (item is MusicAlbum)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return base.HasChangedByDate(item, image);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class FolderImageProvider : BaseFolderImageProvider<Folder>
|
public class FolderImageProvider : BaseFolderImageProvider<Folder>
|
||||||
{
|
{
|
||||||
public FolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
public FolderImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
||||||
@ -87,20 +34,4 @@ namespace Emby.Server.Implementations.Images
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class MusicAlbumImageProvider : BaseFolderImageProvider<MusicAlbum>
|
|
||||||
{
|
|
||||||
public MusicAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
|
||||||
: base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PhotoAlbumImageProvider : BaseFolderImageProvider<PhotoAlbum>
|
|
||||||
{
|
|
||||||
public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
|
||||||
: base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,6 @@ using MediaBrowser.Common.Configuration;
|
|||||||
using MediaBrowser.Controller.Drawing;
|
using MediaBrowser.Controller.Drawing;
|
||||||
using MediaBrowser.Controller.Dto;
|
using MediaBrowser.Controller.Dto;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.Entities.Audio;
|
|
||||||
using MediaBrowser.Controller.Entities.Movies;
|
using MediaBrowser.Controller.Entities.Movies;
|
||||||
using MediaBrowser.Controller.Entities.TV;
|
using MediaBrowser.Controller.Entities.TV;
|
||||||
using MediaBrowser.Controller.Library;
|
using MediaBrowser.Controller.Library;
|
||||||
@ -19,46 +18,6 @@ using MediaBrowser.Model.Querying;
|
|||||||
|
|
||||||
namespace Emby.Server.Implementations.Images
|
namespace Emby.Server.Implementations.Images
|
||||||
{
|
{
|
||||||
/// <summary>
|
|
||||||
/// Class MusicGenreImageProvider.
|
|
||||||
/// </summary>
|
|
||||||
public class MusicGenreImageProvider : BaseDynamicImageProvider<MusicGenre>
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// The library manager.
|
|
||||||
/// </summary>
|
|
||||||
private readonly ILibraryManager _libraryManager;
|
|
||||||
|
|
||||||
public MusicGenreImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) : base(fileSystem, providerManager, applicationPaths, imageProcessor)
|
|
||||||
{
|
|
||||||
_libraryManager = libraryManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Get children objects used to create an music genre image.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="item">The music genre used to create the image.</param>
|
|
||||||
/// <returns>Any relevant children objects.</returns>
|
|
||||||
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
|
|
||||||
{
|
|
||||||
return _libraryManager.GetItemList(new InternalItemsQuery
|
|
||||||
{
|
|
||||||
Genres = new[] { item.Name },
|
|
||||||
IncludeItemTypes = new[]
|
|
||||||
{
|
|
||||||
nameof(MusicAlbum),
|
|
||||||
nameof(MusicVideo),
|
|
||||||
nameof(Audio)
|
|
||||||
},
|
|
||||||
OrderBy = new[] { (ItemSortBy.Random, SortOrder.Ascending) },
|
|
||||||
Limit = 4,
|
|
||||||
Recursive = true,
|
|
||||||
ImageTypes = new[] { ImageType.Primary },
|
|
||||||
DtoOptions = new DtoOptions(false)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Class GenreImageProvider.
|
/// Class GenreImageProvider.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using MediaBrowser.Common.Configuration;
|
||||||
|
using MediaBrowser.Controller.Drawing;
|
||||||
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Providers;
|
||||||
|
using MediaBrowser.Model.IO;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.Images
|
||||||
|
{
|
||||||
|
public class MusicAlbumImageProvider : BaseFolderImageProvider<MusicAlbum>
|
||||||
|
{
|
||||||
|
public MusicAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
||||||
|
: base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,59 @@
|
|||||||
|
#nullable disable
|
||||||
|
|
||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Jellyfin.Data.Enums;
|
||||||
|
using MediaBrowser.Common.Configuration;
|
||||||
|
using MediaBrowser.Controller.Drawing;
|
||||||
|
using MediaBrowser.Controller.Dto;
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Entities.Audio;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Providers;
|
||||||
|
using MediaBrowser.Model.Entities;
|
||||||
|
using MediaBrowser.Model.IO;
|
||||||
|
using MediaBrowser.Model.Querying;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.Images
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class MusicGenreImageProvider.
|
||||||
|
/// </summary>
|
||||||
|
public class MusicGenreImageProvider : BaseDynamicImageProvider<MusicGenre>
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The library manager.
|
||||||
|
/// </summary>
|
||||||
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
|
||||||
|
public MusicGenreImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager) : base(fileSystem, providerManager, applicationPaths, imageProcessor)
|
||||||
|
{
|
||||||
|
_libraryManager = libraryManager;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Get children objects used to create an music genre image.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The music genre used to create the image.</param>
|
||||||
|
/// <returns>Any relevant children objects.</returns>
|
||||||
|
protected override IReadOnlyList<BaseItem> GetItemsWithImages(BaseItem item)
|
||||||
|
{
|
||||||
|
return _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
|
{
|
||||||
|
Genres = new[] { item.Name },
|
||||||
|
IncludeItemTypes = new[]
|
||||||
|
{
|
||||||
|
nameof(MusicAlbum),
|
||||||
|
nameof(MusicVideo),
|
||||||
|
nameof(Audio)
|
||||||
|
},
|
||||||
|
OrderBy = new[] { (ItemSortBy.Random, SortOrder.Ascending) },
|
||||||
|
Limit = 4,
|
||||||
|
Recursive = true,
|
||||||
|
ImageTypes = new[] { ImageType.Primary },
|
||||||
|
DtoOptions = new DtoOptions(false)
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using MediaBrowser.Common.Configuration;
|
||||||
|
using MediaBrowser.Controller.Drawing;
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
|
using MediaBrowser.Controller.Providers;
|
||||||
|
using MediaBrowser.Model.IO;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.Images
|
||||||
|
{
|
||||||
|
public class PhotoAlbumImageProvider : BaseFolderImageProvider<PhotoAlbum>
|
||||||
|
{
|
||||||
|
public PhotoAlbumImageProvider(IFileSystem fileSystem, IProviderManager providerManager, IApplicationPaths applicationPaths, IImageProcessor imageProcessor, ILibraryManager libraryManager)
|
||||||
|
: base(fileSystem, providerManager, applicationPaths, imageProcessor, libraryManager)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,7 +9,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Class FolderResolver.
|
/// Class FolderResolver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class FolderResolver : FolderResolver<Folder>
|
public class FolderResolver : GenericFolderResolver<Folder>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets the priority.
|
/// Gets the priority.
|
||||||
@ -32,24 +32,4 @@ namespace Emby.Server.Implementations.Library.Resolvers
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Class FolderResolver.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TItemType">The type of the T item type.</typeparam>
|
|
||||||
public abstract class FolderResolver<TItemType> : ItemResolver<TItemType>
|
|
||||||
where TItemType : Folder, new()
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Sets the initial item values.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="item">The item.</param>
|
|
||||||
/// <param name="args">The args.</param>
|
|
||||||
protected override void SetInitialItemValues(TItemType item, ItemResolveArgs args)
|
|
||||||
{
|
|
||||||
base.SetInitialItemValues(item, args);
|
|
||||||
|
|
||||||
item.IsRoot = args.Parent == null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
#nullable disable
|
||||||
|
|
||||||
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.Library;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.Library.Resolvers
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Class FolderResolver.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TItemType">The type of the T item type.</typeparam>
|
||||||
|
public abstract class GenericFolderResolver<TItemType> : ItemResolver<TItemType>
|
||||||
|
where TItemType : Folder, new()
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the initial item values.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="item">The item.</param>
|
||||||
|
/// <param name="args">The args.</param>
|
||||||
|
protected override void SetInitialItemValues(TItemType item, ItemResolveArgs args)
|
||||||
|
{
|
||||||
|
base.SetInitialItemValues(item, args);
|
||||||
|
|
||||||
|
item.IsRoot = args.Parent == null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -12,7 +12,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Class BoxSetResolver.
|
/// Class BoxSetResolver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class BoxSetResolver : FolderResolver<BoxSet>
|
public class BoxSetResolver : GenericFolderResolver<BoxSet>
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Resolves the specified args.
|
/// Resolves the specified args.
|
||||||
|
@ -12,7 +12,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Class PhotoAlbumResolver.
|
/// Class PhotoAlbumResolver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class PhotoAlbumResolver : FolderResolver<PhotoAlbum>
|
public class PhotoAlbumResolver : GenericFolderResolver<PhotoAlbum>
|
||||||
{
|
{
|
||||||
private readonly IImageProcessor _imageProcessor;
|
private readonly IImageProcessor _imageProcessor;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
@ -16,7 +16,7 @@ namespace Emby.Server.Implementations.Library.Resolvers
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// <see cref="IItemResolver"/> for <see cref="Playlist"/> library items.
|
/// <see cref="IItemResolver"/> for <see cref="Playlist"/> library items.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class PlaylistResolver : FolderResolver<Playlist>
|
public class PlaylistResolver : GenericFolderResolver<Playlist>
|
||||||
{
|
{
|
||||||
private string[] _musicPlaylistCollectionTypes =
|
private string[] _musicPlaylistCollectionTypes =
|
||||||
{
|
{
|
||||||
|
@ -13,7 +13,7 @@ using MediaBrowser.Model.IO;
|
|||||||
|
|
||||||
namespace Emby.Server.Implementations.Library.Resolvers
|
namespace Emby.Server.Implementations.Library.Resolvers
|
||||||
{
|
{
|
||||||
public class SpecialFolderResolver : FolderResolver<Folder>
|
public class SpecialFolderResolver : GenericFolderResolver<Folder>
|
||||||
{
|
{
|
||||||
private readonly IFileSystem _fileSystem;
|
private readonly IFileSystem _fileSystem;
|
||||||
private readonly IServerApplicationPaths _appPaths;
|
private readonly IServerApplicationPaths _appPaths;
|
||||||
|
@ -12,7 +12,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Class SeasonResolver.
|
/// Class SeasonResolver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SeasonResolver : FolderResolver<Season>
|
public class SeasonResolver : GenericFolderResolver<Season>
|
||||||
{
|
{
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
private readonly ILocalizationManager _localization;
|
private readonly ILocalizationManager _localization;
|
||||||
|
@ -18,7 +18,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.TV
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Class SeriesResolver.
|
/// Class SeriesResolver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class SeriesResolver : FolderResolver<Series>
|
public class SeriesResolver : GenericFolderResolver<Series>
|
||||||
{
|
{
|
||||||
private readonly ILogger<SeriesResolver> _logger;
|
private readonly ILogger<SeriesResolver> _logger;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
|
@ -37,7 +37,7 @@ namespace Emby.Server.Implementations.LiveTv.Listings.SchedulesDirectDtos
|
|||||||
/// Gets or sets the aspect.
|
/// Gets or sets the aspect.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("aspect")]
|
[JsonPropertyName("aspect")]
|
||||||
public string aspect { get; set; }
|
public string Aspect { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the category.
|
/// Gets or sets the category.
|
||||||
|
@ -6,62 +6,62 @@ using System.Text.Json.Serialization;
|
|||||||
namespace Emby.Server.Implementations.LiveTv.Listings.SchedulesDirectDtos
|
namespace Emby.Server.Implementations.LiveTv.Listings.SchedulesDirectDtos
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Station dto.
|
/// Station dto.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class StationDto
|
public class StationDto
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the station id.
|
/// Gets or sets the station id.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("stationID")]
|
[JsonPropertyName("stationID")]
|
||||||
public string StationId { get; set; }
|
public string StationId { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the name.
|
/// Gets or sets the name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("name")]
|
[JsonPropertyName("name")]
|
||||||
public string Name { get; set; }
|
public string Name { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the callsign.
|
/// Gets or sets the callsign.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("callsign")]
|
[JsonPropertyName("callsign")]
|
||||||
public string Callsign { get; set; }
|
public string Callsign { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the broadcast language.
|
/// Gets or sets the broadcast language.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("broadcastLanguage")]
|
[JsonPropertyName("broadcastLanguage")]
|
||||||
public List<string> BroadcastLanguage { get; set; }
|
public List<string> BroadcastLanguage { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the description language.
|
/// Gets or sets the description language.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("descriptionLanguage")]
|
[JsonPropertyName("descriptionLanguage")]
|
||||||
public List<string> DescriptionLanguage { get; set; }
|
public List<string> DescriptionLanguage { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the broadcaster.
|
/// Gets or sets the broadcaster.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("broadcaster")]
|
[JsonPropertyName("broadcaster")]
|
||||||
public BroadcasterDto Broadcaster { get; set; }
|
public BroadcasterDto Broadcaster { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the affiliate.
|
/// Gets or sets the affiliate.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("affiliate")]
|
[JsonPropertyName("affiliate")]
|
||||||
public string Affiliate { get; set; }
|
public string Affiliate { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or sets the logo.
|
/// Gets or sets the logo.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("logo")]
|
[JsonPropertyName("logo")]
|
||||||
public LogoDto Logo { get; set; }
|
public LogoDto Logo { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets or set a value indicating whether it is commercial free.
|
/// Gets or sets a value indicating whether it is commercial free.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[JsonPropertyName("isCommercialFree")]
|
[JsonPropertyName("isCommercialFree")]
|
||||||
public bool? IsCommercialFree { get; set; }
|
public bool? IsCommercialFree { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,35 @@
|
|||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
|
{
|
||||||
|
public class HdHomerunChannelCommands : IHdHomerunChannelCommands
|
||||||
|
{
|
||||||
|
private string? _channel;
|
||||||
|
private string? _profile;
|
||||||
|
|
||||||
|
public HdHomerunChannelCommands(string? channel, string? profile)
|
||||||
|
{
|
||||||
|
_channel = channel;
|
||||||
|
_profile = profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<(string, string)> GetCommands()
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(_channel))
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(_profile)
|
||||||
|
&& !string.Equals(_profile, "native", StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
yield return ("vchannel", $"{_channel} transcode={_profile}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
yield return ("vchannel", _channel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -87,11 +87,6 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|||||||
return lineup.Where(i => !i.DRM).ToList();
|
return lineup.Where(i => !i.DRM).ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
private class HdHomerunChannelInfo : ChannelInfo
|
|
||||||
{
|
|
||||||
public bool IsLegacyTuner { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override async Task<List<ChannelInfo>> GetChannelsInternal(TunerHostInfo tuner, CancellationToken cancellationToken)
|
protected override async Task<List<ChannelInfo>> GetChannelsInternal(TunerHostInfo tuner, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var lineup = await GetLineup(tuner, cancellationToken).ConfigureAwait(false);
|
var lineup = await GetLineup(tuner, cancellationToken).ConfigureAwait(false);
|
||||||
@ -715,5 +710,10 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
|||||||
|
|
||||||
return hostInfo;
|
return hostInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private class HdHomerunChannelInfo : ChannelInfo
|
||||||
|
{
|
||||||
|
public bool IsLegacyTuner { get; set; }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,12 +5,10 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Buffers;
|
using System.Buffers;
|
||||||
using System.Buffers.Binary;
|
using System.Buffers.Binary;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MediaBrowser.Common;
|
using MediaBrowser.Common;
|
||||||
@ -18,70 +16,6 @@ using MediaBrowser.Controller.LiveTv;
|
|||||||
|
|
||||||
namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
{
|
{
|
||||||
public interface IHdHomerunChannelCommands
|
|
||||||
{
|
|
||||||
IEnumerable<(string, string)> GetCommands();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class LegacyHdHomerunChannelCommands : IHdHomerunChannelCommands
|
|
||||||
{
|
|
||||||
private string _channel;
|
|
||||||
private string _program;
|
|
||||||
|
|
||||||
public LegacyHdHomerunChannelCommands(string url)
|
|
||||||
{
|
|
||||||
// parse url for channel and program
|
|
||||||
var regExp = new Regex(@"\/ch([0-9]+)-?([0-9]*)");
|
|
||||||
var match = regExp.Match(url);
|
|
||||||
if (match.Success)
|
|
||||||
{
|
|
||||||
_channel = match.Groups[1].Value;
|
|
||||||
_program = match.Groups[2].Value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<(string, string)> GetCommands()
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(_channel))
|
|
||||||
{
|
|
||||||
yield return ("channel", _channel);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(_program))
|
|
||||||
{
|
|
||||||
yield return ("program", _program);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public class HdHomerunChannelCommands : IHdHomerunChannelCommands
|
|
||||||
{
|
|
||||||
private string _channel;
|
|
||||||
private string _profile;
|
|
||||||
|
|
||||||
public HdHomerunChannelCommands(string channel, string profile)
|
|
||||||
{
|
|
||||||
_channel = channel;
|
|
||||||
_profile = profile;
|
|
||||||
}
|
|
||||||
|
|
||||||
public IEnumerable<(string, string)> GetCommands()
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(_channel))
|
|
||||||
{
|
|
||||||
if (!string.IsNullOrEmpty(_profile)
|
|
||||||
&& !string.Equals(_profile, "native", StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
yield return ("vchannel", $"{_channel} transcode={_profile}");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
yield return ("vchannel", _channel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public sealed class HdHomerunManager : IDisposable
|
public sealed class HdHomerunManager : IDisposable
|
||||||
{
|
{
|
||||||
public const int HdHomeRunPort = 65001;
|
public const int HdHomeRunPort = 65001;
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
|
{
|
||||||
|
public interface IHdHomerunChannelCommands
|
||||||
|
{
|
||||||
|
IEnumerable<(string, string)> GetCommands();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,38 @@
|
|||||||
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
|
namespace Emby.Server.Implementations.LiveTv.TunerHosts.HdHomerun
|
||||||
|
{
|
||||||
|
public class LegacyHdHomerunChannelCommands : IHdHomerunChannelCommands
|
||||||
|
{
|
||||||
|
private string? _channel;
|
||||||
|
private string? _program;
|
||||||
|
|
||||||
|
public LegacyHdHomerunChannelCommands(string url)
|
||||||
|
{
|
||||||
|
// parse url for channel and program
|
||||||
|
var regExp = new Regex(@"\/ch([0-9]+)-?([0-9]*)");
|
||||||
|
var match = regExp.Match(url);
|
||||||
|
if (match.Success)
|
||||||
|
{
|
||||||
|
_channel = match.Groups[1].Value;
|
||||||
|
_program = match.Groups[2].Value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public IEnumerable<(string, string)> GetCommands()
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(_channel))
|
||||||
|
{
|
||||||
|
yield return ("channel", _channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(_program))
|
||||||
|
{
|
||||||
|
yield return ("program", _program);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -10,7 +10,6 @@
|
|||||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||||
<!-- https://github.com/microsoft/ApplicationInsights-dotnet/issues/2047 -->
|
<!-- https://github.com/microsoft/ApplicationInsights-dotnet/issues/2047 -->
|
||||||
<NoWarn>AD0001</NoWarn>
|
<NoWarn>AD0001</NoWarn>
|
||||||
<AnalysisMode>AllDisabledByDefault</AnalysisMode>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -39,11 +39,6 @@
|
|||||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||||
<IncludeSymbols>true</IncludeSymbols>
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release'">
|
|
||||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Stability)'=='Unstable'">
|
<PropertyGroup Condition=" '$(Stability)'=='Unstable'">
|
||||||
|
@ -21,11 +21,6 @@
|
|||||||
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
<EmbedUntrackedSources>true</EmbedUntrackedSources>
|
||||||
<IncludeSymbols>true</IncludeSymbols>
|
<IncludeSymbols>true</IncludeSymbols>
|
||||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
|
||||||
</PropertyGroup>
|
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release'">
|
|
||||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Stability)'=='Unstable'">
|
<PropertyGroup Condition=" '$(Stability)'=='Unstable'">
|
||||||
|
Loading…
Reference in New Issue
Block a user