public void GetEpisodeName(Episode episode) { if (!string.IsNullOrWhiteSpace(episode.EpisodeName)) return; bool isSameEpisode = _last != null && episode.ShowName == _last.ShowName && (episode.IsDaily ? episode.AirDate == _last.AirDate : episode.SeasonNumber == _last.SeasonNumber && episode.EpisodeNumber == _last.EpisodeNumber && episode.EpisodeNumber == _last.EpisodeNumber2); if (isSameEpisode) { episode.EpisodeName = _last.EpisodeName; episode.EpisodeName2 = _last.EpisodeName2; return; } string seriesId = GetSeriesId(episode.ShowName); if (seriesId == null) return; episode.EpisodeName = episode.IsDaily ? GetEpisodeName(seriesId, episode.AirDate) : GetEpisodeName(seriesId, episode.SeasonNumber, episode.EpisodeNumber); if (episode.EpisodeNumber2 != 0) episode.EpisodeName2 = GetEpisodeName(seriesId, episode.SeasonNumber, episode.EpisodeNumber2); _last = episode; }
public bool IsQualityWanted(Episode episode) { string description = (episode.FeedItem.Description ?? string.Empty).ToLower(); string title = episode.FeedItem.Title.ToLower(); //Get show quality from DB //TODO Clean this up, must be a better way to do it... using (SABSyncEntities sabSyncEntities = new SABSyncEntities()) { var qualityNumber = (from q in sabSyncEntities.shows.AsEnumerable() where q.show_name.Equals(episode.ShowName, StringComparison.InvariantCultureIgnoreCase) select new { q.quality }).FirstOrDefault(); if (qualityNumber == null) {; Logger.Log("Quality is not wanted"); return false; } if (qualityNumber.quality == 0) //If quality is 0 get it! { //Figure out what the episode Quality for this episode is... foreach (var q in QualityTable) { if (title.Contains(q.Value) || description.Contains(q.Value)) { episode.Quality = q.Key; Logger.Log("Quality -{0}- is wanted for: {1}.", q.Value, episode.ShowName); return true; } } return false; //In the unlikely (Web DL) event that the quality is not shown in the title, return false since it will not be wanted } var qualityString = (from q in QualityTable where q.Key == qualityNumber.quality select q.Value).FirstOrDefault(); Logger.Log("Title is: {0}", title); bool titleContainsQuality = title.Contains(qualityString); bool descriptionContainsQuality = description.Contains(qualityString); if (titleContainsQuality || descriptionContainsQuality) { episode.Quality = Convert.ToInt32(qualityNumber.quality); Logger.Log("Quality -{0}- is wanted for: {1}.", qualityString, episode.ShowName); return true; } } Logger.Log("Quality is not wanted"); return false; }
public void AddToHistory(Episode episode, NzbInfo nzb) { using (SABSyncEntities sabSyncEntities = new SABSyncEntities()) { var data = (from e in sabSyncEntities.episodes.AsEnumerable() where e.shows.show_name.Equals(episode.ShowName, StringComparison.InvariantCultureIgnoreCase) && e.episode_number == episode.EpisodeNumber && e.season_number == episode.SeasonNumber select new { ShowId = e.shows.id, EpisodeId = e.id }).FirstOrDefault(); if (data == null) { data = (from e in sabSyncEntities.episodes.AsEnumerable() where e.shows.show_name.Equals(episode.ShowName, StringComparison.InvariantCultureIgnoreCase) && Convert.ToDateTime(e.air_date) == episode.AirDate select new { ShowId = e.shows.id, EpisodeId = e.id }).FirstOrDefault(); } histories newItem = new histories { id = new long(), show_id = data.ShowId, episode_id = data.EpisodeId, feed_title = episode.FeedItem.Title, quality = episode.Quality, proper = Convert.ToInt32(episode.IsProper), provider = nzb.Site.Name, date = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") }; Logger.Log("Episode added to History Database: {0} - S{1}E{2}", episode.ShowName, episode.SeasonNumber.ToString("00"), episode.EpisodeNumber.ToString("00")); sabSyncEntities.AddTohistories(newItem); sabSyncEntities.SaveChanges(); } }
private void GetTitleFix(Episode episode) { if (Config.VerboseLogging) Log("Getting Fixed Title for: " + episode.FeedItem.Title); string titleFix; if (episode.IsDaily) titleFix = string.Format("{0} - {1}", episode.AirDate.ToString("yyyy-MM-dd"), episode.EpisodeName); else if (episode.IsMulti) titleFix = string.Format("{0}x{1:D2}-{0}x{2:D2} - {3} & {4}", episode.SeasonNumber, episode.EpisodeNumber, episode.EpisodeNumber2, episode.EpisodeName, episode.EpisodeName2); else titleFix = string.Format("{0}x{1:D2} - {2}", episode.SeasonNumber, episode.EpisodeNumber, episode.EpisodeName); episode.FeedItem.TitleFix = string.Format("{0} - {1}", episode.ShowName, titleFix).TrimEnd(' ', '-'); if (Config.VerboseLogging) Log("Title Fix is: {0}", episode.FeedItem.TitleFix); }
private bool IsQualityWanted(Episode episode) { if(Database.IsQualityWanted(episode)) return true; RejectDownloadQualityCount++; return false; }
private bool IsInLocalHistory(Episode episode) { //TODO: Move this to Database Logger.Log("Checking SABSync.db for: [{0} - S{1:00}E{2:00}]", episode.ShowName, episode.SeasonNumber, episode.EpisodeNumber); using (SABSyncEntities sabSyncEntities = new SABSyncEntities()) { var ep = (from e in sabSyncEntities.histories where e.shows.show_name.Equals(episode.ShowName) & e.episodes.season_number.Value.Equals(episode.SeasonNumber) & e.episodes.episode_number.Value.Equals(episode.EpisodeNumber) select new { e.proper, e.quality }); //Grab all matches containing matching show name, season number and episode number if (ep.Count() > 0) { if (ep.Count(y => y.quality < episode.Quality) == ep.Count()) //If they are equal then higher quality episode has not yet been downloaded { Logger.Log("Episode is better quality than previously downloaded, deleting previous version"); foreach (DirectoryInfo tvDir in Config.TvRootFolders) { string dir = GetEpisodeDir(episode, tvDir); string fileMask = GetEpisodeFileMask(episode, tvDir); DeleteForUpgrade(dir, fileMask); } return false; } //Check if Both are Propers if (episode.IsProper) { if (ep.AsEnumerable().Any(p => Convert.ToBoolean(p.proper.Value) && episode.Quality == p.quality)) { Logger.Log("Found in Local History"); return true; } return false; //Episode in History is not a proper } //Episode to be downloaded is not a proper and episode was found in local history Logger.Log("Found in Local History"); return true; } } return false; //Not found, return false }
private string GetEpisodeDir(Episode episode, DirectoryInfo tvDir) { if (Config.VerboseLogging) Log("Building string for Episode Dir"); string path = episode.IsDaily ? GetPathForDaily(episode, tvDir) : GetPathForSeasonEpisode(episode, tvDir); if (Config.VerboseLogging) Log(path); return path; }
public bool IsInHistory(Episode episode) { Logger.Log("Checking History for: [{0}]", episode.Title); try { XDocument xml = SabRequest.GetHistory(); string error = GetError(xml); if (error != null) { //Logger.Log("Sab History Error: {0}", true, error); Logger.Log("Sab History Error: {0}", error); return false; } bool found = xml.Elements("history").Elements("slots").Elements("slot") .Select(name => (string) name.Element("name")) .Any(name => name.StartsWith(episode.Title, StringComparison.InvariantCultureIgnoreCase)); if (found) { //Logger.Log("Episode in history - '{0}'", true, episode.Title); Logger.Log("Episode in history - '{0}'", episode.Title); return true; } } catch (Exception ex) { //Logger.Log("An Error has occurred while checking the history. {0}", true, ex); Logger.Log("An Error has occurred while checking the history. {0}", ex); } return false; }
private bool IsEpisodeWanted(Episode episode) { if (IsSeasonIgnored(episode)) return false; if (!IsQualityWanted(episode)) return false; if (IsInLocalHistory(episode)) return false; Database.GetEpisodeName(episode); GetTitleFix(episode); if (Queued.Contains(episode.FeedItem.TitleFix + ": ok")) return false; if (Sab.IsInQueue(episode)) { RejectSabQueuedCount++; return false; } if (IsArchivedNzb(episode.FeedItem)) return false; if (IsOnDisk(episode)) return false; //Ignore the SAB History Check - It's too slow and causes issues with Quality "Upgrading" //bool isProper = episode.IsProper && Config.DownloadPropers; //if (!isProper && Sab.IsInHistory(episode)) //{ // RejectSabHistoryCount++; // return false; //} return true; }
private string GetFileMaskForDaily(Episode episode, DirectoryInfo tvDir) { string fileMask = Path.GetFileName(tvDir + Path.DirectorySeparatorChar.ToString() + Config.TvDailyTemplate); string yearReplace = Convert.ToString(episode.AirDate.Year); string zeroMReplace = String.Format("{0:00}", episode.AirDate.Month); string mReplace = Convert.ToString(episode.AirDate.Month); string zeroDReplace = String.Format("{0:00}", episode.AirDate.Day); string dReplace = Convert.ToString(episode.AirDate.Day); fileMask = fileMask.Replace(".%ext", "*"); fileMask = fileMask.Replace("%desc", "*"); fileMask = fileMask.Replace("%.desc", "*"); fileMask = fileMask.Replace("%_desc", "*"); fileMask = fileMask.Replace("%t", "*"); fileMask = fileMask.Replace("%.t", "*"); fileMask = fileMask.Replace("%_t", "*"); fileMask = fileMask.Replace("%y", yearReplace); fileMask = fileMask.Replace("%0m", zeroMReplace); fileMask = fileMask.Replace("%m", mReplace); fileMask = fileMask.Replace("%0d", zeroDReplace); fileMask = fileMask.Replace("%d", dReplace); //Trim fileMask down to just year/month/day (for shows that do not have episode name) ie. [*2010-01-25*] instead of [* - 2010-01-25 - *] fileMask = fileMask.TrimEnd(' ', '*', '.', '-', '_'); fileMask = fileMask.TrimStart(' ', '*', '.', '-', '_'); fileMask = "*" + fileMask + "*"; return fileMask; }
private string GetFileMaskForSeasonEpisode(Episode episode, DirectoryInfo tvDir) { string zeroSReplace = String.Format("{0:00}", episode.SeasonNumber); string sReplace = Convert.ToString(episode.SeasonNumber); string zeroEReplace = String.Format("{0:00}", episode.EpisodeNumber); string eReplace = Convert.ToString(episode.EpisodeNumber); string fileMask = Path.GetFileName(tvDir + Path.DirectorySeparatorChar.ToString() + Config.TvTemplate); fileMask = fileMask.Replace(".%ext", ""); fileMask = fileMask.Replace("%en", "*"); fileMask = fileMask.Replace("%e.n", "*"); fileMask = fileMask.Replace("%e_n", "*"); fileMask = fileMask.Replace("%sn", "*"); fileMask = fileMask.Replace("%s.n", "*"); fileMask = fileMask.Replace("%s_n", "*"); fileMask = fileMask.Replace("%0s", zeroSReplace); fileMask = fileMask.Replace("%s", sReplace); fileMask = fileMask.Replace("%0e", zeroEReplace); fileMask = fileMask.Replace("%e", eReplace); //Trim fileMask down to just season and episode file mask (for shows that do not have episode name) ie. [*S01E01*] instead of [* - S01E01 - *] fileMask = fileMask.TrimEnd(' ', '*', '.', '-', '_'); fileMask = fileMask.TrimStart(' ', '*', '.', '-', '_'); fileMask = "*" + fileMask + "*"; return fileMask; }
private string GetEpisodeFileMask(Episode episode, DirectoryInfo tvDir) { if (Config.VerboseLogging) Log("Building string for Episode File Mask"); string fileMask = episode.IsDaily ? GetFileMaskForDaily(episode, tvDir) : GetFileMaskForSeasonEpisode(episode, tvDir); if (Config.VerboseLogging) Log(fileMask); return fileMask; }
private string GetPathForDaily(Episode episode, DirectoryInfo tvDir) { string showName = CleanString(episode.ShowName); string tReplace = showName; string dotTReplace = showName.Replace(' ', '.'); string underTReplace = showName.Replace(' ', '_'); string yearReplace = Convert.ToString(episode.AirDate.Year); string zeroMReplace = String.Format("{0:00}", episode.AirDate.Month); string mReplace = Convert.ToString(episode.AirDate.Month); string zeroDReplace = String.Format("{0:00}", episode.AirDate.Day); string dReplace = Convert.ToString(episode.AirDate.Day); string path = Path.GetDirectoryName(tvDir + Path.DirectorySeparatorChar.ToString() + Config.TvDailyTemplate); path = path.Replace(".%ext", ""); path = path.Replace("%t", tReplace); path = path.Replace("%.t", dotTReplace); path = path.Replace("%_t", underTReplace); path = path.Replace("%y", yearReplace); path = path.Replace("%0m", zeroMReplace); path = path.Replace("%m", mReplace); path = path.Replace("%0d", zeroDReplace); path = path.Replace("%d", dReplace); return path; }
private string GetPathForSeasonEpisode(Episode episode, DirectoryInfo tvDir) { string showName = CleanString(episode.ShowName); string snReplace = showName; string sDotNReplace = showName.Replace(' ', '.'); string sUnderNReplace = showName.Replace(' ', '_'); string zeroSReplace = String.Format("{0:00}", episode.SeasonNumber); string sReplace = Convert.ToString(episode.SeasonNumber); string zeroEReplace = String.Format("{0:00}", episode.EpisodeNumber); string eReplace = Convert.ToString(episode.EpisodeNumber); string path = Path.GetDirectoryName(tvDir + Path.DirectorySeparatorChar.ToString() + Config.TvTemplate); path = path.Replace(".%ext", ""); path = path.Replace("%sn", snReplace); path = path.Replace("%s.n", sDotNReplace); path = path.Replace("%s_n", sUnderNReplace); path = path.Replace("%0s", zeroSReplace); path = path.Replace("%s", sReplace); path = path.Replace("%0e", zeroEReplace); path = path.Replace("%e", eReplace); return path; }
public bool IsSeasonIgnored(Episode episode) { //Is this season ignored per the Database?? using (SABSyncEntities sabSyncEntities = new SABSyncEntities()) { var ignored = (from i in sabSyncEntities.shows where i.show_name.Equals(episode.ShowName, StringComparison.InvariantCultureIgnoreCase) select i.ignore_season).FirstOrDefault(); if (ignored >= episode.SeasonNumber) return true; } return false; }
public void GetEpisodeName(Episode episode) { //Check if Episode is a Daily episode.EpisodeName = episode.IsDaily ? GetEpisodeName(episode.ShowName, episode.AirDate) : GetEpisodeName(episode.ShowName, episode.SeasonNumber, episode.EpisodeNumber); if (episode.EpisodeNumber2 != 0) episode.EpisodeName2 = GetEpisodeName(episode.ShowName, episode.SeasonNumber, episode.EpisodeNumber2); return; }
private bool IsOnDisk(Episode episode) { foreach (DirectoryInfo tvDir in Config.TvRootFolders) { string dir = GetEpisodeDir(episode, tvDir); string fileMask = GetEpisodeFileMask(episode, tvDir); if (episode.IsProper && Config.DownloadPropers) DeleteForProper(dir, fileMask); if (IsOnDisk(dir, fileMask) || IsOnDisk(dir, episode.SeasonNumber, episode.EpisodeNumber)) return true; } return false; }
public bool IsInQueue(Episode episode) { string rssTitle = episode.FeedItem.Title; string rssTitleFix = episode.FeedItem.TitleFix; string nzbId = episode.FeedItem.NzbId; try { Logger.Log("Checking Queue for : [{0}] or [{1}]", rssTitle, rssTitleFix); string queueRssUrl = String.Format(Config.SabRequest, "mode=queue&output=xml"); var queueRssReader = new XmlTextReader(queueRssUrl); var queueRssDoc = new XmlDocument(); queueRssDoc.Load(queueRssReader); XmlNodeList queue = queueRssDoc.GetElementsByTagName(@"queue"); XmlNodeList error = queueRssDoc.GetElementsByTagName(@"error"); if (error.Count != 0) { //Logger.Log("Sab Queue Error: {0}", true, error[0].InnerText); Logger.Log("Sab Queue Error: {0}", error[0].InnerText); } else if (queue.Count != 0) { XmlNodeList slot = ((XmlElement) queue[0]).GetElementsByTagName("slot"); foreach (object s in slot) { var queueElement = (XmlElement) s; //Queue is empty if (String.IsNullOrEmpty(queueElement.InnerText)) return false; string fileName = queueElement.GetElementsByTagName("filename")[0].InnerText.ToLower(); if (Config.VerboseLogging) Logger.Log("Checking Queue Item for match: " + fileName); if (fileName.ToLower() == CleanString(rssTitle).ToLower() || fileName.ToLower() == CleanString(rssTitleFix).ToLower() || fileName.ToLower().Contains(nzbId)) { //Logger.Log("Episode in queue - '{0}'", true, rssTitle); Logger.Log("Episode in queue - '{0}'", rssTitle); return true; } } } } catch (Exception ex) { //Logger.Log("An Error has occurred while checking the queue. {0}", true, ex); Logger.Log("An Error has occurred while checking the queue. {0}", ex); } return false; }
private bool IsSeasonIgnored(Episode episode) { // TODO: add ignore season support for first aired (ignore <= date?) if (episode.IsDaily) return false; if (Database.IsSeasonIgnored(episode)) { RejectIgnoredSeasonCount++; Log("Ignoring '{0}' Season '{1}' ", episode.ShowName, episode.SeasonNumber); return true; } return false; }