From 2815690f6bce3c26b7b0f40cdfb868950d9252a4 Mon Sep 17 00:00:00 2001 From: Xavlume <42979115+Xavlume@users.noreply.github.com> Date: Thu, 12 Oct 2023 20:45:40 -0600 Subject: [PATCH] New Version 2 commit Changed from text recognition to getting the song link and text from the spotify application itself --- config.ini | 20 +------ stt.py | 163 +++++++++++++++-------------------------------------- 2 files changed, 47 insertions(+), 136 deletions(-) diff --git a/config.ini b/config.ini index 3e74854..3a71492 100644 --- a/config.ini +++ b/config.ini @@ -1,20 +1,6 @@ -[Coordinates] -x1 = 1 -y1 = 2 -x2 = 3 -y2 = 4 -x3 = 5 -y3 = 6 -x4 = 7 -y4 = 8 - -[Path] -tesseract = C:\\Program Files\\Tesseract-OCR\\tesseract.exe - -[Other] -debug = False -savetolog = False -savetoclipboard = True +[Config] +savetolog = True +savetoclipboard = False [Text] prefix = I'm Listening to diff --git a/stt.py b/stt.py index 9f2882e..b2579c9 100644 --- a/stt.py +++ b/stt.py @@ -1,65 +1,47 @@ -import PySimpleGUI as sg - -from PIL import ImageGrab -from pytesseract import pytesseract -from win32clipboard import OpenClipboard, EmptyClipboard, SetClipboardText, CloseClipboard -from pyautogui import position +import pymem +import requests +import html import configparser - +from win32clipboard import OpenClipboard, EmptyClipboard, SetClipboardText, CloseClipboard config = configparser.ConfigParser() config.read('config.ini') -coords = config["Coordinates"] -x1, y1, x2, y2, x3, y3, x4, y4 = int(coords['x1']), int(coords['y1']), int(coords['x2']), int(coords['y2']), int(coords['x3']), int(coords['y3']), int(coords['x4']),int(coords['y4']) - -# Defining paths to tesseract.exe -# and the image we would be using -path_to_tesseract = config["Path"]["tesseract"] -pytesseract.tesseract_cmd = path_to_tesseract - -debug = config.getboolean("Other", "debug") -saveToLog = config.getboolean("Other", "saveToLog") -saveToClipboard = config.getboolean("Other", "saveToClipboard") +saveToLog = config.getboolean("Config", "saveToLog") +saveToClipboard = config.getboolean("Config", "saveToClipboard") prefix, linker, suffix = config["Text"]["prefix"], config["Text"]["linker"], config["Text"]["suffix"] -def validValues(xyValues: list[int]) -> bool: - if xyValues[0] >= xyValues[2] or xyValues[1] >= xyValues[3]: - sg.popup_error("Invalid Title Coordinates") - return False - if xyValues[4] >= xyValues[6] or xyValues[5] >= xyValues[7]: - sg.popup_error("Invalid Artist Coordinates") - return False - - return True - -def getText(firstBox, secondBox, prefix: str = "", linker = " - ", suffix: str = "", debug: bool = False) -> str: - - img = ImageGrab.grab(all_screens=True) - img1 = img.crop(firstBox) - img2 = img.crop(secondBox) - - if debug: - img1.save("title.png") - img2.save("artist.png") - # Providing the tesseract executable - # location to pytesseract library - +def getTitleAndArtistFromHtml(html: str): + title = "" + artist = "" + html = html.split("")[0] + html = html.split("")[1] + title, artist = html.split("song and lyrics") + title = title[:-3] + artist = artist[4:] + artist = artist.replace(" | Spotify", "") - title = pytesseract.image_to_string(img1) - artist = pytesseract.image_to_string(img2) + return (title, artist) - title = title.replace("\n", "") - title = title.replace(" ", "") +#chrome_elf.dll+14FA3E string +pm = pymem.Pymem('Spotify.exe') +client = pymem.process.module_from_name(pm.process_handle, "chrome_elf.dll").lpBaseOfDll +headers = {'Accept-Encoding': 'identity'} - artist = artist.replace("\n", "") - artist = artist.replace(" ", "") +def getStuffs(): + songthing = pm.read_string(client + 0x14FA3E) + link = "https://open.spotify.com/track/" + songthing + r = requests.get(link, headers=headers) + content = r.content[:1000] + content = str(content.decode('utf-8')) + content = html.unescape(content) + # content = content.replace("'", "'") + # content = content.replace(""", "\"") - text = prefix + " " + title + " " + linker + " " + artist + suffix + title, artist = getTitleAndArtistFromHtml(content) - return text - # Displaying the extracted text + return title, artist def textToClipboard(text: str): OpenClipboard() @@ -67,20 +49,12 @@ def textToClipboard(text: str): SetClipboardText(text) CloseClipboard() +import PySimpleGUI as sg + sg.theme('Dark Blue 3') # please make your windows colorful layout = [ - [sg.Text('Current Mouse Position: ( , )', key="mouseLabel")], - - [sg.Text('')], - - [sg.Text('Title Coordinates: ')], - [sg.Text('Top Left x and y: ALT-F5', size=(25, 1)), sg.InputText(x1, key='x1',size=(10, 1)), sg.InputText(y1, key='y1', size=(10, 1))], - [sg.Text('Bottom right x and y: ALT-F6', size=(25, 1)), sg.InputText(x2, key='x2',size=(10, 1)), sg.InputText(y2, key='y2', size=(10, 1))], - - [sg.Text('Artist Coordinates: ')], - [sg.Text('Top Left x and y: ALT-F7', size=(25, 1)), sg.InputText(x3, key='x3',size=(10, 1)), sg.InputText(y3, key='y3', size=(10, 1))], - [sg.Text('Bottom right x and y: ALT-F8', size=(25, 1)), sg.InputText(x4, key='x4',size=(10, 1)), sg.InputText(y4, key='y4', size=(10, 1))], + [sg.Text('Spotify To Text')], [sg.Text('')], @@ -88,11 +62,11 @@ def textToClipboard(text: str): [sg.Text('Linker: ', size=(15, 1)), sg.InputText(linker, key='linker',size=(20, 1))], [sg.Text('Suffix: ', size=(15, 1)), sg.InputText(suffix, key='suffix',size=(20, 1))], - [sg.Checkbox("Debug", default=debug, key="debug"), sg.Checkbox("Save Output To Log File",default=saveToLog, key="saveToLog"), sg.Checkbox("Save Output To Clipboard",default=saveToClipboard, key="saveToClipboard")], + [sg.Checkbox("Save Output To Log File",default=saveToLog, key="saveToLog"), sg.Checkbox("Save Output To Clipboard",default=saveToClipboard, key="saveToClipboard")], [sg.Text('')], - [sg.Button("Apply"), sg.Button("Save to Config")], + [sg.Button("Get Text"), sg.Button("Save to Config")], [sg.Text('')], @@ -101,94 +75,45 @@ def textToClipboard(text: str): window = sg.Window('Spotify To Text', layout, finalize=True) -window.bind("<Alt_L><F5>", "ALT-f5") -window.bind("<Alt_L><F6>", "ALT-f6") -window.bind("<Alt_L><F7>", "ALT-f7") -window.bind("<Alt_L><F8>", "ALT-f8") - while True: event, values = window.read(timeout=20) - - mousePosition = position() - mousePositionText = f"( {mousePosition[0]} , {mousePosition[1]} )" - mousePositionText = "Current Mouse Position: " + mousePositionText - window["mouseLabel"].update(mousePositionText) - if event == sg.WIN_CLOSED: break if event == "__TIMEOUT__": continue - if event != "Apply" and event != "Save to Config" and "ALT" not in event: + if event != "Get Text" and event != "Save to Config": continue try: - debug = window["debug"].Get() saveToLog = window["saveToLog"].Get() saveToClipboard = window["saveToClipboard"].Get() prefix, linker, suffix = values['prefix'], values['linker'], values['suffix'] - xyValues = [values['x1'], values['y1'], values['x2'], values['y2'], values['x3'], values['y3'], values['x4'], values['y4']] - - invalid = False - for coord in xyValues: - if not coord.isdigit(): - sg.popup_error(f"invalid coord: {coord}") - invalid = True - - if invalid: - continue - - xyValues = [int(value) for value in xyValues] - - if "ALT" in event: - if "f5" in event: - window["x1"].update(mousePosition[0]) - window["y1"].update(mousePosition[1]) - if "f6" in event: - window["x2"].update(mousePosition[0]) - window["y2"].update(mousePosition[1]) - if "f7" in event: - window["x3"].update(mousePosition[0]) - window["y3"].update(mousePosition[1]) - if "f8" in event: - window["x4"].update(mousePosition[0]) - window["y4"].update(mousePosition[1]) - continue - - if not validValues(xyValues): - continue if event == "Save to Config": if sg.popup_yes_no('Do you really want to save to config?') == 'Yes': - config["Path"]["tesseract"] = path_to_tesseract - config["Other"]["debug"] = str(debug) - config["Other"]["saveToLog"] = str(saveToLog) - config["Other"]["saveToClipboard"] = str(saveToClipboard) + config["Config"]["saveToLog"] = str(saveToLog) + config["Config"]["saveToClipboard"] = str(saveToClipboard) config["Text"]["prefix"], config["Text"]["linker"], config["Text"]["suffix"] = prefix, linker, suffix - xyStringValues = [str(value) for value in xyValues] - - for index, key in enumerate(config["Coordinates"].keys()): - config["Coordinates"][key] = xyStringValues[index] - with open('config.ini', 'w') as configfile: config.write(configfile) continue - - titleBbox = (xyValues[0], xyValues[1], xyValues[2], xyValues[3]) - artistBbox = (xyValues[4], xyValues[5], xyValues[6], xyValues[7]) + title, artist = getStuffs() - text = getText(titleBbox, artistBbox, prefix, linker, suffix, debug) + text = prefix + " " + title + " " + linker + " " + artist + suffix + + text = str(text) window["output"].update("Output: " + text) if saveToLog: - with open("log.txt", 'a') as f: + with open("log.txt", 'a', encoding="utf-8") as f: f.write(text + "\n") if saveToClipboard: