21 Commits

Author SHA1 Message Date
AiiR
2e44cbc5a3 0.9.9.8
0.9.9.8
2020-02-27 16:55:41 -05:00
AiiR
4e14909b22 0.9.9.7 2020-01-09 05:34:23 -05:00
AiiR
272babb837 Update README.md 2019-12-12 17:55:34 -05:00
AiiR
a4d8289063 0.9.9.6 (Bug fixes)
0.9.9.6 (Bug fixes)
2019-12-11 00:05:07 -05:00
AiiR
5d97d944a7 Merge branch 'master' of https://github.com/ImAiiR/QobuzDownloaderX 2019-12-10 00:10:12 -05:00
AiiR
8cfdd5ed7e Update QBDLX2.png 2019-12-10 00:10:00 -05:00
AiiR
4b92ec794d Update README.md 2019-12-10 00:07:16 -05:00
AiiR
97ff2e2a3e Update README.md 2019-12-10 00:06:48 -05:00
AiiR
9e778a9145 Create QBDLX2.png 2019-12-10 00:06:25 -05:00
AiiR
2446643d99 0.9.9.5
0.9.9.5 (UI Change Update)
2019-12-09 23:56:59 -05:00
AiiR
2b0ec2b90d 0.9.9.0 2019-11-23 16:19:36 -05:00
AiiR
7eba9848ba Change character replacements to "-" 2019-11-23 14:53:55 -05:00
AiiR
7cb2e827cb Update README.md 2019-11-02 14:15:20 -04:00
AiiR
8005e6297b Update README.md 2019-11-01 22:31:38 -04:00
AiiR
497d7f2963 Merge branch 'master' of https://github.com/ImAiiR/QobuzDownloaderX 2019-11-01 22:30:34 -04:00
AiiR
a8839434e7 Create QBDLX1.png 2019-11-01 22:30:15 -04:00
AiiR
799afa706f Update README.md 2019-11-01 22:23:18 -04:00
AiiR
6e8a4fe1dc Update README.md 2019-11-01 22:23:02 -04:00
AiiR
37eaaecc8a Update README.md 2019-11-01 22:17:45 -04:00
AiiR
15a099d6b2 Update README.md 2019-11-01 22:15:17 -04:00
AiiR
8a4ff7c871 Update README.md 2019-11-01 22:13:10 -04:00
15 changed files with 2654 additions and 175 deletions

BIN
-assets/QBDLX1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

BIN
-assets/QBDLX2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

View File

@@ -49,7 +49,7 @@
this.upcTextBox = new System.Windows.Forms.TextBox(); this.upcTextBox = new System.Windows.Forms.TextBox();
this.label5 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label();
this.albumArtPicBox = new System.Windows.Forms.PictureBox(); this.albumArtPicBox = new System.Windows.Forms.PictureBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox(); this.logoBox = new System.Windows.Forms.PictureBox();
this.label6 = new System.Windows.Forms.Label(); this.label6 = new System.Windows.Forms.Label();
this.totalTracksTextbox = new System.Windows.Forms.TextBox(); this.totalTracksTextbox = new System.Windows.Forms.TextBox();
this.totalTracksLabel = new System.Windows.Forms.Label(); this.totalTracksLabel = new System.Windows.Forms.Label();
@@ -84,8 +84,24 @@
this.flacMidCheckbox = new System.Windows.Forms.CheckBox(); this.flacMidCheckbox = new System.Windows.Forms.CheckBox();
this.flacHighCheckbox = new System.Windows.Forms.CheckBox(); this.flacHighCheckbox = new System.Windows.Forms.CheckBox();
this.mp3WarnLabel = new System.Windows.Forms.Label(); this.mp3WarnLabel = new System.Windows.Forms.Label();
this.panel1 = new System.Windows.Forms.Panel();
this.exitLabel = new System.Windows.Forms.Label();
this.minimizeLabel = new System.Windows.Forms.Label();
this.panel2 = new System.Windows.Forms.Panel();
this.panel3 = new System.Windows.Forms.Panel();
this.panel4 = new System.Windows.Forms.Panel();
this.panel5 = new System.Windows.Forms.Panel();
this.panel6 = new System.Windows.Forms.Panel();
this.panel7 = new System.Windows.Forms.Panel();
this.panel8 = new System.Windows.Forms.Panel();
this.streamableCheckbox = new System.Windows.Forms.CheckBox();
this.secretTextbox = new System.Windows.Forms.TextBox();
this.displaySecretButton = new System.Windows.Forms.Button();
this.profilePictureBox = new System.Windows.Forms.PictureBox();
this.logoutLabel = new System.Windows.Forms.Label();
((System.ComponentModel.ISupportInitialize)(this.albumArtPicBox)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.albumArtPicBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.logoBox)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.profilePictureBox)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
// //
// testURLBox // testURLBox
@@ -101,17 +117,23 @@
// //
// selectFolder // selectFolder
// //
this.selectFolder.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(239)))));
this.selectFolder.FlatAppearance.BorderSize = 0;
this.selectFolder.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.selectFolder.ForeColor = System.Drawing.Color.White;
this.selectFolder.Location = new System.Drawing.Point(13, 115); this.selectFolder.Location = new System.Drawing.Point(13, 115);
this.selectFolder.Name = "selectFolder"; this.selectFolder.Name = "selectFolder";
this.selectFolder.Size = new System.Drawing.Size(349, 23); this.selectFolder.Size = new System.Drawing.Size(349, 23);
this.selectFolder.TabIndex = 2; this.selectFolder.TabIndex = 2;
this.selectFolder.Text = "Choose Folder"; this.selectFolder.Text = "Choose Folder";
this.selectFolder.UseVisualStyleBackColor = true; this.selectFolder.UseVisualStyleBackColor = false;
this.selectFolder.Click += new System.EventHandler(this.selectFolder_Click); this.selectFolder.Click += new System.EventHandler(this.selectFolder_Click);
// //
// output // output
// //
this.output.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(33)))), ((int)(((byte)(33)))), ((int)(((byte)(33))))); this.output.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(33)))), ((int)(((byte)(33)))), ((int)(((byte)(33)))));
this.output.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.output.Cursor = System.Windows.Forms.Cursors.IBeam;
this.output.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.output.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.output.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128))))); this.output.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(128)))), ((int)(((byte)(128)))));
this.output.Location = new System.Drawing.Point(12, 144); this.output.Location = new System.Drawing.Point(12, 144);
@@ -125,29 +147,41 @@
// //
// openFolderButton // openFolderButton
// //
this.openFolderButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(239)))));
this.openFolderButton.FlatAppearance.BorderSize = 0;
this.openFolderButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.openFolderButton.ForeColor = System.Drawing.Color.White;
this.openFolderButton.Location = new System.Drawing.Point(368, 115); this.openFolderButton.Location = new System.Drawing.Point(368, 115);
this.openFolderButton.Name = "openFolderButton"; this.openFolderButton.Name = "openFolderButton";
this.openFolderButton.Size = new System.Drawing.Size(349, 23); this.openFolderButton.Size = new System.Drawing.Size(349, 23);
this.openFolderButton.TabIndex = 13; this.openFolderButton.TabIndex = 13;
this.openFolderButton.Text = "Open Folder"; this.openFolderButton.Text = "Open Folder";
this.openFolderButton.UseVisualStyleBackColor = true; this.openFolderButton.UseVisualStyleBackColor = false;
this.openFolderButton.Click += new System.EventHandler(this.openFolderButton_Click); this.openFolderButton.Click += new System.EventHandler(this.openFolderButton_Click);
// //
// downloadButton // downloadButton
// //
this.downloadButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(239)))));
this.downloadButton.FlatAppearance.BorderSize = 0;
this.downloadButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.downloadButton.ForeColor = System.Drawing.Color.White;
this.downloadButton.Location = new System.Drawing.Point(597, 86); this.downloadButton.Location = new System.Drawing.Point(597, 86);
this.downloadButton.Name = "downloadButton"; this.downloadButton.Name = "downloadButton";
this.downloadButton.Size = new System.Drawing.Size(120, 23); this.downloadButton.Size = new System.Drawing.Size(120, 23);
this.downloadButton.TabIndex = 17; this.downloadButton.TabIndex = 17;
this.downloadButton.Text = "Download"; this.downloadButton.Text = "Download";
this.downloadButton.UseVisualStyleBackColor = true; this.downloadButton.UseVisualStyleBackColor = false;
this.downloadButton.Click += new System.EventHandler(this.downloadButton_Click); this.downloadButton.Click += new System.EventHandler(this.downloadButton_Click);
// //
// albumUrl // albumUrl
// //
this.albumUrl.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.albumUrl.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.albumUrl.ForeColor = System.Drawing.Color.White;
this.albumUrl.Location = new System.Drawing.Point(15, 88); this.albumUrl.Location = new System.Drawing.Point(15, 88);
this.albumUrl.Multiline = true;
this.albumUrl.Name = "albumUrl"; this.albumUrl.Name = "albumUrl";
this.albumUrl.Size = new System.Drawing.Size(579, 20); this.albumUrl.Size = new System.Drawing.Size(576, 20);
this.albumUrl.TabIndex = 16; this.albumUrl.TabIndex = 16;
this.albumUrl.WordWrap = false; this.albumUrl.WordWrap = false;
this.albumUrl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.albumUrl_KeyDown); this.albumUrl.KeyDown += new System.Windows.Forms.KeyEventHandler(this.albumUrl_KeyDown);
@@ -165,6 +199,7 @@
// //
// verNumLabel // verNumLabel
// //
this.verNumLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.verNumLabel.Location = new System.Drawing.Point(159, 55); this.verNumLabel.Location = new System.Drawing.Point(159, 55);
this.verNumLabel.Name = "verNumLabel"; this.verNumLabel.Name = "verNumLabel";
this.verNumLabel.Size = new System.Drawing.Size(63, 13); this.verNumLabel.Size = new System.Drawing.Size(63, 13);
@@ -175,6 +210,7 @@
// label1 // label1
// //
this.label1.AutoSize = true; this.label1.AutoSize = true;
this.label1.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.label1.Location = new System.Drawing.Point(801, 213); this.label1.Location = new System.Drawing.Point(801, 213);
this.label1.Name = "label1"; this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(51, 13); this.label1.Size = new System.Drawing.Size(51, 13);
@@ -184,6 +220,7 @@
// label2 // label2
// //
this.label2.AutoSize = true; this.label2.AutoSize = true;
this.label2.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.label2.Location = new System.Drawing.Point(751, 236); this.label2.Location = new System.Drawing.Point(751, 236);
this.label2.Name = "label2"; this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(62, 13); this.label2.Size = new System.Drawing.Size(62, 13);
@@ -192,7 +229,11 @@
// //
// albumArtistTextBox // albumArtistTextBox
// //
this.albumArtistTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.albumArtistTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.albumArtistTextBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.albumArtistTextBox.Location = new System.Drawing.Point(754, 252); this.albumArtistTextBox.Location = new System.Drawing.Point(754, 252);
this.albumArtistTextBox.Multiline = true;
this.albumArtistTextBox.Name = "albumArtistTextBox"; this.albumArtistTextBox.Name = "albumArtistTextBox";
this.albumArtistTextBox.ReadOnly = true; this.albumArtistTextBox.ReadOnly = true;
this.albumArtistTextBox.Size = new System.Drawing.Size(150, 20); this.albumArtistTextBox.Size = new System.Drawing.Size(150, 20);
@@ -201,7 +242,11 @@
// //
// albumTextBox // albumTextBox
// //
this.albumTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.albumTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.albumTextBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.albumTextBox.Location = new System.Drawing.Point(754, 294); this.albumTextBox.Location = new System.Drawing.Point(754, 294);
this.albumTextBox.Multiline = true;
this.albumTextBox.Name = "albumTextBox"; this.albumTextBox.Name = "albumTextBox";
this.albumTextBox.ReadOnly = true; this.albumTextBox.ReadOnly = true;
this.albumTextBox.Size = new System.Drawing.Size(150, 20); this.albumTextBox.Size = new System.Drawing.Size(150, 20);
@@ -211,6 +256,7 @@
// label3 // label3
// //
this.label3.AutoSize = true; this.label3.AutoSize = true;
this.label3.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.label3.Location = new System.Drawing.Point(751, 278); this.label3.Location = new System.Drawing.Point(751, 278);
this.label3.Name = "label3"; this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(36, 13); this.label3.Size = new System.Drawing.Size(36, 13);
@@ -219,7 +265,11 @@
// //
// releaseDateTextBox // releaseDateTextBox
// //
this.releaseDateTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.releaseDateTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.releaseDateTextBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.releaseDateTextBox.Location = new System.Drawing.Point(754, 463); this.releaseDateTextBox.Location = new System.Drawing.Point(754, 463);
this.releaseDateTextBox.Multiline = true;
this.releaseDateTextBox.Name = "releaseDateTextBox"; this.releaseDateTextBox.Name = "releaseDateTextBox";
this.releaseDateTextBox.ReadOnly = true; this.releaseDateTextBox.ReadOnly = true;
this.releaseDateTextBox.Size = new System.Drawing.Size(150, 20); this.releaseDateTextBox.Size = new System.Drawing.Size(150, 20);
@@ -229,6 +279,7 @@
// label4 // label4
// //
this.label4.AutoSize = true; this.label4.AutoSize = true;
this.label4.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.label4.Location = new System.Drawing.Point(751, 447); this.label4.Location = new System.Drawing.Point(751, 447);
this.label4.Name = "label4"; this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(72, 13); this.label4.Size = new System.Drawing.Size(72, 13);
@@ -237,7 +288,11 @@
// //
// upcTextBox // upcTextBox
// //
this.upcTextBox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.upcTextBox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.upcTextBox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.upcTextBox.Location = new System.Drawing.Point(754, 420); this.upcTextBox.Location = new System.Drawing.Point(754, 420);
this.upcTextBox.Multiline = true;
this.upcTextBox.Name = "upcTextBox"; this.upcTextBox.Name = "upcTextBox";
this.upcTextBox.ReadOnly = true; this.upcTextBox.ReadOnly = true;
this.upcTextBox.Size = new System.Drawing.Size(150, 20); this.upcTextBox.Size = new System.Drawing.Size(150, 20);
@@ -247,6 +302,7 @@
// label5 // label5
// //
this.label5.AutoSize = true; this.label5.AutoSize = true;
this.label5.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.label5.Location = new System.Drawing.Point(751, 404); this.label5.Location = new System.Drawing.Point(751, 404);
this.label5.Name = "label5"; this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(29, 13); this.label5.Size = new System.Drawing.Size(29, 13);
@@ -263,19 +319,22 @@
this.albumArtPicBox.TabIndex = 39; this.albumArtPicBox.TabIndex = 39;
this.albumArtPicBox.TabStop = false; this.albumArtPicBox.TabStop = false;
// //
// pictureBox1 // logoBox
// //
this.pictureBox1.Image = global::QobuzDownloaderX.Properties.Resources.qbdlx; this.logoBox.Image = global::QobuzDownloaderX.Properties.Resources.qbdlx_white;
this.pictureBox1.Location = new System.Drawing.Point(12, 12); this.logoBox.Location = new System.Drawing.Point(12, 12);
this.pictureBox1.Name = "pictureBox1"; this.logoBox.Name = "logoBox";
this.pictureBox1.Size = new System.Drawing.Size(207, 52); this.logoBox.Size = new System.Drawing.Size(207, 52);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; this.logoBox.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.TabIndex = 36; this.logoBox.TabIndex = 36;
this.pictureBox1.TabStop = false; this.logoBox.TabStop = false;
this.logoBox.Click += new System.EventHandler(this.logoBox_Click);
this.logoBox.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
// //
// label6 // label6
// //
this.label6.AutoSize = true; this.label6.AutoSize = true;
this.label6.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.label6.Location = new System.Drawing.Point(12, 70); this.label6.Location = new System.Drawing.Point(12, 70);
this.label6.Name = "label6"; this.label6.Name = "label6";
this.label6.Size = new System.Drawing.Size(132, 13); this.label6.Size = new System.Drawing.Size(132, 13);
@@ -284,7 +343,11 @@
// //
// totalTracksTextbox // totalTracksTextbox
// //
this.totalTracksTextbox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.totalTracksTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.totalTracksTextbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.totalTracksTextbox.Location = new System.Drawing.Point(754, 378); this.totalTracksTextbox.Location = new System.Drawing.Point(754, 378);
this.totalTracksTextbox.Multiline = true;
this.totalTracksTextbox.Name = "totalTracksTextbox"; this.totalTracksTextbox.Name = "totalTracksTextbox";
this.totalTracksTextbox.ReadOnly = true; this.totalTracksTextbox.ReadOnly = true;
this.totalTracksTextbox.Size = new System.Drawing.Size(150, 20); this.totalTracksTextbox.Size = new System.Drawing.Size(150, 20);
@@ -294,6 +357,7 @@
// totalTracksLabel // totalTracksLabel
// //
this.totalTracksLabel.AutoSize = true; this.totalTracksLabel.AutoSize = true;
this.totalTracksLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.totalTracksLabel.Location = new System.Drawing.Point(751, 362); this.totalTracksLabel.Location = new System.Drawing.Point(751, 362);
this.totalTracksLabel.Name = "totalTracksLabel"; this.totalTracksLabel.Name = "totalTracksLabel";
this.totalTracksLabel.Size = new System.Drawing.Size(67, 13); this.totalTracksLabel.Size = new System.Drawing.Size(67, 13);
@@ -318,7 +382,11 @@
// //
// qualityTextbox // qualityTextbox
// //
this.qualityTextbox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.qualityTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.qualityTextbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.qualityTextbox.Location = new System.Drawing.Point(754, 336); this.qualityTextbox.Location = new System.Drawing.Point(754, 336);
this.qualityTextbox.Multiline = true;
this.qualityTextbox.Name = "qualityTextbox"; this.qualityTextbox.Name = "qualityTextbox";
this.qualityTextbox.ReadOnly = true; this.qualityTextbox.ReadOnly = true;
this.qualityTextbox.Size = new System.Drawing.Size(150, 20); this.qualityTextbox.Size = new System.Drawing.Size(150, 20);
@@ -328,6 +396,7 @@
// qualityLabel // qualityLabel
// //
this.qualityLabel.AutoSize = true; this.qualityLabel.AutoSize = true;
this.qualityLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.qualityLabel.Location = new System.Drawing.Point(751, 320); this.qualityLabel.Location = new System.Drawing.Point(751, 320);
this.qualityLabel.Name = "qualityLabel"; this.qualityLabel.Name = "qualityLabel";
this.qualityLabel.Size = new System.Drawing.Size(71, 13); this.qualityLabel.Size = new System.Drawing.Size(71, 13);
@@ -336,21 +405,26 @@
// //
// openSearch // openSearch
// //
this.openSearch.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(239)))));
this.openSearch.FlatAppearance.BorderSize = 0;
this.openSearch.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.openSearch.ForeColor = System.Drawing.Color.White;
this.openSearch.Location = new System.Drawing.Point(597, 57); this.openSearch.Location = new System.Drawing.Point(597, 57);
this.openSearch.Name = "openSearch"; this.openSearch.Name = "openSearch";
this.openSearch.Size = new System.Drawing.Size(120, 23); this.openSearch.Size = new System.Drawing.Size(120, 23);
this.openSearch.TabIndex = 60; this.openSearch.TabIndex = 60;
this.openSearch.Text = "Open Search"; this.openSearch.Text = "Open Search";
this.openSearch.UseVisualStyleBackColor = true; this.openSearch.UseVisualStyleBackColor = false;
this.openSearch.Click += new System.EventHandler(this.openSearch_Click); this.openSearch.Click += new System.EventHandler(this.openSearch_Click);
// //
// tagsLabel // tagsLabel
// //
this.tagsLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.tagsLabel.Location = new System.Drawing.Point(12, 501); this.tagsLabel.Location = new System.Drawing.Point(12, 501);
this.tagsLabel.Name = "tagsLabel"; this.tagsLabel.Name = "tagsLabel";
this.tagsLabel.Size = new System.Drawing.Size(914, 23); this.tagsLabel.Size = new System.Drawing.Size(914, 23);
this.tagsLabel.TabIndex = 61; this.tagsLabel.TabIndex = 61;
this.tagsLabel.Text = "🠋 Choose which tags to save 🠋"; this.tagsLabel.Text = "🠋 Choose which tags to save (click me) 🠋";
this.tagsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; this.tagsLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.tagsLabel.Click += new System.EventHandler(this.tagsLabel_Click); this.tagsLabel.Click += new System.EventHandler(this.tagsLabel_Click);
// //
@@ -359,6 +433,8 @@
this.albumArtistCheckbox.AutoSize = true; this.albumArtistCheckbox.AutoSize = true;
this.albumArtistCheckbox.Checked = true; this.albumArtistCheckbox.Checked = true;
this.albumArtistCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.albumArtistCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.albumArtistCheckbox.FlatAppearance.BorderSize = 0;
this.albumArtistCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.albumArtistCheckbox.Location = new System.Drawing.Point(325, 563); this.albumArtistCheckbox.Location = new System.Drawing.Point(325, 563);
this.albumArtistCheckbox.Name = "albumArtistCheckbox"; this.albumArtistCheckbox.Name = "albumArtistCheckbox";
this.albumArtistCheckbox.Size = new System.Drawing.Size(81, 17); this.albumArtistCheckbox.Size = new System.Drawing.Size(81, 17);
@@ -372,6 +448,8 @@
this.artistCheckbox.AutoSize = true; this.artistCheckbox.AutoSize = true;
this.artistCheckbox.Checked = true; this.artistCheckbox.Checked = true;
this.artistCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.artistCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.artistCheckbox.FlatAppearance.BorderSize = 0;
this.artistCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.artistCheckbox.Location = new System.Drawing.Point(325, 609); this.artistCheckbox.Location = new System.Drawing.Point(325, 609);
this.artistCheckbox.Name = "artistCheckbox"; this.artistCheckbox.Name = "artistCheckbox";
this.artistCheckbox.Size = new System.Drawing.Size(80, 17); this.artistCheckbox.Size = new System.Drawing.Size(80, 17);
@@ -385,6 +463,8 @@
this.trackTitleCheckbox.AutoSize = true; this.trackTitleCheckbox.AutoSize = true;
this.trackTitleCheckbox.Checked = true; this.trackTitleCheckbox.Checked = true;
this.trackTitleCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.trackTitleCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.trackTitleCheckbox.FlatAppearance.BorderSize = 0;
this.trackTitleCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.trackTitleCheckbox.Location = new System.Drawing.Point(325, 586); this.trackTitleCheckbox.Location = new System.Drawing.Point(325, 586);
this.trackTitleCheckbox.Name = "trackTitleCheckbox"; this.trackTitleCheckbox.Name = "trackTitleCheckbox";
this.trackTitleCheckbox.Size = new System.Drawing.Size(77, 17); this.trackTitleCheckbox.Size = new System.Drawing.Size(77, 17);
@@ -398,6 +478,8 @@
this.trackNumberCheckbox.AutoSize = true; this.trackNumberCheckbox.AutoSize = true;
this.trackNumberCheckbox.Checked = true; this.trackNumberCheckbox.Checked = true;
this.trackNumberCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.trackNumberCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.trackNumberCheckbox.FlatAppearance.BorderSize = 0;
this.trackNumberCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.trackNumberCheckbox.Location = new System.Drawing.Point(325, 632); this.trackNumberCheckbox.Location = new System.Drawing.Point(325, 632);
this.trackNumberCheckbox.Name = "trackNumberCheckbox"; this.trackNumberCheckbox.Name = "trackNumberCheckbox";
this.trackNumberCheckbox.Size = new System.Drawing.Size(94, 17); this.trackNumberCheckbox.Size = new System.Drawing.Size(94, 17);
@@ -411,6 +493,8 @@
this.trackTotalCheckbox.AutoSize = true; this.trackTotalCheckbox.AutoSize = true;
this.trackTotalCheckbox.Checked = true; this.trackTotalCheckbox.Checked = true;
this.trackTotalCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.trackTotalCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.trackTotalCheckbox.FlatAppearance.BorderSize = 0;
this.trackTotalCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.trackTotalCheckbox.Location = new System.Drawing.Point(325, 655); this.trackTotalCheckbox.Location = new System.Drawing.Point(325, 655);
this.trackTotalCheckbox.Name = "trackTotalCheckbox"; this.trackTotalCheckbox.Name = "trackTotalCheckbox";
this.trackTotalCheckbox.Size = new System.Drawing.Size(86, 17); this.trackTotalCheckbox.Size = new System.Drawing.Size(86, 17);
@@ -424,6 +508,8 @@
this.discNumberCheckbox.AutoSize = true; this.discNumberCheckbox.AutoSize = true;
this.discNumberCheckbox.Checked = true; this.discNumberCheckbox.Checked = true;
this.discNumberCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.discNumberCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.discNumberCheckbox.FlatAppearance.BorderSize = 0;
this.discNumberCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.discNumberCheckbox.Location = new System.Drawing.Point(325, 676); this.discNumberCheckbox.Location = new System.Drawing.Point(325, 676);
this.discNumberCheckbox.Name = "discNumberCheckbox"; this.discNumberCheckbox.Name = "discNumberCheckbox";
this.discNumberCheckbox.Size = new System.Drawing.Size(87, 17); this.discNumberCheckbox.Size = new System.Drawing.Size(87, 17);
@@ -437,6 +523,8 @@
this.discTotalCheckbox.AutoSize = true; this.discTotalCheckbox.AutoSize = true;
this.discTotalCheckbox.Checked = true; this.discTotalCheckbox.Checked = true;
this.discTotalCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.discTotalCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.discTotalCheckbox.FlatAppearance.BorderSize = 0;
this.discTotalCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.discTotalCheckbox.Location = new System.Drawing.Point(325, 699); this.discTotalCheckbox.Location = new System.Drawing.Point(325, 699);
this.discTotalCheckbox.Name = "discTotalCheckbox"; this.discTotalCheckbox.Name = "discTotalCheckbox";
this.discTotalCheckbox.Size = new System.Drawing.Size(79, 17); this.discTotalCheckbox.Size = new System.Drawing.Size(79, 17);
@@ -450,6 +538,8 @@
this.albumCheckbox.AutoSize = true; this.albumCheckbox.AutoSize = true;
this.albumCheckbox.Checked = true; this.albumCheckbox.Checked = true;
this.albumCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.albumCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.albumCheckbox.FlatAppearance.BorderSize = 0;
this.albumCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.albumCheckbox.Location = new System.Drawing.Point(325, 540); this.albumCheckbox.Location = new System.Drawing.Point(325, 540);
this.albumCheckbox.Name = "albumCheckbox"; this.albumCheckbox.Name = "albumCheckbox";
this.albumCheckbox.Size = new System.Drawing.Size(78, 17); this.albumCheckbox.Size = new System.Drawing.Size(78, 17);
@@ -463,6 +553,8 @@
this.explicitCheckbox.AutoSize = true; this.explicitCheckbox.AutoSize = true;
this.explicitCheckbox.Checked = true; this.explicitCheckbox.Checked = true;
this.explicitCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.explicitCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.explicitCheckbox.FlatAppearance.BorderSize = 0;
this.explicitCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.explicitCheckbox.Location = new System.Drawing.Point(425, 678); this.explicitCheckbox.Location = new System.Drawing.Point(425, 678);
this.explicitCheckbox.Name = "explicitCheckbox"; this.explicitCheckbox.Name = "explicitCheckbox";
this.explicitCheckbox.Size = new System.Drawing.Size(106, 17); this.explicitCheckbox.Size = new System.Drawing.Size(106, 17);
@@ -476,6 +568,8 @@
this.upcCheckbox.AutoSize = true; this.upcCheckbox.AutoSize = true;
this.upcCheckbox.Checked = true; this.upcCheckbox.Checked = true;
this.upcCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.upcCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.upcCheckbox.FlatAppearance.BorderSize = 0;
this.upcCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.upcCheckbox.Location = new System.Drawing.Point(425, 655); this.upcCheckbox.Location = new System.Drawing.Point(425, 655);
this.upcCheckbox.Name = "upcCheckbox"; this.upcCheckbox.Name = "upcCheckbox";
this.upcCheckbox.Size = new System.Drawing.Size(52, 17); this.upcCheckbox.Size = new System.Drawing.Size(52, 17);
@@ -489,6 +583,8 @@
this.isrcCheckbox.AutoSize = true; this.isrcCheckbox.AutoSize = true;
this.isrcCheckbox.Checked = true; this.isrcCheckbox.Checked = true;
this.isrcCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.isrcCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.isrcCheckbox.FlatAppearance.BorderSize = 0;
this.isrcCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.isrcCheckbox.Location = new System.Drawing.Point(425, 632); this.isrcCheckbox.Location = new System.Drawing.Point(425, 632);
this.isrcCheckbox.Name = "isrcCheckbox"; this.isrcCheckbox.Name = "isrcCheckbox";
this.isrcCheckbox.Size = new System.Drawing.Size(51, 17); this.isrcCheckbox.Size = new System.Drawing.Size(51, 17);
@@ -502,6 +598,8 @@
this.copyrightCheckbox.AutoSize = true; this.copyrightCheckbox.AutoSize = true;
this.copyrightCheckbox.Checked = true; this.copyrightCheckbox.Checked = true;
this.copyrightCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.copyrightCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.copyrightCheckbox.FlatAppearance.BorderSize = 0;
this.copyrightCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.copyrightCheckbox.Location = new System.Drawing.Point(425, 609); this.copyrightCheckbox.Location = new System.Drawing.Point(425, 609);
this.copyrightCheckbox.Name = "copyrightCheckbox"; this.copyrightCheckbox.Name = "copyrightCheckbox";
this.copyrightCheckbox.Size = new System.Drawing.Size(70, 17); this.copyrightCheckbox.Size = new System.Drawing.Size(70, 17);
@@ -515,6 +613,8 @@
this.composerCheckbox.AutoSize = true; this.composerCheckbox.AutoSize = true;
this.composerCheckbox.Checked = true; this.composerCheckbox.Checked = true;
this.composerCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.composerCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.composerCheckbox.FlatAppearance.BorderSize = 0;
this.composerCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.composerCheckbox.Location = new System.Drawing.Point(425, 586); this.composerCheckbox.Location = new System.Drawing.Point(425, 586);
this.composerCheckbox.Name = "composerCheckbox"; this.composerCheckbox.Name = "composerCheckbox";
this.composerCheckbox.Size = new System.Drawing.Size(73, 17); this.composerCheckbox.Size = new System.Drawing.Size(73, 17);
@@ -528,6 +628,8 @@
this.genreCheckbox.AutoSize = true; this.genreCheckbox.AutoSize = true;
this.genreCheckbox.Checked = true; this.genreCheckbox.Checked = true;
this.genreCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.genreCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.genreCheckbox.FlatAppearance.BorderSize = 0;
this.genreCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.genreCheckbox.Location = new System.Drawing.Point(425, 563); this.genreCheckbox.Location = new System.Drawing.Point(425, 563);
this.genreCheckbox.Name = "genreCheckbox"; this.genreCheckbox.Name = "genreCheckbox";
this.genreCheckbox.Size = new System.Drawing.Size(55, 17); this.genreCheckbox.Size = new System.Drawing.Size(55, 17);
@@ -541,6 +643,8 @@
this.releaseCheckbox.AutoSize = true; this.releaseCheckbox.AutoSize = true;
this.releaseCheckbox.Checked = true; this.releaseCheckbox.Checked = true;
this.releaseCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.releaseCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.releaseCheckbox.FlatAppearance.BorderSize = 0;
this.releaseCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.releaseCheckbox.Location = new System.Drawing.Point(425, 540); this.releaseCheckbox.Location = new System.Drawing.Point(425, 540);
this.releaseCheckbox.Name = "releaseCheckbox"; this.releaseCheckbox.Name = "releaseCheckbox";
this.releaseCheckbox.Size = new System.Drawing.Size(91, 17); this.releaseCheckbox.Size = new System.Drawing.Size(91, 17);
@@ -552,6 +656,8 @@
// commentCheckbox // commentCheckbox
// //
this.commentCheckbox.AutoSize = true; this.commentCheckbox.AutoSize = true;
this.commentCheckbox.FlatAppearance.BorderSize = 0;
this.commentCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.commentCheckbox.Location = new System.Drawing.Point(533, 699); this.commentCheckbox.Location = new System.Drawing.Point(533, 699);
this.commentCheckbox.Name = "commentCheckbox"; this.commentCheckbox.Name = "commentCheckbox";
this.commentCheckbox.Size = new System.Drawing.Size(70, 17); this.commentCheckbox.Size = new System.Drawing.Size(70, 17);
@@ -562,9 +668,13 @@
// //
// commentTextbox // commentTextbox
// //
this.commentTextbox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.commentTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.commentTextbox.ForeColor = System.Drawing.Color.White;
this.commentTextbox.Location = new System.Drawing.Point(609, 697); this.commentTextbox.Location = new System.Drawing.Point(609, 697);
this.commentTextbox.Multiline = true;
this.commentTextbox.Name = "commentTextbox"; this.commentTextbox.Name = "commentTextbox";
this.commentTextbox.Size = new System.Drawing.Size(112, 20); this.commentTextbox.Size = new System.Drawing.Size(112, 17);
this.commentTextbox.TabIndex = 79; this.commentTextbox.TabIndex = 79;
this.commentTextbox.TextChanged += new System.EventHandler(this.commentTextbox_TextChanged); this.commentTextbox.TextChanged += new System.EventHandler(this.commentTextbox_TextChanged);
// //
@@ -573,6 +683,8 @@
this.imageCheckbox.AutoSize = true; this.imageCheckbox.AutoSize = true;
this.imageCheckbox.Checked = true; this.imageCheckbox.Checked = true;
this.imageCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.imageCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.imageCheckbox.FlatAppearance.BorderSize = 0;
this.imageCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.imageCheckbox.Location = new System.Drawing.Point(425, 699); this.imageCheckbox.Location = new System.Drawing.Point(425, 699);
this.imageCheckbox.Name = "imageCheckbox"; this.imageCheckbox.Name = "imageCheckbox";
this.imageCheckbox.Size = new System.Drawing.Size(70, 17); this.imageCheckbox.Size = new System.Drawing.Size(70, 17);
@@ -584,6 +696,7 @@
// mp3Checkbox // mp3Checkbox
// //
this.mp3Checkbox.AutoSize = true; this.mp3Checkbox.AutoSize = true;
this.mp3Checkbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.mp3Checkbox.Location = new System.Drawing.Point(243, 61); this.mp3Checkbox.Location = new System.Drawing.Point(243, 61);
this.mp3Checkbox.Name = "mp3Checkbox"; this.mp3Checkbox.Name = "mp3Checkbox";
this.mp3Checkbox.Size = new System.Drawing.Size(69, 17); this.mp3Checkbox.Size = new System.Drawing.Size(69, 17);
@@ -595,6 +708,7 @@
// flacLowCheckbox // flacLowCheckbox
// //
this.flacLowCheckbox.AutoSize = true; this.flacLowCheckbox.AutoSize = true;
this.flacLowCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.flacLowCheckbox.Location = new System.Drawing.Point(318, 61); this.flacLowCheckbox.Location = new System.Drawing.Point(318, 61);
this.flacLowCheckbox.Name = "flacLowCheckbox"; this.flacLowCheckbox.Name = "flacLowCheckbox";
this.flacLowCheckbox.Size = new System.Drawing.Size(93, 17); this.flacLowCheckbox.Size = new System.Drawing.Size(93, 17);
@@ -606,6 +720,7 @@
// flacMidCheckbox // flacMidCheckbox
// //
this.flacMidCheckbox.AutoSize = true; this.flacMidCheckbox.AutoSize = true;
this.flacMidCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.flacMidCheckbox.Location = new System.Drawing.Point(417, 61); this.flacMidCheckbox.Location = new System.Drawing.Point(417, 61);
this.flacMidCheckbox.Name = "flacMidCheckbox"; this.flacMidCheckbox.Name = "flacMidCheckbox";
this.flacMidCheckbox.Size = new System.Drawing.Size(84, 17); this.flacMidCheckbox.Size = new System.Drawing.Size(84, 17);
@@ -619,6 +734,7 @@
this.flacHighCheckbox.AutoSize = true; this.flacHighCheckbox.AutoSize = true;
this.flacHighCheckbox.Checked = true; this.flacHighCheckbox.Checked = true;
this.flacHighCheckbox.CheckState = System.Windows.Forms.CheckState.Checked; this.flacHighCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.flacHighCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.flacHighCheckbox.Location = new System.Drawing.Point(507, 61); this.flacHighCheckbox.Location = new System.Drawing.Point(507, 61);
this.flacHighCheckbox.Name = "flacHighCheckbox"; this.flacHighCheckbox.Name = "flacHighCheckbox";
this.flacHighCheckbox.Size = new System.Drawing.Size(90, 17); this.flacHighCheckbox.Size = new System.Drawing.Size(90, 17);
@@ -630,17 +746,184 @@
// mp3WarnLabel // mp3WarnLabel
// //
this.mp3WarnLabel.AutoSize = true; this.mp3WarnLabel.AutoSize = true;
this.mp3WarnLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.mp3WarnLabel.Location = new System.Drawing.Point(744, 711); this.mp3WarnLabel.Location = new System.Drawing.Point(744, 711);
this.mp3WarnLabel.Name = "mp3WarnLabel"; this.mp3WarnLabel.Name = "mp3WarnLabel";
this.mp3WarnLabel.Size = new System.Drawing.Size(182, 13); this.mp3WarnLabel.Size = new System.Drawing.Size(182, 13);
this.mp3WarnLabel.TabIndex = 85; this.mp3WarnLabel.TabIndex = 85;
this.mp3WarnLabel.Text = "* = Not available on MP3 downloads."; this.mp3WarnLabel.Text = "* = Not available on MP3 downloads.";
// //
// panel1
//
this.panel1.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel1.Location = new System.Drawing.Point(15, 107);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(576, 1);
this.panel1.TabIndex = 86;
//
// exitLabel
//
this.exitLabel.AutoSize = true;
this.exitLabel.BackColor = System.Drawing.Color.Transparent;
this.exitLabel.Font = new System.Drawing.Font("Calibri", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.exitLabel.ForeColor = System.Drawing.Color.White;
this.exitLabel.Location = new System.Drawing.Point(911, 8);
this.exitLabel.Name = "exitLabel";
this.exitLabel.Size = new System.Drawing.Size(20, 23);
this.exitLabel.TabIndex = 87;
this.exitLabel.Text = "X";
this.exitLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
this.exitLabel.Click += new System.EventHandler(this.exitLabel_Click);
this.exitLabel.MouseLeave += new System.EventHandler(this.exitLabel_MouseLeave);
this.exitLabel.MouseHover += new System.EventHandler(this.exitLabel_MouseHover);
//
// minimizeLabel
//
this.minimizeLabel.AutoSize = true;
this.minimizeLabel.BackColor = System.Drawing.Color.Transparent;
this.minimizeLabel.Font = new System.Drawing.Font("Calibri", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.minimizeLabel.ForeColor = System.Drawing.Color.White;
this.minimizeLabel.Location = new System.Drawing.Point(886, 4);
this.minimizeLabel.Name = "minimizeLabel";
this.minimizeLabel.Size = new System.Drawing.Size(19, 23);
this.minimizeLabel.TabIndex = 88;
this.minimizeLabel.Text = "_";
this.minimizeLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
this.minimizeLabel.Click += new System.EventHandler(this.minimizeLabel_Click);
this.minimizeLabel.MouseLeave += new System.EventHandler(this.minimizeLabel_MouseLeave);
this.minimizeLabel.MouseHover += new System.EventHandler(this.minimizeLabel_MouseHover);
//
// panel2
//
this.panel2.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel2.Location = new System.Drawing.Point(754, 271);
this.panel2.Name = "panel2";
this.panel2.Size = new System.Drawing.Size(150, 1);
this.panel2.TabIndex = 87;
//
// panel3
//
this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel3.Location = new System.Drawing.Point(754, 313);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(150, 1);
this.panel3.TabIndex = 88;
//
// panel4
//
this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel4.Location = new System.Drawing.Point(754, 355);
this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(150, 1);
this.panel4.TabIndex = 89;
//
// panel5
//
this.panel5.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel5.Location = new System.Drawing.Point(754, 397);
this.panel5.Name = "panel5";
this.panel5.Size = new System.Drawing.Size(150, 1);
this.panel5.TabIndex = 89;
//
// panel6
//
this.panel6.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel6.Location = new System.Drawing.Point(754, 439);
this.panel6.Name = "panel6";
this.panel6.Size = new System.Drawing.Size(150, 1);
this.panel6.TabIndex = 89;
//
// panel7
//
this.panel7.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel7.Location = new System.Drawing.Point(754, 482);
this.panel7.Name = "panel7";
this.panel7.Size = new System.Drawing.Size(150, 1);
this.panel7.TabIndex = 89;
//
// panel8
//
this.panel8.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel8.Location = new System.Drawing.Point(609, 716);
this.panel8.Name = "panel8";
this.panel8.Size = new System.Drawing.Size(112, 1);
this.panel8.TabIndex = 90;
//
// streamableCheckbox
//
this.streamableCheckbox.AutoSize = true;
this.streamableCheckbox.Checked = true;
this.streamableCheckbox.CheckState = System.Windows.Forms.CheckState.Checked;
this.streamableCheckbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.streamableCheckbox.Location = new System.Drawing.Point(243, 12);
this.streamableCheckbox.Name = "streamableCheckbox";
this.streamableCheckbox.Size = new System.Drawing.Size(113, 17);
this.streamableCheckbox.TabIndex = 91;
this.streamableCheckbox.Text = "Streamable Check";
this.streamableCheckbox.UseVisualStyleBackColor = true;
this.streamableCheckbox.Visible = false;
//
// secretTextbox
//
this.secretTextbox.Location = new System.Drawing.Point(352, 34);
this.secretTextbox.Name = "secretTextbox";
this.secretTextbox.Size = new System.Drawing.Size(209, 20);
this.secretTextbox.TabIndex = 92;
this.secretTextbox.Visible = false;
//
// displaySecretButton
//
this.displaySecretButton.Location = new System.Drawing.Point(243, 32);
this.displaySecretButton.Name = "displaySecretButton";
this.displaySecretButton.Size = new System.Drawing.Size(103, 23);
this.displaySecretButton.TabIndex = 93;
this.displaySecretButton.Text = "Display appSecret";
this.displaySecretButton.UseVisualStyleBackColor = true;
this.displaySecretButton.Visible = false;
this.displaySecretButton.Click += new System.EventHandler(this.displaySecretButton_Click);
//
// profilePictureBox
//
this.profilePictureBox.Location = new System.Drawing.Point(15, 501);
this.profilePictureBox.Name = "profilePictureBox";
this.profilePictureBox.Size = new System.Drawing.Size(20, 20);
this.profilePictureBox.TabIndex = 94;
this.profilePictureBox.TabStop = false;
//
// logoutLabel
//
this.logoutLabel.AutoSize = true;
this.logoutLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.logoutLabel.Location = new System.Drawing.Point(41, 506);
this.logoutLabel.Name = "logoutLabel";
this.logoutLabel.Size = new System.Drawing.Size(161, 13);
this.logoutLabel.TabIndex = 95;
this.logoutLabel.Text = "Logged in as %name%, Log out?";
this.logoutLabel.Click += new System.EventHandler(this.logoutLabel_Click);
this.logoutLabel.MouseLeave += new System.EventHandler(this.logoutLabel_MouseLeave);
this.logoutLabel.MouseHover += new System.EventHandler(this.logoutLabel_MouseHover);
//
// QobuzDownloaderX // QobuzDownloaderX
// //
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.ClientSize = new System.Drawing.Size(938, 533); this.ClientSize = new System.Drawing.Size(938, 533);
this.Controls.Add(this.logoutLabel);
this.Controls.Add(this.profilePictureBox);
this.Controls.Add(this.displaySecretButton);
this.Controls.Add(this.secretTextbox);
this.Controls.Add(this.streamableCheckbox);
this.Controls.Add(this.panel8);
this.Controls.Add(this.panel7);
this.Controls.Add(this.panel6);
this.Controls.Add(this.panel5);
this.Controls.Add(this.panel4);
this.Controls.Add(this.panel3);
this.Controls.Add(this.panel2);
this.Controls.Add(this.minimizeLabel);
this.Controls.Add(this.exitLabel);
this.Controls.Add(this.panel1);
this.Controls.Add(this.mp3WarnLabel); this.Controls.Add(this.mp3WarnLabel);
this.Controls.Add(this.flacHighCheckbox); this.Controls.Add(this.flacHighCheckbox);
this.Controls.Add(this.flacMidCheckbox); this.Controls.Add(this.flacMidCheckbox);
@@ -682,7 +965,7 @@
this.Controls.Add(this.label1); this.Controls.Add(this.label1);
this.Controls.Add(this.albumArtPicBox); this.Controls.Add(this.albumArtPicBox);
this.Controls.Add(this.verNumLabel); this.Controls.Add(this.verNumLabel);
this.Controls.Add(this.pictureBox1); this.Controls.Add(this.logoBox);
this.Controls.Add(this.imageURLTextbox); this.Controls.Add(this.imageURLTextbox);
this.Controls.Add(this.downloadButton); this.Controls.Add(this.downloadButton);
this.Controls.Add(this.albumUrl); this.Controls.Add(this.albumUrl);
@@ -690,7 +973,7 @@
this.Controls.Add(this.output); this.Controls.Add(this.output);
this.Controls.Add(this.selectFolder); this.Controls.Add(this.selectFolder);
this.Controls.Add(this.testURLBox); this.Controls.Add(this.testURLBox);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false; this.MaximizeBox = false;
this.Name = "QobuzDownloaderX"; this.Name = "QobuzDownloaderX";
@@ -698,8 +981,10 @@
this.Text = "QobuzDownloaderX"; this.Text = "QobuzDownloaderX";
this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.QobuzDownloaderX_FormClosed); this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.QobuzDownloaderX_FormClosed);
this.Load += new System.EventHandler(this.Form1_Load); this.Load += new System.EventHandler(this.Form1_Load);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.QobuzDownloaderX_MouseMove);
((System.ComponentModel.ISupportInitialize)(this.albumArtPicBox)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.albumArtPicBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.logoBox)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.profilePictureBox)).EndInit();
this.ResumeLayout(false); this.ResumeLayout(false);
this.PerformLayout(); this.PerformLayout();
@@ -715,7 +1000,7 @@
private System.Windows.Forms.Button downloadButton; private System.Windows.Forms.Button downloadButton;
private System.Windows.Forms.TextBox albumUrl; private System.Windows.Forms.TextBox albumUrl;
private System.Windows.Forms.TextBox imageURLTextbox; private System.Windows.Forms.TextBox imageURLTextbox;
private System.Windows.Forms.PictureBox pictureBox1; private System.Windows.Forms.PictureBox logoBox;
private System.Windows.Forms.Label verNumLabel; private System.Windows.Forms.Label verNumLabel;
private System.Windows.Forms.PictureBox albumArtPicBox; private System.Windows.Forms.PictureBox albumArtPicBox;
private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label1;
@@ -761,6 +1046,21 @@
private System.Windows.Forms.CheckBox flacMidCheckbox; private System.Windows.Forms.CheckBox flacMidCheckbox;
private System.Windows.Forms.CheckBox flacHighCheckbox; private System.Windows.Forms.CheckBox flacHighCheckbox;
private System.Windows.Forms.Label mp3WarnLabel; private System.Windows.Forms.Label mp3WarnLabel;
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.Label exitLabel;
private System.Windows.Forms.Label minimizeLabel;
private System.Windows.Forms.Panel panel2;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.Panel panel5;
private System.Windows.Forms.Panel panel6;
private System.Windows.Forms.Panel panel7;
private System.Windows.Forms.Panel panel8;
private System.Windows.Forms.CheckBox streamableCheckbox;
private System.Windows.Forms.TextBox secretTextbox;
private System.Windows.Forms.Button displaySecretButton;
private System.Windows.Forms.PictureBox profilePictureBox;
private System.Windows.Forms.Label logoutLabel;
} }
} }

View File

@@ -33,10 +33,19 @@ namespace QobuzDownloaderX
InitializeComponent(); InitializeComponent();
} }
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
public string eMail { get; set; } public string eMail { get; set; }
public string appid { get; set; } public string appid { get; set; }
public string password { get; set; } public string password { get; set; }
public string userAuth { get; set; } public string userAuth { get; set; }
public string profilePic { get; set; }
public string displayName { get; set; } public string displayName { get; set; }
public string accountType { get; set; } public string accountType { get; set; }
public string appSecret { get; set; } public string appSecret { get; set; }
@@ -44,6 +53,7 @@ namespace QobuzDownloaderX
public string trackIdString { get; set; } public string trackIdString { get; set; }
public string formatIdString { get; set; } public string formatIdString { get; set; }
public string audioFileType { get; set; } public string audioFileType { get; set; }
public int devClickEggThingValue { get; set; }
searchForm searchF = new searchForm(); searchForm searchF = new searchForm();
@@ -64,6 +74,11 @@ namespace QobuzDownloaderX
// Set a placeholder image for Cover Art box. // Set a placeholder image for Cover Art box.
albumArtPicBox.ImageLocation = "https://static.qobuz.com/images/covers/01/00/2013072600001_150.jpg"; albumArtPicBox.ImageLocation = "https://static.qobuz.com/images/covers/01/00/2013072600001_150.jpg";
profilePictureBox.ImageLocation = profilePic;
// Change account info for logout button
string oldText = logoutLabel.Text;
logoutLabel.Text = oldText.Replace("%name%", displayName);
#region Load Saved Settings #region Load Saved Settings
// Set saved settings to correct places. // Set saved settings to correct places.
@@ -118,11 +133,15 @@ namespace QobuzDownloaderX
private void debuggingEvents(object sender, EventArgs e) private void debuggingEvents(object sender, EventArgs e)
{ {
#region Debug Events, For Testing #region Debug Events, For Testing
devClickEggThingValue = 0;
// Show app_secret value. // Show app_secret value.
//output.Invoke(new Action(() => output.AppendText("\r\n\r\napp_secret = " + appSecret))); //output.Invoke(new Action(() => output.AppendText("\r\n\r\napp_secret = " + appSecret)));
// Show format_id value. // Show format_id value.
//output.Invoke(new Action(() => output.AppendText("\r\n\r\nformat_id = " + formatIdString))); //output.Invoke(new Action(() => output.AppendText("\r\n\r\nformat_id = " + formatIdString)));
#endregion #endregion
} }
@@ -197,27 +216,13 @@ namespace QobuzDownloaderX
} }
} }
private void selectFolder_Click(object sender, EventArgs e)
{
Thread t = new Thread((ThreadStart)(() => {
// Open Folder Browser to select path & Save the selection
folderBrowserDialog.ShowDialog();
Settings.Default.savedFolder = folderBrowserDialog.SelectedPath;
Settings.Default.Save();
}));
// Run your code from a thread that joins the STA Thread
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
private void createURL(object sender, EventArgs e) private void createURL(object sender, EventArgs e)
{ {
// Create unix timestamp for "request_ts=" and hashing to make request signature. // Create unix timestamp for "request_ts=" and hashing to make request signature.
Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; Int32 unixTimestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
string time = unixTimestamp.ToString(); string time = unixTimestamp.ToString();
// Generate the string that will be hashed using MD5 (utf-8). Example string - "trackgetFileUrlformat_id27intentstreamtrack_id6891469115724574501b4d2f1aca8d4c8ef4z07984c5aa6712" (example shows a fake app_secret) // Generate the string that will be hashed using MD5 (utf-8). Example string - "trackgetFileUrlformat_id27intentstreamtrack_id6891469115724574501b4d2f1aca8d4c8ef4z07984c5aa6712" (example shows a fake app_secret)
string md5HashMe = "trackgetFileUrlformat_id" + formatIdString + "intentstreamtrack_id" + trackIdString + time + appSecret; string md5HashMe = "trackgetFileUrlformat_id" + formatIdString + "intentstreamtrack_id" + trackIdString + time + appSecret;
@@ -277,6 +282,22 @@ namespace QobuzDownloaderX
} }
} }
#region Choosing / Opening folder
private void selectFolder_Click(object sender, EventArgs e)
{
Thread t = new Thread((ThreadStart)(() => {
// Open Folder Browser to select path & Save the selection
folderBrowserDialog.ShowDialog();
Settings.Default.savedFolder = folderBrowserDialog.SelectedPath;
Settings.Default.Save();
}));
// Run your code from a thread that joins the STA Thread
t.SetApartmentState(ApartmentState.STA);
t.Start();
t.Join();
}
private void openFolderButton_Click(object sender, EventArgs e) private void openFolderButton_Click(object sender, EventArgs e)
{ {
// Open selcted folder // Open selcted folder
@@ -296,6 +317,7 @@ namespace QobuzDownloaderX
Process.Start(@folderBrowserDialog.SelectedPath); Process.Start(@folderBrowserDialog.SelectedPath);
} }
} }
#endregion
#region Getting Type of URL #region Getting Type of URL
private void getLinkTypeBG_DoWork(object sender, DoWorkEventArgs e) private void getLinkTypeBG_DoWork(object sender, DoWorkEventArgs e)
@@ -496,7 +518,7 @@ namespace QobuzDownloaderX
foreach (Match mtrack in Regex.Matches(trackinput, trackIdspattern, trackoptions)) foreach (Match mtrack in Regex.Matches(trackinput, trackIdspattern, trackoptions))
{ {
// Set default value for max length. // Set default value for max length.
const int MaxLength = 200; const int MaxLength = 36;
//output.Invoke(new Action(() => output.AppendText(string.Format("{0}\r\n", m.Groups["trackId"].Value)))); //output.Invoke(new Action(() => output.AppendText(string.Format("{0}\r\n", m.Groups["trackId"].Value))));
trackIdString = string.Format("{0}", mtrack.Groups["trackId"].Value); trackIdString = string.Format("{0}", mtrack.Groups["trackId"].Value);
@@ -546,7 +568,7 @@ namespace QobuzDownloaderX
albumArtist = decodedAlbumArtist; albumArtist = decodedAlbumArtist;
albumArtist = albumArtist.Replace(@"\\", @"\").Replace(@"\/", @"/"); albumArtist = albumArtist.Replace(@"\\", @"\").Replace(@"\/", @"/");
var albumArtistPath = albumArtist.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var albumArtistPath = albumArtist.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Display album artist in text box under cover art. // Display album artist in text box under cover art.
albumArtistTextBox.Invoke(new Action(() => albumArtistTextBox.Text = albumArtist)); albumArtistTextBox.Invoke(new Action(() => albumArtistTextBox.Text = albumArtist));
@@ -567,7 +589,7 @@ namespace QobuzDownloaderX
performerName = decodedPerformerName; performerName = decodedPerformerName;
performerName = performerName.Replace(@"\\", @"\").Replace(@"\/", @"/"); performerName = performerName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var performerNamePath = performerName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var performerNamePath = performerName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// If name goes over 200 characters, limit it to 200 // If name goes over 200 characters, limit it to 200
if (performerNamePath.Length > MaxLength) if (performerNamePath.Length > MaxLength)
@@ -600,7 +622,7 @@ namespace QobuzDownloaderX
albumName = decodedAlbumName; albumName = decodedAlbumName;
albumName = albumName.Replace(@"\\", @"\").Replace(@"\/", @"/"); albumName = albumName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var albumNamePath = albumName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var albumNamePath = albumName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Display album name in text box under cover art. // Display album name in text box under cover art.
albumTextBox.Invoke(new Action(() => albumTextBox.Text = albumName)); albumTextBox.Invoke(new Action(() => albumTextBox.Text = albumName));
@@ -622,7 +644,7 @@ namespace QobuzDownloaderX
trackName = decodedTrackName; trackName = decodedTrackName;
trackName = trackName.Replace(@"\\", @"\").Replace(@"\/", @"/"); trackName = trackName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var trackNamePath = trackName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var trackNamePath = trackName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// If name goes over 200 characters, limit it to 200 // If name goes over 200 characters, limit it to 200
if (trackNamePath.Length > MaxLength) if (trackNamePath.Length > MaxLength)
@@ -640,7 +662,7 @@ namespace QobuzDownloaderX
versionName = decodedVersionName; versionName = decodedVersionName;
versionName = versionName.Replace(@"\\", @"\").Replace(@"\/", @"/"); versionName = versionName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var versionNamePath = versionName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var versionNamePath = versionName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Genre tag // Genre tag
var genreLog = Regex.Match(trackRequest, "\"genre\":{\"id\":(?<notUsed>.*?),\"color\":\"(?<notUsed2>.*?)\",\"name\":\"(?<genreName>.*?)\",\\\"").Groups; var genreLog = Regex.Match(trackRequest, "\"genre\":{\"id\":(?<notUsed>.*?),\"color\":\"(?<notUsed2>.*?)\",\"name\":\"(?<genreName>.*?)\",\\\"").Groups;
@@ -693,7 +715,7 @@ namespace QobuzDownloaderX
#endregion #endregion
#region Filename Number Padding #region Filename Number Padding
// Set default padding length // Set default track number padding length
var paddingLength = 2; var paddingLength = 2;
// Prepare track number padding in filename. // Prepare track number padding in filename.
@@ -706,14 +728,40 @@ namespace QobuzDownloaderX
{ {
paddingLength = trackTotal.Length; paddingLength = trackTotal.Length;
} }
// Set default disc number padding length
var paddingDiscLength = 2;
// Prepare disc number padding in filename.
string paddingDiscLog = discTotal.Length.ToString();
if (paddingDiscLog == "1")
{
paddingDiscLength = 1;
}
else
{
paddingDiscLength = discTotal.Length;
}
#endregion #endregion
#region Create Directories #region Create Directories
// Create strings for disc folders
string discFolder = null;
string discFolderCreate = null;
// If more than 1 disc, create folders for discs. Otherwise, strings will remain null.
if (discTotal != "1")
{
discFolder = "CD " + discNumber.PadLeft(paddingDiscLength, '0') + "\\";
discFolderCreate = "\\CD " + discNumber.PadLeft(paddingDiscLength, '0') + "\\";
}
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]"); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]");
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + discFolderCreate);
string discogPath = loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath; string discogPath = loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + discFolderCreate;
#endregion #endregion
#region Availability Check (Streamable?) #region Availability Check (Streamable?)
@@ -722,18 +770,25 @@ namespace QobuzDownloaderX
var streamCheck = streamCheckLog[2].Value; var streamCheck = streamCheckLog[2].Value;
if (streamCheck != "true") if (streamCheck != "true")
{
if (streamableCheckbox.Checked == true)
{ {
output.Invoke(new Action(() => output.AppendText("Track " + trackNumber + " \"" + trackName + "\" is not available for streaming. Skipping track...\r\n"))); output.Invoke(new Action(() => output.AppendText("Track " + trackNumber + " \"" + trackName + "\" is not available for streaming. Skipping track...\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
continue; continue;
} }
else
{
output.Invoke(new Action(() => output.AppendText("\r\nTrack " + trackNumber + " \"" + trackName + "\" is not available for streaming. But stremable check is being ignored for debugging, or messed up releases. Attempting to download...\r\n")));
}
}
#endregion #endregion
#region Check if File Exists #region Check if File Exists
// Check if there is a version name. // Check if there is a version name.
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
if (System.IO.File.Exists(discogPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType)) if (System.IO.File.Exists(discogPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType))
{ {
output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + "\" already exists. Skipping.\r\n"))); output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + "\" already exists. Skipping.\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
@@ -742,7 +797,7 @@ namespace QobuzDownloaderX
} }
else else
{ {
if (System.IO.File.Exists(discogPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType)) if (System.IO.File.Exists(discogPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType))
{ {
output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + " (" + versionName + ")" + "\" already exists. Skipping.\r\n"))); output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + " (" + versionName + ")" + "\" already exists. Skipping.\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
@@ -781,10 +836,10 @@ namespace QobuzDownloaderX
using (var stream = await client.GetStreamAsync(testURLBox.Text)) using (var stream = await client.GetStreamAsync(testURLBox.Text))
// Save single track in selected path. // Save single track in selected path.
if (versionName == null | versionName == "") if (versionNamePath == null | versionNamePath == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType)) using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType))
{ {
await stream.CopyToAsync(output); await stream.CopyToAsync(output);
} }
@@ -792,7 +847,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType)) using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType))
{ {
await stream.CopyToAsync(output); await stream.CopyToAsync(output);
} }
@@ -828,7 +883,7 @@ namespace QobuzDownloaderX
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2); TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2);
@@ -951,7 +1006,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2); TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2);
@@ -1081,7 +1136,7 @@ namespace QobuzDownloaderX
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph); var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph);
@@ -1202,7 +1257,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + " [" + albumIdDiscog + "]" + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph); var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph);
@@ -1353,7 +1408,7 @@ namespace QobuzDownloaderX
{ {
// If there is an issue trying to, or during the download, show error info. // If there is an issue trying to, or during the download, show error info.
string error = downloadError.ToString(); string error = downloadError.ToString();
output.Invoke(new Action(() => output.Text = String.Empty)); output.Invoke(new Action(() => output.AppendText("\r\n\r\n")));
output.Invoke(new Action(() => output.AppendText("Track Download ERROR. Information below.\r\n\r\n"))); output.Invoke(new Action(() => output.AppendText("Track Download ERROR. Information below.\r\n\r\n")));
output.Invoke(new Action(() => output.AppendText(error))); output.Invoke(new Action(() => output.AppendText(error)));
output.Invoke(new Action(() => output.AppendText("\r\n\r\nIf some tracks aren't available for streaming on the album you're trying to download, try to manually download the available tracks individually."))); output.Invoke(new Action(() => output.AppendText("\r\n\r\nIf some tracks aren't available for streaming on the album you're trying to download, try to manually download the available tracks individually.")));
@@ -1500,7 +1555,7 @@ namespace QobuzDownloaderX
foreach (Match m in Regex.Matches(input, trackIdspattern, options)) foreach (Match m in Regex.Matches(input, trackIdspattern, options))
{ {
// Set default value for max length. // Set default value for max length.
const int MaxLength = 200; const int MaxLength = 36;
// Grab matches for Track IDs // Grab matches for Track IDs
trackIdString = string.Format("{0}", m.Groups["trackId"].Value); trackIdString = string.Format("{0}", m.Groups["trackId"].Value);
@@ -1553,8 +1608,9 @@ namespace QobuzDownloaderX
string decodedAlbumArtist = DecodeEncodedNonAsciiCharacters(unicodeAlbumArtist); string decodedAlbumArtist = DecodeEncodedNonAsciiCharacters(unicodeAlbumArtist);
albumArtist = decodedAlbumArtist; albumArtist = decodedAlbumArtist;
// Replace double slashes & path unfriendly characters
albumArtist = albumArtist.Replace(@"\\", @"\").Replace(@"\/", @"/"); albumArtist = albumArtist.Replace(@"\\", @"\").Replace(@"\/", @"/");
var albumArtistPath = albumArtist.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var albumArtistPath = albumArtist.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Display album artist in text box under cover art. // Display album artist in text box under cover art.
albumArtistTextBox.Invoke(new Action(() => albumArtistTextBox.Text = albumArtist)); albumArtistTextBox.Invoke(new Action(() => albumArtistTextBox.Text = albumArtist));
@@ -1574,8 +1630,9 @@ namespace QobuzDownloaderX
string decodedPerformerName = DecodeEncodedNonAsciiCharacters(unicodePerformerName); string decodedPerformerName = DecodeEncodedNonAsciiCharacters(unicodePerformerName);
performerName = decodedPerformerName; performerName = decodedPerformerName;
// Replace double slashes & path unfriendly characters
performerName = performerName.Replace(@"\\", @"\").Replace(@"\/", @"/"); performerName = performerName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var performerNamePath = performerName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var performerNamePath = performerName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// If name goes over 200 characters, limit it to 200 // If name goes over 200 characters, limit it to 200
if (performerNamePath.Length > MaxLength) if (performerNamePath.Length > MaxLength)
@@ -1596,6 +1653,7 @@ namespace QobuzDownloaderX
string decodedComposerName = DecodeEncodedNonAsciiCharacters(unicodeComposerName); string decodedComposerName = DecodeEncodedNonAsciiCharacters(unicodeComposerName);
composerName = decodedComposerName; composerName = decodedComposerName;
// Replace double slashes
composerName = composerName.Replace(@"\\", @"\").Replace(@"\/", @"/"); composerName = composerName.Replace(@"\\", @"\").Replace(@"\/", @"/");
// Album Name tag // Album Name tag
@@ -1607,8 +1665,9 @@ namespace QobuzDownloaderX
string decodedAlbumName = DecodeEncodedNonAsciiCharacters(unicodeAlbumName); string decodedAlbumName = DecodeEncodedNonAsciiCharacters(unicodeAlbumName);
albumName = decodedAlbumName; albumName = decodedAlbumName;
// Replace double slashes & path unfriendly characters
albumName = albumName.Replace(@"\\", @"\").Replace(@"\/", @"/"); albumName = albumName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var albumNamePath = albumName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var albumNamePath = albumName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Display album name in text box under cover art. // Display album name in text box under cover art.
albumTextBox.Invoke(new Action(() => albumTextBox.Text = albumName)); albumTextBox.Invoke(new Action(() => albumTextBox.Text = albumName));
@@ -1629,8 +1688,9 @@ namespace QobuzDownloaderX
string decodedTrackName = DecodeEncodedNonAsciiCharacters(unicodeTrackName); string decodedTrackName = DecodeEncodedNonAsciiCharacters(unicodeTrackName);
trackName = decodedTrackName; trackName = decodedTrackName;
// Replace double slashes & path unfriendly characters
trackName = trackName.Replace(@"\\", @"\").Replace(@"\/", @"/"); trackName = trackName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var trackNamePath = trackName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var trackNamePath = trackName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// If name goes over 200 characters, limit it to 200 // If name goes over 200 characters, limit it to 200
if (trackNamePath.Length > MaxLength) if (trackNamePath.Length > MaxLength)
@@ -1647,8 +1707,15 @@ namespace QobuzDownloaderX
string decodedVersionName = DecodeEncodedNonAsciiCharacters(unicodeVersionName); string decodedVersionName = DecodeEncodedNonAsciiCharacters(unicodeVersionName);
versionName = decodedVersionName; versionName = decodedVersionName;
// Replace double slashes & path unfriendly characters
versionName = versionName.Replace(@"\\", @"\").Replace(@"\/", @"/"); versionName = versionName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var versionNamePath = versionName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var versionNamePath = versionName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
//// If name goes over 200 characters, limit it to 200
//if (trackNamePath.Length + versionNamePath.Length > MaxLength)
//{
// versionNamePath = null;
//}
// Genre tag // Genre tag
var genreLog = Regex.Match(trackRequest, "\"genre\":{\"id\":(?<notUsed>.*?),\"color\":\"(?<notUsed2>.*?)\",\"name\":\"(?<genreName>.*?)\",\\\"").Groups; var genreLog = Regex.Match(trackRequest, "\"genre\":{\"id\":(?<notUsed>.*?),\"color\":\"(?<notUsed2>.*?)\",\"name\":\"(?<genreName>.*?)\",\\\"").Groups;
@@ -1701,7 +1768,7 @@ namespace QobuzDownloaderX
#endregion #endregion
#region Filename Number Padding #region Filename Number Padding
// Set default padding length // Set default track number padding length
var paddingLength = 2; var paddingLength = 2;
// Prepare track number padding in filename. // Prepare track number padding in filename.
@@ -1714,14 +1781,42 @@ namespace QobuzDownloaderX
{ {
paddingLength = trackTotal.Length; paddingLength = trackTotal.Length;
} }
// Set default disc number padding length
var paddingDiscLength = 2;
// Prepare disc number padding in filename.
string paddingDiscLog = discTotal.Length.ToString();
if (paddingDiscLog == "1")
{
paddingDiscLength = 1;
}
else
{
paddingDiscLength = discTotal.Length;
}
#endregion #endregion
#region Create Directories #region Create Directories
// Create strings for disc folders
string discFolder = null;
string discFolderCreate = null;
// If more than 1 disc, create folders for discs. Otherwise, strings will remain null.
if (discTotal != "1")
{
discFolder = "CD " + discNumber.PadLeft(paddingDiscLength, '0') + "\\";
discFolderCreate = "\\CD " + discNumber.PadLeft(paddingDiscLength, '0') + "\\";
}
// Create directories
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + discFolderCreate);
string albumPath = loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath; // Set albumPath to the created directories.
string albumPath = loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + discFolderCreate;
#endregion #endregion
#region Availability Check (Streamable?) #region Availability Check (Streamable?)
@@ -1730,18 +1825,25 @@ namespace QobuzDownloaderX
var streamCheck = streamCheckLog[2].Value; var streamCheck = streamCheckLog[2].Value;
if (streamCheck != "true") if (streamCheck != "true")
{
if (streamableCheckbox.Checked == true)
{ {
output.Invoke(new Action(() => output.AppendText("Track " + trackNumber + " \"" + trackName + "\" is not available for streaming. Skipping track...\r\n"))); output.Invoke(new Action(() => output.AppendText("Track " + trackNumber + " \"" + trackName + "\" is not available for streaming. Skipping track...\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
continue; continue;
} }
else
{
output.Invoke(new Action(() => output.AppendText("\r\nTrack " + trackNumber + " \"" + trackName + "\" is not available for streaming. But stremable check is being ignored for debugging, or messed up releases. Attempting to download...\r\n")));
}
}
#endregion #endregion
#region Check if File Exists #region Check if File Exists
// Check if there is a version name. // Check if there is a version name.
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
if (System.IO.File.Exists(albumPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType)) if (System.IO.File.Exists(albumPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType))
{ {
output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + "\" already exists. Skipping.\r\n"))); output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + "\" already exists. Skipping.\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
@@ -1750,7 +1852,7 @@ namespace QobuzDownloaderX
} }
else else
{ {
if (System.IO.File.Exists(albumPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType)) if (System.IO.File.Exists(albumPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType))
{ {
output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + " (" + versionName + ")" + "\" already exists. Skipping.\r\n"))); output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + " (" + versionName + ")" + "\" already exists. Skipping.\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
@@ -1790,10 +1892,10 @@ namespace QobuzDownloaderX
using (var stream = await client.GetStreamAsync(testURLBox.Text)) using (var stream = await client.GetStreamAsync(testURLBox.Text))
// Save single track in selected path. // Save single track in selected path.
if (versionName == null | versionName == "") if (versionNamePath == null | versionNamePath == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType)) using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType))
{ {
await stream.CopyToAsync(output); await stream.CopyToAsync(output);
} }
@@ -1801,7 +1903,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType)) using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType))
{ {
await stream.CopyToAsync(output); await stream.CopyToAsync(output);
} }
@@ -1834,7 +1936,7 @@ namespace QobuzDownloaderX
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2); TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2);
@@ -1957,7 +2059,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2); TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2);
@@ -2087,7 +2189,7 @@ namespace QobuzDownloaderX
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph); var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph);
@@ -2208,7 +2310,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph); var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph);
@@ -2366,7 +2468,7 @@ namespace QobuzDownloaderX
{ {
// If there is an issue trying to, or during the download, show error info. // If there is an issue trying to, or during the download, show error info.
string error = downloadError.ToString(); string error = downloadError.ToString();
output.Invoke(new Action(() => output.Text = String.Empty)); output.Invoke(new Action(() => output.AppendText("\r\n\r\n")));
output.Invoke(new Action(() => output.AppendText("Track Download ERROR. Information below.\r\n\r\n"))); output.Invoke(new Action(() => output.AppendText("Track Download ERROR. Information below.\r\n\r\n")));
output.Invoke(new Action(() => output.AppendText(error))); output.Invoke(new Action(() => output.AppendText(error)));
downloadButton.Invoke(new Action(() => downloadButton.Enabled = true)); downloadButton.Invoke(new Action(() => downloadButton.Enabled = true));
@@ -2400,7 +2502,7 @@ namespace QobuzDownloaderX
{ {
#region If URL has "track" #region If URL has "track"
// Set default value for max length. // Set default value for max length.
const int MaxLength = 200; const int MaxLength = 36;
// Set "loc" as the selected path. // Set "loc" as the selected path.
String loc = folderBrowserDialog.SelectedPath; String loc = folderBrowserDialog.SelectedPath;
@@ -2509,7 +2611,7 @@ namespace QobuzDownloaderX
albumArtist = decodedAlbumArtist; albumArtist = decodedAlbumArtist;
albumArtist = albumArtist.Replace(@"\\", @"\").Replace(@"\/", @"/"); albumArtist = albumArtist.Replace(@"\\", @"\").Replace(@"\/", @"/");
var albumArtistPath = albumArtist.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var albumArtistPath = albumArtist.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Display album artist in text box under cover art. // Display album artist in text box under cover art.
albumArtistTextBox.Invoke(new Action(() => albumArtistTextBox.Text = albumArtist)); albumArtistTextBox.Invoke(new Action(() => albumArtistTextBox.Text = albumArtist));
@@ -2530,7 +2632,7 @@ namespace QobuzDownloaderX
performerName = decodedPerformerName; performerName = decodedPerformerName;
performerName = performerName.Replace(@"\\", @"\").Replace(@"\/", @"/"); performerName = performerName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var performerNamePath = performerName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var performerNamePath = performerName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// If name goes over 200 characters, limit it to 200 // If name goes over 200 characters, limit it to 200
if (performerNamePath.Length > MaxLength) if (performerNamePath.Length > MaxLength)
@@ -2563,7 +2665,7 @@ namespace QobuzDownloaderX
albumName = decodedAlbumName; albumName = decodedAlbumName;
albumName = albumName.Replace(@"\\", @"\").Replace(@"\/", @"/"); albumName = albumName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var albumNamePath = albumName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var albumNamePath = albumName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Display album name in text box under cover art. // Display album name in text box under cover art.
albumTextBox.Invoke(new Action(() => albumTextBox.Text = albumName)); albumTextBox.Invoke(new Action(() => albumTextBox.Text = albumName));
@@ -2585,12 +2687,12 @@ namespace QobuzDownloaderX
trackName = decodedTrackName; trackName = decodedTrackName;
trackName = trackName.Replace(@"\\", @"\").Replace(@"\/", @"/"); trackName = trackName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var trackNamePath = trackName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var trackNamePath = trackName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// If name goes over 200 characters, limit it to 200 // If name goes over 200 characters, limit it to 200
if (trackNamePath.Length > MaxLength) if (trackNamePath.Length > MaxLength)
{ {
trackNamePath = trackNamePath.Substring(0, MaxLength); trackNamePath = trackNamePath.Substring(0, MaxLength).ToString();
} }
// Version Name tag // Version Name tag
@@ -2603,7 +2705,7 @@ namespace QobuzDownloaderX
versionName = decodedVersionName; versionName = decodedVersionName;
versionName = versionName.Replace(@"\\", @"\").Replace(@"\/", @"/"); versionName = versionName.Replace(@"\\", @"\").Replace(@"\/", @"/");
var versionNamePath = versionName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", ";").Replace("<", "[").Replace(">", "]").Replace("|", "-").Replace("?", "_").Replace("*", "-"); var versionNamePath = versionName.Replace(@"\", "-").Replace(@"/", "-").Replace("\"", "''").Replace(":", "-").Replace("<", "-").Replace(">", "-").Replace("|", "-").Replace("?", "-").Replace("*", "-");
// Genre tag // Genre tag
var genreLog = Regex.Match(trackRequest, "\"genre\":{\"id\":(?<notUsed>.*?),\"color\":\"(?<notUsed2>.*?)\",\"name\":\"(?<genreName>.*?)\",\\\"").Groups; var genreLog = Regex.Match(trackRequest, "\"genre\":{\"id\":(?<notUsed>.*?),\"color\":\"(?<notUsed2>.*?)\",\"name\":\"(?<genreName>.*?)\",\\\"").Groups;
@@ -2653,7 +2755,7 @@ namespace QobuzDownloaderX
#endregion #endregion
#region Filename Number Padding #region Filename Number Padding
// Set default padding length // Set default track number padding length
var paddingLength = 2; var paddingLength = 2;
// Prepare track number padding in filename. // Prepare track number padding in filename.
@@ -2666,14 +2768,42 @@ namespace QobuzDownloaderX
{ {
paddingLength = trackTotal.Length; paddingLength = trackTotal.Length;
} }
// Set default disc number padding length
var paddingDiscLength = 2;
// Prepare disc number padding in filename.
string paddingDiscLog = discTotal.Length.ToString();
if (paddingDiscLog == "1")
{
paddingDiscLength = 1;
}
else
{
paddingDiscLength = discTotal.Length;
}
#endregion #endregion
#region Create Directories #region Create Directories
// Create strings for disc folders
string discFolder = null;
string discFolderCreate = null;
// If more than 1 disc, create folders for discs. Otherwise, strings will remain null.
if (discTotal != "1")
{
discFolder = "CD " + discNumber.PadLeft(paddingDiscLength, '0') + "\\";
discFolderCreate = "\\CD " + discNumber.PadLeft(paddingDiscLength, '0') + "\\";
}
// Create directories
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath); System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath);
System.IO.Directory.CreateDirectory(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + discFolderCreate);
string trackPath = loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath; // Set albumPath to the created directories.
string trackPath = loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + discFolderCreate;
#endregion #endregion
#region Availability Check (Streamable?) #region Availability Check (Streamable?)
@@ -2682,18 +2812,26 @@ namespace QobuzDownloaderX
var streamCheck = streamCheckLog[2].Value; var streamCheck = streamCheckLog[2].Value;
if (streamCheck != "true") if (streamCheck != "true")
{
if (streamableCheckbox.Checked == true)
{ {
output.Invoke(new Action(() => output.AppendText("Track is not available for streaming. Unable to download.\r\n"))); output.Invoke(new Action(() => output.AppendText("Track is not available for streaming. Unable to download.\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
downloadButton.Invoke(new Action(() => downloadButton.Enabled = true));
return; return;
} }
else
{
output.Invoke(new Action(() => output.AppendText("Track is not available for streaming. But stremable check is being ignored for debugging, or messed up releases. Attempting to download...\r\n")));
}
}
#endregion #endregion
#region Check if File Exists #region Check if File Exists
// Check if there is a version name. // Check if there is a version name.
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
if (System.IO.File.Exists(trackPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType)) if (System.IO.File.Exists(trackPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType))
{ {
output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + "\" already exists. Skipping.\r\n"))); output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + "\" already exists. Skipping.\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
@@ -2703,7 +2841,7 @@ namespace QobuzDownloaderX
} }
else else
{ {
if (System.IO.File.Exists(trackPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType)) if (System.IO.File.Exists(trackPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType))
{ {
output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + " (" + versionName + ")" + "\" already exists. Skipping.\r\n"))); output.Invoke(new Action(() => output.AppendText("File for \"" + trackNumber.PadLeft(paddingLength, '0') + " " + trackName + " (" + versionName + ")" + "\" already exists. Skipping.\r\n")));
System.Threading.Thread.Sleep(800); System.Threading.Thread.Sleep(800);
@@ -2744,10 +2882,10 @@ namespace QobuzDownloaderX
using (var stream = await client.GetStreamAsync(testURLBox.Text)) using (var stream = await client.GetStreamAsync(testURLBox.Text))
// Save single track in selected path. // Save single track in selected path.
if (versionName == null | versionName == "") if (versionNamePath == null | versionNamePath == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType)) using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType))
{ {
await stream.CopyToAsync(output); await stream.CopyToAsync(output);
} }
@@ -2755,7 +2893,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType)) using (var output = System.IO.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType))
{ {
await stream.CopyToAsync(output); await stream.CopyToAsync(output);
} }
@@ -2788,7 +2926,7 @@ namespace QobuzDownloaderX
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2); TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2);
@@ -2911,7 +3049,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2); TagLib.Id3v2.Tag t = (TagLib.Id3v2.Tag)tfile.GetTag(TagLib.TagTypes.Id3v2);
@@ -3041,7 +3179,7 @@ namespace QobuzDownloaderX
if (versionName == null | versionName == "") if (versionName == null | versionName == "")
{ {
// If there is NOT a version name. // If there is NOT a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph); var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph);
@@ -3162,7 +3300,7 @@ namespace QobuzDownloaderX
else else
{ {
// If there is a version name. // If there is a version name.
var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath + " (" + versionNamePath + ")" + audioFileType); var tfile = TagLib.File.Create(loc + "\\" + albumArtistPath + "\\" + albumNamePath + "\\" + qualityPath + "\\" + discFolder + trackNumber.PadLeft(paddingLength, '0') + " " + trackNamePath.Trim() + " (" + versionNamePath + ")" + audioFileType);
// For custom / troublesome tags. // For custom / troublesome tags.
var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph); var custom = (TagLib.Ogg.XiphComment)tfile.GetTag(TagLib.TagTypes.Xiph);
@@ -3288,6 +3426,7 @@ namespace QobuzDownloaderX
{ {
// If there is an issue trying to, or during the download, show error info. // If there is an issue trying to, or during the download, show error info.
string error = downloadError.ToString(); string error = downloadError.ToString();
output.Invoke(new Action(() => output.AppendText("\r\n\r\n")));
output.Invoke(new Action(() => output.AppendText("Track Download ERROR. Information below.\r\n\r\n"))); output.Invoke(new Action(() => output.AppendText("Track Download ERROR. Information below.\r\n\r\n")));
output.Invoke(new Action(() => output.AppendText(error))); output.Invoke(new Action(() => output.AppendText(error)));
downloadButton.Invoke(new Action(() => downloadButton.Enabled = true)); downloadButton.Invoke(new Action(() => downloadButton.Enabled = true));
@@ -3305,17 +3444,17 @@ namespace QobuzDownloaderX
#region Tagging Options #region Tagging Options
private void tagsLabel_Click(object sender, EventArgs e) private void tagsLabel_Click(object sender, EventArgs e)
{ {
if (this.Height == 572) if (this.Height == 533)
{ {
//New Height //New Height
this.Height = 772; this.Height = 733;
tagsLabel.Text = "🠉 Choose which tags to save 🠉"; tagsLabel.Text = "🠉 Choose which tags to save (click me) 🠉";
} }
else if (this.Height == 772) else if (this.Height == 733)
{ {
//New Height //New Height
this.Height = 572; this.Height = 533;
tagsLabel.Text = "🠋 Choose which tags to save 🠋"; tagsLabel.Text = "🠋 Choose which tags to save (click me) 🠋";
} }
} }
@@ -3531,9 +3670,99 @@ namespace QobuzDownloaderX
} }
#endregion #endregion
#region Form moving, closing, minimizing, etc.
private void exitLabel_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void minimizeLabel_Click(object sender, EventArgs e)
{
this.WindowState = FormWindowState.Minimized;
}
private void minimizeLabel_MouseHover(object sender, EventArgs e)
{
minimizeLabel.ForeColor = Color.FromArgb(0, 112, 239);
}
private void minimizeLabel_MouseLeave(object sender, EventArgs e)
{
minimizeLabel.ForeColor = Color.White;
}
private void exitLabel_MouseHover(object sender, EventArgs e)
{
exitLabel.ForeColor = Color.FromArgb(0, 112, 239);
}
private void exitLabel_MouseLeave(object sender, EventArgs e)
{
exitLabel.ForeColor = Color.White;
}
private void QobuzDownloaderX_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
private void QobuzDownloaderX_FormClosed(object sender, FormClosedEventArgs e) private void QobuzDownloaderX_FormClosed(object sender, FormClosedEventArgs e)
{ {
Application.Exit(); Application.Exit();
} }
#endregion
private void logoBox_Click(object sender, EventArgs e)
{
devClickEggThingValue = devClickEggThingValue + 1;
if (devClickEggThingValue >= 3)
{
streamableCheckbox.Visible = true;
displaySecretButton.Visible = true;
secretTextbox.Visible = true;
}
else
{
streamableCheckbox.Visible = false;
displaySecretButton.Visible = false;
secretTextbox.Visible = false;
}
}
private void displaySecretButton_Click(object sender, EventArgs e)
{
secretTextbox.Text = appSecret;
}
private void logoutLabel_MouseHover(object sender, EventArgs e)
{
logoutLabel.ForeColor = Color.FromArgb(0, 112, 239);
}
private void logoutLabel_MouseLeave(object sender, EventArgs e)
{
logoutLabel.ForeColor = Color.FromArgb(88, 92, 102);
}
private void logoutLabel_Click(object sender, EventArgs e)
{
// Could use some work, but this works.
Process.Start("QobuzDownloaderX.exe");
Application.Exit();
}
} }
} }

269
QobuzDownloaderX/LoginForm-v2.Designer.cs generated Normal file
View File

@@ -0,0 +1,269 @@
namespace QobuzDownloaderX
{
partial class LoginFrm
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LoginFrm));
this.panel1 = new System.Windows.Forms.Panel();
this.verNumLabel2 = new System.Windows.Forms.Label();
this.exitLabel = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.loginButton = new System.Windows.Forms.Button();
this.panel3 = new System.Windows.Forms.Panel();
this.panel4 = new System.Windows.Forms.Panel();
this.emailTextbox = new System.Windows.Forms.TextBox();
this.passwordTextbox = new System.Windows.Forms.TextBox();
this.md5Button = new System.Windows.Forms.Button();
this.loginText = new System.Windows.Forms.Label();
this.getSecretBG = new System.ComponentModel.BackgroundWorker();
this.loginBG = new System.ComponentModel.BackgroundWorker();
this.visableCheckbox = new System.Windows.Forms.CheckBox();
this.disableLogin = new System.Windows.Forms.CheckBox();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// panel1
//
this.panel1.BackgroundImage = global::QobuzDownloaderX.Properties.Resources.login_frame;
this.panel1.Controls.Add(this.disableLogin);
this.panel1.Controls.Add(this.verNumLabel2);
this.panel1.Controls.Add(this.exitLabel);
this.panel1.Controls.Add(this.pictureBox1);
this.panel1.Dock = System.Windows.Forms.DockStyle.Top;
this.panel1.Location = new System.Drawing.Point(0, 0);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(282, 175);
this.panel1.TabIndex = 0;
this.panel1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.panel1_MouseMove);
//
// verNumLabel2
//
this.verNumLabel2.BackColor = System.Drawing.Color.Transparent;
this.verNumLabel2.Font = new System.Drawing.Font("Trebuchet MS", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.verNumLabel2.ForeColor = System.Drawing.Color.White;
this.verNumLabel2.Location = new System.Drawing.Point(194, 157);
this.verNumLabel2.Name = "verNumLabel2";
this.verNumLabel2.Size = new System.Drawing.Size(85, 18);
this.verNumLabel2.TabIndex = 32;
this.verNumLabel2.Text = "#.#.#.#";
this.verNumLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleRight;
this.verNumLabel2.MouseMove += new System.Windows.Forms.MouseEventHandler(this.verNumLabel2_MouseMove);
//
// exitLabel
//
this.exitLabel.AutoSize = true;
this.exitLabel.BackColor = System.Drawing.Color.Transparent;
this.exitLabel.Font = new System.Drawing.Font("Calibri", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.exitLabel.ForeColor = System.Drawing.Color.Black;
this.exitLabel.Location = new System.Drawing.Point(262, 0);
this.exitLabel.Name = "exitLabel";
this.exitLabel.Size = new System.Drawing.Size(20, 23);
this.exitLabel.TabIndex = 9;
this.exitLabel.Text = "X";
this.exitLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
this.exitLabel.Click += new System.EventHandler(this.exitLabel_Click);
//
// pictureBox1
//
this.pictureBox1.BackColor = System.Drawing.Color.Transparent;
this.pictureBox1.Image = global::QobuzDownloaderX.Properties.Resources.qbdlx_white;
this.pictureBox1.Location = new System.Drawing.Point(12, 52);
this.pictureBox1.Name = "pictureBox1";
this.pictureBox1.Size = new System.Drawing.Size(258, 64);
this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.pictureBox1.TabIndex = 29;
this.pictureBox1.TabStop = false;
this.pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler(this.pictureBox1_MouseMove);
//
// loginButton
//
this.loginButton.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(239)))));
this.loginButton.FlatAppearance.BorderSize = 0;
this.loginButton.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.loginButton.Font = new System.Drawing.Font("Trebuchet MS", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.loginButton.ForeColor = System.Drawing.Color.White;
this.loginButton.Location = new System.Drawing.Point(12, 293);
this.loginButton.Name = "loginButton";
this.loginButton.Size = new System.Drawing.Size(258, 30);
this.loginButton.TabIndex = 2;
this.loginButton.Text = "LOGIN";
this.loginButton.UseVisualStyleBackColor = false;
this.loginButton.Click += new System.EventHandler(this.loginButton_Click);
//
// panel3
//
this.panel3.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel3.Location = new System.Drawing.Point(12, 221);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(258, 1);
this.panel3.TabIndex = 2;
this.panel3.Click += new System.EventHandler(this.panel3_Click);
//
// panel4
//
this.panel4.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.panel4.Location = new System.Drawing.Point(12, 277);
this.panel4.Name = "panel4";
this.panel4.Size = new System.Drawing.Size(258, 1);
this.panel4.TabIndex = 2;
this.panel4.Click += new System.EventHandler(this.panel4_Click);
//
// emailTextbox
//
this.emailTextbox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.emailTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.emailTextbox.Font = new System.Drawing.Font("Trebuchet MS", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.emailTextbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.emailTextbox.Location = new System.Drawing.Point(12, 199);
this.emailTextbox.Multiline = true;
this.emailTextbox.Name = "emailTextbox";
this.emailTextbox.Size = new System.Drawing.Size(258, 23);
this.emailTextbox.TabIndex = 7;
this.emailTextbox.Text = "Email";
this.emailTextbox.Click += new System.EventHandler(this.emailTextbox_Click);
this.emailTextbox.Leave += new System.EventHandler(this.emailTextbox_Leave);
//
// passwordTextbox
//
this.passwordTextbox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.passwordTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.passwordTextbox.Font = new System.Drawing.Font("Trebuchet MS", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.passwordTextbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.passwordTextbox.Location = new System.Drawing.Point(12, 255);
this.passwordTextbox.Multiline = true;
this.passwordTextbox.Name = "passwordTextbox";
this.passwordTextbox.Size = new System.Drawing.Size(209, 23);
this.passwordTextbox.TabIndex = 8;
this.passwordTextbox.Text = "Password";
this.passwordTextbox.Click += new System.EventHandler(this.passwordTextbox_Click);
this.passwordTextbox.Leave += new System.EventHandler(this.passwordTextbox_Leave);
//
// md5Button
//
this.md5Button.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(239)))));
this.md5Button.FlatAppearance.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.md5Button.FlatAppearance.BorderSize = 2;
this.md5Button.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
this.md5Button.ForeColor = System.Drawing.Color.White;
this.md5Button.Location = new System.Drawing.Point(227, 250);
this.md5Button.Name = "md5Button";
this.md5Button.Size = new System.Drawing.Size(43, 27);
this.md5Button.TabIndex = 9;
this.md5Button.Text = "MD5";
this.md5Button.UseVisualStyleBackColor = false;
this.md5Button.Click += new System.EventHandler(this.md5Button_Click);
//
// loginText
//
this.loginText.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.loginText.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.loginText.Location = new System.Drawing.Point(12, 333);
this.loginText.Name = "loginText";
this.loginText.Size = new System.Drawing.Size(258, 23);
this.loginText.TabIndex = 30;
this.loginText.Text = "Waiting for login...";
this.loginText.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// getSecretBG
//
this.getSecretBG.DoWork += new System.ComponentModel.DoWorkEventHandler(this.getSecretBG_DoWork);
//
// loginBG
//
this.loginBG.DoWork += new System.ComponentModel.DoWorkEventHandler(this.loginBG_DoWork);
//
// visableCheckbox
//
this.visableCheckbox.AutoSize = true;
this.visableCheckbox.Location = new System.Drawing.Point(206, 257);
this.visableCheckbox.Name = "visableCheckbox";
this.visableCheckbox.Size = new System.Drawing.Size(15, 14);
this.visableCheckbox.TabIndex = 31;
this.visableCheckbox.UseVisualStyleBackColor = true;
this.visableCheckbox.CheckedChanged += new System.EventHandler(this.visableCheckbox_CheckedChanged);
//
// disableLogin
//
this.disableLogin.AutoSize = true;
this.disableLogin.ForeColor = System.Drawing.Color.Transparent;
this.disableLogin.Location = new System.Drawing.Point(12, 155);
this.disableLogin.Name = "disableLogin";
this.disableLogin.Size = new System.Drawing.Size(90, 17);
this.disableLogin.TabIndex = 34;
this.disableLogin.Text = "Disable Login";
this.disableLogin.UseVisualStyleBackColor = true;
this.disableLogin.Visible = false;
//
// LoginFrm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.ClientSize = new System.Drawing.Size(282, 377);
this.Controls.Add(this.visableCheckbox);
this.Controls.Add(this.loginText);
this.Controls.Add(this.md5Button);
this.Controls.Add(this.panel4);
this.Controls.Add(this.panel3);
this.Controls.Add(this.passwordTextbox);
this.Controls.Add(this.emailTextbox);
this.Controls.Add(this.loginButton);
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "LoginFrm";
this.Text = "QobuzDLX | Login";
this.Load += new System.EventHandler(this.LoginFrm_Load);
this.panel1.ResumeLayout(false);
this.panel1.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit();
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
private System.Windows.Forms.Panel panel1;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Button loginButton;
private System.Windows.Forms.Panel panel3;
private System.Windows.Forms.Panel panel4;
private System.Windows.Forms.TextBox emailTextbox;
private System.Windows.Forms.TextBox passwordTextbox;
private System.Windows.Forms.Label exitLabel;
private System.Windows.Forms.Button md5Button;
private System.Windows.Forms.Label loginText;
private System.ComponentModel.BackgroundWorker getSecretBG;
private System.ComponentModel.BackgroundWorker loginBG;
private System.Windows.Forms.Label verNumLabel2;
private System.Windows.Forms.CheckBox visableCheckbox;
private System.Windows.Forms.CheckBox disableLogin;
}
}

View File

@@ -0,0 +1,545 @@
using QobuzDownloaderX.Properties;
using System;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Net;
using System.Text;
using System.IO;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Security.Cryptography;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Drawing.Imaging;
using TagLib.Flac;
using QobuzDownloaderX;
namespace QobuzDownloaderX
{
public partial class LoginFrm : Form
{
public LoginFrm()
{
InitializeComponent();
}
public const int WM_NCLBUTTONDOWN = 0xA1;
public const int HT_CAPTION = 0x2;
[DllImportAttribute("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
[DllImportAttribute("user32.dll")]
public static extern bool ReleaseCapture();
private void QobuzDownloaderX_FormClosing(Object sender, FormClosingEventArgs e)
{
Application.Exit();
}
QobuzDownloaderX qbdlx = new QobuzDownloaderX();
public string appSecret { get; set; }
public string appID { get; set; }
string errorLog = Path.GetDirectoryName(Application.ExecutablePath) + "\\Latest_Error.log";
string dllCheck = Path.GetDirectoryName(Application.ExecutablePath) + "\\taglib-sharp.dll";
static string GetMd5Hash(MD5 md5Hash, string input)
{
// Convert the input string to a byte array and compute the hash.
byte[] data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(input));
// Create a new Stringbuilder to collect the bytes and create a string.
StringBuilder sBuilder = new StringBuilder();
// Loop through each byte of the hashed data and format each one as a hexadecimal string.
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
// Return the hexadecimal string.
return sBuilder.ToString();
}
// Verify a hash against a string.
static bool VerifyMd5Hash(MD5 md5Hash, string input, string hash)
{
// Hash the input.
string hashOfInput = GetMd5Hash(md5Hash, input);
// Create a StringComparer an compare the hashes.
StringComparer comparer = StringComparer.OrdinalIgnoreCase;
if (0 == comparer.Compare(hashOfInput, hash))
{
return true;
}
else
{
return false;
}
}
private void LoginFrm_Load(object sender, EventArgs e)
{
try
{
WebClient versionURLClient = new WebClient();
// Run through TLS to allow secure connection.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
string versionHTML = versionURLClient.DownloadString("https://github.com/ImAiiR/QobuzDownloaderX/releases");
// Grab link to bundle.js
var versionLog = Regex.Match(versionHTML, "<span class=\"css-truncate-target\" style=\"max-width: 125px\">(?<latestVersion>.*?)<\\/span>").Groups;
var version = versionLog[1].Value;
string currentVersion = Assembly.GetExecutingAssembly().GetName().Version.ToString();
string newVersion = version;
if (currentVersion.Contains(newVersion))
{
// Do nothing. All is good.
}
else
{
DialogResult dialogResult = MessageBox.Show("New version of QBDLX is available!\r\n\r\nInstalled version - " + currentVersion + "\r\nLatest version - "+ newVersion + "\r\n\r\nWould you like to update?", "QBDLX | Update Available", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
// If "Yes" is clicked, open GitHub page and close QBDLX.
Process.Start("https://github.com/ImAiiR/QobuzDownloaderX/releases/latest");
Application.Exit();
}
else if (dialogResult == DialogResult.No)
{
// Ignore the update until next open.
}
}
}
catch
{
DialogResult dialogResult = MessageBox.Show("Connection to GitHub to check for an update has failed.\r\nWould you like to check for an update manually?\r\n\r\nYour current version is " + Assembly.GetExecutingAssembly().GetName().Version.ToString(), "QBDLX | GitHub Connection Failed", MessageBoxButtons.YesNo);
if (dialogResult == DialogResult.Yes)
{
// If "Yes" is clicked, open GitHub page and close QBDLX.
Process.Start("https://github.com/ImAiiR/QobuzDownloaderX/releases/latest");
Application.Exit();
}
else if (dialogResult == DialogResult.No)
{
// Ignore the update until next open.
}
}
// Get and display version number.
verNumLabel2.Text = Assembly.GetExecutingAssembly().GetName().Version.ToString();
// Check for taglib-sharp.dll
if (!System.IO.File.Exists(dllCheck))
{
MessageBox.Show("taglib-sharp.dll missing from folder!\r\nPlease Make sure the DLL is in the same folder as QobuzDownloaderX.exe!", "ERROR",
MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
}
// Bring to center of screen.
CenterToScreen();
if (Properties.Settings.Default.UpgradeRequired)
{
Properties.Settings.Default.Upgrade();
Properties.Settings.Default.UpgradeRequired = false;
Properties.Settings.Default.Save();
}
// Set saved settings to correct places.
emailTextbox.Text = Settings.Default.savedEmail.ToString();
passwordTextbox.Text = Settings.Default.savedPassword.ToString();
if (emailTextbox.Text != "Email")
{
emailTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
if (emailTextbox.Text == null | emailTextbox.Text == "")
{
emailTextbox.ForeColor = Color.FromArgb(88, 92, 102);
emailTextbox.Text = "Email";
}
if (passwordTextbox.Text != "Password")
{
passwordTextbox.PasswordChar = '*';
passwordTextbox.UseSystemPasswordChar = false;
passwordTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
if (passwordTextbox.Text == null | passwordTextbox.Text == "")
{
passwordTextbox.ForeColor = Color.FromArgb(88, 92, 102);
passwordTextbox.UseSystemPasswordChar = true;
passwordTextbox.Text = "Password";
}
}
private void loginButton_Click(object sender, EventArgs e)
{
//if (appidTextbox.Text == "app_id" | appidTextbox.Text == null | appidTextbox.Text == "")
//{
// // If there's no app_id typed in.
// loginText.Invoke(new Action(() => loginText.Text = "No app_id, please input app_id first."));
// return;
//}
if (emailTextbox.Text == "Email" | emailTextbox.Text == null | emailTextbox.Text == "")
{
// If there's no email typed in.
loginText.Invoke(new Action(() => loginText.Text = "No email, please input email first."));
return;
}
var passMD5CheckLog = Regex.Match(passwordTextbox.Text, "(?<md5Test>^[0-9a-f]{32}$)").Groups;
var passMD5Check = passMD5CheckLog[1].Value;
if (passMD5Check == null | passMD5Check == "")
{
loginText.Text = "Password not MD5! Hit \"MD5\" before logging in!";
return;
}
// Save info locally to be used on next launch.
Settings.Default.savedEmail = emailTextbox.Text;
Settings.Default.savedPassword = passwordTextbox.Text;
Settings.Default.Save();
loginText.Text = "Getting App ID and Secret...";
loginButton.Enabled = false;
getSecretBG.RunWorkerAsync();
}
#region Textbox Focous & Text Change
#region app_id Textbox (Removed)
//private void appIdTextbox_Click(object sender, EventArgs e)
//{
// if (appidTextbox.Text == "app_id")
// {
// appidTextbox.Text = null;
// appidTextbox.ForeColor = Color.FromArgb(186, 186, 186);
// }
//}
//private void panel2_Click(object sender, EventArgs e)
//{
// appidTextbox.Focus();
// if (appidTextbox.Text == "app_id")
// {
// appidTextbox.Text = null;
// appidTextbox.ForeColor = Color.FromArgb(186, 186, 186);
// }
//}
//private void appIdTextbox_Leave(object sender, EventArgs e)
//{
// if (appidTextbox.Text == null | appidTextbox.Text == "")
// {
// appidTextbox.ForeColor = Color.FromArgb(88, 92, 102);
// appidTextbox.Text = "app_id";
// }
//}
#endregion
#region Email Textbox
private void emailTextbox_Click(object sender, EventArgs e)
{
if (emailTextbox.Text == "Email")
{
emailTextbox.Text = null;
emailTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
}
private void panel3_Click(object sender, EventArgs e)
{
emailTextbox.Focus();
if (emailTextbox.Text == "Email")
{
emailTextbox.Text = null;
emailTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
}
private void emailTextbox_Leave(object sender, EventArgs e)
{
if (emailTextbox.Text == null | emailTextbox.Text == "")
{
emailTextbox.ForeColor = Color.FromArgb(88, 92, 102);
emailTextbox.Text = "Email";
}
}
#endregion
#region Password Textbox
private void passwordTextbox_Click(object sender, EventArgs e)
{
if (passwordTextbox.Text == "Password")
{
passwordTextbox.Text = null;
passwordTextbox.PasswordChar = '*';
passwordTextbox.UseSystemPasswordChar = false;
passwordTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
}
private void panel4_Click(object sender, EventArgs e)
{
passwordTextbox.Focus();
if (passwordTextbox.Text == "Password")
{
passwordTextbox.Text = null;
passwordTextbox.PasswordChar = '*';
passwordTextbox.UseSystemPasswordChar = false;
passwordTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
}
private void passwordTextbox_Leave(object sender, EventArgs e)
{
if (passwordTextbox.Text == null | passwordTextbox.Text == "")
{
passwordTextbox.ForeColor = Color.FromArgb(88, 92, 102);
passwordTextbox.UseSystemPasswordChar = true;
passwordTextbox.Text = "Password";
}
}
#endregion
#endregion
private void visableCheckbox_CheckedChanged(object sender, EventArgs e)
{
if (visableCheckbox.Checked == true)
{
passwordTextbox.UseSystemPasswordChar = true;
}
else
{
passwordTextbox.UseSystemPasswordChar = false;
}
}
private void exitLabel_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void panel1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
private void verNumLabel2_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
private void md5Button_Click(object sender, EventArgs e)
{
if (passwordTextbox.Text == "Password")
{
// If there's no password typed in.
loginText.Invoke(new Action(() => loginText.Text = "No password typed, please input password first."));
return;
}
string plainTextPW = passwordTextbox.Text;
// Generate the MD5 hash using the string created above.
using (MD5 md5PassHash = MD5.Create())
{
string hashedPW = GetMd5Hash(md5PassHash, plainTextPW);
if (VerifyMd5Hash(md5PassHash, plainTextPW, hashedPW))
{
// If the MD5 hash is verified, proceed to get the streaming URL.
passwordTextbox.Text = hashedPW;
}
else
{
// If the hash can't be verified.
loginText.Invoke(new Action(() => loginText.Text = "Hashing failed. Please retry."));
return;
}
}
}
private void getSecretBG_DoWork(object sender, DoWorkEventArgs e)
{
getSecretBG.WorkerSupportsCancellation = true;
WebClient bundleURLClient = new WebClient();
string bundleHTML = bundleURLClient.DownloadString("https://play.qobuz.com/login");
// Grab link to bundle.js
var bundleLog = Regex.Match(bundleHTML, "<script src=\"(?<bundleJS>\\/resources\\/\\d+\\.\\d+\\.\\d+-[a-z]\\d{3}\\/bundle\\.js)").Groups;
var bundleSuffix = bundleLog[1].Value;
var bundleURL = "https://play.qobuz.com" + bundleSuffix;
WebRequest bundleWR = WebRequest.Create(bundleURL);
try
{
WebResponse bundleWS = bundleWR.GetResponse();
StreamReader bundleSR = new StreamReader(bundleWS.GetResponseStream());
string getBundleRequest = bundleSR.ReadToEnd();
string text = getBundleRequest;
// Grab app_id from bundle.js
var bundleLog0 = Regex.Match(getBundleRequest, "\\):\\(n.qobuzapi={app_id:\"(?<appID>.*?)\",app_secret:").Groups;
appID = bundleLog0[1].Value;
// Grab "info" and "extras"
var bundleLog1 = Regex.Match(getBundleRequest, "{offset:\"(?<notUsed>.*?)\",name:\"Europe\\/Berlin\",info:\"(?<info>.*?)\",extras:\"(?<extras>.*?)\"}").Groups;
var bundleInfo = bundleLog1[2].Value;
var bundleExtras = bundleLog1[3].Value;
// Grab "seed"
var bundleLog2 = Regex.Match(getBundleRequest, "window.utimezone.paris\\):h.initialSeed\\(\"(?<seed>.*?)\",window.utimezone.berlin\\)").Groups;
var bundleSeed = bundleLog2[1].Value;
// Step 1 of getting the app_secret
string B64step1 = bundleSeed + bundleInfo + bundleExtras;
B64step1 = B64step1.Remove(B64step1.Length - 44, 44);
byte[] step1Bytes = Encoding.UTF8.GetBytes(B64step1);
B64step1 = Convert.ToBase64String(step1Bytes);
// Step 2 of getting the app_secret
byte[] step2Data = Convert.FromBase64String(B64step1);
string B64step2 = Encoding.UTF8.GetString(step2Data);
// Step 3 of getting the app_secret
byte[] step3Data = Convert.FromBase64String(B64step2);
// Set app_secret
appSecret = Encoding.UTF8.GetString(step3Data);
loginText.Invoke(new Action(() => loginText.Text = "ID and Secret Obtained! Logging in.."));
System.Threading.Thread.Sleep(1000);
}
catch (Exception bundleEx)
{
// If obtaining bundle.js info fails, show error info.
string bundleError = bundleEx.ToString();
loginText.Invoke(new Action(() => loginText.Text = "Couldn't obtain app info. Error Log saved"));
System.IO.File.WriteAllText(errorLog, bundleError);
bundleWR.Abort();
loginButton.Invoke(new Action(() => loginButton.Enabled = true));
return;
}
bundleWR.Abort();
loginBG.RunWorkerAsync();
getSecretBG.CancelAsync();
}
private void loginBG_DoWork(object sender, DoWorkEventArgs e)
{
loginBG.WorkerSupportsCancellation = true;
// Create WebRequest to login using login information from input textboxes.
WebRequest wr = WebRequest.Create("https://www.qobuz.com/api.json/0.2/user/login?email=" + emailTextbox.Text + "&password=" + passwordTextbox.Text + "&app_id=" + appID);
try
{
// Grab info to be displayed and used.
WebResponse ws = wr.GetResponse();
StreamReader sr = new StreamReader(ws.GetResponseStream());
string loginRequest = sr.ReadToEnd();
string text = loginRequest;
// Grab display name
var displayNameLog = Regex.Match(loginRequest, "\"display_name\":\"(?<displayName>.*?)\",\\\"").Groups;
var displayName = displayNameLog[1].Value;
qbdlx.displayName = displayName;
// Grab account type
var accountTypeLog = Regex.Match(loginRequest, "short_label\":\"(?<accountType>\\w+)").Groups;
var accountType = accountTypeLog[1].Value;
qbdlx.accountType = accountType;
// Grab authentication token
var userAuth = Regex.Match(loginRequest, "\"user_auth_token\":\"(?<userAuth>.*?)\\\"}").Groups;
var userAuthToken = userAuth[1].Value;
// Grab profile image
var profilePic = Regex.Match(loginRequest, "avatar\\\":\\\"(?<profilePic>.*?)\",").Groups;
var profilePicURL = profilePic[1].Value.Replace(@"\", null).Replace("s=50", "s=20");
qbdlx.profilePic = profilePicURL;
// Set user_auth_token
qbdlx.userAuth = userAuthToken;
loginText.Invoke(new Action(() => loginText.Text = "Login Successful! Launching QBDLX..."));
}
catch (Exception ex)
{
// If connection to API fails, show error info.
string error = ex.ToString();
loginText.Invoke(new Action(() => loginText.Text = "Login Failed. Error Log saved"));
System.IO.File.WriteAllText(errorLog, error);
wr.Abort();
loginButton.Invoke(new Action(() => loginButton.Enabled = true));
return;
}
wr.Abort();
finishLogin(sender, e);
loginBG.CancelAsync();
}
private void finishLogin(object sender, EventArgs e)
{
loginButton.Invoke(new Action(() => loginButton.Enabled = true));
// If info is legit, go to the main form.
qbdlx.appid = appID;
qbdlx.eMail = emailTextbox.Text;
qbdlx.password = passwordTextbox.Text;
qbdlx.appSecret = appSecret;
if (disableLogin.Checked != true)
{
this.Invoke(new Action(() => this.Hide()));
Application.Run(qbdlx);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -16,7 +16,7 @@ namespace QobuzDownloaderX
{ {
Application.EnableVisualStyles(); Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false); Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new LoginForm()); Application.Run(new LoginFrm());
} }
} }
} }

View File

@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
// You can specify all the values or you can default the Build and Revision Numbers // You can specify all the values or you can default the Build and Revision Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")] // [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.9.8.7")] [assembly: AssemblyVersion("0.9.9.8")]
[assembly: AssemblyFileVersion("0.9.8.7")] [assembly: AssemblyFileVersion("0.9.9.8")]

View File

@@ -60,6 +60,16 @@ namespace QobuzDownloaderX.Properties {
} }
} }
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap login_frame {
get {
object obj = ResourceManager.GetObject("login_frame", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
/// <summary> /// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap. /// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary> /// </summary>
@@ -79,5 +89,15 @@ namespace QobuzDownloaderX.Properties {
return ((System.Drawing.Icon)(obj)); return ((System.Drawing.Icon)(obj));
} }
} }
/// <summary>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
internal static System.Drawing.Bitmap qbdlx_white {
get {
object obj = ResourceManager.GetObject("qbdlx_white", resourceCulture);
return ((System.Drawing.Bitmap)(obj));
}
}
} }
} }

View File

@@ -118,10 +118,16 @@
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader> </resheader>
<assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> <assembly alias="System.Windows.Forms" name="System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<data name="login_frame" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\login-frame.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<data name="qbdlx" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="qbdlx" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\qbdlx.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\qbdlx.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="qbdlx_icon" type="System.Resources.ResXFileRef, System.Windows.Forms"> <data name="qbdlx_icon" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\qbdlx_icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> <value>..\Resources\qbdlx_icon.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data> </data>
<data name="qbdlx_white" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>..\Resources\qbdlx-white.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
</root> </root>

View File

@@ -79,6 +79,12 @@
<Compile Include="Form1.Designer.cs"> <Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon> <DependentUpon>Form1.cs</DependentUpon>
</Compile> </Compile>
<Compile Include="LoginForm-v2.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="LoginForm-v2.Designer.cs">
<DependentUpon>LoginForm-v2.cs</DependentUpon>
</Compile>
<Compile Include="searchForm.cs"> <Compile Include="searchForm.cs">
<SubType>Form</SubType> <SubType>Form</SubType>
</Compile> </Compile>
@@ -97,6 +103,9 @@
<EmbeddedResource Include="Form1.resx"> <EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon> <DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="LoginForm-v2.resx">
<DependentUpon>LoginForm-v2.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="searchForm.resx"> <EmbeddedResource Include="searchForm.resx">
<DependentUpon>searchForm.cs</DependentUpon> <DependentUpon>searchForm.cs</DependentUpon>
</EmbeddedResource> </EmbeddedResource>
@@ -148,6 +157,12 @@
<Install>false</Install> <Install>false</Install>
</BootstrapperPackage> </BootstrapperPackage>
</ItemGroup> </ItemGroup>
<ItemGroup>
<None Include="Resources\login-frame.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\qbdlx-white.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it. <!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets. Other similar extension points exist, see Microsoft.Common.targets.

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -1 +1,38 @@
# QobuzDownloaderX <p style="align:center;">
<a href="https://github.com/ImAiiR/QobuzDownloaderX">
<img src="https://github.com/ImAiiR/QobuzDownloaderX/raw/master/QobuzDownloaderX/Resources/qbdlx.png?raw=true" />
</a>
<a href="https://ko-fi.com/I3I41A5DY">
<img src="https://www.ko-fi.com/img/githubbutton_sm.svg" />
</a>
</p>
Inspired by Qo-DL by <a href="https://github.com/Sorrow446">Sorrow</a> & <a href="https://github.com/DashLt">Dash</a>
<p style="align:center;">
<a href="https://github.com/ImAiiR/QobuzDownloaderX/blob/master/-assets/QBDLX2.png?raw=true">
<img src="https://github.com/ImAiiR/QobuzDownloaderX/blob/master/-assets/QBDLX2.png?raw=true" />
</a>
</p>
# About
QobuzDownloaderX is a program for downloading music streams from the streaming platform <a href="https://qobuz.com/">Qobuz</a>.
You can not download anything with a free account.
# Disclaimer & Legal
I will not be responsible for how you use QBDLX (QobuzDownloaderX).
This program DOES NOT include...
- Code to bypass Qobuz's region restrictions.
- Qobuz app IDs or secrets.
QBDLX does not publish any of Qobuz's private secrets or app IDs. It contains regular expressions and other code to dynamically grab them from Qobuz's web player's *publicly available* JavaScript, which is not rehosted, but grabbed client side. Scraping public data is not a violation of the Computer Fraud and Abuse Act (USA) according to the Ninth Court of Appeals, [case # 17-16783](http://cdn.ca9.uscourts.gov/datastore/opinions/2019/09/09/17-16783.pdf) (see page 29).
QBDLX uses the Qobuz API, but is not endorsed, certified or otherwise approved in any way by Qobuz.
Qobuz brand and name is the registered trademark of its respective owner.
QBDLX has no partnership, sponsorship or endorsement with Qobuz.
By using QBDLX, you agree to the following: http://static.qobuz.com/apps/api/QobuzAPI-TermsofUse.pdf