mirror of
https://github.com/Readarr/Readarr.git
synced 2026-04-21 22:04:31 -04:00
New: Readarr 0.1
This commit is contained in:
@@ -25,24 +25,10 @@ namespace NzbDrone.Core.Parser
|
||||
private static readonly Regex RealRegex = new Regex(@"\b(?<real>REAL)\b",
|
||||
RegexOptions.Compiled);
|
||||
|
||||
private static readonly Regex BitRateRegex = new Regex(@"\b(?:(?<B096>96[ ]?kbps|96|[\[\(].*96.*[\]\)])|
|
||||
(?<B128>128[ ]?kbps|128|[\[\(].*128.*[\]\)])|
|
||||
(?<B160>160[ ]?kbps|160|[\[\(].*160.*[\]\)]|q5)|
|
||||
(?<B192>192[ ]?kbps|192|[\[\(].*192.*[\]\)]|q6)|
|
||||
(?<B224>224[ ]?kbps|224|[\[\(].*224.*[\]\)]|q7)|
|
||||
(?<B256>256[ ]?kbps|256|itunes\splus|[\[\(].*256.*[\]\)]|q8)|
|
||||
(?<B320>320[ ]?kbps|320|[\[\(].*320.*[\]\)]|q9)|
|
||||
(?<B500>500[ ]?kbps|500|[\[\(].*500.*[\]\)]|q10)|
|
||||
(?<VBRV0>V0[ ]?kbps|V0|[\[\(].*V0.*[\]\)])|
|
||||
(?<VBRV2>V2[ ]?kbps|V2|[\[\(].*V2.*[\]\)]))\b",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.IgnorePatternWhitespace);
|
||||
private static readonly Regex CodecRegex = new Regex(@"\b(?:(?<PDF>PDF)|(?<MOBI>MOBI)|(?<EPUB>EPUB)|(?<AZW3>AZW3?)|(?<MP1>MPEG Version \d(.5)? Audio, Layer 1|MP1)|(?<MP2>MPEG Version \d(.5)? Audio, Layer 2|MP2)|(?<MP3VBR>MP3.*VBR|MPEG Version \d(.5)? Audio, Layer 3 vbr)|(?<MP3CBR>MP3|MPEG Version \d(.5)? Audio, Layer 3)|(?<FLAC>flac)|(?<WAVPACK>wavpack|wv)|(?<ALAC>alac)|(?<WMA>WMA\d?)|(?<WAV>WAV|PCM)|(?<AAC>M4A|M4P|M4B|AAC|mp4a|MPEG-4 Audio(?!.*alac))|(?<OGG>OGG|OGA|Vorbis))\b|(?<APE>monkey's audio|[\[|\(].*\bape\b.*[\]|\)])|(?<OPUS>Opus Version \d(.5)? Audio|[\[|\(].*\bopus\b.*[\]|\)])",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
private static readonly Regex SampleSizeRegex = new Regex(@"\b(?:(?<S24>24[ ]bit|24bit|[\[\(].*24bit.*[\]\)]))");
|
||||
|
||||
private static readonly Regex CodecRegex = new Regex(@"\b(?:(?<MP1>MPEG Version \d(.5)? Audio, Layer 1|MP1)|(?<MP2>MPEG Version \d(.5)? Audio, Layer 2|MP2)|(?<MP3VBR>MP3.*VBR|MPEG Version \d(.5)? Audio, Layer 3 vbr)|(?<MP3CBR>MP3|MPEG Version \d(.5)? Audio, Layer 3)|(?<FLAC>flac)|(?<WAVPACK>wavpack|wv)|(?<ALAC>alac)|(?<WMA>WMA\d?)|(?<WAV>WAV|PCM)|(?<AAC>M4A|M4P|M4B|AAC|mp4a|MPEG-4 Audio(?!.*alac))|(?<OGG>OGG|OGA|Vorbis))\b|(?<APE>monkey's audio|[\[|\(].*\bape\b.*[\]|\)])|(?<OPUS>Opus Version \d(.5)? Audio|[\[|\(].*\bopus\b.*[\]|\)])",
|
||||
RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
public static QualityModel ParseQuality(string name, string desc, int fileBitrate, int fileSampleSize = 0)
|
||||
public static QualityModel ParseQuality(string name, string desc = null)
|
||||
{
|
||||
Logger.Debug("Trying to parse quality for {0}", name);
|
||||
|
||||
@@ -54,7 +40,7 @@ namespace NzbDrone.Core.Parser
|
||||
var descCodec = ParseCodec(desc, "");
|
||||
Logger.Trace($"Got codec {descCodec}");
|
||||
|
||||
result.Quality = FindQuality(descCodec, fileBitrate, fileSampleSize);
|
||||
result.Quality = FindQuality(descCodec);
|
||||
|
||||
if (result.Quality != Quality.Unknown)
|
||||
{
|
||||
@@ -64,164 +50,40 @@ namespace NzbDrone.Core.Parser
|
||||
}
|
||||
|
||||
var codec = ParseCodec(normalizedName, name);
|
||||
var bitrate = ParseBitRate(normalizedName);
|
||||
var sampleSize = ParseSampleSize(normalizedName);
|
||||
|
||||
switch (codec)
|
||||
{
|
||||
case Codec.MP1:
|
||||
case Codec.MP2:
|
||||
result.Quality = Quality.Unknown;
|
||||
case Codec.PDF:
|
||||
result.Quality = Quality.PDF;
|
||||
break;
|
||||
case Codec.MP3VBR:
|
||||
if (bitrate == BitRate.VBRV0)
|
||||
{
|
||||
result.Quality = Quality.MP3_VBR;
|
||||
}
|
||||
else if (bitrate == BitRate.VBRV2)
|
||||
{
|
||||
result.Quality = Quality.MP3_VBR_V2;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Quality = Quality.Unknown;
|
||||
}
|
||||
|
||||
case Codec.EPUB:
|
||||
result.Quality = Quality.EPUB;
|
||||
break;
|
||||
case Codec.MP3CBR:
|
||||
if (bitrate == BitRate.B096)
|
||||
{
|
||||
result.Quality = Quality.MP3_096;
|
||||
}
|
||||
else if (bitrate == BitRate.B128)
|
||||
{
|
||||
result.Quality = Quality.MP3_128;
|
||||
}
|
||||
else if (bitrate == BitRate.B160)
|
||||
{
|
||||
result.Quality = Quality.MP3_160;
|
||||
}
|
||||
else if (bitrate == BitRate.B192)
|
||||
{
|
||||
result.Quality = Quality.MP3_192;
|
||||
}
|
||||
else if (bitrate == BitRate.B256)
|
||||
{
|
||||
result.Quality = Quality.MP3_256;
|
||||
}
|
||||
else if (bitrate == BitRate.B320)
|
||||
{
|
||||
result.Quality = Quality.MP3_320;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Quality = Quality.Unknown;
|
||||
}
|
||||
|
||||
case Codec.MOBI:
|
||||
result.Quality = Quality.MOBI;
|
||||
break;
|
||||
case Codec.AZW3:
|
||||
result.Quality = Quality.AZW3;
|
||||
break;
|
||||
case Codec.FLAC:
|
||||
if (sampleSize == SampleSize.S24)
|
||||
{
|
||||
result.Quality = Quality.FLAC_24;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Quality = Quality.FLAC;
|
||||
}
|
||||
|
||||
break;
|
||||
case Codec.ALAC:
|
||||
result.Quality = Quality.ALAC;
|
||||
break;
|
||||
case Codec.WAVPACK:
|
||||
result.Quality = Quality.WAVPACK;
|
||||
result.Quality = Quality.FLAC;
|
||||
break;
|
||||
case Codec.MP1:
|
||||
case Codec.MP2:
|
||||
case Codec.MP3VBR:
|
||||
case Codec.MP3CBR:
|
||||
case Codec.APE:
|
||||
result.Quality = Quality.APE;
|
||||
break;
|
||||
case Codec.WMA:
|
||||
result.Quality = Quality.WMA;
|
||||
break;
|
||||
case Codec.WAV:
|
||||
result.Quality = Quality.WAV;
|
||||
break;
|
||||
case Codec.AAC:
|
||||
if (bitrate == BitRate.B192)
|
||||
{
|
||||
result.Quality = Quality.AAC_192;
|
||||
}
|
||||
else if (bitrate == BitRate.B256)
|
||||
{
|
||||
result.Quality = Quality.AAC_256;
|
||||
}
|
||||
else if (bitrate == BitRate.B320)
|
||||
{
|
||||
result.Quality = Quality.AAC_320;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Quality = Quality.AAC_VBR;
|
||||
}
|
||||
|
||||
break;
|
||||
case Codec.AACVBR:
|
||||
result.Quality = Quality.AAC_VBR;
|
||||
break;
|
||||
case Codec.OGG:
|
||||
case Codec.OPUS:
|
||||
if (bitrate == BitRate.B160)
|
||||
{
|
||||
result.Quality = Quality.VORBIS_Q5;
|
||||
}
|
||||
else if (bitrate == BitRate.B192)
|
||||
{
|
||||
result.Quality = Quality.VORBIS_Q6;
|
||||
}
|
||||
else if (bitrate == BitRate.B224)
|
||||
{
|
||||
result.Quality = Quality.VORBIS_Q7;
|
||||
}
|
||||
else if (bitrate == BitRate.B256)
|
||||
{
|
||||
result.Quality = Quality.VORBIS_Q8;
|
||||
}
|
||||
else if (bitrate == BitRate.B320)
|
||||
{
|
||||
result.Quality = Quality.VORBIS_Q9;
|
||||
}
|
||||
else if (bitrate == BitRate.B500)
|
||||
{
|
||||
result.Quality = Quality.VORBIS_Q10;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Quality = Quality.Unknown;
|
||||
}
|
||||
|
||||
result.Quality = Quality.MP3_320;
|
||||
break;
|
||||
case Codec.Unknown:
|
||||
if (bitrate == BitRate.B192)
|
||||
{
|
||||
result.Quality = Quality.MP3_192;
|
||||
}
|
||||
else if (bitrate == BitRate.B256)
|
||||
{
|
||||
result.Quality = Quality.MP3_256;
|
||||
}
|
||||
else if (bitrate == BitRate.B320)
|
||||
{
|
||||
result.Quality = Quality.MP3_320;
|
||||
}
|
||||
else if (bitrate == BitRate.VBR)
|
||||
{
|
||||
result.Quality = Quality.MP3_VBR_V2;
|
||||
}
|
||||
else
|
||||
{
|
||||
result.Quality = Quality.Unknown;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
result.Quality = Quality.Unknown;
|
||||
break;
|
||||
@@ -259,6 +121,26 @@ namespace NzbDrone.Core.Parser
|
||||
return Codec.Unknown;
|
||||
}
|
||||
|
||||
if (match.Groups["PDF"].Success)
|
||||
{
|
||||
return Codec.PDF;
|
||||
}
|
||||
|
||||
if (match.Groups["EPUB"].Success)
|
||||
{
|
||||
return Codec.EPUB;
|
||||
}
|
||||
|
||||
if (match.Groups["MOBI"].Success)
|
||||
{
|
||||
return Codec.MOBI;
|
||||
}
|
||||
|
||||
if (match.Groups["AZW3"].Success)
|
||||
{
|
||||
return Codec.AZW3;
|
||||
}
|
||||
|
||||
if (match.Groups["FLAC"].Success)
|
||||
{
|
||||
return Codec.FLAC;
|
||||
@@ -327,287 +209,26 @@ namespace NzbDrone.Core.Parser
|
||||
return Codec.Unknown;
|
||||
}
|
||||
|
||||
private static BitRate ParseBitRate(string name)
|
||||
{
|
||||
//var nameWithNoSpaces = Regex.Replace(name, @"\s+", "");
|
||||
var match = BitRateRegex.Match(name);
|
||||
|
||||
if (!match.Success)
|
||||
{
|
||||
return BitRate.Unknown;
|
||||
}
|
||||
|
||||
if (match.Groups["B096"].Success)
|
||||
{
|
||||
return BitRate.B096;
|
||||
}
|
||||
|
||||
if (match.Groups["B128"].Success)
|
||||
{
|
||||
return BitRate.B128;
|
||||
}
|
||||
|
||||
if (match.Groups["B160"].Success)
|
||||
{
|
||||
return BitRate.B160;
|
||||
}
|
||||
|
||||
if (match.Groups["B192"].Success)
|
||||
{
|
||||
return BitRate.B192;
|
||||
}
|
||||
|
||||
if (match.Groups["B224"].Success)
|
||||
{
|
||||
return BitRate.B224;
|
||||
}
|
||||
|
||||
if (match.Groups["B256"].Success)
|
||||
{
|
||||
return BitRate.B256;
|
||||
}
|
||||
|
||||
if (match.Groups["B320"].Success)
|
||||
{
|
||||
return BitRate.B320;
|
||||
}
|
||||
|
||||
if (match.Groups["B500"].Success)
|
||||
{
|
||||
return BitRate.B500;
|
||||
}
|
||||
|
||||
if (match.Groups["VBR"].Success)
|
||||
{
|
||||
return BitRate.VBR;
|
||||
}
|
||||
|
||||
if (match.Groups["VBRV0"].Success)
|
||||
{
|
||||
return BitRate.VBRV0;
|
||||
}
|
||||
|
||||
if (match.Groups["VBRV2"].Success)
|
||||
{
|
||||
return BitRate.VBRV2;
|
||||
}
|
||||
|
||||
return BitRate.Unknown;
|
||||
}
|
||||
|
||||
private static SampleSize ParseSampleSize(string name)
|
||||
{
|
||||
var match = SampleSizeRegex.Match(name);
|
||||
|
||||
if (!match.Success)
|
||||
{
|
||||
return SampleSize.Unknown;
|
||||
}
|
||||
|
||||
if (match.Groups["S24"].Success)
|
||||
{
|
||||
return SampleSize.S24;
|
||||
}
|
||||
|
||||
return SampleSize.Unknown;
|
||||
}
|
||||
|
||||
private static Quality FindQuality(Codec codec, int bitrate, int sampleSize = 0)
|
||||
private static Quality FindQuality(Codec codec)
|
||||
{
|
||||
switch (codec)
|
||||
{
|
||||
case Codec.ALAC:
|
||||
case Codec.FLAC:
|
||||
case Codec.WAVPACK:
|
||||
case Codec.WAV:
|
||||
return Quality.FLAC;
|
||||
case Codec.MP1:
|
||||
case Codec.MP2:
|
||||
return Quality.Unknown;
|
||||
case Codec.MP3VBR:
|
||||
return Quality.MP3_VBR;
|
||||
case Codec.MP3CBR:
|
||||
if (bitrate == 8)
|
||||
{
|
||||
return Quality.MP3_008;
|
||||
}
|
||||
|
||||
if (bitrate == 16)
|
||||
{
|
||||
return Quality.MP3_016;
|
||||
}
|
||||
|
||||
if (bitrate == 24)
|
||||
{
|
||||
return Quality.MP3_024;
|
||||
}
|
||||
|
||||
if (bitrate == 32)
|
||||
{
|
||||
return Quality.MP3_032;
|
||||
}
|
||||
|
||||
if (bitrate == 40)
|
||||
{
|
||||
return Quality.MP3_040;
|
||||
}
|
||||
|
||||
if (bitrate == 48)
|
||||
{
|
||||
return Quality.MP3_048;
|
||||
}
|
||||
|
||||
if (bitrate == 56)
|
||||
{
|
||||
return Quality.MP3_056;
|
||||
}
|
||||
|
||||
if (bitrate == 64)
|
||||
{
|
||||
return Quality.MP3_064;
|
||||
}
|
||||
|
||||
if (bitrate == 80)
|
||||
{
|
||||
return Quality.MP3_080;
|
||||
}
|
||||
|
||||
if (bitrate == 96)
|
||||
{
|
||||
return Quality.MP3_096;
|
||||
}
|
||||
|
||||
if (bitrate == 112)
|
||||
{
|
||||
return Quality.MP3_112;
|
||||
}
|
||||
|
||||
if (bitrate == 128)
|
||||
{
|
||||
return Quality.MP3_128;
|
||||
}
|
||||
|
||||
if (bitrate == 160)
|
||||
{
|
||||
return Quality.MP3_160;
|
||||
}
|
||||
|
||||
if (bitrate == 192)
|
||||
{
|
||||
return Quality.MP3_192;
|
||||
}
|
||||
|
||||
if (bitrate == 224)
|
||||
{
|
||||
return Quality.MP3_224;
|
||||
}
|
||||
|
||||
if (bitrate == 256)
|
||||
{
|
||||
return Quality.MP3_256;
|
||||
}
|
||||
|
||||
if (bitrate == 320)
|
||||
{
|
||||
return Quality.MP3_320;
|
||||
}
|
||||
|
||||
return Quality.Unknown;
|
||||
case Codec.FLAC:
|
||||
if (sampleSize == 24)
|
||||
{
|
||||
return Quality.FLAC_24;
|
||||
}
|
||||
|
||||
return Quality.FLAC;
|
||||
case Codec.ALAC:
|
||||
return Quality.ALAC;
|
||||
case Codec.WAVPACK:
|
||||
return Quality.WAVPACK;
|
||||
case Codec.APE:
|
||||
return Quality.APE;
|
||||
case Codec.WMA:
|
||||
return Quality.WMA;
|
||||
case Codec.WAV:
|
||||
return Quality.WAV;
|
||||
case Codec.AAC:
|
||||
if (bitrate == 192)
|
||||
{
|
||||
return Quality.AAC_192;
|
||||
}
|
||||
|
||||
if (bitrate == 256)
|
||||
{
|
||||
return Quality.AAC_256;
|
||||
}
|
||||
|
||||
if (bitrate == 320)
|
||||
{
|
||||
return Quality.AAC_320;
|
||||
}
|
||||
|
||||
return Quality.AAC_VBR;
|
||||
case Codec.OGG:
|
||||
if (bitrate == 160)
|
||||
{
|
||||
return Quality.VORBIS_Q5;
|
||||
}
|
||||
|
||||
if (bitrate == 192)
|
||||
{
|
||||
return Quality.VORBIS_Q6;
|
||||
}
|
||||
|
||||
if (bitrate == 224)
|
||||
{
|
||||
return Quality.VORBIS_Q7;
|
||||
}
|
||||
|
||||
if (bitrate == 256)
|
||||
{
|
||||
return Quality.VORBIS_Q8;
|
||||
}
|
||||
|
||||
if (bitrate == 320)
|
||||
{
|
||||
return Quality.VORBIS_Q9;
|
||||
}
|
||||
|
||||
if (bitrate == 500)
|
||||
{
|
||||
return Quality.VORBIS_Q10;
|
||||
}
|
||||
|
||||
return Quality.Unknown;
|
||||
case Codec.OPUS:
|
||||
if (bitrate < 130)
|
||||
{
|
||||
return Quality.Unknown;
|
||||
}
|
||||
|
||||
if (bitrate < 180)
|
||||
{
|
||||
return Quality.VORBIS_Q5;
|
||||
}
|
||||
|
||||
if (bitrate < 205)
|
||||
{
|
||||
return Quality.VORBIS_Q6;
|
||||
}
|
||||
|
||||
if (bitrate < 240)
|
||||
{
|
||||
return Quality.VORBIS_Q7;
|
||||
}
|
||||
|
||||
if (bitrate < 290)
|
||||
{
|
||||
return Quality.VORBIS_Q8;
|
||||
}
|
||||
|
||||
if (bitrate < 410)
|
||||
{
|
||||
return Quality.VORBIS_Q9;
|
||||
}
|
||||
|
||||
return Quality.VORBIS_Q10;
|
||||
default:
|
||||
return Quality.Unknown;
|
||||
return Quality.MP3_320;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -661,28 +282,10 @@ namespace NzbDrone.Core.Parser
|
||||
OGG,
|
||||
OPUS,
|
||||
WAV,
|
||||
Unknown
|
||||
}
|
||||
|
||||
public enum BitRate
|
||||
{
|
||||
B096,
|
||||
B128,
|
||||
B160,
|
||||
B192,
|
||||
B224,
|
||||
B256,
|
||||
B320,
|
||||
B500,
|
||||
VBR,
|
||||
VBRV0,
|
||||
VBRV2,
|
||||
Unknown,
|
||||
}
|
||||
|
||||
public enum SampleSize
|
||||
{
|
||||
S24,
|
||||
PDF,
|
||||
EPUB,
|
||||
MOBI,
|
||||
AZW3,
|
||||
Unknown
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user