aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Common/Providers/ProviderIdParsers.cs
blob: 56e0112ddcdeb06ccfc3921b5a51ad927383a1cc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#nullable enable

using System;
using System.Diagnostics.CodeAnalysis;

namespace MediaBrowser.Common.Providers
{
    /// <summary>
    /// Parsers for provider ids.
    /// </summary>
    public static class ProviderIdParsers
    {
        /// <summary>
        /// Parses an IMDb id from a string.
        /// </summary>
        /// <param name="text">The text to parse.</param>
        /// <param name="imdbId">The parsed IMDb id.</param>
        /// <returns>True if parsing was successful, false otherwise.</returns>
        public static bool TryParseImdbId(string text, [NotNullWhen(true)] out string? imdbId)
        {
            var span = text.AsSpan();
            var tt = "tt".AsSpan();

            while (true)
            {
                var ttPos = span.IndexOf(tt);
                if (ttPos == -1)
                {
                    imdbId = default;
                    return false;
                }

                span = span.Slice(ttPos + tt.Length);

                int i = 0;
                // IMDb id has a maximum of 8 digits
                int max = span.Length > 8 ? 8 : span.Length;
                for (; i < max; i++)
                {
                    var c = span[i];

                    if (c < '0' || c > '9')
                    {
                        break;
                    }
                }

                // IMDb id has a minimum of 7 digits
                if (i >= 7)
                {
                    imdbId = string.Concat(tt, span.Slice(0, i));
                    return true;
                }
            }
        }

        /// <summary>
        /// Parses an TMDb id from a movie url.
        /// </summary>
        /// <param name="text">The text with the url to parse.</param>
        /// <param name="tmdbId">The parsed TMDb id.</param>
        /// <returns>True if parsing was successful, false otherwise.</returns>
        public static bool TryParseTmdbMovieId(string text, [NotNullWhen(true)] out string? tmdbId)
            => TryParseProviderId(text, "themoviedb.org/movie/", out tmdbId);

        /// <summary>
        /// Parses an TMDb id from a series url.
        /// </summary>
        /// <param name="text">The text with the url to parse.</param>
        /// <param name="tmdbId">The parsed TMDb id.</param>
        /// <returns>True if parsing was successful, false otherwise.</returns>
        public static bool TryParseTmdbSeriesId(string text, [NotNullWhen(true)] out string? tmdbId)
            => TryParseProviderId(text, "themoviedb.org/tv/", out tmdbId);

        /// <summary>
        /// Parses an TVDb id from a url.
        /// </summary>
        /// <param name="text">The text with the url to parse.</param>
        /// <param name="tvdbId">The parsed TVDb id.</param>
        /// <returns>True if parsing was successful, false otherwise.</returns>
        public static bool TryParseTvdbId(string text, [NotNullWhen(true)] out string? tvdbId)
            => TryParseProviderId(text, "thetvdb.com/?tab=series&id=", out tvdbId);

        private static bool TryParseProviderId(string text, string searchString, [NotNullWhen(true)] out string? providerId)
        {
            var span = text.AsSpan();
            var searchSpan = searchString.AsSpan();

            while (true)
            {
                var searchPos = span.IndexOf(searchSpan);
                if (searchPos == -1)
                {
                    providerId = default;
                    return false;
                }

                span = span.Slice(searchPos + searchSpan.Length);

                int i = 0;
                for (; i < span.Length; i++)
                {
                    var c = span[i];

                    if (c < '0' || c > '9')
                    {
                        break;
                    }
                }

                if (i >= 1)
                {
                    providerId = span.Slice(0, i).ToString();
                    return true;
                }
            }
        }
    }
}