mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2025-04-25 06:17:26 -04:00
Cleanup StringUtil
This commit is contained in:
parent
7b244b022c
commit
dbeb725cda
7 changed files with 24 additions and 167 deletions
|
@ -1,34 +0,0 @@
|
||||||
namespace NzbDrone.Common
|
|
||||||
{
|
|
||||||
public static class ConvertBase32
|
|
||||||
{
|
|
||||||
private static string ValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
|
|
||||||
|
|
||||||
public static byte[] FromBase32String(string str)
|
|
||||||
{
|
|
||||||
int numBytes = str.Length * 5 / 8;
|
|
||||||
byte[] bytes = new byte[numBytes];
|
|
||||||
|
|
||||||
// all UPPERCASE chars
|
|
||||||
str = str.ToUpper();
|
|
||||||
|
|
||||||
int bitBuffer = 0;
|
|
||||||
int bitBufferCount = 0;
|
|
||||||
int index = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < str.Length; i++)
|
|
||||||
{
|
|
||||||
bitBuffer = (bitBuffer << 5) | ValidChars.IndexOf(str[i]);
|
|
||||||
bitBufferCount += 5;
|
|
||||||
|
|
||||||
if (bitBufferCount >= 8)
|
|
||||||
{
|
|
||||||
bitBufferCount -= 8;
|
|
||||||
bytes[index++] = (byte)(bitBuffer >> bitBufferCount);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
namespace NzbDrone.Common.Extensions
|
namespace NzbDrone.Common.Extensions
|
||||||
{
|
{
|
||||||
|
@ -13,5 +14,8 @@ namespace NzbDrone.Common.Extensions
|
||||||
{
|
{
|
||||||
return BitConverter.GetBytes(input).ToBase64();
|
return BitConverter.GetBytes(input).ToBase64();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string FromBase64(string str) =>
|
||||||
|
Encoding.UTF8.GetString(Convert.FromBase64String(str));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using System;
|
using System;
|
||||||
|
using System.Security.Cryptography;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
|
|
||||||
namespace NzbDrone.Common
|
namespace NzbDrone.Common
|
||||||
|
@ -28,6 +29,18 @@ namespace NzbDrone.Common
|
||||||
return $"{mCrc:x8}";
|
return $"{mCrc:x8}";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static string CalculateMd5(string s)
|
||||||
|
{
|
||||||
|
// Use input string to calculate MD5 hash
|
||||||
|
using (var md5 = MD5.Create())
|
||||||
|
{
|
||||||
|
var inputBytes = Encoding.ASCII.GetBytes(s);
|
||||||
|
var hashBytes = md5.ComputeHash(inputBytes);
|
||||||
|
|
||||||
|
return Convert.ToHexString(hashBytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static string AnonymousToken()
|
public static string AnonymousToken()
|
||||||
{
|
{
|
||||||
var seed = $"{Environment.ProcessorCount}_{Environment.OSVersion.Platform}_{Environment.MachineName}_{Environment.UserName}";
|
var seed = $"{Environment.ProcessorCount}_{Environment.OSVersion.Platform}_{Environment.MachineName}_{Environment.UserName}";
|
||||||
|
|
|
@ -1,16 +1,14 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
using System.Globalization;
|
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using FluentValidation;
|
using FluentValidation;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Converters;
|
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using NzbDrone.Common;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Annotations;
|
using NzbDrone.Core.Annotations;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
|
@ -454,7 +452,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||||
{
|
{
|
||||||
var fileName = torrent.Files.First().FileName;
|
var fileName = torrent.Files.First().FileName;
|
||||||
|
|
||||||
var guid = new Uri(details + "&nh=" + StringUtil.Hash(fileName));
|
var guid = new Uri(details + "&nh=" + HashUtil.CalculateMd5(fileName));
|
||||||
|
|
||||||
var release = new TorrentInfo
|
var release = new TorrentInfo
|
||||||
{
|
{
|
||||||
|
@ -487,7 +485,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||||
$"{title} {year} {releaseGroup}{infoString}" :
|
$"{title} {year} {releaseGroup}{infoString}" :
|
||||||
$"{releaseGroup}{title} {releaseInfo} {infoString}";
|
$"{releaseGroup}{title} {releaseInfo} {infoString}";
|
||||||
|
|
||||||
var guid = new Uri(details + "&nh=" + StringUtil.Hash(title));
|
var guid = new Uri(details + "&nh=" + HashUtil.CalculateMd5(title));
|
||||||
|
|
||||||
var release = new TorrentInfo
|
var release = new TorrentInfo
|
||||||
{
|
{
|
||||||
|
|
|
@ -8,6 +8,7 @@ using System.Threading.Tasks;
|
||||||
using AngleSharp.Dom;
|
using AngleSharp.Dom;
|
||||||
using AngleSharp.Html.Parser;
|
using AngleSharp.Html.Parser;
|
||||||
using NLog;
|
using NLog;
|
||||||
|
using NzbDrone.Common.Extensions;
|
||||||
using NzbDrone.Common.Http;
|
using NzbDrone.Common.Http;
|
||||||
using NzbDrone.Core.Configuration;
|
using NzbDrone.Core.Configuration;
|
||||||
using NzbDrone.Core.Indexers.Exceptions;
|
using NzbDrone.Core.Indexers.Exceptions;
|
||||||
|
@ -22,7 +23,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||||
public class BB : TorrentIndexerBase<UserPassTorrentBaseSettings>
|
public class BB : TorrentIndexerBase<UserPassTorrentBaseSettings>
|
||||||
{
|
{
|
||||||
public override string Name => "BB";
|
public override string Name => "BB";
|
||||||
public override string[] IndexerUrls => new[] { StringUtil.FromBase64("aHR0cHM6Ly9iYWNvbmJpdHMub3JnLw==") };
|
public override string[] IndexerUrls => new[] { Base64Extensions.FromBase64("aHR0cHM6Ly9iYWNvbmJpdHMub3JnLw==") };
|
||||||
private string LoginUrl => Settings.BaseUrl + "login.php";
|
private string LoginUrl => Settings.BaseUrl + "login.php";
|
||||||
public override string Description => "BB is a Private Torrent Tracker for 0DAY / GENERAL";
|
public override string Description => "BB is a Private Torrent Tracker for 0DAY / GENERAL";
|
||||||
public override string Language => "en-US";
|
public override string Language => "en-US";
|
||||||
|
|
|
@ -8,10 +8,6 @@ namespace NzbDrone.Core.Parser
|
||||||
{
|
{
|
||||||
public static class ParseUtil
|
public static class ParseUtil
|
||||||
{
|
{
|
||||||
private static readonly Regex InvalidXmlChars =
|
|
||||||
new Regex(
|
|
||||||
@"(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x9F\uFEFF\uFFFE\uFFFF]",
|
|
||||||
RegexOptions.Compiled);
|
|
||||||
private static readonly Regex ImdbId = new Regex(@"^(?:tt)?(\d{1,8})$", RegexOptions.Compiled);
|
private static readonly Regex ImdbId = new Regex(@"^(?:tt)?(\d{1,8})$", RegexOptions.Compiled);
|
||||||
|
|
||||||
public static string NormalizeMultiSpaces(string s) =>
|
public static string NormalizeMultiSpaces(string s) =>
|
||||||
|
@ -46,8 +42,6 @@ namespace NzbDrone.Core.Parser
|
||||||
return valStr;
|
return valStr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string RemoveInvalidXmlChars(string text) => string.IsNullOrEmpty(text) ? "" : InvalidXmlChars.Replace(text, "");
|
|
||||||
|
|
||||||
public static double CoerceDouble(string str) => double.Parse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture);
|
public static double CoerceDouble(string str) => double.Parse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
public static float CoerceFloat(string str) => float.Parse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture);
|
public static float CoerceFloat(string str) => float.Parse(NormalizeNumber(str), NumberStyles.Any, CultureInfo.InvariantCulture);
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
using System.Globalization;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
|
@ -41,102 +40,12 @@ namespace NzbDrone.Core.Parser
|
||||||
return result.TrimStart(' ', '.').TrimEnd(' ');
|
return result.TrimStart(' ', '.').TrimEnd(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string StripNonAlphaNumeric(this string str, string replacement = "") =>
|
|
||||||
StripRegex(str, "[^a-zA-Z0-9 -]", replacement);
|
|
||||||
|
|
||||||
public static string StripRegex(string str, string regex, string replacement = "")
|
|
||||||
{
|
|
||||||
var rgx = new Regex(regex);
|
|
||||||
str = rgx.Replace(str, replacement);
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
// replaces culture specific characters with the corresponding base characters (e.g. è becomes e).
|
|
||||||
public static string RemoveDiacritics(string s)
|
|
||||||
{
|
|
||||||
var normalizedString = s.Normalize(NormalizationForm.FormD);
|
|
||||||
var stringBuilder = new StringBuilder();
|
|
||||||
|
|
||||||
for (var i = 0; i < normalizedString.Length; i++)
|
|
||||||
{
|
|
||||||
var c = normalizedString[i];
|
|
||||||
if (CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
|
|
||||||
{
|
|
||||||
stringBuilder.Append(c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return stringBuilder.ToString();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string FromBase64(string str) =>
|
|
||||||
Encoding.UTF8.GetString(Convert.FromBase64String(str));
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Convert an array of bytes to a string of hex digits
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="bytes">array of bytes</param>
|
|
||||||
/// <returns>String of hex digits</returns>
|
|
||||||
public static string HexStringFromBytes(byte[] bytes) =>
|
|
||||||
string.Join("", bytes.Select(b => b.ToString("X2")));
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Compute hash for string encoded as UTF8
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="s">String to be hashed</param>
|
|
||||||
/// <returns>40-character hex string</returns>
|
|
||||||
public static string HashSHA1(string s)
|
|
||||||
{
|
|
||||||
var sha1 = SHA1.Create();
|
|
||||||
|
|
||||||
var bytes = Encoding.UTF8.GetBytes(s);
|
|
||||||
var hashBytes = sha1.ComputeHash(bytes);
|
|
||||||
|
|
||||||
return HexStringFromBytes(hashBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string Hash(string s)
|
|
||||||
{
|
|
||||||
// Use input string to calculate MD5 hash
|
|
||||||
var md5 = System.Security.Cryptography.MD5.Create();
|
|
||||||
|
|
||||||
var inputBytes = System.Text.Encoding.ASCII.GetBytes(s);
|
|
||||||
var hashBytes = md5.ComputeHash(inputBytes);
|
|
||||||
|
|
||||||
return HexStringFromBytes(hashBytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is never used
|
|
||||||
// remove in favor of Exception.ToString() ?
|
|
||||||
public static string GetExceptionDetails(this Exception exception)
|
|
||||||
{
|
|
||||||
var properties = exception.GetType()
|
|
||||||
.GetProperties();
|
|
||||||
var fields = properties
|
|
||||||
.Select(property => new
|
|
||||||
{
|
|
||||||
Name = property.Name,
|
|
||||||
Value = property.GetValue(exception, null)
|
|
||||||
})
|
|
||||||
.Select(x => string.Format(
|
|
||||||
"{0} = {1}",
|
|
||||||
x.Name,
|
|
||||||
x.Value != null ? x.Value.ToString() : string.Empty));
|
|
||||||
return string.Join("\n", fields);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static char[] MakeValidFileName_invalids;
|
private static char[] MakeValidFileName_invalids;
|
||||||
|
|
||||||
/// <summary>Replaces characters in <c>text</c> that are not allowed in
|
|
||||||
/// file names with the specified replacement character.</summary>
|
|
||||||
/// <param name="text">Text to make into a valid filename. The same string is returned if it is valid already.</param>
|
|
||||||
/// <param name="replacement">Replacement character, or null to simply remove bad characters.</param>
|
|
||||||
/// <param name="fancy">Whether to replace quotes and slashes with the non-ASCII characters ” and ⁄.</param>
|
|
||||||
/// <returns>A string that can be used as a filename. If the output string would otherwise be empty, returns "_".</returns>
|
|
||||||
public static string MakeValidFileName(string text, char? replacement = '_', bool fancy = true)
|
public static string MakeValidFileName(string text, char? replacement = '_', bool fancy = true)
|
||||||
{
|
{
|
||||||
var sb = new StringBuilder(text.Length);
|
var sb = new StringBuilder(text.Length);
|
||||||
var invalids = MakeValidFileName_invalids ?? (MakeValidFileName_invalids = Path.GetInvalidFileNameChars());
|
var invalids = MakeValidFileName_invalids ??= Path.GetInvalidFileNameChars();
|
||||||
var changed = false;
|
var changed = false;
|
||||||
for (var i = 0; i < text.Length; i++)
|
for (var i = 0; i < text.Length; i++)
|
||||||
{
|
{
|
||||||
|
@ -180,16 +89,6 @@ namespace NzbDrone.Core.Parser
|
||||||
return changed ? sb.ToString() : text;
|
return changed ? sb.ToString() : text;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Converts a NameValueCollection to an appropriately formatted query string.
|
|
||||||
/// Duplicate keys are allowed in a NameValueCollection, but are stored as a csv string in Value.
|
|
||||||
/// This function handles leaving the values together in the csv string or splitting the value into separate keys
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="collection">The NameValueCollection being converted</param>
|
|
||||||
/// <param name="encoding">The Encoding to use in url encoding Value</param>
|
|
||||||
/// <param name="duplicateKeysIfMulti">Duplicate keys are handled as true => {"Key=Val1", "Key=Val2} or false => {"Key=Val1,Val2"}</param>
|
|
||||||
/// <param name="separator">The string used to separate each query value</param>
|
|
||||||
/// <returns>A web encoded string of key=value parameters separated by the separator</returns>
|
|
||||||
public static string GetQueryString(this NameValueCollection collection,
|
public static string GetQueryString(this NameValueCollection collection,
|
||||||
Encoding encoding = null,
|
Encoding encoding = null,
|
||||||
bool duplicateKeysIfMulti = false,
|
bool duplicateKeysIfMulti = false,
|
||||||
|
@ -238,24 +137,6 @@ namespace NzbDrone.Core.Parser
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static string GenerateRandom(int length)
|
|
||||||
{
|
|
||||||
var chars = "abcdefghijklmnopqrstuvwxyz0123456789";
|
|
||||||
var randBytes = new byte[length];
|
|
||||||
|
|
||||||
using (var rngCsp = RandomNumberGenerator.Create())
|
|
||||||
{
|
|
||||||
rngCsp.GetBytes(randBytes);
|
|
||||||
var key = "";
|
|
||||||
foreach (var b in randBytes)
|
|
||||||
{
|
|
||||||
key += chars[b % chars.Length];
|
|
||||||
}
|
|
||||||
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static string NormalizeTitle(this string title)
|
public static string NormalizeTitle(this string title)
|
||||||
{
|
{
|
||||||
title = WordDelimiterRegex.Replace(title, " ");
|
title = WordDelimiterRegex.Replace(title, " ");
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue