Есть код python (начало и конец кода между словами START и END:

START
import sys
import os
import requests
import time
import re
import tkinter as tk
from tkinter import filedialog, messagebox, ttk
from mutagen.easyid3 import EasyID3
from urllib.parse import urljoin
from requests_html import HTMLSession
from threading import Thread

def sanitize_filename(filename):
    return re.sub(r'[<>:"/\\|?*]+', '_', filename).strip()

def check_file_exists(directory, file_size):
    for root, _, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if os.path.getsize(file_path) == file_size:
                return True
    return False

def get_remote_file_size(url):
    try:
        response = requests.get(url, stream=True)
        if 'Content-Length' in response.headers:
            return int(response.headers['Content-Length'])
        return None
    except Exception as e:
        print(f"Ошибка при запросе размера файла: {e}")
        return None

class MusifyDownloader:
    def __init__(self, master):
        self.master = master
        master.title("Musify Downloader")

        self.tabs = ttk.Notebook(master)
        self.tabs.pack(expand=True, fill='both')

        self.browser_tab = ttk.Frame(self.tabs)
        self.download_tab = ttk.Frame(self.tabs)

        self.tabs.add(self.browser_tab, text="Browser")
        self.tabs.add(self.download_tab, text="Downloads")

        self.web_frame = ttk.Frame(self.browser_tab)
        self.web_frame.pack(expand=True, fill='both')

        self.file_list = tk.Listbox(self.download_tab)
        self.file_list.pack(expand=True, fill='both')

        self.path_layout = ttk.Frame(self.download_tab)
        self.path_layout.pack(fill='x')

        self.path_label = ttk.Label(self.path_layout, text="Save to:")
        self.path_label.pack(side='left')

        self.path_input = ttk.Entry(self.path_layout)
        self.path_input.pack(side='left', expand=True, fill='x')

        self.browse_button = ttk.Button(self.path_layout, text="Browse", command=self.select_save_path)
        self.browse_button.pack(side='right')

        self.progress_bar = ttk.Progressbar(self.download_tab, length=200)
        self.progress_bar.pack(fill='x')

        self.status_label = ttk.Label(self.download_tab, text="")
        self.status_label.pack(fill='x')

        self.speed_label = ttk.Label(self.download_tab, text="")
        self.speed_label.pack(fill='x')

        self.save_path = ""
        self.current_file_index = 0
        self.mp3_links = []
        self.album_title = ""

    def select_save_path(self):
        path = filedialog.askdirectory()
        if path:
            self.save_path = path
            self.path_input.delete(0, tk.END)
            self.path_input.insert(0, path)

    def download_album(self, link):
        self.file_list.delete(0, tk.END)
        self.album_title = ""

        session = HTMLSession()
        r = session.get(link)
        r.html.render()

        album_title_element = r.html.find('h2.card-title', first=True)
        if album_title_element:
            self.album_title = sanitize_filename(album_title_element.text.strip())

        self.mp3_links = []
        playlist_div = r.html.find('div.playlist', first=True)
        if playlist_div:
            action_divs = playlist_div.find('div.playlist__actions')
            for action_div in action_divs:
                link_element = action_div.find('a', first=True)
                if link_element and link_element.attrs.get('href', '').endswith('.mp3'):
                    self.mp3_links.append(link_element.attrs.get('href'))

        if not self.save_path:
            self.select_save_path()

        if self.mp3_links:
            self.current_file_index = 0
            self.download_next_file()
        else:
            self.file_list.insert(tk.END, "Все файлы недоступны для скачивания.")

    def download_next_file(self):
        if self.current_file_index < len(self.mp3_links):
            mp3_url = self.mp3_links[self.current_file_index]
            absolute_url = urljoin("https://musify.club", mp3_url)

            if self.save_path:
                album_path = os.path.join(self.save_path, sanitize_filename(self.album_title))
                if not os.path.exists(album_path):
                    os.makedirs(album_path)

                filename = os.path.basename(mp3_url)
                file_path = os.path.join(album_path, sanitize_filename(filename))

                file_size = get_remote_file_size(absolute_url)
                if file_size is None:
                    self.status_label.config(text=f"Не удалось определить размер файла: {filename}")
                    self.current_file_index += 1
                    self.download_next_file()
                else:
                    if check_file_exists(album_path, file_size):
                        self.status_label.config(text=f"Файл уже существует: {filename}")
                        self.current_file_index += 1
                        self.download_next_file()
                    else:
                        self.status_label.config(text=f"Скачивание: {filename}")
                        self.download_file(absolute_url, file_path)
                        self.current_file_index += 1
            else:
                self.status_label.config(text="Пожалуйста, выберите директорию для сохранения.")
        else:
            self.status_label.config(text="Все загрузки завершены.")

    def download_file(self, url, file_path):
        def run():
            try:
                response = requests.get(url, stream=True)
                total_size = int(response.headers.get('content-length', 0))
                downloaded_size = 0

                with open(file_path, 'wb') as f:
                    for data in response.iter_content(1024):
                        downloaded_size += len(data)
                        f.write(data)
                        progress = int(100 * downloaded_size / total_size)
                        self.progress_bar['value'] = progress
                        self.speed_label.config(text=f"Загружено {downloaded_size / 1024:.2f} KB из {total_size / 1024:.2f} KB")

                self.status_label.config(text=f"Загрузка завершена: {file_path}")
            except Exception as e:
                self.status_label.config(text=f"Ошибка загрузки: {str(e)}")

        Thread(target=run).start()

if __name__ == "__main__":
    root = tk.Tk()
    downloader = MusifyDownloader(root)
    root.mainloop()
END

Перепиши этот код на C++, заменив gui qt на другой, пригодный к использованию в linux. Затем покажи, как скомпилировать полученный код по шагам