2021-03-16 20:11:34 +00:00
|
|
|
|
#nullable enable
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
|
|
|
|
|
|
|
namespace MediaBrowser.Common.Providers
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Parsers for provider ids.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static class ProviderIdParsers
|
|
|
|
|
{
|
2021-03-18 10:25:58 +00:00
|
|
|
|
private const int ImdbMinNumbers = 7;
|
|
|
|
|
private const int ImdbMaxNumbers = 8;
|
|
|
|
|
|
2021-03-16 20:11:34 +00:00
|
|
|
|
/// <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>
|
2021-03-18 19:52:56 +00:00
|
|
|
|
public static bool TryParseImdbId(ReadOnlySpan<char> text, [NotNullWhen(true)] out string? imdbId)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
|
|
|
|
var tt = "tt".AsSpan();
|
|
|
|
|
|
2021-03-18 10:25:58 +00:00
|
|
|
|
// imdb id is at least 9 chars (tt + 7 numbers)
|
2021-03-18 19:52:56 +00:00
|
|
|
|
while (text.Length >= 2 + ImdbMinNumbers)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
2021-03-18 19:52:56 +00:00
|
|
|
|
var ttPos = text.IndexOf(tt);
|
2021-03-16 20:11:34 +00:00
|
|
|
|
if (ttPos == -1)
|
|
|
|
|
{
|
|
|
|
|
imdbId = default;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-18 19:52:56 +00:00
|
|
|
|
text = text.Slice(ttPos + tt.Length);
|
2021-03-18 10:25:58 +00:00
|
|
|
|
var i = 0;
|
2021-03-18 19:52:56 +00:00
|
|
|
|
for (; i < Math.Min(text.Length, ImdbMaxNumbers); i++)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
2021-03-18 19:52:56 +00:00
|
|
|
|
var c = text[i];
|
2021-03-19 11:34:21 +00:00
|
|
|
|
if (!IsDigit(c))
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-03-18 10:25:58 +00:00
|
|
|
|
// skip if more than 8 digits
|
|
|
|
|
if (i <= ImdbMaxNumbers && i >= ImdbMinNumbers)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
2021-03-18 19:52:56 +00:00
|
|
|
|
imdbId = string.Concat(tt, text.Slice(0, i));
|
2021-03-16 20:11:34 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
2021-03-18 10:25:58 +00:00
|
|
|
|
|
2021-03-18 19:52:56 +00:00
|
|
|
|
text = text.Slice(i);
|
2021-03-16 20:11:34 +00:00
|
|
|
|
}
|
2021-03-18 10:25:58 +00:00
|
|
|
|
|
|
|
|
|
imdbId = default;
|
|
|
|
|
return false;
|
2021-03-16 20:11:34 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <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>
|
2021-03-18 19:52:56 +00:00
|
|
|
|
public static bool TryParseTmdbMovieId(ReadOnlySpan<char> text, [NotNullWhen(true)] out string? tmdbId)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
=> 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>
|
2021-03-18 19:52:56 +00:00
|
|
|
|
public static bool TryParseTmdbSeriesId(ReadOnlySpan<char> text, [NotNullWhen(true)] out string? tmdbId)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
=> 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>
|
2021-03-18 19:52:56 +00:00
|
|
|
|
public static bool TryParseTvdbId(ReadOnlySpan<char> text, [NotNullWhen(true)] out string? tvdbId)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
=> TryParseProviderId(text, "thetvdb.com/?tab=series&id=", out tvdbId);
|
|
|
|
|
|
2021-03-18 19:52:56 +00:00
|
|
|
|
private static bool TryParseProviderId(ReadOnlySpan<char> text, ReadOnlySpan<char> searchString, [NotNullWhen(true)] out string? providerId)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
2021-03-18 19:52:56 +00:00
|
|
|
|
var searchPos = text.IndexOf(searchString);
|
2021-03-18 10:25:58 +00:00
|
|
|
|
if (searchPos == -1)
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
2021-03-18 10:25:58 +00:00
|
|
|
|
providerId = default;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2021-03-16 20:11:34 +00:00
|
|
|
|
|
2021-03-18 19:52:56 +00:00
|
|
|
|
text = text.Slice(searchPos + searchString.Length);
|
2021-03-16 20:11:34 +00:00
|
|
|
|
|
2021-03-18 10:25:58 +00:00
|
|
|
|
int i = 0;
|
2021-03-18 19:52:56 +00:00
|
|
|
|
for (; i < text.Length; i++)
|
2021-03-18 10:25:58 +00:00
|
|
|
|
{
|
2021-03-18 19:52:56 +00:00
|
|
|
|
var c = text[i];
|
2021-03-16 20:11:34 +00:00
|
|
|
|
|
2021-03-19 11:34:21 +00:00
|
|
|
|
if (!IsDigit(c))
|
2021-03-16 20:11:34 +00:00
|
|
|
|
{
|
2021-03-18 10:25:58 +00:00
|
|
|
|
break;
|
2021-03-16 20:11:34 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2021-03-18 10:25:58 +00:00
|
|
|
|
|
|
|
|
|
if (i >= 1)
|
|
|
|
|
{
|
2021-03-18 19:52:56 +00:00
|
|
|
|
providerId = text.Slice(0, i).ToString();
|
2021-03-18 10:25:58 +00:00
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
providerId = default;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2021-03-19 11:34:21 +00:00
|
|
|
|
|
|
|
|
|
private static bool IsDigit(char c)
|
|
|
|
|
{
|
|
|
|
|
return c >= '0' && c <= '9';
|
|
|
|
|
}
|
2021-03-16 20:11:34 +00:00
|
|
|
|
}
|
|
|
|
|
}
|