static DBExpression() { // make sure the table is created - create a dummy object DBExpression dummy = new DBExpression(); DBExpression[] expressions = DBExpression.GetAll(); if (expressions == null || expressions.Length == 0) { // no expressions in the db, add defaults AddDefaults(); } else { // upgrade, add any new expressions int nCurrentDBVersion = cDBVersion; int nUpgradeDBVersion = DBOption.GetOptions(DBOption.cDBExpressionsVersion); while (nUpgradeDBVersion != nCurrentDBVersion) { DBExpression expression = new DBExpression(); switch (nUpgradeDBVersion) { case 4: expression[DBExpression.cEnabled] = "1"; expression[DBExpression.cIndex] = expressions.Length; expression[DBExpression.cType] = DBExpression.cType_Regexp; expression[DBExpression.cExpression] = @"(^.*?\\?(?<series>[^\\$]+?)[ .-]+(?<firstaired>\d{2,4}[.-]\d{2}[.-]\d{2,4})[ .-]*(?<title>(?![^\\]*?(?<!the)[ .(-]sample[ .)-]).*?)\.(?<ext>[^.]*)$)"; expression.Commit(); break; } nUpgradeDBVersion++; } DBOption.SetOptions(DBOption.cDBExpressionsVersion, nCurrentDBVersion); } }
/// <summary> /// Loads and compile Parsing Expressions and also String Replacements /// </summary> /// <returns></returns> public static bool reLoadExpressions() { // build a list of all the regular expressions to apply bool error = false; try { MPTVSeriesLog.Write("Compiling Parsing Expressions"); sExpressions.Clear(); regularExpressions.Clear(); replacementRegexAfter.Clear(); replacementRegexBefore.Clear(); DBExpression[] expressions = DBExpression.GetAll(); foreach (DBExpression expression in expressions) { if (expression[DBExpression.cEnabled] != 0) { String sExpression = String.Empty; switch ((String)expression[DBExpression.cType]) { case DBExpression.cType_Simple: sExpression = ConvertSimpleExpressionToRegEx(expression[DBExpression.cExpression]); break; case DBExpression.cType_Regexp: sExpression = expression[DBExpression.cExpression]; break; } sExpression = sExpression.ToLower(); // replace series, season and episode by the valid DBEpisode column names sExpression = sExpression.Replace("<series>", "<" + DBSeries.cParsedName + ">"); sExpression = sExpression.Replace("<season>", "<" + DBEpisode.cSeasonIndex + ">"); sExpression = sExpression.Replace("<episode>", "<" + DBEpisode.cEpisodeIndex + ">"); sExpression = sExpression.Replace("<episode2>", "<" + DBEpisode.cEpisodeIndex2 + ">"); sExpression = sExpression.Replace("<title>", "<" + DBEpisode.cEpisodeName + ">"); sExpression = sExpression.Replace("<firstaired>", "<" + DBOnlineEpisode.cFirstAired + ">"); // we precompile the expressions here which is faster in the end try { regularExpressions.Add(new Regex(sExpression, RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture | RegexOptions.Compiled)); sExpressions.Add(sExpression); } catch (Exception e) { // wrong regex MPTVSeriesLog.Write("Cannot use the following Expression: " + e.Message); } } } MPTVSeriesLog.Write("Finished Compiling Parsing Expressions, found " + sExpressions.Count.ToString() + " valid expressions"); } catch (Exception ex) { MPTVSeriesLog.Write("Error loading Parsing Expressions: " + ex.Message); error = true; } // now go for the replacements try { MPTVSeriesLog.Write("Compiling Replacement Expressions"); foreach (DBReplacements replacement in DBReplacements.GetAll()) { try { if (replacement[DBReplacements.cEnabled]) { String searchString = replacement[DBReplacements.cToReplace]; searchString = searchString .Replace("<space>", " "); string regexSearchString = searchString; if (!replacement[DBReplacements.cIsRegex]) { regexSearchString = Regex.Escape(searchString); } String replaceString = replacement[DBReplacements.cWith]; replaceString = replaceString .Replace("<space>", " ") .Replace("<empty>", ""); var replaceRegex = new Regex(regexSearchString, RegexOptions.Compiled | RegexOptions.IgnoreCase); if (replacement[DBReplacements.cBefore]) { replacementRegexBefore.Add(replaceRegex, replaceString); } else { replacementRegexAfter.Add(replaceRegex, replaceString); } if (replacement[DBReplacements.cTagEnabled]) { tags.Add(searchString); } } } catch (Exception e) { MPTVSeriesLog.Write("Cannot use the following Expression: " + e.Message); } } MPTVSeriesLog.Write("Finished Compiling Replacement Expressions, found " + (replacementRegexBefore.Count + replacementRegexAfter.Count).ToString() + " valid expressions"); return(error); } catch (Exception ex) { MPTVSeriesLog.Write("Error loading String Replacements: " + ex.Message); return(false); } }