示例#1
0
        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;
        }
示例#2
0
        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;
        }
示例#3
0
        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();

            }
        }
示例#4
0
        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);
        }
示例#5
0
        private bool IsQualityWanted(Episode episode)
        {
            if(Database.IsQualityWanted(episode))
                return true;

            RejectDownloadQualityCount++;
            return false;
        }
示例#6
0
        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
        }
示例#7
0
        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;
        }
示例#8
0
        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;
        }
示例#9
0
        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;
        }
示例#10
0
        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;
        }
示例#11
0
        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;
        }
示例#12
0
        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;
        }
示例#13
0
        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;
        }
示例#14
0
        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;
        }
示例#15
0
        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;
        }
示例#16
0
        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;
        }
示例#17
0
        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;
        }
示例#18
0
        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;
        }
示例#19
0
        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;
        }