diff --git a/TVRename#/Custom Controls/TheTVDBCodeFinder.cs b/TVRename#/Custom Controls/TheTVDBCodeFinder.cs index a352f1112..0c3d01bfb 100644 --- a/TVRename#/Custom Controls/TheTVDBCodeFinder.cs +++ b/TVRename#/Custom Controls/TheTVDBCodeFinder.cs @@ -15,6 +15,7 @@ namespace TVRename { + /// /// /// Summary for TheTVDBCodeFinder /// @@ -62,6 +63,19 @@ public int SelectedCode() return -1; } } + public string SelectedShowName() + { + try + { + if (this.lvMatches.SelectedItems.Count == 0) return ""; + + return (string)(this.lvMatches.SelectedItems[0].SubItems[1].Text); + } + catch + { + return ""; + } + } private void txtFindThis_TextChanged(object sender, EventArgs e) { @@ -186,4 +200,4 @@ private void lvMatches_ColumnClick(object sender, ColumnClickEventArgs e) lvMatches.Sort(); } } -} \ No newline at end of file +} diff --git a/TVRename#/Forms/AutoAddShow.Designer.cs b/TVRename#/Forms/AutoAddShow.Designer.cs new file mode 100644 index 000000000..7b518f25f --- /dev/null +++ b/TVRename#/Forms/AutoAddShow.Designer.cs @@ -0,0 +1,137 @@ +namespace TVRename.Forms +{ + partial class AutoAddShow + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(AutoAddShow)); + this.cbDirectory = new System.Windows.Forms.ComboBox(); + this.btnOK = new System.Windows.Forms.Button(); + this.btnCancel = new System.Windows.Forms.Button(); + this.pnlCF = new System.Windows.Forms.Panel(); + this.label1 = new System.Windows.Forms.Label(); + this.lblDirectoryName = new System.Windows.Forms.Label(); + this.SuspendLayout(); + // + // cbDirectory + // + this.cbDirectory.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.cbDirectory.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.cbDirectory.FormattingEnabled = true; + this.cbDirectory.Location = new System.Drawing.Point(89, 317); + this.cbDirectory.Name = "cbDirectory"; + this.cbDirectory.Size = new System.Drawing.Size(221, 21); + this.cbDirectory.Sorted = true; + this.cbDirectory.TabIndex = 0; + // + // btnOK + // + this.btnOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnOK.Location = new System.Drawing.Point(392, 350); + this.btnOK.Name = "btnOK"; + this.btnOK.Size = new System.Drawing.Size(75, 23); + this.btnOK.TabIndex = 1; + this.btnOK.Text = "Quick Add"; + this.btnOK.UseVisualStyleBackColor = true; + this.btnOK.Click += new System.EventHandler(this.btnOK_Click); + // + // btnCancel + // + this.btnCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.btnCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.btnCancel.Location = new System.Drawing.Point(296, 350); + this.btnCancel.Name = "btnCancel"; + this.btnCancel.Size = new System.Drawing.Size(90, 23); + this.btnCancel.TabIndex = 2; + this.btnCancel.Text = "Leave for later"; + this.btnCancel.UseVisualStyleBackColor = true; + // + // pnlCF + // + this.pnlCF.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlCF.Location = new System.Drawing.Point(10, 10); + this.pnlCF.Name = "pnlCF"; + this.pnlCF.Size = new System.Drawing.Size(462, 301); + this.pnlCF.TabIndex = 3; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(13, 324); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(51, 13); + this.label1.TabIndex = 4; + this.label1.Text = "Location:"; + // + // lblDirectoryName + // + this.lblDirectoryName.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lblDirectoryName.AutoSize = true; + this.lblDirectoryName.Location = new System.Drawing.Point(318, 322); + this.lblDirectoryName.Name = "lblDirectoryName"; + this.lblDirectoryName.Size = new System.Drawing.Size(0, 13); + this.lblDirectoryName.TabIndex = 5; + // + // AutoAddShow + // + this.AcceptButton = this.btnOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.btnCancel; + this.ClientSize = new System.Drawing.Size(479, 385); + this.Controls.Add(this.lblDirectoryName); + this.Controls.Add(this.label1); + this.Controls.Add(this.pnlCF); + this.Controls.Add(this.btnCancel); + this.Controls.Add(this.btnOK); + this.Controls.Add(this.cbDirectory); + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "AutoAddShow"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "New Show Detected..."; + this.Load += new System.EventHandler(this.AutoAddShow_Load); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.ComboBox cbDirectory; + private System.Windows.Forms.Button btnOK; + private System.Windows.Forms.Button btnCancel; + private System.Windows.Forms.Panel pnlCF; + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label lblDirectoryName; + } +} diff --git a/TVRename#/Forms/AutoAddShow.cs b/TVRename#/Forms/AutoAddShow.cs new file mode 100644 index 000000000..8abee20c0 --- /dev/null +++ b/TVRename#/Forms/AutoAddShow.cs @@ -0,0 +1,75 @@ +using System; +using System.Windows.Forms; + +namespace TVRename.Forms +{ + public partial class AutoAddShow : Form + { + private ShowItem mSI; + private readonly TheTVDBCodeFinder mTCCF; + + public AutoAddShow(string hint) + { + InitializeComponent(); + this.mSI = new ShowItem(); + this.mTCCF = new TheTVDBCodeFinder("") {Dock = DockStyle.Fill}; + this.mTCCF.SetHint(hint); + this.mTCCF.SelectionChanged += MTCCF_SelectionChanged; + this.pnlCF.SuspendLayout(); + this.pnlCF.Controls.Add(this.mTCCF); + this.pnlCF.ResumeLayout(); + this.ActiveControl = this.mTCCF; // set initial focus to the code entry/show finder control + + this.cbDirectory.SuspendLayout(); + this.cbDirectory.Items.Clear(); + this.cbDirectory.Items.AddRange(TVSettings.Instance.MonitorFoldersNames.ToArray()); + this.cbDirectory.SelectedIndex = 0; + this.cbDirectory.ResumeLayout(); + } + + private void MTCCF_SelectionChanged(object sender, EventArgs e) + { + this.lblDirectoryName.Text = System.IO.Path.DirectorySeparatorChar + TVSettings.Instance.FilenameFriendly(FileHelper.MakeValidPath(this.mTCCF.SelectedShowName( ))); + } + + public ShowItem ShowItem => this.mSI; + + private void SetShowItem() + { + int code = this.mTCCF.SelectedCode(); + + + this.mSI.TVDBCode = code; + this.mSI.AutoAdd_FolderBase = this.cbDirectory.Text+this.lblDirectoryName.Text; + + } + + private void btnOK_Click(object sender, EventArgs e) + { + if (!OkToClose()) + { + this.DialogResult = DialogResult.None; + return; + } + + SetShowItem(); + this.DialogResult = DialogResult.OK; + Close(); + } + + private bool OkToClose() + { + if (TheTVDB.Instance.HasSeries(this.mTCCF.SelectedCode())) return true; + + DialogResult dr = MessageBox.Show("tvdb code unknown, close anyway?", "TVRename Add/Edit Show", + MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + + return dr != DialogResult.No; + } + + private void AutoAddShow_Load(object sender, EventArgs e) + { + + } + } +} diff --git a/TVRename#/Forms/AutoAddShow.resx b/TVRename#/Forms/AutoAddShow.resx new file mode 100644 index 000000000..4693f4f49 --- /dev/null +++ b/TVRename#/Forms/AutoAddShow.resx @@ -0,0 +1,377 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + AAABAAMAMDAAAAEAIACoJQAANgAAACAgAAABACAAqBAAAN4lAAAQEAAAAQAgAGgEAACGNgAAKAAAADAA + AABgAAAAAQAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9PT/9PT0//T09P/zk5 + Of85OTn/OTk5/zc3N/83Nzf/Nzc3/zU1Nf81NTX/NTU1/zMzM/8zMzP/MzMz/zIyMv8yMjL/MjIy/zAw + MP8wMDD/MDAw/y4uLv8uLi7/Li4u/y0tLf8tLS3/LS0t/ysrK/8rKyv/Kysr/yoqKv8qKir/Kioq/ykp + Kf8pKSn/KSkp/ykpKf8pKSn/KSkp/ygoKP8oKCj/KCgo/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9P + T/9PT0//T09P/zk5Of85OTn/OTk5/zc3N/83Nzf/Nzc3/zU1Nf81NTX/NTU1/zMzM/8zMzP/MzMz/zIy + Mv8yMjL/MjIy/zAwMP8wMDD/MDAw/y4uLv8uLi7/Li4u/y0tLf8tLS3/LS0t/ysrK/8rKyv/Kysr/yoq + Kv8qKir/Kioq/ykpKf8pKSn/KSkp/ykpKf8pKSn/KSkp/ygoKP8oKCj/KCgo/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAE9PT/9PT0//T09P/zk5Of85OTn/OTk5/zc3N/83Nzf/Nzc3/zU1Nf81NTX/NTU1/zMz + M/8zMzP/MzMz/zIyMv8yMjL/MjIy/zAwMP8wMDD/MDAw/y4uLv8uLi7/Li4u/y0tLf8tLS3/LS0t/ysr + K/8rKyv/Kysr/yoqKv8qKir/Kioq/ykpKf8pKSn/KSkp/ykpKf8pKSn/KSkp/ygoKP8oKCj/KCgo/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVlZf9lZWX/ZWVl/319ff99fX3/fX19/3p6ev96enr/enp6/3d3 + d/93d3f/d3d3/3R0dP90dHT/dHR0/3Fxcf9xcXH/cXFx/25ubv9ubm7/bm5u/2tra/9ra2v/a2tr/2ho + aP9oaGj/aGho/2ZmZv9mZmb/ZmZm/2NjY/9jY2P/Y2Nj/2FhYf9hYWH/YWFh/19fX/9fX1//X19f/zEx + Mf8xMTH/MTEx/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVlZf9lZWX/ZWVl/319ff99fX3/fX19/3p6 + ev96enr/enp6/3d3d/93d3f/d3d3/3R0dP90dHT/dHR0/3Fxcf9xcXH/cXFx/25ubv9ubm7/bm5u/2tr + a/9ra2v/a2tr/2hoaP9oaGj/aGho/2ZmZv9mZmb/ZmZm/2NjY/9jY2P/Y2Nj/2FhYf9hYWH/YWFh/19f + X/9fX1//X19f/zExMf8xMTH/MTEx/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGVlZf9lZWX/ZWVl/319 + ff99fX3/fX19/3p6ev96enr/enp6/3d3d/93d3f/d3d3/3R0dP90dHT/dHR0/3Fxcf9xcXH/cXFx/25u + bv9ubm7/bm5u/2tra/9ra2v/a2tr/2hoaP9oaGj/aGho/2ZmZv9mZmb/ZmZm/2NjY/9jY2P/Y2Nj/2Fh + Yf9hYWH/YWFh/19fX/9fX1//X19f/zExMf8xMTH/MTEx/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpq + av9qamr/ampq/4KCgv+CgoL/goKC/2FhYf9hYWH/YWFh/6ynfP8l/iH/rKd8/1lZWf9ZWVn/WVlZ/35+ + fv9UVFT/fn5+/35+fv9+fn7/fn5+/35+fv9MTEz/fn5+/35+fv9+fn7/fn5+/35+fv9FRUX/fn5+/35+ + fv9+fn7/fn5+/35+fv8/Pz//fn5+/2NjY/9jY2P/Y2Nj/zIyMv8yMjL/MjIy/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGpqav9qamr/ampq/4KCgv+CgoL/goKC/2FhYf9hYWH/YWFh/yX+If8l/iH/Jv4i/1lZ + Wf9ZWVn/WVlZ/1RUVP9UVFT/VVVV/35+fv9+fn7/fn5+/0xMTP9MTEz/TExM/35+fv9+fn7/fn5+/0VF + Rf9FRUX/RUVF/35+fv9+fn7/fn5+/z8/P/8/Pz//Pz8//2NjY/9jY2P/Y2Nj/zIyMv8yMjL/MjIy/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGpqav9qamr/ampq/4KCgv+CgoL/goKC/2FhYf9hYWH/YWFh/6yn + fP8l/iH/rKd8/1lZWf9ZWVn/WVlZ/35+fv9UVFT/fn5+/35+fv9+fn7/fn5+/35+fv9MTEz/fn5+/35+ + fv9+fn7/fn5+/35+fv9FRUX/fn5+/35+fv9+fn7/fn5+/35+fv8/Pz//fn5+/2NjY/9jY2P/Y2Nj/zIy + Mv8yMjL/MjIy/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNjY/9jY2P/Y2Nj/xsAlf8bAJX/GwCV/xgA + n/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwA + zv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA + /v8AAP7/AAD+/zU1Nf81NTX/NTU1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNjY/9jY2P/Y2Nj/xsA + lf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4A + xf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA + 9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zU1Nf81NTX/NTU1/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGNj + Y/9jY2P/Y2Nj/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEA + u/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA + 6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zU1Nf81NTX/NTU1/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAGlpaf9paWn/aWlp/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMA + sv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA + 4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zc3N/83Nzf/Nzc3/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlpaf9paWn/aWlp/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYA + qP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA + 2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zc3 + N/83Nzf/Nzc3/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGlpaf9paWn/aWlp/xsAlf8bAJX/GwCV/xgA + n/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwA + zv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA + /v8AAP7/AAD+/zc3N/83Nzf/Nzc3/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1tbf9tbW3/bW1t/xsA + lf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4A + xf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA + 9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zk5Of85OTn/OTk5/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1t + bf9tbW3/bW1t/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEA + u/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA + 6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zk5Of85OTn/OTk5/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAG1tbf9tbW3/bW1t/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMA + sv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA + 4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zk5Of85OTn/OTk5/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcP9wcHD/cHBw/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYA + qP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA + 2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zw8 + PP88PDz/PDw8/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcP9wcHD/cHBw/xsAlf8bAJX/GwCV/xgA + n/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwA + zv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA + /v8AAP7/AAD+/zw8PP88PDz/PDw8/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHBwcP9wcHD/cHBw/xsA + lf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4A + xf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA + 9P8CAPT/AgD0/wAA/v8AAP7/AAD+/zw8PP88PDz/PDw8/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZ2 + dv92dnb/dnZ2/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEA + u/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA + 6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/z8/P/8/Pz//Pz8//wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHZ2dv92dnb/dnZ2/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYAqP8WAKj/FgCo/xMA + sv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA + 4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/z8/P/8/Pz//Pz8//wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZ2dv92dnb/dnZ2/xsAlf8bAJX/GwCV/xgAn/8YAJ//GACf/xYA + qP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwAzv8MAM7/DADO/wkA + 2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/z8/ + P/8/Pz//Pz8//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHt7e/97e3v/e3t7/xsAlf8bAJX/GwCV/xgA + n/8YAJ//GACf/xYAqP8WAKj/FgCo/xMAsv8TALL/EwCy/xEAu/8RALv/EQC7/w4Axf8OAMX/DgDF/wwA + zv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA + /v8AAP7/AAD+/0JCQv9CQkL/QkJC/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fP98fHz/fHx8/xwA + lv8cAJb/HACW/xkAoP8ZAKD/GQCg/xcAqf8XAKn/FwCp/xQAs/8UALP/FACz/xIAvP8SALz/EgC8/w8A + xv8PAMb/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA + 9P8CAPT/AgD0/wAA/v8AAP7/AAD+/0JCQv9CQkL/QkJC/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8 + fP98fHz/fHx8/xwAlv8cAJb/HACW/xkAoP8ZAKD/GQCg/xcAqf8XAKn/FwCp/xQAs/8UALP/FACz/xIA + vP8SALz/EgC8/w8Axv8PAMb/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA + 6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/0JCQv9CQkL/QkJC/wAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAH19ff99fX3/fX19/xwAlv8cAJb/HACW/xkAoP8ZAKD/GQCg/xcAqf8XAKn/FwCp/xQA + s/8UALP/FACz/xIAvP8SALz/EgC8/w8Axv8PAMb/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA + 4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/0VFRf9FRUX/RUVF/wAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAH19ff99fX3/fX19/xwAlv8cAJb/HACW/xkAoP8ZAKD/GQCg/xcA + qf8XAKn/FwCp/xQAs/8UALP/FACz/xIAvP8SALz/EgC8/w8Axv8PAMb/DgDF/wwAzv8MAM7/DADO/wkA + 2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/0VF + Rf9FRUX/RUVF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH19ff99fX3/fX19/xwAlv8cAJb/HACW/xkA + oP8ZAKD/GQCg/xcAqf8XAKn/FwCp/xQAs/8UALP/FACz/xIAvP8SALz/EgC8/w8Axv8PAMb/DgDF/wwA + zv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA + /v8AAP7/AAD+/0VFRf9FRUX/RUVF/wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNzc/5zc3P+c3Nz/hwA + lv8cAJb/HACW/xkAoP8ZAKD/GQCg/xcAqf8XAKn/FwCp/xQAs/8UALP/FACz/xIAvP8SALz/EgC8/w8A + xv8PAMb/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA + 9P8CAPT/AgD0/wAA/v8AAP7/AAD+/0pKSv5KSkr+SkpK/gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHNz + c/5zc3P+c3Nz/hwAlv8cAJb/HACW/xkAoP8ZAKD/GQCg/xcAqf8XAKn/FwCp/xQAs/8UALP/FACz/xIA + vP8SALz/EgC8/w8Axv8PAMb/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA4f8HAOH/BwDh/wQA + 6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/0pKSv5KSkr+SkpK/gAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAHNzc/5zc3P+c3Nz/hwAlv8cAJb/HACW/xkAoP8ZAKD/GQCg/xcAqf8XAKn/FwCp/xQA + s/8UALP/FACz/xIAvP8SALz/EgC8/w8Axv8PAMb/DgDF/wwAzv8MAM7/DADO/wkA2P8JANj/CQDY/wcA + 4f8HAOH/BwDh/wQA6/8EAOv/BADr/wIA9P8CAPT/AgD0/wAA/v8AAP7/AAD+/0pKSv5KSkr+SkpK/gAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAHR0dIFzc3P/c3Nz/3NzdPxzc3T8c3N0/HJyc/xycnP8cnJz/HJy + c/xycnP8cnJz/HFxcvxxcXL8cXFy/IeHiP+Hh4j/h4eI/4eHiP+Hh4j/h4eI/4SEhf+EhIX/hISF/4KC + g/+CgoP/goKD/2trbPxra2z8a2ts/Gpqa/xqamv8ampr/GlpavxpaWr8aWlq/GZmZ/xmZmf8ZmZn/EpK + Sv9KSkr/W1tbgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHR0dIF0dHSBc3Nz/3R0dPx0dHT8dHR0/HNz + c/xzc3P8c3Nz/HNzc/xzc3P8c3Nz/HJycvxycnL8cnJy/IiIiP+IiIj/iIiI/4iIiP+IiIj/h4eH/4SE + hP+EhIT/hISE/4KCgv+CgoL/goKC/2tra/xra2v8a2tr/Gpqavxqamr8ampq/GlpafxpaWn8aWlp/GZm + ZvxmZmb8ZmZm/EpKSv9bW1uBW1tbgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB0dHSBdHR0gXR0 + dPx0dHT8dHR0/HNzc/xzc3P8c3Nz/HNzc/xzc3P8c3Nz/HJycvxycnL8cnJy/IiIiP+IiIj/iIiI/4iI + iP+IiIj/h4eH/4SEhP+EhIT/hISE/4KCgv+CgoL/goKC/2tra/xra2v8a2tr/Gpqavxqamr8ampq/Glp + afxpaWn8aWlp/GZmZvxmZmb8ZmZm/FtbW4FbW1uBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJBjTwaQY08GkGNPBqmJduKpiXbiqYl24qWH + c+ulh3PrpIZy67ych+W8nIflck4/D2hIOQ+SdGH9knRh/Y9yX+uPcl/rj3Jf64ZmVOKGZlTihmZU4lI7 + LAZSOywGUjssBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + 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 + Nf8zMzP/MzMz/zIyMv8yMjL/MDAw/zAwMP8uLi7/Li4u/y0tLf8tLS3/Kysr/ysrK/8qKir/Kioq/ykp + Kf8pKSn/KSkp/ykpKf8oKCj/KCgo/wAAAAAAAAAAAAAAAAAAAABlZWX/ZWVl/319ff99fX3/enp6/3p6 + ev93d3f/d3d3/3R0dP90dHT/cXFx/3Fxcf9ubm7/bm5u/2tra/9ra2v/aGho/2hoaP9mZmb/ZmZm/2Nj + Y/9jY2P/YWFh/2FhYf9fX1//X19f/zExMf8xMTH/AAAAAAAAAAAAAAAAAAAAAGVlZf9lZWX/fX19/319 + ff96enr/enp6/3d3d/93d3f/dHR0/3R0dP9xcXH/cXFx/25ubv9ubm7/a2tr/2tra/9oaGj/aGho/2Zm + Zv9mZmb/Y2Nj/2NjY/9hYWH/YWFh/19fX/9fX1//MTEx/zExMf8AAAAAAAAAAAAAAAAAAAAAampq/2pq + av+CgoL/goKC/2FhYf9hYWH/YddJ/2HXSf9ZWVn/WVlZ/2ZmZv9mZmb/fn5+/35+fv9iYmL/YmJi/35+ + fv9+fn7/Xl5e/15eXv9+fn7/fn5+/1tbW/9bW1v/Y2Nj/2NjY/8yMjL/MjIy/wAAAAAAAAAAAAAAAAAA + AABqamr/ampq/4KCgv+CgoL/YWFh/2FhYf9h10n/YddJ/1lZWf9ZWVn/ZmZm/2ZmZv9+fn7/fn5+/2Ji + Yv9iYmL/fn5+/35+fv9eXl7/Xl5e/35+fv9+fn7/W1tb/1tbW/9jY2P/Y2Nj/zIyMv8yMjL/AAAAAAAA + AAAAAAAAAAAAAGNjY/9jY2P/GwCV/xsAlf8YAJ//GACf/xYAqP8WAKj/EwCy/xMAsv8RALv/EQC7/w0A + xP8OAMX/DADN/wwAzv8JANj/CQDY/wYA4f8HAOH/BADr/wQA6/8CAPT/AgD0/wAA/v8AAP7/NTU1/zU1 + Nf8AAAAAAAAAAAAAAAAAAAAAY2Nj/2NjY/8bAJX/GwCV/xgAn/8YAJ//FgCo/xYAqP8TALL/EwCy/xEA + u/8RALv/DQDE/w0AxP8MAM3/DADN/wkA2P8JANj/BgDh/wYA4f8EAOv/BADr/wIA9P8CAPT/AAD+/wAA + /v81NTX/NTU1/wAAAAAAAAAAAAAAAAAAAABpaWn/aWlp/xsAlf8bAJX/GACf/xgAn/8WAKj/FgCo/xMA + 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 + rEGAAaxBgAGsQfAPrEHhh6xBw8OsQYfhrEE= + + + \ No newline at end of file diff --git a/TVRename#/Forms/Preferences.Designer.cs b/TVRename#/Forms/Preferences.Designer.cs index 0e489cff1..9a5eb705b 100644 --- a/TVRename#/Forms/Preferences.Designer.cs +++ b/TVRename#/Forms/Preferences.Designer.cs @@ -128,6 +128,7 @@ private void InitializeComponent() this.txtMissingCSV = new System.Windows.Forms.TextBox(); this.cbMissingCSV = new System.Windows.Forms.CheckBox(); this.tpScanOptions = new System.Windows.Forms.TabPage(); + this.chkAutoMergeEpisodes = new System.Windows.Forms.CheckBox(); this.chkPreventMove = new System.Windows.Forms.CheckBox(); this.label40 = new System.Windows.Forms.Label(); this.cbxUpdateAirDate = new System.Windows.Forms.CheckBox(); @@ -234,7 +235,7 @@ private void InitializeComponent() this.pyTivoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.mede8erToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); this.noneToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.chkAutoMergeEpisodes = new System.Windows.Forms.CheckBox(); + this.chkAutoSearchForDownloadedFiles = new System.Windows.Forms.CheckBox(); this.groupBox2.SuspendLayout(); this.tabControl1.SuspendLayout(); this.tbGeneral.SuspendLayout(); @@ -1183,6 +1184,7 @@ private void InitializeComponent() // // tpScanOptions // + this.tpScanOptions.Controls.Add(this.chkAutoSearchForDownloadedFiles); this.tpScanOptions.Controls.Add(this.chkAutoMergeEpisodes); this.tpScanOptions.Controls.Add(this.chkPreventMove); this.tpScanOptions.Controls.Add(this.label40); @@ -1205,6 +1207,16 @@ private void InitializeComponent() this.tpScanOptions.Text = "Scan Options"; this.tpScanOptions.UseVisualStyleBackColor = true; // + // chkAutoMergeEpisodes + // + this.chkAutoMergeEpisodes.AutoSize = true; + this.chkAutoMergeEpisodes.Location = new System.Drawing.Point(9, 311); + this.chkAutoMergeEpisodes.Name = "chkAutoMergeEpisodes"; + this.chkAutoMergeEpisodes.Size = new System.Drawing.Size(276, 17); + this.chkAutoMergeEpisodes.TabIndex = 13; + this.chkAutoMergeEpisodes.Text = "Automatically create merge rules for merged episodes"; + this.chkAutoMergeEpisodes.UseVisualStyleBackColor = true; + // // chkPreventMove // this.chkPreventMove.AutoSize = true; @@ -2297,15 +2309,15 @@ private void InitializeComponent() this.noneToolStripMenuItem.Tag = "4"; this.noneToolStripMenuItem.Text = "&None"; // - // chkAutoMergeEpisodes + // chkAutoSearchForDownloadedFiles // - this.chkAutoMergeEpisodes.AutoSize = true; - this.chkAutoMergeEpisodes.Location = new System.Drawing.Point(9, 311); - this.chkAutoMergeEpisodes.Name = "chkAutoMergeEpisodes"; - this.chkAutoMergeEpisodes.Size = new System.Drawing.Size(276, 17); - this.chkAutoMergeEpisodes.TabIndex = 13; - this.chkAutoMergeEpisodes.Text = "Automatically create merge rules for merged episodes"; - this.chkAutoMergeEpisodes.UseVisualStyleBackColor = true; + this.chkAutoSearchForDownloadedFiles.AutoSize = true; + this.chkAutoSearchForDownloadedFiles.Location = new System.Drawing.Point(9, 334); + this.chkAutoSearchForDownloadedFiles.Name = "chkAutoSearchForDownloadedFiles"; + this.chkAutoSearchForDownloadedFiles.Size = new System.Drawing.Size(186, 17); + this.chkAutoSearchForDownloadedFiles.TabIndex = 14; + this.chkAutoSearchForDownloadedFiles.Text = "Notify when new shows are found"; + this.chkAutoSearchForDownloadedFiles.UseVisualStyleBackColor = true; // // Preferences // @@ -2578,5 +2590,6 @@ private void InitializeComponent() private System.Windows.Forms.CheckBox chkHideMyShowsSpoilers; private System.Windows.Forms.CheckBox chkPreventMove; private System.Windows.Forms.CheckBox chkAutoMergeEpisodes; + private System.Windows.Forms.CheckBox chkAutoSearchForDownloadedFiles; } } diff --git a/TVRename#/Forms/Preferences.cs b/TVRename#/Forms/Preferences.cs index 38170e986..b0ab4dc86 100644 --- a/TVRename#/Forms/Preferences.cs +++ b/TVRename#/Forms/Preferences.cs @@ -169,6 +169,7 @@ private void OKButton_Click(object sender, System.EventArgs e) S.MissingCheck = this.cbMissing.Checked; S.CorrectFileDates = this.cbxUpdateAirDate.Checked; S.SearchLocally = this.cbSearchLocally.Checked; + S.AutoSearchForDownloadedFiles = this.chkAutoSearchForDownloadedFiles.Checked; S.LeaveOriginals = this.cbLeaveOriginals.Checked; S.CheckuTorrent = this.cbCheckuTorrent.Checked; S.LookForDateInFilename = this.cbLookForAirdate.Checked; @@ -405,6 +406,7 @@ private void Preferences_Load(object sender, System.EventArgs e) this.cbCleanUpDownloadDir.Checked = S.RemoveDownloadDirectoriesFiles; this.cbMissing.Checked = S.MissingCheck; this.cbxUpdateAirDate.Checked = S.CorrectFileDates; + this.chkAutoSearchForDownloadedFiles.Checked = S.AutoSearchForDownloadedFiles; this.cbSearchLocally.Checked = S.SearchLocally; this.cbLeaveOriginals.Checked = S.LeaveOriginals; this.EnterPreferredLanguage = S.PreferredLanguage; diff --git a/TVRename#/Forms/UI.cs b/TVRename#/Forms/UI.cs index 4b7a9d746..09c074d27 100644 --- a/TVRename#/Forms/UI.cs +++ b/TVRename#/Forms/UI.cs @@ -18,6 +18,7 @@ using File = Alphaleonis.Win32.Filesystem.File; using System.IO; using System.Linq; +using System.Text.RegularExpressions; using TVRename.Ipc; namespace TVRename @@ -2979,6 +2980,141 @@ private void Scan(List shows) this.FillActionList(); } + private void GetNewShows() + { + //for each directory in settings directory + //for each file in directory + //for each saved show (order by recent) + //does show match selected file? + //if so add series to list of series scanned + if (!TVSettings.Instance.AutoSearchForDownloadedFiles) return; + + List possibleShowNames = new List(); + + foreach (string dirPath in this.mDoc.SearchFolders) + { + if (!Directory.Exists(dirPath)) continue; + + foreach (string filePath in Directory.GetFiles(dirPath, "*", System.IO.SearchOption.AllDirectories)) + { + if (!File.Exists(filePath)) continue; + + FileInfo fi = new FileInfo(filePath); + + if (!TVSettings.Instance.UsefulExtension(fi.Extension, false)) + continue; // move on + + if (TVSettings.Instance.IgnoreSamples && Helpers.Contains(fi.FullName, "sample", StringComparison.OrdinalIgnoreCase) && ((fi.Length / (1024 * 1024)) < TVSettings.Instance.SampleFileMaxSizeMB)) + continue; + + if (!LookForSeries(fi.Name)) possibleShowNames.Add(fi.RemoveExtension()+"."); + + } + + foreach (string subDirPath in Directory.GetDirectories(dirPath, "*", System.IO.SearchOption.AllDirectories)) + { + if (!Directory.Exists(subDirPath)) continue; + + DirectoryInfo di = new DirectoryInfo(subDirPath); + + if (!LookForSeries(di.Name)) possibleShowNames.Add(di.Name); + } + + + List addedShows = new List(); + + foreach (string hint in possibleShowNames) + { + //MessageBox.Show($"Search for {hint}"); + //if hint doesn't match existing added shows + if (LookForSeries(hint, addedShows)) continue; + + //Remove anything we can from hint to make it cleaner and hence more likely to match + string refinedHint = RemoveSeriesEpisodeIndicators(hint); + + //popup dialog + AutoAddShow askForMatch = new AutoAddShow(refinedHint); + if (askForMatch.ShowDialog() == DialogResult.OK) + { + //If added add show to collection + addedShows.Add(askForMatch.ShowItem); + } + + } + this.mDoc.ShowItems.AddRange(addedShows); + + + } + } + + private string RemoveSeriesEpisodeIndicators(string hint) + { + string hint2 = Helpers.RemoveDiacritics(hint); + hint2 = RemoveSE(hint2); + hint2 = hint2.ToLower(); + hint2 = hint2.Replace("'", ""); + hint2 = hint2.Replace("&", "and"); + hint2 = Regex.Replace(hint2, "[_\\W]+", " "); + hint2 = hint2.RemoveAfter("1080p") ; + hint2 = hint2.RemoveAfter("720p"); + foreach (string seasonWord in this.mDoc.SeasonWords()) + { + hint2 = hint2.RemoveAfter(seasonWord ); + } + hint2 = hint2.Trim(); + return hint2; + + } + + private string RemoveSE(string hint) + { + foreach (FilenameProcessorRE re in TVSettings.Instance.FNPRegexs) + { + if (!re.Enabled) + continue; + try + { + Match m = Regex.Match(hint, re.RE, RegexOptions.IgnoreCase); + if (m.Success) + { + if (!int.TryParse(m.Groups["s"].ToString(), out int seas)) + seas = -1; + if (!int.TryParse(m.Groups["e"].ToString(), out int ep)) + ep = -1; + + int p = Math.Min(m.Groups["s"].Index, m.Groups["e"].Index); + int p2 = Math.Min(p, hint.IndexOf(m.Groups.SyncRoot.ToString())); + + if ((seas != -1) && (ep != -1)) return hint.Remove(p2!=-1?p2:p); + } + } + catch (FormatException) + { + } + catch (ArgumentException) + { } + } + + return hint; + } + + private bool LookForSeries(string name) + { + return LookForSeries(name, this.mDoc.ShowItems); + } + + private bool LookForSeries(string test,IEnumerable shows) + { + foreach (ShowItem si in shows) + { + if (si.getSimplifiedPossibleShowNames() + .Any(name => FileHelper.SimplifyAndCheckFilename(test, name))) + return true; + } + + return false; + } + public void QuickScan() { logger.Info("*******************************"); @@ -2986,6 +3122,7 @@ public void QuickScan() this.MoreBusy(); this.mDoc.QuickScan(); this.LessBusy(); + GetNewShows(); this.FillMyShows(); // scanning can download more info to be displayed in my shows this.FillActionList(); } diff --git a/TVRename#/Settings/Settings.cs b/TVRename#/Settings/Settings.cs index 84a456486..b5a728c20 100644 --- a/TVRename#/Settings/Settings.cs +++ b/TVRename#/Settings/Settings.cs @@ -365,6 +365,7 @@ public string[] OtherExtensionsArray public bool HideWtWSpoilers = false; public bool HideMyShowsSpoilers = false; public bool ShowInTaskbar = true; + public bool AutoSearchForDownloadedFiles = false; public string SpecialsFolderName = "Specials"; public int StartupTab = 0; public Searchers TheSearchers = new Searchers(); @@ -374,6 +375,8 @@ public string[] VideoExtensionsArray get { return VideoExtensionsString.Split(';'); } } + + public bool AutoMergeEpisodes = false; public string VideoExtensionsString = ""; public int WTWRecentDays = 7; @@ -587,6 +590,8 @@ public void load(XmlReader reader) this.SearchLocally = reader.ReadElementContentAsBoolean(); else if (reader.Name == "LeaveOriginals") this.LeaveOriginals = reader.ReadElementContentAsBoolean(); + else if (reader.Name == "AutoSearchForDownloadedFiles") + this.AutoSearchForDownloadedFiles = reader.ReadElementContentAsBoolean(); else if (reader.Name == "LookForDateInFilename") this.LookForDateInFilename = reader.ReadElementContentAsBoolean(); else if (reader.Name == "AutoMergeEpisodes") @@ -871,6 +876,7 @@ public void WriteXML(XmlWriter writer) XMLHelper.WriteElementToXML(writer,"RenameCheck",this.RenameCheck); XMLHelper.WriteElementToXML(writer, "PreventMove", this.PreventMove); XMLHelper.WriteElementToXML(writer,"MissingCheck",this.MissingCheck); + XMLHelper.WriteElementToXML(writer, "AutoSearchForDownloadedFiles", this.AutoSearchForDownloadedFiles); XMLHelper.WriteElementToXML(writer, "UpdateFileDates", this.CorrectFileDates); XMLHelper.WriteElementToXML(writer,"SearchLocally",this.SearchLocally); XMLHelper.WriteElementToXML(writer,"LeaveOriginals",this.LeaveOriginals); diff --git a/TVRename#/TVRename#.csproj b/TVRename#/TVRename#.csproj index b37a1a7ab..5dc09f17a 100644 --- a/TVRename#/TVRename#.csproj +++ b/TVRename#/TVRename#.csproj @@ -100,6 +100,12 @@ + + Form + + + AutoAddShow.cs + Form @@ -346,6 +352,9 @@ AddModifyRule.cs Designer + + AutoAddShow.cs + BugReport.cs Designer diff --git a/TVRename#/TVRename/TVDoc.cs b/TVRename#/TVRename/TVDoc.cs index 9af741781..d47b50908 100644 --- a/TVRename#/TVRename/TVDoc.cs +++ b/TVRename#/TVRename/TVDoc.cs @@ -80,7 +80,8 @@ private IEnumerable GetSeasonWords() } private IEnumerable SeasonWordsCache; - private IEnumerable SeasonWords() + + internal IEnumerable SeasonWords() { if (SeasonWordsCache == null) SeasonWordsCache = GetSeasonWords(); return SeasonWordsCache; diff --git a/TVRename#/Utility/Helpers.cs b/TVRename#/Utility/Helpers.cs index 5c3a96bc0..ba620cfce 100644 --- a/TVRename#/Utility/Helpers.cs +++ b/TVRename#/Utility/Helpers.cs @@ -376,6 +376,20 @@ public static bool SimplifyAndCheckFilename(string filename, string showname) } internal static string TempPath(string v) => Path.GetTempPath() + v; + + public static string MakeValidPath(string input) + { + string directoryName = input; + string invalid = new string(Path.GetInvalidFileNameChars()) + new string(Path.GetInvalidPathChars()); + + foreach (char c in invalid) + { + directoryName = directoryName.Replace(c.ToString(), ""); + } + + return directoryName; + + } } public static class HTTPHelper @@ -846,6 +860,7 @@ public static string CompareName(string n) } + public static string GetCommonStartString(List testValues) { string root = string.Empty; @@ -873,6 +888,13 @@ public static string TrimEnd(this string root, string ending) return root.Substring(0, root.Length - ending.Length); } + public static string RemoveAfter(this string root, string ending) + { + if (root.IndexOf(ending) !=-1) + return root.Substring(0, root.IndexOf(ending)); + return root; + } + public static string TrimEnd(this string root, string[] endings) { string trimmedString = root;