예제 #1
0
 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");
 }
예제 #2
0
        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());
        }