diff --git a/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/5b395812-1833-4e08-92cb-d32df91da63c.vsidx b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/5b395812-1833-4e08-92cb-d32df91da63c.vsidx new file mode 100644 index 0000000..c1f3f7e Binary files /dev/null and b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/5b395812-1833-4e08-92cb-d32df91da63c.vsidx differ diff --git a/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/62540623-228b-4a97-bfb9-0d29679308e4.vsidx b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/62540623-228b-4a97-bfb9-0d29679308e4.vsidx new file mode 100644 index 0000000..2cae50e Binary files /dev/null and b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/62540623-228b-4a97-bfb9-0d29679308e4.vsidx differ diff --git a/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/6f8fd3c8-54dc-4000-9590-fad97cc1e7cd.vsidx b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/6f8fd3c8-54dc-4000-9590-fad97cc1e7cd.vsidx new file mode 100644 index 0000000..1bcfff6 Binary files /dev/null and b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/6f8fd3c8-54dc-4000-9590-fad97cc1e7cd.vsidx differ diff --git a/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/a0f15790-a26d-45a8-bcb5-496e1449d68f.vsidx b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/a0f15790-a26d-45a8-bcb5-496e1449d68f.vsidx new file mode 100644 index 0000000..d1e4741 Binary files /dev/null and b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/a0f15790-a26d-45a8-bcb5-496e1449d68f.vsidx differ diff --git a/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/a583c6cf-732c-4720-97dd-bda00d71e863.vsidx b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/a583c6cf-732c-4720-97dd-bda00d71e863.vsidx new file mode 100644 index 0000000..5fa6f25 Binary files /dev/null and b/SpotifyABClient/.vs/SpotifyAB/FileContentIndex/a583c6cf-732c-4720-97dd-bda00d71e863.vsidx differ diff --git a/SpotifyABClient/Dashboard.Designer.cs b/SpotifyABClient/Dashboard.Designer.cs new file mode 100644 index 0000000..60c8f37 --- /dev/null +++ b/SpotifyABClient/Dashboard.Designer.cs @@ -0,0 +1,188 @@ +namespace SpotifyAB +{ + partial class Dashboard + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Dashboard)); + linkLabel1 = new LinkLabel(); + logBox = new TextBox(); + installBtn = new Button(); + issuebtn = new Button(); + devbtn = new Button(); + groupBox1 = new GroupBox(); + uninstallABbtn = new Button(); + overri = new Button(); + groupBox1.SuspendLayout(); + SuspendLayout(); + // + // linkLabel1 + // + linkLabel1.ActiveLinkColor = Color.Lime; + linkLabel1.AutoSize = true; + linkLabel1.Cursor = Cursors.Help; + linkLabel1.Font = new Font("Helvetica", 25F, FontStyle.Bold); + linkLabel1.LinkBehavior = LinkBehavior.HoverUnderline; + linkLabel1.LinkColor = Color.Black; + linkLabel1.Location = new Point(16, 9); + linkLabel1.Margin = new Padding(4, 0, 4, 0); + linkLabel1.Name = "linkLabel1"; + linkLabel1.Size = new Size(268, 59); + linkLabel1.TabIndex = 0; + linkLabel1.TabStop = true; + linkLabel1.Text = "SpotifyAB"; + linkLabel1.TextAlign = ContentAlignment.MiddleCenter; + linkLabel1.VisitedLinkColor = Color.FromArgb(64, 64, 64); + linkLabel1.LinkClicked += linkLabel1_LinkClicked; + // + // logBox + // + logBox.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + logBox.BackColor = SystemColors.ButtonHighlight; + logBox.BorderStyle = BorderStyle.FixedSingle; + logBox.Font = new Font("Consolas", 10F); + logBox.Location = new Point(12, 89); + logBox.Margin = new Padding(4, 3, 4, 3); + logBox.MaxLength = 1000; + logBox.MinimumSize = new Size(926, 270); + logBox.Multiline = true; + logBox.Name = "logBox"; + logBox.ReadOnly = true; + logBox.ScrollBars = ScrollBars.Vertical; + logBox.Size = new Size(930, 270); + logBox.TabIndex = 1; + logBox.WordWrap = false; + // + // installBtn + // + installBtn.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right; + installBtn.Location = new Point(6, 32); + installBtn.Name = "installBtn"; + installBtn.Size = new Size(292, 106); + installBtn.TabIndex = 2; + installBtn.Text = "Install AB to Spotify"; + installBtn.UseVisualStyleBackColor = true; + installBtn.Click += installBtn_Click; + // + // issuebtn + // + issuebtn.Anchor = AnchorStyles.Top | AnchorStyles.Right; + issuebtn.Location = new Point(831, 12); + issuebtn.MinimumSize = new Size(112, 71); + issuebtn.Name = "issuebtn"; + issuebtn.Size = new Size(112, 71); + issuebtn.TabIndex = 3; + issuebtn.Text = "Report a \r\nBug"; + issuebtn.UseVisualStyleBackColor = true; + issuebtn.Click += issuebtn_Click; + // + // devbtn + // + devbtn.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + devbtn.Location = new Point(642, 499); + devbtn.Name = "devbtn"; + devbtn.Size = new Size(301, 110); + devbtn.TabIndex = 4; + devbtn.Text = "Enable Dev Tools"; + devbtn.UseVisualStyleBackColor = true; + devbtn.Click += devbtn_Click; + // + // groupBox1 + // + groupBox1.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + groupBox1.Controls.Add(uninstallABbtn); + groupBox1.Controls.Add(installBtn); + groupBox1.Location = new Point(12, 365); + groupBox1.Name = "groupBox1"; + groupBox1.Size = new Size(304, 244); + groupBox1.TabIndex = 5; + groupBox1.TabStop = false; + groupBox1.Text = "SpotifyAB Management"; + // + // uninstallABbtn + // + uninstallABbtn.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right; + uninstallABbtn.Location = new Point(6, 144); + uninstallABbtn.Name = "uninstallABbtn"; + uninstallABbtn.Size = new Size(292, 94); + uninstallABbtn.TabIndex = 6; + uninstallABbtn.Text = "Uninstall AB from Spotify"; + uninstallABbtn.UseVisualStyleBackColor = true; + uninstallABbtn.Click += uninstallABbtn_Click; + // + // overri + // + overri.Anchor = AnchorStyles.Bottom; + overri.Location = new Point(397, 535); + overri.Name = "overri"; + overri.Size = new Size(161, 74); + overri.TabIndex = 6; + overri.Text = "Override Options"; + overri.UseVisualStyleBackColor = true; + overri.Click += overri_Click; + // + // Dashboard + // + AccessibleDescription = "SpotifyAB Client App. Can Block Spotify Ads and trackers."; + AccessibleName = "SpotifyAB"; + AutoScaleDimensions = new SizeF(13F, 25F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = SystemColors.Control; + ClientSize = new Size(955, 621); + Controls.Add(overri); + Controls.Add(groupBox1); + Controls.Add(devbtn); + Controls.Add(issuebtn); + Controls.Add(logBox); + Controls.Add(linkLabel1); + Font = new Font("Helvetica", 11F, FontStyle.Regular, GraphicsUnit.Point, 0); + Icon = (Icon)resources.GetObject("$this.Icon"); + Margin = new Padding(4, 3, 4, 3); + MinimumSize = new Size(977, 677); + Name = "Dashboard"; + StartPosition = FormStartPosition.CenterScreen; + Text = "SpotifyAB Dashboard"; + WindowState = FormWindowState.Maximized; + Load += Dashboard_Load; + groupBox1.ResumeLayout(false); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + + private LinkLabel linkLabel1; + private Button installBtn; + private Button issuebtn; + private Button devbtn; + private GroupBox groupBox1; + private Button uninstallABbtn; + private Button overri; + private static TextBox logBox; + } +} diff --git a/SpotifyABClient/Dashboard.cs b/SpotifyABClient/Dashboard.cs new file mode 100644 index 0000000..984ef48 --- /dev/null +++ b/SpotifyABClient/Dashboard.cs @@ -0,0 +1,611 @@ +using Microsoft.Win32; +using SharpCompress.Common; +using SharpCompress.Readers; +using System.Diagnostics; +using System.Runtime.InteropServices; +using System.Timers; + + +namespace SpotifyAB; + +public partial class Dashboard : Form +{ + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool FlashWindow(IntPtr hwnd, bool bInvert); + private ToolTip toolTip1; // Declare ToolTip component + + public Dashboard() + { + InitializeComponent(); + + BlockSpotify(); + + // Call startup method + startup(); + log("SpotifyAB has successfully started"); + } + + + + // Block Spotify from running while SpotifyAB is running + private void BlockSpotify() + { + var timer = new System.Timers.Timer(); + timer.Interval = 1500; // Check every 1.5 seconds + timer.Elapsed += CheckAndKillSpotify; + timer.Start(); + } + + private void CheckAndKillSpotify(object sender, ElapsedEventArgs e) + { + try + { + var processes = Process.GetProcessesByName("Spotify"); + if (processes.Length > 0) + { + foreach (var process in processes) + { + if (!process.HasExited) + { + process.EnableRaisingEvents = true; + process.Exited += (s, args) => + { + this.Invoke((MethodInvoker)delegate + { + FlashWindow(this.Handle, true); // Flash the window in the taskbar + }); + }; + process.Kill(); + log("Spotify has been closed in order to avoid conflicts with SpotifyAB."); + } + } + } + } + catch (Exception ex) + { + this.Invoke((MethodInvoker)delegate + { + MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); // Show error message if an exception occurs while checking if Spotify is running + }); + } + } + + + public void startup() + { + log("Starting SpotifyAB"); + + // Initialize ToolTip component + toolTip1 = new ToolTip(); + + // Associate ToolTip with LinkLabel control + toolTip1.SetToolTip(linkLabel1, "Visit SpotifyAB's GitHub Repository"); // Tooltip message for LinkLabel + + // Check if Spotify is Installed + if (File.Exists(@"C:\Users\" + Environment.UserName + @"\AppData\Roaming\Spotify\Spotify.exe")) + { + log("Spotify is installed on this machine"); + // Check if SpotifyAB is already installed + var openSubKey = Registry.CurrentUser.OpenSubKey("Software\\SpotifyAB"); + var installed = 0; + if (openSubKey != null) + { + var value = openSubKey.GetValue("Installed"); + if (value.ToString() == "True") installed = 1; + } + + if (installed == 1) + { + installBtn.Enabled = false; + uninstallABbtn.Enabled = true; + log("It seems, that SpotifyAB is already installed."); + } + else + { + installBtn.Enabled = true; + uninstallABbtn.Enabled = false; + log("It seems, that SpotifyAB is not yet installed."); + } + } + else + { + log("Spotify is not installed on this machine. Or at least not the correct version."); + log("Install Spotify (direct link): https://download.scdn.co/SpotifySetup.exe"); + MessageBox.Show( + "Please install Spotify first.\r\nNote: SpotifyAB works only on Windows Desktop (Microsoft store version is not supported.)", + "Not Installed", MessageBoxButtons.OK, + MessageBoxIcon.Error); // Show error message if Spotify is not installed + var answer = MessageBox.Show("Do you want to open the Spotify download page?", "Download Spotify", + MessageBoxButtons.YesNo, + MessageBoxIcon.Question); // Show confirmation message before opening the Spotify download page + if (answer == DialogResult.Yes) + { + string url = "https://www.spotify.com/download/windows/#download-cdn"; // Set Spotify download page URL + try + { + // Open URL in default web browser + Process.Start(new ProcessStartInfo + { + FileName = url, + UseShellExecute = true + }); + } + catch (Exception ex) + { + MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); // Show error message if an exception occurs while opening URL + } + } // Open the Spotify download page + else + { + log("Spotify download page has been canceled."); + } + + // put Registry key to false + try + { + var key = Registry.CurrentUser.CreateSubKey("Software\\SpotifyAB"); + key.SetValue("Installed", "False"); + key.Close(); + } + catch (Exception r) + { + MessageBox.Show($"An error occurred: {r.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + log("An error occurred while saving success to registry (CurrentUser\\Software\\SpotifyAB)"); + log(r.InnerException.ToString()); + } + + // Disable all buttons + installBtn.Enabled = false; + uninstallABbtn.Enabled = false; + devbtn.Enabled = false; + } + } + + public static void log(string message) + { + //Check if the TextBox has reached the maximum number of lines + if (logBox.Lines.Length > 1000) + // Clear TextBox if the maximum number of lines is reached + logBox.Clear(); + + //get the current date and time + var dateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + // Append message to TextBox + logBox.AppendText($"[{dateTime}] - {message}\r\n"); + } + + private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + var url = "https://www.github.com/An0n-00/SpotifyAB"; // Set Repository URL + + try + { + // Open URL in default web browser + Process.Start(new ProcessStartInfo + { + FileName = url, + UseShellExecute = true + }); + } + catch (Exception ex) + { + MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); // Show error message if an exception occurs while opening URL + } + } + + private async void installBtn_Click(object sender, EventArgs e) + { + try + { + int success = 0; + var fileUrl = "https://github.com/An0n-00/SpotifyAB/releases/latest/download/xpui.spa"; + var downloadPath = AppDomain.CurrentDomain.BaseDirectory + "\\xpui.spa"; + var destinationPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui.spa"; + + var openSubKey = Registry.CurrentUser.OpenSubKey("Software\\SpotifyAB"); + var installed = 0; + + // Check if spotifyAB is already installed + if (openSubKey != null) + { + var value = openSubKey.GetValue("Installed"); + if (value.ToString() == "True") installed = 1; + } + + + // Backup the original file + if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui.spa") && installed != 1) + { + if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui-original.spa")) + File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui-original.spa"); + + File.Move(destinationPath, + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui-original.spa"); + } + else + { + MessageBox.Show( + "Spotify is not installed properly on this machine. Please reinstall Spotify first.", + "Broken Install", MessageBoxButtons.OK, MessageBoxIcon.Error); + log("Spotify is not installed properly on this machine. Please reinstall Spotify first."); + log("Install Spotify (direct link): https://download.scdn.co/SpotifySetup.exe"); + success = 1; + return; + } + + try + { + using (var client = new HttpClient()) + { + using (var response = await client.GetAsync(fileUrl, HttpCompletionOption.ResponseHeadersRead)) + { + // Disable all controls in the current form + Enabled = false; + + // Create a new form with a progress bar + // Create a new form with a progress bar + var progressForm = new Form + { + Size = new Size(399, 110), // Set the initial size + MinimumSize = new Size(399, 109), // Set the minimum size + MaximumSize = new Size(400, 110), // Set the maximum size + StartPosition = FormStartPosition.CenterScreen, // Set the start position + Text = "Installing AB" // Set the title + }; + + var progressBar = new ProgressBar + { Style = ProgressBarStyle.Continuous, Dock = DockStyle.Fill }; + progressForm.Controls.Add(progressBar); + progressForm.Show(); + + var contentLength = response.Content.Headers.ContentLength.GetValueOrDefault(); + var totalBytes = 0L; + + using (var stream = new FileStream(downloadPath, FileMode.Create, FileAccess.Write, + FileShare.None)) + { + var buffer = new byte[8192]; + var length = 0; + + while ((length = await response.Content.ReadAsStreamAsync().Result + .ReadAsync(buffer, 0, buffer.Length)) > 0) + { + await stream.WriteAsync(buffer, 0, length); + totalBytes += length; + + // Update the progress bar + progressBar.Value = (int)((double)totalBytes / contentLength * 100); + } + } + + // Close the progress form and enable all controls in the current form + progressForm.Close(); + Enabled = true; + } + } + } + catch (Exception d) + { + MessageBox.Show($"An error occurred: {d.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + log("An error occurred while downloading the file."); + log(d.InnerException.ToString()); + success = 1; + return; + } + + // Move the downloaded file to the Spotify directory + try + { + if (installed == 1) File.Delete(destinationPath); + File.Move(downloadPath, destinationPath); + + // Unzip the file + try + { + using (var stream = File.OpenRead(destinationPath)) + using (var reader = ReaderFactory.Open(stream)) + { + while (reader.MoveToNextEntry()) + { + if (!reader.Entry.IsDirectory) + { + reader.WriteEntryToDirectory(Path.GetDirectoryName(destinationPath), new ExtractionOptions() { ExtractFullPath = true, Overwrite = true }); + } + } + } + } + catch (Exception ex) + { + MessageBox.Show($"An error occurred while unzipping the file: {ex.Message}", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); + log("An error occurred while unzipping the file."); + log(ex.InnerException.ToString()); + success = 1; + return; + } + } + catch (Exception m) + { + MessageBox.Show($"An error occurred: {m.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + log("An error occurred while moving the file."); + log(m.InnerException.ToString()); + success = 1; + return; + } + + try + { + // Open the key or create it if it doesn't exist + var key = Registry.CurrentUser.CreateSubKey("Software\\SpotifyAB"); + + // Set the value + key.SetValue("Installed", "True"); + + // Close the key + key.Close(); + } + catch (Exception r) + { + MessageBox.Show($"An error occurred: {r.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + log("An error occurred while saving success to registry (CurrentUser\\Software\\SpotifyAB)"); + log(r.InnerException.ToString()); + success = 1; + } + + if (success != 1) + { + MessageBox.Show("SpotifyAB has been installed successfully.\r\nEnjoy your music!", "Success", + MessageBoxButtons.OK, MessageBoxIcon.Exclamation); + log("SpotifyAB has been installed successfully."); + installBtn.Enabled = false; + uninstallABbtn.Enabled = true; + } + } + catch (Exception f) + { + MessageBox.Show($"An error occurred: {f.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + + private void issuebtn_Click(object sender, EventArgs e) + { + var url = "https://www.github.com/An0n-00/SpotifyAB/issues"; // Set Repository URL + + try + { + // Open URL in default web browser + Process.Start(new ProcessStartInfo + { + FileName = url, + UseShellExecute = true + }); + } + catch (Exception ex) + { + MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); // Show error message if an exception occurs while opening URL + } + } + + private int DownloadAndRunScript(ref int success) + { + try + { + var scriptUrl = + "https://raw.githubusercontent.com/An0n-00/SpotifyAB/main/analyze-tools/dev-tools/Enable-Dev-Tools-for-spotify.ps1"; + var installationFolder = AppDomain.CurrentDomain.BaseDirectory + "\\addons\\"; + var scriptPath = installationFolder + "enable-dev.ps1"; + if (!Directory.Exists(installationFolder)) Directory.CreateDirectory(installationFolder); + // Download the script + using (var client = new HttpClient()) + { + var content = client.GetByteArrayAsync(scriptUrl).Result; + File.WriteAllBytes(scriptPath, content); + } + var process = new Process(); + process.StartInfo.FileName = "powershell.exe"; + process.StartInfo.Arguments = $"-ExecutionPolicy Bypass -File \"{scriptPath}\""; + process.StartInfo.UseShellExecute = false; + process.StartInfo.CreateNoWindow = true; + process.StartInfo.RedirectStandardOutput = true; + process.Start(); + IntPtr maxWorkingSet = process.MaxWorkingSet; + process.WaitForExit(); + int exitCode = process.ExitCode; + if (exitCode == 0) + { + return success = 0; + } + else if (exitCode == 1) + { + return success = 1; + } + else if (exitCode == 2) + { + return success = 2; + } + else if (exitCode == 3) + { + return success = 3; + } + else if (success == 4) + { + return success = 4; + } + else if (success == 5) + { + return success = 5; + } + else + { + return success = 1; + } + } + catch (Exception e) + { + MessageBox.Show($"An error occurred: {e.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon + .Error); // Show error message if an exception occurs while downloading and running the PowerShell script + return success = 1; + throw; + } + } + + private void devbtn_Click(object sender, EventArgs e) + { + var answer = MessageBox.Show("Are you sure you want to enable Developer Tools for Spotify?", + "Enable Developer Tools", MessageBoxButtons.YesNo, + MessageBoxIcon.Question); // Show confirmation message before enabling Developer Tools + if (answer != DialogResult.Yes) + { + log("Enabling Developer Tools for Spotify has been canceled."); + } + else + { + var success = 0; + DownloadAndRunScript(ref success); + if (success == 0) + log("Developer Tools for Spotify has been enabled successfully. Depending on the version, the dev tools will only work one time until you enable them again."); + else if (success == 1) + log("An unknown error occurred while enabling Developer Tools for Spotify."); + else if (success == 2) + log("Could not find Spotify.exe"); + else if (success == 3) + log("Please login to Spotify first."); + else if (success == 4) + log("Could not find Spotify.exe"); + else if (success == 5) + log("Please login to Spotify first."); + + } + } + + private void uninstallABbtn_Click(object sender, EventArgs e) + { + var key = Registry.CurrentUser.OpenSubKey("Software\\SpotifyAB", true); + var success = 0; + + // Check if the key exists + if (key != null) + { + // Read the value + var value = key.GetValue("Installed"); + + if (value == null) + { + MessageBox.Show("SpotifyAB is not installed on this machine.", + "Not Installed", MessageBoxButtons.OK, MessageBoxIcon.Error); + success = 1; + } + + // Check if the value exists + if (value.ToString() != "True") + { + MessageBox.Show("SpotifyAB is not installed on this machine.", + "Not Installed", MessageBoxButtons.OK, MessageBoxIcon.Error); + success = 1; + } + else + { + try + { + // Set the value + key.SetValue("Installed", "False"); + + // Close the key + key.Close(); + } + catch (Exception r) + { + MessageBox.Show($"An error occurred: {r.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + log($"Error: {r.Message}"); + success = 1; + } + + try + { + // Delete the files + if (success == 0) + File.Delete(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui.spa"); + + if (success == 0) Directory.Delete(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui", true); + + // Restore the original + if (success == 0 && File.Exists( + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui-original.spa")) + File.Move(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui-original.spa", + Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + + "\\Spotify\\Apps\\xpui.spa"); + } + catch (Exception ex) + { + MessageBox.Show($"An error occurred: {ex.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + log($"Error: {ex.Message}"); + success = 1; + } + + if (success == 0) + { + MessageBox.Show("SpotifyAB has been uninstalled successfully.", "Success", MessageBoxButtons.OK, + MessageBoxIcon.Information); + log("SpotifyAB has been uninstalled successfully."); + installBtn.Enabled = true; + uninstallABbtn.Enabled = false; + } + else + { + MessageBox.Show("An error occurred while uninstalling SpotifyAB.", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + log("An error occurred while uninstalling SpotifyAB."); + } + } + } + else + { + MessageBox.Show("SpotifyAB is not installed on this machine.", + "Not Installed", MessageBoxButtons.OK, MessageBoxIcon.Error); + log("SpotifyAB is not installed on this machine."); + } + } + + private void overri_Click(object sender, EventArgs e) + { + var answer = MessageBox.Show("Are you sure that you want to override SpotifyAB's behavior? You might have to do this when Spotify updates and removes the SpotifyAB files.", "Override", MessageBoxButtons.YesNo, MessageBoxIcon.Question); + + if (answer == DialogResult.Yes) + { + // start overri.cs form + log("Showing override window."); + var form = new OverrideSpotifyAB(); + form.Show(); + } + else + { + log("Overriding SpotifyAB's behavior has been canceled."); + } + } + + private void Dashboard_Load(object sender, EventArgs e) + { + + } +} \ No newline at end of file diff --git a/SpotifyABClient/Dashboard.resx b/SpotifyABClient/Dashboard.resx new file mode 100644 index 0000000..bd5f57d --- /dev/null +++ b/SpotifyABClient/Dashboard.resx @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file diff --git a/SpotifyABClient/Program.cs b/SpotifyABClient/Program.cs new file mode 100644 index 0000000..634ccf0 --- /dev/null +++ b/SpotifyABClient/Program.cs @@ -0,0 +1,17 @@ +namespace SpotifyAB +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + private static void Main() + { + // To customize application configuration such as set high DPI settings or default font, + // see https://aka.ms/applicationconfiguration. + ApplicationConfiguration.Initialize(); + Application.Run(new Dashboard()); + } + } +} \ No newline at end of file diff --git a/SpotifyABClient/Properties/PublishProfiles/ClickOnceProfile.pubxml b/SpotifyABClient/Properties/PublishProfiles/ClickOnceProfile.pubxml new file mode 100644 index 0000000..e595459 --- /dev/null +++ b/SpotifyABClient/Properties/PublishProfiles/ClickOnceProfile.pubxml @@ -0,0 +1,43 @@ + + + + + 0 + 1.0.0.* + True + Release + True + https://github.com/An0n-00/SpotifyAB/issues + true + True + Web + https://github.com/An0n-00/SpotifyAB/releases/ + True + True + True + False + Any CPU + SpotifyAB + bin\Release\net8.0-windows\win-x64\app.publish\ + C:\Users\Satap\Desktop\ + An0n-00 + ClickOnce + True + True + win-x64 + True + (none) + False + false + SpotifyAB + https://github.com/An0n-00/SpotifyAB/releases + en + net8.0-windows + True + Foreground + False + Publish.html + + \ No newline at end of file diff --git a/SpotifyABClient/Properties/PublishProfiles/ClickOnceProfile.pubxml.user b/SpotifyABClient/Properties/PublishProfiles/ClickOnceProfile.pubxml.user new file mode 100644 index 0000000..fccb456 --- /dev/null +++ b/SpotifyABClient/Properties/PublishProfiles/ClickOnceProfile.pubxml.user @@ -0,0 +1,10 @@ + + + + + False|2024-08-16T09:34:11.9087291Z||; + + + \ No newline at end of file diff --git a/SpotifyABClient/Properties/PublishProfiles/FolderProfile.pubxml b/SpotifyABClient/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 0000000..ad48f8b --- /dev/null +++ b/SpotifyABClient/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,13 @@ + + + + + Release + Any CPU + bin\Release\net8.0-windows\publish\ + FileSystem + <_TargetId>Folder + + \ No newline at end of file diff --git a/SpotifyABClient/Properties/PublishProfiles/FolderProfile.pubxml.user b/SpotifyABClient/Properties/PublishProfiles/FolderProfile.pubxml.user new file mode 100644 index 0000000..7f60cea --- /dev/null +++ b/SpotifyABClient/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -0,0 +1,10 @@ + + + + + True|2024-08-16T09:35:18.7021941Z||; + + + \ No newline at end of file diff --git a/SpotifyABClient/Properties/Resources.Designer.cs b/SpotifyABClient/Properties/Resources.Designer.cs new file mode 100644 index 0000000..681affc --- /dev/null +++ b/SpotifyABClient/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace SpotifyAB.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("SpotifyAB.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/SpotifyABClient/Properties/Resources.resx b/SpotifyABClient/Properties/Resources.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/SpotifyABClient/Properties/Resources.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SpotifyABClient/SpotifyAB.csproj b/SpotifyABClient/SpotifyAB.csproj new file mode 100644 index 0000000..906c838 --- /dev/null +++ b/SpotifyABClient/SpotifyAB.csproj @@ -0,0 +1,38 @@ + + + + WinExe + net8.0-windows10.0.17763.0 + enable + true + enable + app.manifest + 7.0 + logo.ico + + + + + + + + + + + + + + True + True + Resources.resx + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + + + + \ No newline at end of file diff --git a/SpotifyABClient/SpotifyAB.csproj.user b/SpotifyABClient/SpotifyAB.csproj.user new file mode 100644 index 0000000..6a71edd --- /dev/null +++ b/SpotifyABClient/SpotifyAB.csproj.user @@ -0,0 +1,14 @@ + + + + <_LastSelectedProfileId>D:\GitHub\SpotifyAB\testing\SpotifyAB\Properties\PublishProfiles\FolderProfile.pubxml + + + + Form + + + Form + + + \ No newline at end of file diff --git a/SpotifyABClient/SpotifyAB.sln b/SpotifyABClient/SpotifyAB.sln new file mode 100644 index 0000000..cf3f0ae --- /dev/null +++ b/SpotifyABClient/SpotifyAB.sln @@ -0,0 +1,25 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.9.34714.143 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SpotifyAB", "SpotifyAB.csproj", "{3F0546CF-A066-4711-A649-7E06010845D2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {3F0546CF-A066-4711-A649-7E06010845D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3F0546CF-A066-4711-A649-7E06010845D2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3F0546CF-A066-4711-A649-7E06010845D2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3F0546CF-A066-4711-A649-7E06010845D2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {4E54E9E4-4091-4C98-A57C-A7CAF35135B8} + EndGlobalSection +EndGlobal diff --git a/SpotifyABClient/SpotifyAB.sln.DotSettings.user b/SpotifyABClient/SpotifyAB.sln.DotSettings.user new file mode 100644 index 0000000..3dd4c02 --- /dev/null +++ b/SpotifyABClient/SpotifyAB.sln.DotSettings.user @@ -0,0 +1,4 @@ + + <SessionState ContinuousTestingMode="0" Name="All tests from Form1.cs" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> + <ProjectFile>3F0546CF-A066-4711-A649-7E06010845D2/f:Form1.cs</ProjectFile> +</SessionState> \ No newline at end of file diff --git a/SpotifyABClient/app.manifest b/SpotifyABClient/app.manifest new file mode 100644 index 0000000..d042360 --- /dev/null +++ b/SpotifyABClient/app.manifest @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SpotifyABClient/logo.ico b/SpotifyABClient/logo.ico new file mode 100644 index 0000000..d5d6815 Binary files /dev/null and b/SpotifyABClient/logo.ico differ diff --git a/SpotifyABClient/logo.png b/SpotifyABClient/logo.png new file mode 100644 index 0000000..7e374d0 Binary files /dev/null and b/SpotifyABClient/logo.png differ diff --git a/SpotifyABClient/overri.Designer.cs b/SpotifyABClient/overri.Designer.cs new file mode 100644 index 0000000..d9fb4db --- /dev/null +++ b/SpotifyABClient/overri.Designer.cs @@ -0,0 +1,109 @@ +namespace SpotifyAB +{ + partial class OverrideSpotifyAB + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(OverrideSpotifyAB)); + isAlreadyInstalled = new Button(); + isNotInstalled = new Button(); + Back = new Button(); + label1 = new Label(); + SuspendLayout(); + // + // isAlreadyInstalled + // + isAlreadyInstalled.Anchor = AnchorStyles.Bottom | AnchorStyles.Left; + isAlreadyInstalled.Location = new Point(12, 78); + isAlreadyInstalled.Name = "isAlreadyInstalled"; + isAlreadyInstalled.Size = new Size(161, 133); + isAlreadyInstalled.TabIndex = 0; + isAlreadyInstalled.Text = "SpotifyAB is already installed in Spotify."; + isAlreadyInstalled.UseVisualStyleBackColor = true; + isAlreadyInstalled.Click += isAlreadyInstalled_Click; + // + // isNotInstalled + // + isNotInstalled.Anchor = AnchorStyles.Bottom | AnchorStyles.Right; + isNotInstalled.ImeMode = ImeMode.NoControl; + isNotInstalled.Location = new Point(246, 78); + isNotInstalled.Name = "isNotInstalled"; + isNotInstalled.Size = new Size(161, 133); + isNotInstalled.TabIndex = 1; + isNotInstalled.Text = "SpotifyAB is NOT installed in Spotify."; + isNotInstalled.UseVisualStyleBackColor = true; + isNotInstalled.Click += isNotInstalled_Click; + // + // Back + // + Back.Location = new Point(12, 217); + Back.Name = "Back"; + Back.Size = new Size(395, 114); + Back.TabIndex = 2; + Back.Text = "I was just playing around...\r\n(Back)"; + Back.UseVisualStyleBackColor = true; + Back.Click += Back_Click; + // + // label1 + // + label1.AutoSize = true; + label1.Font = new Font("Segoe UI", 11F); + label1.Location = new Point(12, 9); + label1.Name = "label1"; + label1.Size = new Size(150, 30); + label1.TabIndex = 1; + label1.Text = "I am sure that:"; + // + // OverrideSpotifyAB + // + AutoScaleDimensions = new SizeF(10F, 25F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(419, 343); + Controls.Add(label1); + Controls.Add(Back); + Controls.Add(isNotInstalled); + Controls.Add(isAlreadyInstalled); + FormBorderStyle = FormBorderStyle.FixedToolWindow; + Icon = (Icon)resources.GetObject("$this.Icon"); + MaximumSize = new Size(441, 399); + MinimumSize = new Size(441, 399); + Name = "OverrideSpotifyAB"; + ShowInTaskbar = false; + StartPosition = FormStartPosition.CenterScreen; + Text = "OverrideSpotifyAB"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Button isAlreadyInstalled; + private Button isNotInstalled; + private Button Back; + private Label label1; + } +} \ No newline at end of file diff --git a/SpotifyABClient/overri.cs b/SpotifyABClient/overri.cs new file mode 100644 index 0000000..bdd8aaf --- /dev/null +++ b/SpotifyABClient/overri.cs @@ -0,0 +1,86 @@ +using Microsoft.Win32; + +namespace SpotifyAB +{ + public partial class OverrideSpotifyAB : Form + { + public OverrideSpotifyAB() + { + InitializeComponent(); + } + + private void Back_Click(object sender, EventArgs e) + { + // Close the form + Dashboard.log("Override SpotifyAB form closed with no changes"); + this.Close(); + } + + private void isAlreadyInstalled_Click(object sender, EventArgs e) + { + var answer = MessageBox.Show("Are you sure that you want to override the current analysis of SpotifyAB?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (answer == DialogResult.No) + { + return; + } + else if (answer == DialogResult.Yes) + { + try + { + // Open the key or create it if it doesn't exist + var key = Registry.CurrentUser.CreateSubKey("Software\\SpotifyAB"); + + // Set the value + key.SetValue("Installed", "True"); + + // Close the key + key.Close(); + + Dashboard.log("Change: SpotifyAB is already installed in Spotify"); + Dashboard.log("Note: Restart SpotifyAB for the changes to take effect"); + + MessageBox.Show("Please Restart SpotifyAB for the changes to take effect.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception r) + { + MessageBox.Show($"An error occurred while Overriding: {r.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + + private void isNotInstalled_Click(object sender, EventArgs e) + { + var answer = MessageBox.Show("Are you sure that you want to override the current analysis of SpotifyAB?", "Warning", MessageBoxButtons.YesNo, MessageBoxIcon.Warning); + if (answer == DialogResult.No) + { + return; + } + else if (answer == DialogResult.Yes) + { + try + { + // Open the key or create it if it doesn't exist + var key = Registry.CurrentUser.CreateSubKey("Software\\SpotifyAB"); + + // Set the value + key.SetValue("Installed", "False"); + + // Close the key + key.Close(); + + + Dashboard.log("Change: SpotifyAB is NOT installed in Spotify"); + Dashboard.log("Note: Restart SpotifyAB for the changes to take effect"); + + MessageBox.Show("Please Restart SpotifyAB for the changes to take effect.", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + catch (Exception r) + { + MessageBox.Show($"An error occurred while Overriding: {r.Message}", "Error", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + } +} diff --git a/SpotifyABClient/overri.resx b/SpotifyABClient/overri.resx new file mode 100644 index 0000000..bd5f57d --- /dev/null +++ b/SpotifyABClient/overri.resx @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + + + 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 + + + \ No newline at end of file