< Summary - Jellyfin

Information
Class: MediaBrowser.Providers.Lyric.LrcLyricParser
Assembly: MediaBrowser.Providers
File(s): /srv/git/jellyfin/MediaBrowser.Providers/Lyric/LrcLyricParser.cs
Line coverage
15%
Covered lines: 3
Uncovered lines: 17
Coverable lines: 20
Total lines: 77
Line coverage: 15%
Branch coverage
0%
Covered branches: 0
Total branches: 6
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Coverage history

Coverage history 0 25 50 75 100

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%210%
.ctor()100%11100%
get_Name()100%210%
get_Priority()100%11100%
ParseLyrics(...)0%4260%

File(s)

/srv/git/jellyfin/MediaBrowser.Providers/Lyric/LrcLyricParser.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.IO;
 4using System.Linq;
 5using Jellyfin.Extensions;
 6using LrcParser.Model;
 7using LrcParser.Parser;
 8using MediaBrowser.Controller.Lyrics;
 9using MediaBrowser.Controller.Resolvers;
 10using MediaBrowser.Model.Lyrics;
 11
 12namespace MediaBrowser.Providers.Lyric;
 13
 14/// <summary>
 15/// LRC Lyric Parser.
 16/// </summary>
 17public class LrcLyricParser : ILyricParser
 18{
 19    private readonly LyricParser _lrcLyricParser;
 20
 021    private static readonly string[] _supportedMediaTypes = [".lrc", ".elrc"];
 22
 23    /// <summary>
 24    /// Initializes a new instance of the <see cref="LrcLyricParser"/> class.
 25    /// </summary>
 26    public LrcLyricParser()
 27    {
 2228        _lrcLyricParser = new LrcParser.Parser.Lrc.LrcParser();
 2229    }
 30
 31    /// <inheritdoc />
 032    public string Name => "LrcLyricProvider";
 33
 34    /// <summary>
 35    /// Gets the priority.
 36    /// </summary>
 37    /// <value>The priority.</value>
 2238    public ResolverPriority Priority => ResolverPriority.Fourth;
 39
 40    /// <inheritdoc />
 41    public LyricDto? ParseLyrics(LyricFile lyrics)
 42    {
 043        if (!_supportedMediaTypes.Contains(Path.GetExtension(lyrics.Name.AsSpan()), StringComparison.OrdinalIgnoreCase))
 44        {
 045            return null;
 46        }
 47
 48        Song lyricData;
 49
 50        try
 51        {
 052            lyricData = _lrcLyricParser.Decode(lyrics.Content);
 053        }
 054        catch (Exception)
 55        {
 56            // Failed to parse, return null so the next parser will be tried
 057            return null;
 58        }
 59
 060        List<LrcParser.Model.Lyric> sortedLyricData = lyricData.Lyrics.OrderBy(x => x.StartTime).ToList();
 61
 062        if (sortedLyricData.Count == 0)
 63        {
 064            return null;
 65        }
 66
 067        List<LyricLine> lyricList = [];
 68
 069        for (int i = 0; i < sortedLyricData.Count; i++)
 70        {
 071            long ticks = TimeSpan.FromMilliseconds(sortedLyricData[i].StartTime).Ticks;
 072            lyricList.Add(new LyricLine(sortedLyricData[i].Text.Trim(), ticks));
 73        }
 74
 075        return new LyricDto { Lyrics = lyricList };
 076    }
 77}