private void FillExamples() { if (this.Eps == null) { return; } this.lvTest.Items.Clear(); foreach (ProcessedEpisode pe in this.Eps) { ListViewItem lvi = new ListViewItem(); string fn = TVSettings.Instance.FilenameFriendly(this.CN.NameForExt(pe)); lvi.Text = fn; bool ok = TVDoc.FindSeasEp(new FileInfo(fn + ".avi"), out int seas, out int ep, out int maxEp, pe.SI); bool ok1 = ok && (seas == pe.AppropriateSeasonNumber); bool ok2 = ok && (ep == pe.AppropriateEpNum); string pre1 = ok1 ? "" : "* "; string pre2 = ok2 ? "" : "* "; lvi.SubItems.Add(pre1 + ((seas != -1) ? seas.ToString() : "")); lvi.SubItems.Add(pre2 + ((ep != -1) ? ep.ToString() : "") + (maxEp != -1 ? "-" + maxEp : "")); lvi.Tag = pe; if (!ok || !ok1 || !ok2) { lvi.BackColor = Helpers.WarningColor(); } this.lvTest.Items.Add(lvi); } }
private void UpdatePreview(List <TVSettings.FilenameProcessorRE> rel) { lvPreview.BeginUpdate(); DirectoryInfo d = new DirectoryInfo(txtFolder.Text); foreach (FileInfo fi in d.GetFiles()) { if (!TVSettings.Instance.UsefulExtension(fi.Extension, true)) { continue; // move on } ShowItem si = cbShowList.SelectedIndex >= 0 ? shows[cbShowList.SelectedIndex] : null; bool r = TVDoc.FindSeasEp(fi, out int seas, out int ep, out int maxEp, si, rel, false, out TVSettings.FilenameProcessorRE matchRex); ListViewItem lvi = new ListViewItem { Text = fi.Name }; lvi.SubItems.Add((seas == -1) ? "-" : seas.ToString()); lvi.SubItems.Add((ep == -1) ? "-" : ep + ((maxEp != -1) ? "-" + maxEp : "")); lvi.SubItems.Add((matchRex == null) ? "-" : matchRex.Notes); if (!r) { lvi.BackColor = Helpers.WarningColor(); } lvPreview.Items.Add(lvi); } lvPreview.EndUpdate(); }
protected void SearchForAppropriateDownloads(SetProgressDelegate prog, int startpct, int totPct, List <TorrentEntry> downloading, DownloadApp tApp) { ItemList newList = new ItemList(); ItemList toRemove = new ItemList(); int c = ActionList.Count + 2; int n = 1; prog.Invoke(startpct); foreach (ItemMissing action in ActionList.MissingItems()) { if (ActionCancel) { return; } prog.Invoke(startpct + ((totPct - startpct) * (++n) / (c))); foreach (TorrentEntry te in downloading) { FileInfo file = new FileInfo(te.DownloadingTo); if (!TVSettings.Instance.UsefulExtension(file.Extension, false)) // not a usefile file extension { continue; } //do any of the possible names for the series match the filename? bool matched = (action.Episode.Show.GetSimplifiedPossibleShowNames().Any(name => FileHelper.SimplifyAndCheckFilename(file.FullName, name))); if (!matched) { continue; } if (TVDoc.FindSeasEp(file, out int seasF, out int epF, out int _, action.Episode.Show) && (seasF == action.Episode.AppropriateSeasonNumber) && (epF == action.Episode.AppropriateEpNum)) { toRemove.Add(action); newList.Add(new ItemDownloading(te, action.Episode, action.TheFileNoExt, tApp)); break; } } } foreach (Item i in toRemove) { ActionList.Remove(i); } foreach (Item action in newList) { ActionList.Add(action); } prog.Invoke(totPct); }
private bool ReviewFile(ItemMissing me, ItemList addTo, DirCacheEntry dce) { if (ActionCancel) { return(true); } int season = me.Episode.AppropriateSeasonNumber; int epnum = me.Episode.AppropriateEpNum; bool matched = false; try { if (FileHelper.IgnoreFile(dce.TheFile)) { return(false); } //do any of the possible names for the series match the filename? matched = (me.Episode.Show.GetSimplifiedPossibleShowNames() .Any(name => FileHelper.SimplifyAndCheckFilename(dce.SimplifiedFullName, name))); if (matched) { bool regularMatch = TVDoc.FindSeasEp(dce.TheFile, out int seasF, out int epF, out int maxEp, me.Episode.Show) && seasF == season && epF == epnum; bool sequentialMatch = me.Episode.Show.UseSequentialMatch && TVDoc.MatchesSequentialNumber(dce.TheFile.Name, ref seasF, ref epF, me.Episode) && seasF == season && epF == epnum; if (regularMatch || sequentialMatch) { if (maxEp != -1 && TVSettings.Instance.AutoMergeDownloadEpisodes) { ShowRule sr = new ShowRule { DoWhatNow = RuleAction.kMerge, First = epF, Second = maxEp }; me.Episode.Show?.AddSeasonRule(seasF, sr); LOGGER.Info( $"Looking at {me.Episode.Show.ShowName} and have identified that episode {epF} and {maxEp} of season {seasF} have been merged into one file {dce.TheFile.FullName}"); LOGGER.Info($"Added new rule automatically for {sr}"); //Regenerate the episodes with the new rule added ShowLibrary.GenerateEpisodeDict(me.Episode.Show); //Get the newly created processed episode we are after // ReSharper disable once InconsistentNaming ProcessedEpisode newPE = me.Episode; foreach (ProcessedEpisode pe in me.Episode.Show.SeasonEpisodes[seasF]) { if (pe.AppropriateEpNum == epF && pe.EpNum2 == maxEp) { newPE = pe; } } me = new ItemMissing(newPE, me.TargetFolder, TVSettings.Instance.FilenameFriendly(TVSettings.Instance.NamingStyle.NameFor(newPE))); } FileInfo fi = new FileInfo(me.TheFileNoExt + dce.TheFile.Extension); if (TVSettings.Instance.PreventMove) { //We do not want to move the file, just rename it fi = new FileInfo(dce.TheFile.DirectoryName + System.IO.Path.DirectorySeparatorChar + me.Filename + dce.TheFile.Extension); } // don't remove the base search folders bool doTidyup = true; foreach (string folder in TVSettings.Instance.DownloadFolders) { if (folder.SameDirectoryLocation(fi.Directory.FullName)) { doTidyup = false; break; } } if (dce.TheFile.FullName != fi.FullName) { addTo.Add(new ActionCopyMoveRename(ActionCopyMoveRename.Op.copy, dce.TheFile, fi, me.Episode, doTidyup ? TVSettings.Instance.Tidyup : null, me)); } DownloadIdentifiersController di = new DownloadIdentifiersController(); // if we're copying/moving a file across, we might also want to make a thumbnail or NFO for it addTo.Add(di.ProcessEpisode(me.Episode, fi)); return(true); } } } catch (System.IO.PathTooLongException e) { string t = "Path too long. " + dce.TheFile.FullName + ", " + e.Message; LOGGER.Warn(e, "Path too long. " + dce.TheFile.FullName); t += ". More information is available in the log file"; if ((!Doc.Args.Unattended) && (!Doc.Args.Hide)) { MessageBox.Show(t, "Path too long", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } t = "DirectoryName " + dce.TheFile.DirectoryName + ", File name: " + dce.TheFile.Name; t += matched ? ", matched. " : ", no match. "; if (matched) { t += "Show: " + me.Episode.TheSeries.Name + ", Season " + season + ", Ep " + epnum + ". "; t += "To: " + me.TheFileNoExt; } LOGGER.Warn(t); } return(false); }
private bool ReadItem(XmlReader r) { string title = ""; string link = ""; string description = ""; r.Read(); r.Read(); while (!r.EOF) { if ((r.Name == "item") && (!r.IsStartElement())) { break; } if (r.Name == "title") { title = r.ReadElementContentAsString(); } else if (r.Name == "description") { description = r.ReadElementContentAsString(); } else if ((r.Name == "link") && (string.IsNullOrEmpty(link))) { link = r.ReadElementContentAsString(); } else if ((r.Name == "enclosure") && (r.GetAttribute("type") == "application/x-bittorrent")) { link = r.GetAttribute("url"); r.ReadOuterXml(); } else { r.ReadOuterXml(); } } if ((string.IsNullOrEmpty(title)) || (string.IsNullOrEmpty(link))) { return(false); } string showName = ""; TVDoc.FindSeasEp("", title, out int season, out int episode, out int maxEp, null, this.regxps); try { Match m = Regex.Match(description, "Show Name: (.*?)[;|$]", RegexOptions.IgnoreCase); if (m.Success) { showName = m.Groups[1].ToString(); } m = Regex.Match(description, "Season: ([0-9]+)", RegexOptions.IgnoreCase); if (m.Success) { season = int.Parse(m.Groups[1].ToString()); } m = Regex.Match(description, "Episode: ([0-9]+)", RegexOptions.IgnoreCase); if (m.Success) { episode = int.Parse(m.Groups[1].ToString()); } } catch { // ignored } if ((season != -1) && (episode != -1)) { Add(new RSSItem(link, title, season, episode, showName)); } return(true); }
public override void Check(SetProgressDelegate prog, int startpct, int totPct) { if (string.IsNullOrEmpty(TVSettings.Instance.SABAPIKey) || String.IsNullOrEmpty(TVSettings.Instance.SABHostPort)) { prog.Invoke(totPct); return; } // get list of files being downloaded by SABnzbd // Something like: // http://localhost:8080/sabnzbd/api?mode=queue&apikey=xxx&start=0&limit=8888&output=xml string theURL = "http://" + TVSettings.Instance.SABHostPort + "/sabnzbd/api?mode=queue&start=0&limit=8888&output=xml&apikey=" + TVSettings.Instance.SABAPIKey; WebClient wc = new WebClient(); byte[] r = null; try { r = wc.DownloadData(theURL); } catch (WebException) { logger.Warn("Failed to obtain SABnzbd, please recheck settings: " + theURL); } if (r == null) { prog.Invoke(totPct); return; } try { SAB.result res = SAB.result.Deserialize(r); if (res != null && res.status == "False") { logger.Error("Error processing data from SABnzbd (Queue Check): {0}", res.error); prog.Invoke(totPct); return; } } catch { // wasn't a result/error combo. this is good! } SAB.queue sq = null; try { sq = SAB.queue.Deserialize(r); } catch (Exception e) { logger.Error(e, "Error processing data from SABnzbd (Queue Check)"); prog.Invoke(totPct); return; } System.Diagnostics.Debug.Assert(sq != null); // shouldn't happen if (sq?.slots == null || sq.slots.Length == 0) // empty queue { return; } ItemList newList = new ItemList(); ItemList toRemove = new ItemList(); int c = this.ActionList.Count + 2; int n = 1; foreach (Item Action1 in this.ActionList) { if (this.ActionCancel) { return; } prog.Invoke(startpct + (totPct - startpct) * (++n) / (c)); if (!(Action1 is ItemMissing)) { continue; } ItemMissing Action = (ItemMissing)(Action1); string showname = Helpers.SimplifyName(Action.Episode.SI.ShowName); foreach (SAB.queueSlotsSlot te in sq.slots) { //foreach (queueSlotsSlot te in qs) { FileInfo file = new FileInfo(te.filename); //if (!TVSettings.Instance.UsefulExtension(file.Extension, false)) // not a usefile file extension // continue; if (!FileHelper.SimplifyAndCheckFilename(file.FullName, showname, true, false)) { continue; } if (!TVDoc.FindSeasEp(file, out int seasF, out int epF, out int maxEp, Action.Episode.SI) || (seasF != Action.Episode.AppropriateSeasonNumber) || (epF != Action.Episode.AppropriateEpNum)) { continue; } toRemove.Add(Action1); newList.Add(new ItemSABnzbd(te, Action.Episode, Action.TheFileNoExt)); break; } } } foreach (Item i in toRemove) { this.ActionList.Remove(i); } foreach (Item Action in newList) { this.ActionList.Add(Action); } prog.Invoke(totPct); }
private bool ReadItem(XElement itemElement) { string title = itemElement.ExtractString("title"); string link = itemElement.ExtractString("link"); string description = itemElement.ExtractString("description"); string enclosureLink = itemElement.Descendants("enclosure").Where(enclosure => enclosure.Attribute("type")?.Value == "application/x-bittorrent").First().Attribute("url").Value; if (TVSettings.Instance.DetailedRSSJSONLogging) { Logger.Info("Processing RSS Item"); Logger.Info(itemElement.ToString); Logger.Info("Extracted"); Logger.Info($"Title: {title}"); Logger.Info($"Link: {link}"); Logger.Info($"Description: {description}"); Logger.Info($"encLink: {enclosureLink}"); } link = (string.IsNullOrWhiteSpace(enclosureLink))?link:enclosureLink; if ((string.IsNullOrEmpty(title)) || (string.IsNullOrEmpty(link))) { return(false); } string showName = ""; TVDoc.FindSeasEp("", title, out int season, out int episode, out int _, null, regxps); if (TVSettings.Instance.DetailedRSSJSONLogging) { Logger.Info($"Season: {season}"); Logger.Info($"Episode: {episode}"); } try { Match m = Regex.Match(description, "Show Name: (.*?)[;|$]", RegexOptions.IgnoreCase); if (m.Success) { showName = m.Groups[1].ToString(); } m = Regex.Match(description, "Season: ([0-9]+)", RegexOptions.IgnoreCase); if (m.Success) { season = int.Parse(m.Groups[1].ToString()); } m = Regex.Match(description, "Episode: ([0-9]+)", RegexOptions.IgnoreCase); if (m.Success) { episode = int.Parse(m.Groups[1].ToString()); } } catch { // ignored } if (TVSettings.Instance.DetailedRSSJSONLogging) { Logger.Info($"Show Name: {showName}"); Logger.Info($"Season: {season}"); Logger.Info($"Episode: {episode}"); } if ((season != -1) && (episode != -1)) { Add(new RSSItem(link, title, season, episode, showName)); } return(true); }
public override void Check(SetProgressDelegate prog, int startpct, int totPct) { if (String.IsNullOrEmpty(TVSettings.Instance.SABAPIKey) || String.IsNullOrEmpty(TVSettings.Instance.SABHostPort)) { prog.Invoke(startpct + totPct); return; } // get list of files being downloaded by SABnzbd // Something like: // http://localhost:8080/sabnzbd/api?mode=queue&apikey=xxx&start=0&limit=8888&output=xml String theURL = "http://" + TVSettings.Instance.SABHostPort + "/sabnzbd/api?mode=queue&start=0&limit=8888&output=xml&apikey=" + TVSettings.Instance.SABAPIKey; WebClient wc = new WebClient(); byte[] r = null; try { r = wc.DownloadData(theURL); } catch (WebException) { } if (r == null) { prog.Invoke(startpct + totPct); return; } try { SAB.result res = SAB.result.Deserialize(r); if (res.status == "False") { MessageBox.Show(res.error, "SABnzbd Queue Check", MessageBoxButtons.OK, MessageBoxIcon.Error); prog.Invoke(startpct + totPct); return; } } catch { // wasn't a result/error combo. this is good! } SAB.queue sq = null; try { sq = SAB.queue.Deserialize(r); } catch (Exception) { MessageBox.Show("Error processing data from SABnzbd", "SABnzbd Queue Check", MessageBoxButtons.OK, MessageBoxIcon.Error); prog.Invoke(startpct + totPct); return; } System.Diagnostics.Debug.Assert(sq != null); // shouldn't happen if (sq == null || sq.slots == null || sq.slots.Length == 0) // empty queue { return; } ItemList newList = new ItemList(); ItemList toRemove = new ItemList(); int c = this.TheActionList.Count + 2; int n = 1; foreach (Item Action1 in this.TheActionList) { if (this.ActionCancel) { return; } n++; prog.Invoke(startpct + totPct * n / c); if (!(Action1 is ItemMissing)) { continue; } ItemMissing Action = (ItemMissing)(Action1); string showname = Helpers.SimplifyName(Action.Episode.SI.ShowName); foreach (SAB.queueSlotsSlot te in sq.slots) { //foreach (queueSlotsSlot te in qs) { FileInfo file = new FileInfo(te.filename); //if (!TVSettings.Instance.UsefulExtension(file.Extension, false)) // not a usefile file extension // continue; if (FileHelper.SimplifyAndCheckFilename(file.FullName, showname, true, false)) // if (Regex::Match(simplifiedfname,"\\b"+showname+"\\b",RegexOptions::IgnoreCase)->Success) { int seasF; int epF; if (TVDoc.FindSeasEp(file, out seasF, out epF, Action.Episode.SI) && (seasF == Action.Episode.SeasonNumber) && (epF == Action.Episode.EpNum)) { toRemove.Add(Action1); newList.Add(new ItemSABnzbd(te, Action.Episode, Action.TheFileNoExt)); break; } } } } } foreach (Item i in toRemove) { this.TheActionList.Remove(i); } foreach (Item Action in newList) { this.TheActionList.Add(Action); } prog.Invoke(startpct + totPct); }
public override void Check(SetProgressDelegate prog, int startpct, int totPct) { // get list of files being downloaded by uTorrent string resDatFile = TVSettings.Instance.ResumeDatPath; if (string.IsNullOrEmpty(resDatFile) || !File.Exists(resDatFile)) { return; } BTResume btr = new BTResume(prog, resDatFile); if (!btr.LoadResumeDat()) { return; } List <TorrentEntry> downloading = btr.AllFilesBeingDownloaded(); ItemList newList = new ItemList(); ItemList toRemove = new ItemList(); int c = this.ActionList.Count + 2; int n = 1; prog.Invoke(startpct); foreach (Item action1 in this.ActionList) { if (this.ActionCancel) { return; } prog.Invoke(startpct + (totPct - startpct) * (++n) / (c)); if (!(action1 is ItemMissing action)) { continue; } foreach (TorrentEntry te in downloading) { FileInfo file = new FileInfo(te.DownloadingTo); if (!TVSettings.Instance.UsefulExtension(file.Extension, false)) // not a usefile file extension { continue; } //do any of the possible names for the series match the filename? bool matched = (action.Episode.SI.getSimplifiedPossibleShowNames().Any(name => FileHelper.SimplifyAndCheckFilename(file.FullName, name))); if (!matched) { continue; } if (TVDoc.FindSeasEp(file, out int seasF, out int epF, out int maxEp, action.Episode.SI) && (seasF == action.Episode.AppropriateSeasonNumber) && (epF == action.Episode.AppropriateEpNum)) { toRemove.Add(action1); newList.Add(new ItemuTorrenting(te, action.Episode, action.TheFileNoExt)); break; } } } foreach (Item i in toRemove) { this.ActionList.Remove(i); } foreach (Item action in newList) { this.ActionList.Add(action); } prog.Invoke(totPct); }
// consider each of the files, see if it is suitable for series "ser" and episode "epi" // if so, add a rcitem for copy to "fi" public bool FindMissingEp(DirCache dirCache, ItemMissing me, ItemList addTo, ActionCopyMoveRename.Op whichOp) { int season = me.Episode.SeasonNumber; //String ^toName = FilenameFriendly(Settings->NamingStyle->NameFor(me->PE)); int epnum = me.Episode.EpNum; // TODO: find a 'best match', or use first ? foreach (DirCacheEntry dce in dirCache) { if (this.ActionCancel) { return(true); } bool matched = false; try { if (!dce.HasUsefulExtension_NotOthersToo) // not a usefile file extension { continue; } if (TVSettings.Instance.IgnoreSamples && dce.LowerName.Contains("sample") && ((dce.Length / (1024 * 1024)) < TVSettings.Instance.SampleFileMaxSizeMB)) { continue; } //do any of the possible names for the series match the filename? matched = (me.Episode.SI.getSimplifiedPossibleShowNames().Any(name => FileHelper.SimplifyAndCheckFilename(dce.SimplifiedFullName, name))); if (matched) { int seasF; int epF; if ((TVDoc.FindSeasEp(dce.TheFile, out seasF, out epF, me.Episode.SI) && (seasF == season) && (epF == epnum)) || (me.Episode.SI.UseSequentialMatch && TVDoc.MatchesSequentialNumber(dce.TheFile.Name, ref seasF, ref epF, me.Episode) && (seasF == season) && (epF == epnum))) { FileInfo fi = new FileInfo(me.TheFileNoExt + dce.TheFile.Extension); // don't remove the base search folders bool doTidyup = true; foreach (String folder in this.mDoc.SearchFolders) { // http://stackoverflow.com/questions/1794025/how-to-check-whether-2-directoryinfo-objects-are-pointing-to-the-same-directory if (String.Compare(folder.ToLower().TrimEnd('\\'), fi.Directory.FullName.ToLower().TrimEnd('\\'), StringComparison.InvariantCultureIgnoreCase) == 0) { doTidyup = false; break; } } addTo.Add(new ActionCopyMoveRename(whichOp, dce.TheFile, fi, me.Episode, doTidyup ? TVSettings.Instance.Tidyup : null)); DownloadIdentifiersController di = new DownloadIdentifiersController(); // if we're copying/moving a file across, we might also want to make a thumbnail or NFO for it addTo.Add(di.ProcessEpisode(me.Episode, fi)); return(true); } } } catch (System.IO.PathTooLongException e) { string t = "Path too long. " + dce.TheFile.FullName + ", " + e.Message; logger.Warn(e, "Path too long. " + dce.TheFile.FullName); t += ". More information is available in the log file"; if ((!this.mDoc.Args.Unattended) && (!this.mDoc.Args.Hide)) { MessageBox.Show(t, "Path too long", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } t = "DirectoryName " + dce.TheFile.DirectoryName + ", File name: " + dce.TheFile.Name; t += matched ? ", matched. " : ", no match. "; if (matched) { t += "Show: " + me.Episode.TheSeries.Name + ", Season " + season + ", Ep " + epnum + ". "; t += "To: " + me.TheFileNoExt; } logger.Warn(t); } } return(false); }
public override void Check(SetProgressDelegate prog, int startpct, int totPct) { if (string.IsNullOrEmpty(TVSettings.Instance.SABAPIKey) || string.IsNullOrEmpty(TVSettings.Instance.SABHostPort)) { prog.Invoke(totPct); return; } // get list of files being downloaded by SABnzbd // Something like: // http://localhost:8080/sabnzbd/api?mode=queue&apikey=xxx&start=0&limit=8888&output=xml string theUrl = "http://" + TVSettings.Instance.SABHostPort + "/sabnzbd/api?mode=queue&start=0&limit=8888&output=xml&apikey=" + TVSettings.Instance.SABAPIKey; byte[] r = DownloadPage(theUrl); if (r == null) { prog.Invoke(totPct); return; } try { SAB.Result res = SAB.Result.Deserialize(r); if (res != null && res.status == "False") { LOGGER.Error("Error processing data from SABnzbd (Queue Check): {0}", res.error); prog.Invoke(totPct); return; } } catch { // wasn't a result/error combo. this is good! } SAB.Queue sq; try { sq = SAB.Queue.Deserialize(r); } catch (Exception e) { LOGGER.Error(e, "Error processing data from SABnzbd (Queue Check)"); prog.Invoke(totPct); return; } System.Diagnostics.Debug.Assert(sq != null); // shouldn't happen if (sq.slots == null || sq.slots.Length == 0) // empty queue { return; } ItemList newList = new ItemList(); ItemList toRemove = new ItemList(); int c = ActionList.Count + 2; int n = 1; foreach (ItemMissing action in ActionList.MissingItems()) { if (ActionCancel) { return; } prog.Invoke(startpct + ((totPct - startpct) * (++n) / (c))); string showname = Helpers.SimplifyName(action.Episode.Show.ShowName); foreach (SAB.QueueSlotsSlot te in sq.slots) { FileInfo file = new FileInfo(te.filename); if (!FileHelper.SimplifyAndCheckFilename(file.FullName, showname, true, false)) { continue; } if (!TVDoc.FindSeasEp(file, out int seasF, out int epF, out int _, action.Episode.Show) || (seasF != action.Episode.AppropriateSeasonNumber) || (epF != action.Episode.AppropriateEpNum)) { continue; } toRemove.Add(action); newList.Add(new ItemDownloading(te, action.Episode, action.TheFileNoExt, DownloadApp.SABnzbd)); break; } } foreach (Item i in toRemove) { ActionList.Remove(i); } foreach (Item action in newList) { ActionList.Add(action); } prog.Invoke(totPct); }
private void bnCreate_Click(object sender, System.EventArgs e) { this.txtEmailText.Text = "Working... This may take a while."; this.txtEmailText.Update(); StringBuilder txt = new StringBuilder(); if (this.cbSettings.Checked) { txt.AppendLine("==== Settings Files ===="); txt.AppendLine(); txt.AppendLine("---- TVRenameSettings.xml"); txt.AppendLine(); try { using (StreamReader sr = new StreamReader(PathManager.TVDocSettingsFile.FullName)) txt.AppendLine(sr.ReadToEnd()); } catch { txt.AppendLine("Error reading TVRenameSettings.xml"); } txt.AppendLine(""); } if (this.cbFOScan.Checked || this.cbFolderScan.Checked) { txt.AppendLine("==== Filename processors ===="); foreach (FilenameProcessorRE s in TVSettings.Instance.FNPRegexs) { txt.AppendLine((s.Enabled ? "Enabled" : "Disabled") + " \"" + s.RE + "\" " + (s.UseFullPath ? "(FullPath)" : "")); } txt.AppendLine(); } if (this.cbFOScan.Checked) { txt.AppendLine("==== Finding & Organising Directory Scan ===="); txt.AppendLine(); DirCache dirC = new DirCache(); foreach (string efi in TVSettings.Instance.DownloadFolders) { dirC.AddFolder(null, 0, 0, efi, true); } foreach (DirCacheEntry fi in dirC) { bool r = TVDoc.FindSeasEp(fi.TheFile, out int seas, out int ep, out int maxEp, null); bool useful = TVSettings.Instance.UsefulExtension(fi.TheFile.Extension, false); txt.AppendLine(fi.TheFile.FullName + " (" + (r ? "OK" : "No") + " " + seas + "," + ep + "," + maxEp + " " + (useful ? fi.TheFile.Extension : "-") + ")"); } txt.AppendLine(); } if (this.cbFolderScan.Checked) { txt.AppendLine("==== Media Folders Directory Scan ===="); foreach (ShowItem si in this.mDoc.Library.GetShowItems()) { foreach (KeyValuePair <int, List <ProcessedEpisode> > kvp in si.SeasonEpisodes) { int snum = kvp.Key; if (((snum == 0) && (si.CountSpecials)) || !si.AllFolderLocations().ContainsKey(snum)) { continue; // skip specials } foreach (string folder in si.AllFolderLocations()[snum]) { txt.AppendLine(si.TVDBCode + " : " + si.ShowName + " : S" + snum); txt.AppendLine("Folder: " + folder); DirCache files = new DirCache(); if (Directory.Exists(folder)) { files.AddFolder(null, 0, 0, folder, true); } foreach (DirCacheEntry fi in files) { bool r = TVDoc.FindSeasEp(fi.TheFile, out int seas, out int ep, out int maxEp, si); bool useful = TVSettings.Instance.UsefulExtension(fi.TheFile.Extension, false); txt.AppendLine(fi.TheFile.FullName + " (" + (r ? "OK" : "No") + " " + seas + "," + ep + "," + maxEp + " " + (useful ? fi.TheFile.Extension : "-") + ")"); } txt.AppendLine(); } } txt.AppendLine(); } txt.AppendLine(); } this.txtEmailText.Text = txt.ToString(); }
private void FillPreview() { this.lvPreview.Items.Clear(); if ((string.IsNullOrEmpty(this.txtFolder.Text)) || (!Directory.Exists(this.txtFolder.Text))) { this.txtFolder.BackColor = Helpers.WarningColor(); return; } else { this.txtFolder.BackColor = System.Drawing.SystemColors.Window; } if (this.Grid1.RowsCount <= 1) // 1 for header { return; // empty } this.lvPreview.Enabled = true; List <FilenameProcessorRE> rel = new List <FilenameProcessorRE>(); if (this.chkTestAll.Checked) { for (int i = 1; i < this.Grid1.RowsCount; i++) { FilenameProcessorRE re = this.REForRow(i); if (re != null) { rel.Add(re); } } } else { int[] rowsIndex = this.Grid1.Selection.GetSelectionRegion().GetRowsIndex(); if (rowsIndex.Length == 0) { return; } FilenameProcessorRE re2 = this.REForRow(rowsIndex[0]); if (re2 != null) { rel.Add(re2); } else { return; } } this.lvPreview.BeginUpdate(); DirectoryInfo d = new DirectoryInfo(this.txtFolder.Text); foreach (FileInfo fi in d.GetFiles()) { int seas; int ep; if (!this.TheSettings.UsefulExtension(fi.Extension, true)) { continue; // move on } ShowItem si = this.cbShowList.SelectedIndex >= 0 ? this.SIL[this.cbShowList.SelectedIndex] : null; bool r = TVDoc.FindSeasEp(fi, out seas, out ep, si, rel, false); ListViewItem lvi = new ListViewItem(); lvi.Text = fi.Name; lvi.SubItems.Add((seas == -1) ? "-" : seas.ToString()); lvi.SubItems.Add((ep == -1) ? "-" : ep.ToString()); if (!r) { lvi.BackColor = Helpers.WarningColor(); } this.lvPreview.Items.Add(lvi); } this.lvPreview.EndUpdate(); }
public override void Check(SetProgressDelegate prog, int startpct, int totPct) { // get list of files being downloaded by uTorrent string resDatFile = TVSettings.Instance.ResumeDatPath; if (string.IsNullOrEmpty(resDatFile) || !File.Exists(resDatFile)) { return; } BTResume btr = new BTResume(prog, resDatFile); if (!btr.LoadResumeDat()) { return; } List <TorrentEntry> downloading = btr.AllFilesBeingDownloaded(); ItemList newList = new ItemList(); ItemList toRemove = new ItemList(); int c = this.TheActionList.Count + 2; int n = 1; prog.Invoke(startpct + totPct * n / c); foreach (Item Action1 in this.TheActionList) { if (this.ActionCancel) { return; } n++; prog.Invoke(100 * n / c); if (!(Action1 is ItemMissing)) { continue; } ItemMissing Action = (ItemMissing)(Action1); string showname = Helpers.SimplifyName(Action.Episode.SI.ShowName); foreach (TorrentEntry te in downloading) { FileInfo file = new FileInfo(te.DownloadingTo); if (!TVSettings.Instance.UsefulExtension(file.Extension, false)) // not a usefile file extension { continue; } if (FileHelper.SimplifyAndCheckFilename(file.FullName, showname, true, false)) // if (Regex::Match(simplifiedfname,"\\b"+showname+"\\b",RegexOptions::IgnoreCase)->Success) { int seasF; int epF; if (TVDoc.FindSeasEp(file, out seasF, out epF, Action.Episode.SI) && (seasF == Action.Episode.SeasonNumber) && (epF == Action.Episode.EpNum)) { toRemove.Add(Action1); newList.Add(new ItemuTorrenting(te, Action.Episode, Action.TheFileNoExt)); break; } } } } foreach (Item i in toRemove) { this.TheActionList.Remove(i); } foreach (Item Action in newList) { this.TheActionList.Add(Action); } prog.Invoke(startpct + totPct); }
public override void Check(SetProgressDelegate prog, int startpct, int totPct) { int c = ActionList.Count + 2; int n = 1; prog.Invoke(startpct); ItemList newItems = new ItemList(); ItemList toRemove = new ItemList(); try { foreach (ItemMissing action in ActionList.MissingItems()) { if (ActionCancel) { return; } prog.Invoke(startpct + ((totPct - startpct) * (++n) / (c))); ProcessedEpisode pe = action.Episode; string simpleShowName = Helpers.SimplifyName(action.Episode.Show.ShowName); string simpleSeriesName = Helpers.SimplifyName(action.Episode.TheSeries.Name); string imdbId = action.Episode.TheSeries.GetImdbNumber(); if (string.IsNullOrWhiteSpace(imdbId)) { continue; } WebClient client = new WebClient(); client.Headers.Add("user-agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"); string response = client.DownloadString($"{TVSettings.Instance.SearchJSONURL}{imdbId}"); JObject jsonResponse = JObject.Parse(response); if (jsonResponse.ContainsKey(TVSettings.Instance.SearchJSONRootNode)) { foreach (JToken item in jsonResponse[TVSettings.Instance.SearchJSONRootNode]) { if (item != null && item is JObject episodeResponse) { if (episodeResponse.ContainsKey(TVSettings.Instance.SearchJSONFilenameToken) && episodeResponse.ContainsKey(TVSettings.Instance.SearchJSONURLToken)) { string itemName = (string)item[TVSettings.Instance.SearchJSONFilenameToken]; string itemUrl = (string)item[TVSettings.Instance.SearchJSONURLToken]; if (TVSettings.Instance.DetailedRSSJSONLogging) { LOGGER.Info("Processing JSON Item"); LOGGER.Info(episodeResponse.ToString); LOGGER.Info("Extracted"); LOGGER.Info($"Name: {itemName}"); LOGGER.Info($"URL: {itemUrl}"); } if (!FileHelper.SimplifyAndCheckFilename(itemName, simpleShowName, true, false) && !FileHelper.SimplifyAndCheckFilename(itemName, simpleSeriesName, true, false)) { continue; } if (!TVDoc.FindSeasEp(itemName, out int seas, out int ep, out int _, action.Episode.Show)) { continue; } if (TVSettings.Instance.DetailedRSSJSONLogging) { LOGGER.Info($"Season: {seas}"); LOGGER.Info($"Episode: {ep}"); } if (seas != pe.AppropriateSeasonNumber) { continue; } if (ep != pe.AppropriateEpNum) { continue; } LOGGER.Info( $"Adding {itemUrl} as it appears to be match for {pe.Show.ShowName} S{pe.AppropriateSeasonNumber}E{pe.AppropriateEpNum}"); newItems.Add(new ActionTDownload(itemName, itemUrl, action.TheFileNoExt, pe)); toRemove.Add(action); } else { LOGGER.Info( $"{TVSettings.Instance.SearchJSONFilenameToken} or {TVSettings.Instance.SearchJSONURLToken} not found in {TVSettings.Instance.SearchJSONURL}{imdbId} for {action.Episode.TheSeries.Name}"); } } } } else { LOGGER.Info( $"{TVSettings.Instance.SearchJSONRootNode} not found in {TVSettings.Instance.SearchJSONURL}{imdbId} for {action.Episode.TheSeries.Name}"); } } } catch (WebException ex) { LOGGER.Info(ex, $"Failed to Access {TVSettings.Instance.SearchJSONURL}"); } foreach (ActionTDownload x in FindDuplicates(newItems)) { newItems.Remove(x); } foreach (Item i in toRemove) { ActionList.Remove(i); } foreach (Item action in newItems) { ActionList.Add(action); } prog.Invoke(totPct); }
private void bnCreate_Click(object sender, System.EventArgs e) { this.txtEmailText.Text = "Working... This may take a while."; this.txtEmailText.Update(); string txt = ""; txt += "From: " + this.txtName.Text + " <" + this.txtEmail.Text + ">" + "\r\n"; txt += "Subject: TVRename bug report" + "\r\n"; txt += "\r\n"; txt += "TVRename version: " + Version.DisplayVersionString() + "\r\n"; txt += "UserAppDataPath is " + System.Windows.Forms.Application.UserAppDataPath + "\r\n"; txt += "EpGuidePath is " + UI.EpGuidePath() + "\r\n"; txt += "\r\n"; txt += "==== Brief Description ====" + "\r\n"; txt += this.txtDesc1.Text + "\r\n"; txt += "\r\n"; txt += "==== Description ====" + "\r\n"; txt += this.txtDesc2.Text + "\r\n"; txt += "\r\n"; txt += "==== Frequency ====" + "\r\n"; txt += this.txtFreq.Text + "\r\n"; txt += "\r\n"; txt += "==== Notes and Comments ====" + "\r\n"; txt += this.txtComments.Text + "\r\n"; txt += "\r\n"; if (this.cbSettings.Checked) { txt += "==== Settings Files ====" + "\r\n"; txt += "\r\n"; txt += "---- TVRenameSettings.xml" + "\r\n"; txt += "\r\n"; try { StreamReader sr = new StreamReader(PathManager.TVDocSettingsFile.FullName); txt += sr.ReadToEnd(); sr.Close(); txt += "\r\n"; } catch { txt += "Error reading TVRenameSettings.xml\r\n"; } txt += "\r\n"; } if (this.cbFOScan.Checked || this.cbFolderScan.Checked) { txt += "==== Filename processors ====\r\n"; foreach (FilenameProcessorRE s in TVSettings.Instance.FNPRegexs) { txt += (s.Enabled ? "Enabled" : "Disabled") + " \"" + s.RE + "\" " + (s.UseFullPath ? "(FullPath)" : "") + "\r\n"; } txt += "\r\n"; } if (this.cbFOScan.Checked) { txt += "==== Finding & Organising Directory Scan ====" + "\r\n"; txt += "\r\n"; DirCache dirC = new DirCache(); foreach (string efi in this.mDoc.SearchFolders) { dirC.AddFolder(null, 0, 0, efi, true); } foreach (DirCacheEntry fi in dirC) { int seas; int ep; bool r = TVDoc.FindSeasEp(fi.TheFile, out seas, out ep, null); bool useful = fi.HasUsefulExtension_NotOthersToo; txt += fi.TheFile.FullName + " (" + (r ? "OK" : "No") + " " + seas + "," + ep + " " + (useful ? fi.TheFile.Extension : "-") + ")" + "\r\n"; } txt += "\r\n"; } if (this.cbFolderScan.Checked) { txt += "==== Media Folders Directory Scan ====" + "\r\n"; foreach (ShowItem si in this.mDoc.GetShowItems(true)) { foreach (System.Collections.Generic.KeyValuePair <int, List <ProcessedEpisode> > kvp in si.SeasonEpisodes) { int snum = kvp.Key; if (((snum == 0) && (si.CountSpecials)) || !si.AllFolderLocations().ContainsKey(snum)) { continue; // skip specials } foreach (string folder in si.AllFolderLocations()[snum]) { txt += si.TVDBCode + " : " + si.ShowName + " : S" + snum + "\r\n"; txt += "Folder: " + folder; txt += "\r\n"; DirCache files = new DirCache(); if (Directory.Exists(folder)) { files.AddFolder(null, 0, 0, folder, true); } foreach (DirCacheEntry fi in files) { int seas; int ep; bool r = TVDoc.FindSeasEp(fi.TheFile, out seas, out ep, si); bool useful = fi.HasUsefulExtension_NotOthersToo; txt += fi.TheFile.FullName + " (" + (r ? "OK" : "No") + " " + seas + "," + ep + " " + (useful ? fi.TheFile.Extension : "-") + ")" + "\r\n"; } txt += "\r\n"; } } txt += "\r\n"; } this.mDoc.UnlockShowItems(); txt += "\r\n"; } this.txtEmailText.Text = txt; }