mirror of
https://github.com/jellyfin/jellyfin.git
synced 2024-07-03 04:13:38 +02:00
Use Directory GetFiles to find lyric files
This commit is contained in:
parent
b442c79e62
commit
6f0d33b1ca
|
@ -46,7 +46,6 @@ using Emby.Server.Implementations.SyncPlay;
|
|||
using Emby.Server.Implementations.TV;
|
||||
using Emby.Server.Implementations.Updates;
|
||||
using Jellyfin.Api.Helpers;
|
||||
using Jellyfin.Api.Models.UserDtos;
|
||||
using Jellyfin.MediaEncoding.Hls.Playlist;
|
||||
using Jellyfin.Networking.Configuration;
|
||||
using Jellyfin.Networking.Manager;
|
||||
|
|
|
@ -1,4 +1,7 @@
|
|||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using Jellyfin.Extensions;
|
||||
|
||||
namespace MediaBrowser.Controller.Lyrics;
|
||||
|
||||
|
@ -13,12 +16,21 @@ public static class LyricInfo
|
|||
/// <param name="lyricProvider">The lyricProvider interface to use.</param>
|
||||
/// <param name="itemPath">Path of requested item.</param>
|
||||
/// <returns>Lyric file path if passed lyric provider's supported media type is found; otherwise, null.</returns>
|
||||
public static string? GetLyricFilePath(ILyricProvider lyricProvider, string itemPath)
|
||||
public static string? GetLyricFilePath(this ILyricProvider lyricProvider, string itemPath)
|
||||
{
|
||||
foreach (string lyricFileExtension in lyricProvider.SupportedMediaTypes)
|
||||
if (lyricProvider is null)
|
||||
{
|
||||
var lyricFilePath = Path.ChangeExtension(itemPath, lyricFileExtension);
|
||||
if (File.Exists(lyricFilePath))
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!Directory.Exists(Path.GetDirectoryName(itemPath)))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
foreach (var lyricFilePath in Directory.GetFiles(Path.GetDirectoryName(itemPath), $"{Path.GetFileNameWithoutExtension(itemPath)}.*"))
|
||||
{
|
||||
if (lyricProvider.SupportedMediaTypes.Contains(Path.GetExtension(lyricFilePath)[1..]))
|
||||
{
|
||||
return lyricFilePath;
|
||||
}
|
||||
|
|
|
@ -20,7 +20,7 @@ public class LrcLyricProvider : ILyricProvider
|
|||
|
||||
private readonly LyricParser _lrcLyricParser;
|
||||
|
||||
private static readonly IReadOnlyList<string> _acceptedTimeFormats = new string[] { "HH:mm:ss", "H:mm:ss", "mm:ss", "m:ss" };
|
||||
private static readonly string[] _acceptedTimeFormats = { "HH:mm:ss", "H:mm:ss", "mm:ss", "m:ss" };
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="LrcLyricProvider"/> class.
|
||||
|
@ -51,14 +51,14 @@ public class LrcLyricProvider : ILyricProvider
|
|||
/// <returns>If provider can determine lyrics, returns a <see cref="LyricResponse"/> with or without metadata; otherwise, null.</returns>
|
||||
public LyricResponse? GetLyrics(BaseItem item)
|
||||
{
|
||||
string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path);
|
||||
string? lyricFilePath = this.GetLyricFilePath(item.Path);
|
||||
|
||||
if (string.IsNullOrEmpty(lyricFilePath))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
IDictionary<string, string> fileMetaData = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||
var fileMetaData = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
|
||||
string lrcFileContent = System.IO.File.ReadAllText(lyricFilePath);
|
||||
|
||||
Song lyricData;
|
||||
|
@ -90,6 +90,10 @@ public class LrcLyricProvider : ILyricProvider
|
|||
}
|
||||
|
||||
string[] metaDataField = metaDataRow.Split(':', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||
|
||||
// Remove square bracket before field name, and after field value
|
||||
// Example 1: [au: 1hitsong]
|
||||
// Example 2: [ar: Calabrese]
|
||||
string metaDataFieldName = metaDataField[0][1..];
|
||||
string metaDataFieldValue = metaDataField[1][..^1];
|
||||
|
||||
|
@ -162,7 +166,7 @@ public class LrcLyricProvider : ILyricProvider
|
|||
|
||||
if (metaData.TryGetValue("length", out var length) && !string.IsNullOrEmpty(length))
|
||||
{
|
||||
if (DateTime.TryParseExact(length, _acceptedTimeFormats.ToArray(), null, DateTimeStyles.None, out var value))
|
||||
if (DateTime.TryParseExact(length, _acceptedTimeFormats, null, DateTimeStyles.None, out var value))
|
||||
{
|
||||
lyricMetadata.Length = value.TimeOfDay.Ticks;
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ public class LyricManager : ILyricManager
|
|||
continue;
|
||||
}
|
||||
|
||||
if (LyricInfo.GetLyricFilePath(provider, item.Path) is not null)
|
||||
if (provider.GetLyricFilePath(item.Path) is not null)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ public class TxtLyricProvider : ILyricProvider
|
|||
/// <returns>If provider can determine lyrics, returns a <see cref="LyricResponse"/>; otherwise, null.</returns>
|
||||
public LyricResponse? GetLyrics(BaseItem item)
|
||||
{
|
||||
string? lyricFilePath = LyricInfo.GetLyricFilePath(this, item.Path);
|
||||
string? lyricFilePath = this.GetLyricFilePath(item.Path);
|
||||
|
||||
if (string.IsNullOrEmpty(lyricFilePath))
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue