private static bool isValid(TvShowInfoProvider someProvider) { if (string.IsNullOrEmpty(someProvider.getName())) { return(false); } return(true); }
/// <summary> /// Checks the app subfolder for tv show provider configuration files and populates the list with valid configurations /// </summary> public static void loadAllValidTvShowInfoProviders() { StringBuilder status = new StringBuilder(); status.AppendLine("Providers found:"); foreach (string configFileName in getConfigurationFileNames(TVSHOWINFOPROVIDER_CONFIGURATION_FOLDER)) { log.Debug("Provider: " + configFileName); try { TvShowInfoProvider newTvShowInfoProvider = new TvShowInfoProvider(configFileName); if (!isValid(newTvShowInfoProvider)) { log.Error("Invalid provider file: " + configFileName); delete(newTvShowInfoProvider); continue; } status.AppendLine(newTvShowInfoProvider.getName()); } catch (Exception ex) { log.Error("Invalid provider file: " + configFileName + " Error: " + ex.Message); } } log.Info(status.ToString()); }
//parse page(s) containing relations /// <summary> /// Parses page containing the relation data /// </summary> /// <param name="url">URL of the page to parse</param> /// <param name="Showname">Showname</param> public static void GetRelations(string url, string Showname, TvShowInfoProvider provider, BackgroundWorker worker, DoWorkEventArgs dwea) { if (provider == null) { log.Error("GetRelations: No relation provider found/selected"); return; } if (String.IsNullOrEmpty(url)) { log.Error("GetRelations: URL is null or empty"); return; } if (String.IsNullOrEmpty(Showname)) { log.Error("GetRelations: Showname is null or empty"); return; } log.Debug("Trying to get relations from " + url); //if episode infos are stored on a new page for each season, this should be marked with %S in url, so we can iterate through all those pages int season = 1; string url2 = url; //Create new RelationCollection TvShow rc = new TvShow(Showname); while (true) { if (url2.Contains("%S")) { url = url2.Replace("%S", season.ToString()); } if (url == null || url == "") return; // request url = System.Web.HttpUtility.UrlPathEncode(url); log.Debug("Trying to get relations for season " + season + " from " + url); HttpWebRequest requestHtml = null; try { requestHtml = (HttpWebRequest)(HttpWebRequest.Create(url)); } catch (Exception ex) { log.Error(ex.Message); requestHtml.Abort(); return; } requestHtml.Timeout = Helper.ReadInt(AppProperties.CONNECTION_TIMEOUT_KEY); // get response HttpWebResponse responseHtml = null; try { responseHtml = (HttpWebResponse)(requestHtml.GetResponse()); } catch (WebException ex) { //Serienjunkies returns "(300) Mehrdeutige Umleitung" when an inexistant season is requested if (ex.Message.Contains("(300)")) break; log.Error(ex.Message); if (responseHtml != null) { responseHtml.Close(); } return; } log.Debug("Response URL: " + responseHtml.ResponseUri.AbsoluteUri); //if we get redirected, lets assume this page does not exist if (responseHtml.ResponseUri.AbsoluteUri != url) { log.Debug("Response URL doesn't match request URL, page doesn't seem to exist"); responseHtml.Close(); requestHtml.Abort(); break; } // and download //Logger.Instance.LogMessage("charset=" + responseHtml.CharacterSet, LogLevel.INFO); Encoding enc; if (provider.Encoding != null && provider.Encoding != "") { try { enc = Encoding.GetEncoding(provider.Encoding); } catch (Exception ex) { log.Error("Invalid encoding in config file: " + ex.Message); enc = Encoding.GetEncoding(responseHtml.CharacterSet); } } else { enc = Encoding.GetEncoding(responseHtml.CharacterSet); } StreamReader r = new StreamReader(responseHtml.GetResponseStream(), enc); string source = r.ReadToEnd(); r.Close(); responseHtml.Close(); //Source cropping source = source.Substring(Math.Max(source.IndexOf(provider.RelationsStart), 0)); source = source.Substring(0, Math.Max(source.LastIndexOf(provider.RelationsEnd), 0)); string pattern = provider.RelationsRegExp; //for some reason, responseHtml.ResponseUri is null for some providers when running on mono if (!Settings.Instance.isMonoCompatibilityMode) { log.Debug("Trying to match source from " + responseHtml.ResponseUri.AbsoluteUri + " with " + pattern); } RegexOptions ro = RegexOptions.IgnoreCase | RegexOptions.Singleline; if (provider.RelationsRightToLeft) ro |= RegexOptions.RightToLeft; MatchCollection mc = Regex.Matches(source, pattern, ro); string CleanupRegex = provider.RelationsRemove; for (int i = 0; i < mc.Count; i++) { Match m = mc[i]; string result = Regex.Replace(System.Web.HttpUtility.HtmlDecode(m.Groups["Title"].Value), CleanupRegex, ""); //RELATIONS_REMOVE_KEY may be used to filter out results completely, for example if they are a html tag if (result != "") { //parse season and episode numbers int s, e; Int32.TryParse(m.Groups["Season"].Value, out s); Int32.TryParse(m.Groups["Episode"].Value, out e); //if we are iterating through season pages, take season from page url directly if (url != url2) { rc.AddEpisode(new ShowEpisode(season, e, result)); log.Debug("Found Relation: " + "S" + s.ToString() + "E" + e.ToString() + " - " + result); } else { rc.AddEpisode(new ShowEpisode(s, e, result)); log.Debug("Found Relation: " + "S" + s.ToString() + "E" + e.ToString() + " - " + result); } } } TvShowManager.Instance.addTvShow(rc); // THOU SHALL NOT FORGET THE BREAK if (!url2.Contains("%S")) break; season++; } log.Debug("" + (season - 1) + " Seasons, " + rc.CountEpisodes + " relations found"); }
public static void delete(TvShowInfoProvider oldInfoProvider) { tvShowInfoProviders.Remove(oldInfoProvider); }
private static bool isValid(TvShowInfoProvider someProvider) { if (string.IsNullOrEmpty(someProvider.getName())) { return false; } return true; }