Compare commits

...

48 Commits

Author SHA1 Message Date
AiiR
048c577b65 Update AssemblyInfo.cs 2021-03-03 12:23:50 -05:00
AiiR
ff3496f24c
Merge pull request #81 from jraiver/master
Update LoginForm-v2.cs (Fixed login / authorization)
2021-03-03 12:10:18 -05:00
Nikita Kuryshev
59d2d0de95 Update LoginForm-v2.cs
Fix authorization
2021-03-03 18:06:42 +03:00
AiiR
d39800c6c5 0.9.9.22
- Added the ability to download Playlists (finally). New feature, probably broken in some ways, so let me know if it is by creating issues.
- Reorganized tag options and made the tag options section smaller.
- Added debug option for listing / using custom format IDs.
- Added option for filename template. Choices are `00 Trackname` or `00 - Trackname`.
2020-08-24 14:13:13 -04:00
AiiR
be43bdde0a
Update README.md 2020-08-23 18:45:09 -04:00
AiiR
e548bfe90b 0.9.9.21
- Added another debug option for Re-enabling disabled buttons and checkboxes, for if anything goes wrong and they don't get re-enabled automatically.
- Added a Hide button in debug options
- Added a way for users to change the max length for filenames. There's a limit at 110 to avoid errors. If you still get errors with 110, just lower the value to download, but still create an issue with the error, and provide a link to the release, so I can check what a new limit should be.
- Added a line of code before grabbing tags to set composer to `null`, as sometimes QBDLX would keep the old value from another release and use it for another.
2020-08-15 00:43:54 -04:00
AiiR
bcc81b8462 0.9.9.20
- Fixed login
2020-08-10 15:25:26 -04:00
AiiR
ba8b9e3eec 0.9.9.19
0.9.9.19
2020-07-24 21:12:12 -04:00
AiiR
1ead0ed343 Track IDs regex
Changed regex for track IDs
2020-07-22 21:03:41 -04:00
AiiR
3962e0f682 0.9.9.18
0.9.9.18
2020-07-20 17:17:03 -04:00
AiiR
ffbd8e521e Fix misplaced string 2020-07-18 01:48:44 -04:00
AiiR
ea09798e3c
Merge pull request #40 from tomty89/path_bs
ditch remaining backslashes in paths
2020-07-10 00:13:38 -04:00
Tom Yan
72db4d0814 ditch remaining backslashes in paths 2020-07-10 11:16:20 +08:00
AiiR
7fee36c600 0.9.9.17
0.9.9.17
2020-07-08 23:58:48 -04:00
AiiR
bb30ed6deb
Update README.md 2020-06-26 22:21:08 -04:00
AiiR
58a6be7283 0.9.9.16
0.9.9.16
2020-06-16 03:35:27 -04:00
AiiR
6c225b895e 0.9.9.15
Fixed downloading goodies (digital booklets)
2020-05-26 12:14:03 -04:00
AiiR
e302608d6e 0.9.9.14
0.9.9.14
2020-05-25 15:23:10 -04:00
AiiR
56ffb88b16 0.9.9.13
0.9.9.13
2020-04-30 04:27:06 -04:00
AiiR
5c40d5315a Merge branch 'master' of https://github.com/ImAiiR/QobuzDownloaderX 2020-03-29 01:39:53 -04:00
AiiR
984bed19f2 0.9.9.12
0.9.9.12
2020-03-29 01:39:50 -04:00
AiiR
b257e8540f
Update README.md 2020-03-26 10:16:25 -04:00
AiiR
aebd046185
Update README.md 2020-03-26 10:16:13 -04:00
AiiR
8f33ebd46f
Update README.md 2020-03-26 10:13:47 -04:00
AiiR
7c6b826c77 0.9.9.11
0.9.9.11
2020-03-25 15:01:33 -04:00
AiiR
8f8a01fddd 0.9.9.10
0.9.9.10
2020-03-23 16:31:00 -04:00
AiiR
8321081dd9 0.9.9.9
0.9.9.9
2020-03-22 21:57:27 -04:00
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
24 changed files with 8979 additions and 2550 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

178
QobuzDownloaderX/AboutForm.Designer.cs generated Normal file
View File

@ -0,0 +1,178 @@
namespace QobuzDownloaderX
{
partial class AboutForm
{
/// <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(AboutForm));
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.devLabel = new System.Windows.Forms.Label();
this.label1 = new System.Windows.Forms.Label();
this.label2 = new System.Windows.Forms.Label();
this.label3 = new System.Windows.Forms.Label();
this.panel1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout();
//
// panel1
//
this.panel1.BackgroundImage = global::QobuzDownloaderX.Properties.Resources.login_frame;
this.panel1.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
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(365, 95);
this.panel1.TabIndex = 1;
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.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.verNumLabel2.Location = new System.Drawing.Point(12, 98);
this.verNumLabel2.Name = "verNumLabel2";
this.verNumLabel2.Size = new System.Drawing.Size(341, 18);
this.verNumLabel2.TabIndex = 32;
this.verNumLabel2.Text = "#.#.#.#";
this.verNumLabel2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
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(345, 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(53, 12);
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);
//
// devLabel
//
this.devLabel.AutoSize = true;
this.devLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.devLabel.Location = new System.Drawing.Point(140, 131);
this.devLabel.Name = "devLabel";
this.devLabel.Size = new System.Drawing.Size(84, 13);
this.devLabel.TabIndex = 34;
this.devLabel.Text = "Developer - AiiR";
//
// label1
//
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(79, 154);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(207, 13);
this.label1.TabIndex = 35;
this.label1.Text = "Inspired By - Qo-DL by Sorrow and DashLt";
this.label1.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label2
//
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(47, 177);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(271, 26);
this.label2.TabIndex = 36;
this.label2.Text = "Thanks to the users on Github and Telegram for offering\r\nbug reports and ideas!";
this.label2.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// label3
//
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(15, 237);
this.label3.Name = "label3";
this.label3.Size = new System.Drawing.Size(334, 26);
this.label3.TabIndex = 37;
this.label3.Text = "IF YOU PAID FOR THIS PROGRAM, YOU HAVE BEEN SCAMMED!\r\nTHIS SOFTWARE IS COMPLETELY" +
" FREE AND OPEN-SOURCE.";
this.label3.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
//
// AboutForm
//
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(365, 289);
this.Controls.Add(this.label3);
this.Controls.Add(this.label2);
this.Controls.Add(this.label1);
this.Controls.Add(this.devLabel);
this.Controls.Add(this.verNumLabel2);
this.Controls.Add(this.panel1);
this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.Name = "AboutForm";
this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
this.Text = "QobuzDLX | About";
this.Load += new System.EventHandler(this.AboutForm_Load);
this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.AboutForm_MouseMove);
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.Label verNumLabel2;
private System.Windows.Forms.Label exitLabel;
private System.Windows.Forms.PictureBox pictureBox1;
private System.Windows.Forms.Label devLabel;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label3;
}
}

View File

@ -0,0 +1,78 @@
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.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Reflection;
namespace QobuzDownloaderX
{
public partial class AboutForm : Form
{
public AboutForm()
{
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 AboutForm_Load(object sender, EventArgs e)
{
// Get and display version number.
verNumLabel2.Text = Assembly.GetExecutingAssembly().GetName().Version.ToString();
}
private void exitLabel_Click(object sender, EventArgs e)
{
this.Close();
}
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 AboutForm_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
ReleaseCapture();
SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -100,6 +100,31 @@
<setting name="audioType" serializeAs="String">
<value>.flac</value>
</setting>
<setting name="savedUserID" serializeAs="String">
<value />
</setting>
<setting name="savedUserAuthToken" serializeAs="String">
<value />
</setting>
<setting name="savedAltLoginValue" serializeAs="String">
<value>0</value>
</setting>
<setting name="savedArtSize" serializeAs="String">
<value>1</value>
</setting>
<setting name="typeTag" serializeAs="String">
<value>True</value>
</setting>
<setting name="savedMaxLength" serializeAs="String">
<value>36</value>
</setting>
<setting name="savedFilenameTemplate" serializeAs="String">
<value>1</value>
</setting>
<setting name="savedFilenameTemplateString" serializeAs="String">
<value>
</value>
</setting>
</QobuzDownloaderX.Properties.Settings>
</userSettings>
</configuration>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -135,6 +135,18 @@
<metadata name="downloadDiscogBG.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>737, 13</value>
</metadata>
<metadata name="downloadLabelBG.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>901, 13</value>
</metadata>
<metadata name="downloadFaveAlbumsBG.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>1065, 13</value>
</metadata>
<metadata name="downloadFaveArtistsBG.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>1229, 13</value>
</metadata>
<metadata name="downloadPlaylistBG.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 52</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>

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

@ -0,0 +1,360 @@
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.disableLogin = new System.Windows.Forms.CheckBox();
this.verNumLabel2 = new System.Windows.Forms.Label();
this.md5Button = new System.Windows.Forms.Button();
this.exitLabel = new System.Windows.Forms.Label();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.userAuthTokenTextbox = new System.Windows.Forms.TextBox();
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.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.altLoginLabel = new System.Windows.Forms.Label();
this.altLoginTutLabel = new System.Windows.Forms.Label();
this.userIdTextbox = new System.Windows.Forms.TextBox();
this.altLoginBG = new System.ComponentModel.BackgroundWorker();
this.aboutLabel = new System.Windows.Forms.Label();
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.aboutLabel);
this.panel1.Controls.Add(this.disableLogin);
this.panel1.Controls.Add(this.verNumLabel2);
this.panel1.Controls.Add(this.md5Button);
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);
//
// 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;
//
// 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);
//
// md5Button
//
this.md5Button.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(112)))), ((int)(((byte)(239)))));
this.md5Button.Enabled = false;
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, 122);
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.Visible = false;
this.md5Button.Click += new System.EventHandler(this.md5Button_Click);
//
// 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);
//
// userAuthTokenTextbox
//
this.userAuthTokenTextbox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.userAuthTokenTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.userAuthTokenTextbox.Font = new System.Drawing.Font("Trebuchet MS", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.userAuthTokenTextbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.userAuthTokenTextbox.Location = new System.Drawing.Point(12, 255);
this.userAuthTokenTextbox.Multiline = true;
this.userAuthTokenTextbox.Name = "userAuthTokenTextbox";
this.userAuthTokenTextbox.Size = new System.Drawing.Size(237, 23);
this.userAuthTokenTextbox.TabIndex = 35;
this.userAuthTokenTextbox.Text = "user_auth_token";
this.userAuthTokenTextbox.Visible = false;
this.userAuthTokenTextbox.Click += new System.EventHandler(this.userAuthTokenTextbox_Click);
this.userAuthTokenTextbox.Leave += new System.EventHandler(this.userAuthTokenTextbox_Leave);
//
// 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;
//
// 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;
//
// 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(237, 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);
//
// 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, 349);
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(255, 256);
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);
//
// altLoginLabel
//
this.altLoginLabel.Font = new System.Drawing.Font("Trebuchet MS", 8.25F);
this.altLoginLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.altLoginLabel.Location = new System.Drawing.Point(12, 326);
this.altLoginLabel.Name = "altLoginLabel";
this.altLoginLabel.Size = new System.Drawing.Size(258, 20);
this.altLoginLabel.TabIndex = 32;
this.altLoginLabel.Text = "Can\'t login? Click here";
this.altLoginLabel.TextAlign = System.Drawing.ContentAlignment.MiddleCenter;
this.altLoginLabel.Click += new System.EventHandler(this.altLoginLabel_Click);
//
// altLoginTutLabel
//
this.altLoginTutLabel.AutoSize = true;
this.altLoginTutLabel.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.altLoginTutLabel.Location = new System.Drawing.Point(77, 180);
this.altLoginTutLabel.Name = "altLoginTutLabel";
this.altLoginTutLabel.Size = new System.Drawing.Size(128, 13);
this.altLoginTutLabel.TabIndex = 33;
this.altLoginTutLabel.Text = "Click Here for Instructions";
this.altLoginTutLabel.Visible = false;
this.altLoginTutLabel.Click += new System.EventHandler(this.altLoginTutLabel_Click);
//
// userIdTextbox
//
this.userIdTextbox.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(20)))), ((int)(((byte)(20)))), ((int)(((byte)(20)))));
this.userIdTextbox.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.userIdTextbox.Font = new System.Drawing.Font("Trebuchet MS", 9.75F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.userIdTextbox.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(88)))), ((int)(((byte)(92)))), ((int)(((byte)(102)))));
this.userIdTextbox.Location = new System.Drawing.Point(12, 199);
this.userIdTextbox.Multiline = true;
this.userIdTextbox.Name = "userIdTextbox";
this.userIdTextbox.Size = new System.Drawing.Size(258, 23);
this.userIdTextbox.TabIndex = 9;
this.userIdTextbox.Text = "user_id";
this.userIdTextbox.Visible = false;
this.userIdTextbox.Click += new System.EventHandler(this.userIdTextbox_Click);
this.userIdTextbox.Leave += new System.EventHandler(this.userIdTextbox_Leave);
//
// altLoginBG
//
this.altLoginBG.DoWork += new System.ComponentModel.DoWorkEventHandler(this.altLoginBG_DoWork);
//
// aboutLabel
//
this.aboutLabel.AutoSize = true;
this.aboutLabel.BackColor = System.Drawing.Color.Transparent;
this.aboutLabel.Font = new System.Drawing.Font("Calibri", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.aboutLabel.ForeColor = System.Drawing.Color.Black;
this.aboutLabel.Location = new System.Drawing.Point(241, 0);
this.aboutLabel.Name = "aboutLabel";
this.aboutLabel.Size = new System.Drawing.Size(15, 23);
this.aboutLabel.TabIndex = 35;
this.aboutLabel.Text = "i";
this.aboutLabel.TextAlign = System.Drawing.ContentAlignment.TopCenter;
this.aboutLabel.Click += new System.EventHandler(this.aboutLabel_Click);
//
// 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, 392);
this.Controls.Add(this.altLoginTutLabel);
this.Controls.Add(this.altLoginLabel);
this.Controls.Add(this.visableCheckbox);
this.Controls.Add(this.loginText);
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.Controls.Add(this.userIdTextbox);
this.Controls.Add(this.userAuthTokenTextbox);
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;
private System.Windows.Forms.TextBox userAuthTokenTextbox;
private System.Windows.Forms.Label altLoginLabel;
private System.Windows.Forms.Label altLoginTutLabel;
private System.Windows.Forms.TextBox userIdTextbox;
private System.ComponentModel.BackgroundWorker altLoginBG;
private System.Windows.Forms.Label aboutLabel;
}
}

View File

@ -0,0 +1,873 @@
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 Newtonsoft.Json.Linq;
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();
AboutForm about = new AboutForm();
public string appSecret { get; set; }
public string appID { get; set; }
public string userID { get; set; }
public string userAuthToken { get; set; }
public string altLoginValue { get; set; }
string errorLog = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), "Latest_Error.log");
string dllCheck = Path.Combine(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 async void LoginFrm_Load(object sender, EventArgs e)
{
// 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();
userIdTextbox.Text = Settings.Default.savedUserID.ToString();
userAuthTokenTextbox.Text = Settings.Default.savedUserAuthToken.ToString();
altLoginValue = Settings.Default.savedAltLoginValue.ToString();
// Set alt login mode & label text based on saved value
if (altLoginValue == "0")
{
// Change alt login label text
altLoginLabel.Text = "Can't login? Click here";
// Hide alt login methods
altLoginTutLabel.Visible = false;
userIdTextbox.Visible = false;
userAuthTokenTextbox.Visible = false;
// Unhide standard login methods
emailTextbox.Visible = true;
passwordTextbox.Visible = true;
}
else if (altLoginValue == "1")
{
// Change alt login label text
altLoginLabel.Text = "Login normally? Click here";
// Hide standard login methods
emailTextbox.Visible = false;
passwordTextbox.Visible = false;
// Unhide alt login methods
altLoginTutLabel.Visible = true;
userIdTextbox.Visible = true;
userAuthTokenTextbox.Visible = true;
}
// Set values for email textbox.
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";
}
// Set values for user_id textbox.
if (userIdTextbox.Text != "user_id")
{
userIdTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
if (userIdTextbox.Text == null | userIdTextbox.Text == "")
{
userIdTextbox.ForeColor = Color.FromArgb(88, 92, 102);
userIdTextbox.Text = "user_id";
}
// Set values for password textbox.
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";
}
// Set values for user_auth_token textbox.
if (userAuthTokenTextbox.Text != "user_auth_token")
{
userAuthTokenTextbox.PasswordChar = '*';
userAuthTokenTextbox.UseSystemPasswordChar = false;
userAuthTokenTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
if (userAuthTokenTextbox.Text == null | userAuthTokenTextbox.Text == "")
{
userAuthTokenTextbox.ForeColor = Color.FromArgb(88, 92, 102);
userAuthTokenTextbox.UseSystemPasswordChar = true;
userAuthTokenTextbox.Text = "user_auth_token";
}
try
{
// Create HttpClient to grab version number from Github
var versionURLClient = new HttpClient();
// Run through TLS to allow secure connection.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
// Set user-agent to Firefox.
versionURLClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0");
// Grab response from Github to get Track IDs from Album response.
var versionURL = "https://api.github.com/repos/ImAiiR/QobuzDownloaderX/releases/latest";
var versionURLResponse = await versionURLClient.GetAsync(versionURL);
string versionURLResponseString = versionURLResponse.Content.ReadAsStringAsync().Result;
// Grab metadata from API JSON response
JObject joVersionResponse = JObject.Parse(versionURLResponseString);
// Grab latest version number
string version = (string)joVersionResponse["tag_name"];
// Grab changelog
string changes = (string)joVersionResponse["body"];
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\nChangelog Below\r\n==============\r\n" + changes.Replace("\\r\\n", "\r\n") + "\r\n==============\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.
}
}
}
private void loginButton_Click(object sender, EventArgs e)
{
// Hide alt login label until job is finished or failed
altLoginLabel.Visible = false;
switch (altLoginValue)
{
// If logging in normally (email & password)
case "0":
#region Normal Login
#region Check if textboxes are valid
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;
}
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;
}
#endregion
string plainTextPW = passwordTextbox.Text;
var passMD5CheckLog = Regex.Match(plainTextPW, "(?<md5Test>^[0-9a-f]{32}$)").Groups;
var passMD5Check = passMD5CheckLog[1].Value;
if (passMD5Check == null | passMD5Check == "")
{
// 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;
}
}
}
// Save info locally to be used on next launch.
Settings.Default.savedEmail = emailTextbox.Text;
Settings.Default.savedPassword = passwordTextbox.Text;
Settings.Default.savedAltLoginValue = altLoginValue;
Settings.Default.Save();
loginText.Text = "Getting App ID and Secret...";
loginButton.Enabled = false;
getSecretBG.RunWorkerAsync();
#endregion
break;
default:
#region Alt Login
#region Check if textboxes are valid
if (userIdTextbox.Text == "user_id" | userIdTextbox.Text == null | userIdTextbox.Text == "")
{
// If there's no email typed in.
loginText.Invoke(new Action(() => loginText.Text = "No user_id, please input user_id first."));
return;
}
if (userAuthTokenTextbox.Text == "user_auth_token")
{
// If there's no password typed in.
loginText.Invoke(new Action(() => loginText.Text = "No user_auth_token typed, please input user_auth_token first."));
return;
}
#endregion
// Set user_id & user_auth_token to login.
userID = userIdTextbox.Text;
userAuthToken = userAuthTokenTextbox.Text;
// Save info locally to be used on next launch.
Settings.Default.savedUserID = userIdTextbox.Text;
Settings.Default.savedUserAuthToken = userAuthTokenTextbox.Text;
Settings.Default.savedAltLoginValue = altLoginValue;
Settings.Default.Save();
loginText.Text = "Getting App ID and Secret...";
loginButton.Enabled = false;
getSecretBG.RunWorkerAsync();
#endregion
break;
}
}
private void getSecretBG_DoWork(object sender, DoWorkEventArgs e)
{
getSecretBG.WorkerSupportsCancellation = true;
WebClient bundleURLClient = new WebClient();
bundleURLClient.Proxy = null;
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.algier\\):f.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));
altLoginLabel.Invoke(new Action(() => altLoginLabel.Visible = true));
return;
}
bundleWR.Abort();
if (altLoginValue == "0")
{
loginBG.RunWorkerAsync();
}
else if (altLoginValue == "1")
{
altLoginBG.RunWorkerAsync();
}
getSecretBG.CancelAsync();
}
private async void loginBG_DoWork(object sender, DoWorkEventArgs e)
{
loginBG.WorkerSupportsCancellation = true;
// Create HttpClient for logging in using Napster / Rhapsody API.
var loginClient = new HttpClient();
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; //Make connection secure
loginClient.DefaultRequestHeaders.Add("Authorization", "Basic WlRKbE9XTmhaR1V0TnpsbVpTMDBaR1UyTFRrd1lqTXRaRGsxT0RSbE1Ea3dPRE01Ok1UUmpaVFZqTTJFdE9HVmxaaTAwT1RVM0xXRm1Oamt0TlRsbE9ERmhObVl5TnpJNQ=="); //This value is from logging in to the Napster Android app.
// Create HttpClient to grab Track ID
var loginClient2 = new HttpClient();
// Run through TLS to allow secure connection.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
// Set user-agent to Firefox.
loginClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0");
var loginURL = "https://www.qobuz.com/api.json/0.2/user/login"; //Set base URL
var parameters = new Dictionary<string, string> { { "username", emailTextbox.Text }, { "email", emailTextbox.Text }, { "password", passwordTextbox.Text }, { "extra", "partner" }, { "app_id", appID } }; //Set email & password parameters
var encodedContent = new FormUrlEncodedContent(parameters); //Add parameters as encoded content to login
// Grab response from Rhapsody to get Track IDs from Album response.
var loginUrl = "https://www.qobuz.com/api.json/0.2/user/login?email=" + emailTextbox.Text + "&password=" + passwordTextbox.Text + "&app_id=" + appID;
var loginResponse = await loginClient.PostAsync(loginURL, encodedContent);
string loginResponseString = loginResponse.Content.ReadAsStringAsync().Result;
// Grab metadata from API JSON response
JObject joLoginResponse = JObject.Parse(loginResponseString);
try
{
// Grab user_id
string userID = (string)joLoginResponse["user"]["id"];
qbdlx.userID = userID;
// Grab display name
string displayName = (string)joLoginResponse["user"]["display_name"];
qbdlx.displayName = displayName;
// Grab account type
try
{
string accountType = (string)joLoginResponse["user"]["credential"]["parameters"]["short_label"];
// Check if accountType returns null or not
switch (accountType)
{
case null:
qbdlx.accountType = null;
break;
default:
qbdlx.accountType = accountType;
break;
}
}
catch
{
// Free account, still able to login but won't be able to download anything.
qbdlx.accountType = null;
}
// Grab authentication token
string userAuthToken = (string)joLoginResponse["user_auth_token"];
qbdlx.userAuth = userAuthToken;
// Grab profile image
string profilePic = (string)joLoginResponse["user"]["avatar"];
string profilePicURL = profilePic.Replace(@"\", null).Replace("s=50", "s=20");
qbdlx.profilePic = profilePicURL;
// Set user_auth_token
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);
loginButton.Invoke(new Action(() => loginButton.Enabled = true));
altLoginLabel.Invoke(new Action(() => altLoginLabel.Visible = true));
return;
}
finishLogin(sender, e);
loginBG.CancelAsync();
}
private async void altLoginBG_DoWork(object sender, DoWorkEventArgs e)
{
altLoginBG.WorkerSupportsCancellation = true;
// Create HttpClient to grab Track ID
var altLoginClient = new HttpClient();
// Run through TLS to allow secure connection.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
// Set user-agent to Firefox.
altLoginClient.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0");
// Grab response from Rhapsody to get Track IDs from Album response.
var altLoginUrl = "http://www.qobuz.com/api.json/0.2/user/get?user_id=" + userID + "&user_auth_token=" + userAuthToken + "&app_id=" + appID;
var altLoginResponse = await altLoginClient.GetAsync(altLoginUrl);
string altLoginResponseString = altLoginResponse.Content.ReadAsStringAsync().Result;
// Grab metadata from API JSON response
JObject joAltLoginResponse = JObject.Parse(altLoginResponseString);
try
{
// Use user_id that was used by the user
qbdlx.userID = userID;
// Use user_auth_token that was used by the user
qbdlx.userAuth = userAuthToken;
// Grab display name
string displayName = (string)joAltLoginResponse["display_name"];
qbdlx.displayName = displayName;
// Grab account type
try
{
string accountType = (string)joAltLoginResponse["subscription"]["offer"];
// Check if accountType returns null or not
switch (accountType)
{
case null:
qbdlx.accountType = null;
break;
default:
qbdlx.accountType = accountType;
break;
}
}
catch
{
// Free account, still able to login but won't be able to download anything.
qbdlx.accountType = null;
}
// Grab profile image
string profilePic = (string)joAltLoginResponse["avatar"];
var profilePicURL = profilePic.Replace(@"\", null).Replace("s=50", "s=20");
qbdlx.profilePic = profilePicURL;
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);
loginButton.Invoke(new Action(() => loginButton.Enabled = true));
altLoginLabel.Invoke(new Action(() => altLoginLabel.Visible = true));
return;
}
finishLogin(sender, e);
altLoginBG.CancelAsync();
}
private void finishLogin(object sender, EventArgs e)
{
loginButton.Invoke(new Action(() => loginButton.Enabled = true));
altLoginLabel.Invoke(new Action(() => altLoginLabel.Visible = 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);
}
}
#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 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 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
#region user_id Textbox
private void userIdTextbox_Click(object sender, EventArgs e)
{
if (userIdTextbox.Text == "user_id")
{
userIdTextbox.Text = null;
userIdTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
}
private void userIdTextbox_Leave(object sender, EventArgs e)
{
if (userIdTextbox.Text == null | userIdTextbox.Text == "")
{
userIdTextbox.ForeColor = Color.FromArgb(88, 92, 102);
userIdTextbox.Text = "user_id";
}
}
#endregion
#region user_auth_token Textbox
private void userAuthTokenTextbox_Click(object sender, EventArgs e)
{
if (userAuthTokenTextbox.Text == "user_auth_token")
{
userAuthTokenTextbox.Text = null;
userAuthTokenTextbox.PasswordChar = '*';
userAuthTokenTextbox.UseSystemPasswordChar = false;
userAuthTokenTextbox.ForeColor = Color.FromArgb(186, 186, 186);
}
}
private void userAuthTokenTextbox_Leave(object sender, EventArgs e)
{
if (userAuthTokenTextbox.Text == null | userAuthTokenTextbox.Text == "")
{
userAuthTokenTextbox.ForeColor = Color.FromArgb(88, 92, 102);
userAuthTokenTextbox.UseSystemPasswordChar = true;
userAuthTokenTextbox.Text = "user_auth_token";
}
}
#endregion
#endregion
private void visableCheckbox_CheckedChanged(object sender, EventArgs e)
{
if (visableCheckbox.Checked == true)
{
passwordTextbox.UseSystemPasswordChar = true;
userAuthTokenTextbox.UseSystemPasswordChar = true;
}
else
{
passwordTextbox.UseSystemPasswordChar = false;
userAuthTokenTextbox.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 altLoginLabel_Click(object sender, EventArgs e)
{
if (altLoginLabel.Text == "Can't login? Click here")
{
// Set value if alt login is needed.
altLoginValue = "1";
// Change alt login label text
altLoginLabel.Text = "Login normally? Click here";
// Hide standard login methods
emailTextbox.Visible = false;
passwordTextbox.Visible = false;
// Unhide alt login methods
altLoginTutLabel.Visible = true;
userIdTextbox.Visible = true;
userAuthTokenTextbox.Visible = true;
}
else
{
// Set value if alt login is not needed.
altLoginValue = "0";
// Change alt login label text
altLoginLabel.Text = "Can't login? Click here";
// Hide alt login methods
altLoginTutLabel.Visible = false;
userIdTextbox.Visible = false;
userAuthTokenTextbox.Visible = false;
// Unhide standard login methods
emailTextbox.Visible = true;
passwordTextbox.Visible = true;
}
}
private void altLoginTutLabel_Click(object sender, EventArgs e)
{
Process.Start("https://github.com/ImAiiR/QobuzDownloaderX/wiki/Logging-In-(The-Alternate-Way)");
}
private void aboutLabel_Click(object sender, EventArgs e)
{
about.Show();
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,7 @@ namespace QobuzDownloaderX
{
Application.EnableVisualStyles();
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
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.9.8.7")]
[assembly: AssemblyFileVersion("0.9.8.7")]
[assembly: AssemblyVersion("0.9.9.23")]
[assembly: AssemblyFileVersion("0.9.9.23")]

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>
/// Looks up a localized resource of type System.Drawing.Bitmap.
/// </summary>
@ -79,5 +89,15 @@ namespace QobuzDownloaderX.Properties {
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>
</resheader>
<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">
<value>..\Resources\qbdlx.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value>
</data>
<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>
</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>

View File

@ -382,5 +382,101 @@ namespace QobuzDownloaderX.Properties {
this["audioType"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string savedUserID {
get {
return ((string)(this["savedUserID"]));
}
set {
this["savedUserID"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string savedUserAuthToken {
get {
return ((string)(this["savedUserAuthToken"]));
}
set {
this["savedUserAuthToken"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("0")]
public string savedAltLoginValue {
get {
return ((string)(this["savedAltLoginValue"]));
}
set {
this["savedAltLoginValue"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("1")]
public int savedArtSize {
get {
return ((int)(this["savedArtSize"]));
}
set {
this["savedArtSize"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("True")]
public bool typeTag {
get {
return ((bool)(this["typeTag"]));
}
set {
this["typeTag"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("36")]
public int savedMaxLength {
get {
return ((int)(this["savedMaxLength"]));
}
set {
this["savedMaxLength"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("1")]
public int savedFilenameTemplate {
get {
return ((int)(this["savedFilenameTemplate"]));
}
set {
this["savedFilenameTemplate"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string savedFilenameTemplateString {
get {
return ((string)(this["savedFilenameTemplateString"]));
}
set {
this["savedFilenameTemplateString"] = value;
}
}
}
}

View File

@ -92,5 +92,29 @@
<Setting Name="audioType" Type="System.String" Scope="User">
<Value Profile="(Default)">.flac</Value>
</Setting>
<Setting Name="savedUserID" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="savedUserAuthToken" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="savedAltLoginValue" Type="System.String" Scope="User">
<Value Profile="(Default)">0</Value>
</Setting>
<Setting Name="savedArtSize" Type="System.Int32" Scope="User">
<Value Profile="(Default)">1</Value>
</Setting>
<Setting Name="typeTag" Type="System.Boolean" Scope="User">
<Value Profile="(Default)">True</Value>
</Setting>
<Setting Name="savedMaxLength" Type="System.Int32" Scope="User">
<Value Profile="(Default)">36</Value>
</Setting>
<Setting Name="savedFilenameTemplate" Type="System.Int32" Scope="User">
<Value Profile="(Default)">1</Value>
</Setting>
<Setting Name="savedFilenameTemplateString" Type="System.String" Scope="User">
<Value Profile="(Default)"> </Value>
</Setting>
</Settings>
</SettingsFile>

View File

@ -52,6 +52,10 @@
<ApplicationIcon>Resources\qbdlx_icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="policy.2.0.taglib-sharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=db62eba44689b5b0, processorArchitecture=MSIL">
<HintPath>..\packages\taglib.2.1.0.0\lib\policy.2.0.taglib-sharp.dll</HintPath>
<Private>True</Private>
@ -79,6 +83,18 @@
<Compile Include="Form1.Designer.cs">
<DependentUpon>Form1.cs</DependentUpon>
</Compile>
<Compile Include="AboutForm.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="AboutForm.Designer.cs">
<DependentUpon>AboutForm.cs</DependentUpon>
</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">
<SubType>Form</SubType>
</Compile>
@ -97,6 +113,12 @@
<EmbeddedResource Include="Form1.resx">
<DependentUpon>Form1.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="AboutForm.resx">
<DependentUpon>AboutForm.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="LoginForm-v2.resx">
<DependentUpon>LoginForm-v2.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="searchForm.resx">
<DependentUpon>searchForm.cs</DependentUpon>
</EmbeddedResource>
@ -148,6 +170,12 @@
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<None Include="Resources\login-frame.png" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\qbdlx-white.png" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,4 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.3" targetFramework="net46" />
<package id="taglib" version="2.1.0.0" targetFramework="net46" />
</packages>

View File

@ -60,7 +60,7 @@ namespace QobuzDownloaderX
string searchRequest = searchsr.ReadToEnd();
// Remove backslashes from the stream URL to have a proper URL.
string resultpattern = "\"maximum_sampling_rate\":(?<sampleRate>.*?),(?:.*?)\",\"id\":\"(?<albumID>.*?)\",\"maximum_bit_depth\":(?<bitDepth>.*?),(?:.*?)\"title\":\"(?<albumTitle>.*?)\",\"(?:.*?)\"artist\":(?:.*?)\"name\":\"(?<albumArtist>.*?)\"";
string resultpattern = "\"maximum_bit_depth\":(?<bitDepth>.*?),(?:.*?),\"artist\":(?:.*?)\"name\":\"(?<albumArtist>.*?)\",(?:.*?)\"title\":\"(?<albumTitle>.*?)\"(?:.*?),\"maximum_channel_count\":(?:.*?),\"id\":\"(?<albumID>.*?)\",\"maximum_sampling_rate\":(?<sampleRate>.*?),\"";
string resultinput = searchRequest;
RegexOptions resultoptions = RegexOptions.Multiline;

View File

@ -1 +1,41 @@
# 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>
</p>
<center><a href="https://www.buymeacoffee.com/ImAiiR" target="_blank"><img src="https://i.imgur.com/H2hMOg6.png" alt="Buy Me A Coffee" style="height: 51px !important;width: 217px !important;" ></a></center>
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>
Telegram Group Chat - <a href="https://t.me/QbdLX">@QbdLX</a><br />
Telegram Updates Channel - <a href="https://t.me/QobuzDownloaderX">@QobuzDownloaderX</a><br />
I'm rarely active on Telegram, but these are official.
# 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