public void Basic() { var tags = new MGTagCollection(); tags.Add("foo", 123); tags.Add("foo", 456); tags.Add("bar", "asdf"); tags.Add("bar", "qwer"); Assert.That(() => tags.Add("foo", "789"), Throws.TypeOf<ArgumentException>()); Assert.That(() => tags.Add("bar", 123), Throws.TypeOf<ArgumentException>()); tags.Add("foo", 987); tags.Add("bar", "poiu"); }
private void ParseTokens(List<Token> tokens, MGTagCollection tags, bool foundSeriesTitle) { //tokens = tokens.Where(t => t.TokenType != TokenType.WhiteSpace).ToList(); //Remove whitespace //Find CRC32 var crcMatches = Pattern.Exact(Pattern.Single(TokenType.OpenBracket), //Pattern.Single(TokenType.Letter), Pattern.Single(new Regex("[0-9A-F]{8}")), Pattern.Single(TokenType.CloseBracket)).MatchAndRemove(tokens); if (crcMatches != null) { tags.Set(TVShowDataStoreTemplate.CRC32, crcMatches[1].GetContentsString()); } //Match labels numbers int? episodeNum = MatchAndRemoveLabeledNumber(tokens, c_EpisodeWords); int? seasonNum = MatchAndRemoveLabeledNumber(tokens, c_SeasonWords); int? partNum = MatchAndRemoveLabeledNumber(tokens, c_PartWords); int? versionNum = MatchAndRemoveLabeledNumber(tokens, c_VersionWords); var yearMatches = Pattern.Exact(Pattern.Single(TokenType.OpenBracket), Pattern.Single(new Regex(@"\d{4}")), Pattern.Single(TokenType.CloseBracket)).MatchAndRemove(tokens); string year = null; if (yearMatches != null) { year = yearMatches[1].GetContentsString(); } if (!episodeNum.HasValue && !seasonNum.HasValue) { //Try to match 01x03 var matchedTokens = Pattern.Exact(Pattern.Single(TokenType.Number), Pattern.Any("x"), Pattern.Single(TokenType.Number)).MatchAndRemove(tokens); if (matchedTokens != null) { seasonNum = int.Parse(matchedTokens[0].GetContentsString()); episodeNum = int.Parse(matchedTokens[2].GetContentsString()); } } //Match the first two numbers as series and episode if (!episodeNum.HasValue) { var firstNumberToken = Pattern.Single(TokenType.Number).MatchAndRemove(tokens); var secondNumberToken = Pattern.Single(new Regex(@"\d{1,3}")).MatchAndRemove(tokens); //var numberTokens = tokens.Where(t => t.TokenType == TokenType.Number).ToArray(); if (firstNumberToken != null && secondNumberToken == null) { int num = int.Parse(firstNumberToken[0].GetContentsString()); if (num > 100) { seasonNum = num / 100; episodeNum = num % 100; } else { seasonNum = 1; episodeNum = num; } } else if (firstNumberToken != null && secondNumberToken != null) { seasonNum = int.Parse(firstNumberToken[0].GetContentsString()); episodeNum = int.Parse(secondNumberToken[0].GetContentsString()); } else { //No numbers found at all } } if (episodeNum.HasValue && !seasonNum.HasValue || seasonNum > 100) seasonNum = 1; if (seasonNum.HasValue) tags.Set(TVShowDataStoreTemplate.SeasonNumber, seasonNum.Value); if (episodeNum.HasValue) tags.Set(TVShowDataStoreTemplate.EpisodeNumber, episodeNum.Value); //Grab group var groupToken = Pattern.Exact(Pattern.Start(), Pattern.Single(TokenType.OpenBracket), Pattern.ZeroOrMore(Pattern.Not(Pattern.Single(TokenType.CloseBracket)))).MatchAndRemove(tokens); if (groupToken != null) { tags.Set(TVShowDataStoreTemplate.Group, groupToken.Select(t => t.ToString()).JoinToString(" ")); } //The longest phrase must be series title bool includeNumbers = episodeNum.HasValue && seasonNum.HasValue; var phrases = TokensToPhrases(tokens, includeNumbers); //var longestPhrase = phrases.MaxItem(p => p.Tokens.Count); if (phrases.Count >= 1) tags.Set(TVShowDataStoreTemplate.SeriesTitle, phrases[0].Trim().GetContents() + (year != null ? " (" + year + ")" : "")); if (phrases.Count >= 2) tags.Set(TVShowDataStoreTemplate.EpisodeTitle, phrases[1].Trim().GetContents()); }