File size: 7,864 Bytes
62bbb8a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# from cv2 import imdecode,IMREAD_GRAYSCALE ,TM_CCOEFF_NORMED , matchTemplate
# from numpy import frombuffer,uint8,where
# from io import BytesIO
# from requests import get
# def find_element_coordinatesofmic():
    # template = imdecode(frombuffer(BytesIO(get("https://shethjenil-automatic-song-rec.static.hf.space/voiceelement.jpg").content).read(), uint8), IMREAD_GRAYSCALE)
    # screen_image = imdecode(frombuffer(device.screencap(), uint8), IMREAD_GRAYSCALE)
    # w, h = template.shape[::-1]
    # loc = where(matchTemplate(screen_image, template, TM_CCOEFF_NORMED) >= 0.8)
    # return [loc[1][0] + w // 2, loc[0][0] + h // 2]
from os import getenv, path, remove, makedirs
import winshell
import sys
from shutil import copyfile , rmtree

def add_to_startmenu(target, shortcut_name):
    shortcut = winshell.shortcut(path.join(winshell.start_menu(), f"{shortcut_name}.lnk"))
    shortcut.path = target
    print(shortcut.show_cmd)
    shortcut.write()

def remove_from_startmenu(shortcut_name):
    remove(path.join(winshell.start_menu(), f"{shortcut_name}.lnk"))
if len(sys.argv) == 2:
    if sys.argv[1] == "--uninstall":
        if path.exists(path.join(getenv("LOCALAPPDATA"), "JENILSOFTWARESONGREC")):
            rmtree(path.join(getenv("LOCALAPPDATA"), "JENILSOFTWARESONGREC"))
            remove_from_startmenu("Song Recognizer")
        sys.exit()
if not path.exists(path.join(getenv("LOCALAPPDATA"), "JENILSOFTWARESONGREC")) or (len(sys.argv) == 2 and sys.argv[1] == "--install"):
    try:
        # Create directory if it doesn't exist
        makedirs(path.join(getenv("LOCALAPPDATA"), "JENILSOFTWARESONGREC"))
    except OSError as e:
        print("Error creating directory:", e)
        sys.exit(1)

    try:
        # Copy file to the created directory
        copyfile(sys.argv[0], path.join(getenv("LOCALAPPDATA"), "JENILSOFTWARESONGREC", sys.argv[0].split("\\")[-1]))
        add_to_startmenu(path.join(getenv("LOCALAPPDATA"), "JENILSOFTWARESONGREC", sys.argv[0].split("\\")[-1]), "Song Recognizer")
    except IOError as e:
        print("Error copying file:", e)
        sys.exit(1)

    sys.exit()



from subprocess import Popen , DEVNULL
from time import sleep
from ppadb.client import Client
from os import remove,chdir
from pytube import Search
from xml.etree.ElementTree import parse
from json import dump ,load
from tkinter import messagebox
from tkinter.simpledialog import askstring
chdir(getattr(sys, '_MEIPASS', path.abspath(path.dirname(__file__))))
#change a path to your project folder
try:
    messagebox.showinfo(message="this program is made by Vicky,varshil,jeet(leader),preet to dedicating SCIENCE FEST 2024")
    messagebox.showinfo(message="in mobile in setting in system build number tap 7 times to open developer options Enable USB debugging and then connect your mobile to pc and tap ok")
    Popen(r"data\adb kill-server", shell=True, stdout=DEVNULL, stderr=DEVNULL)
    Popen(r"data\adb start-server", shell=True, stdout=DEVNULL, stderr=DEVNULL)
    while True:
        global device
        try:
            device = Client(host="127.0.0.1", port=5037).devices()[0]
            break
        except:
            messagebox.showwarning(message="waiting for device")
            pass
    messagebox.showwarning(message="please unlock and open your mobile during project")
    global screentimeout
    
    while True:
        password = askstring("password","enter password")
        if password.strip() != "":
            if device.shell(f"locksettings clear --old {password}").strip() == "Lock credential cleared":
                device.shell(f"#locksettings set-disabled 1")
                break
            else:
                messagebox.showwarning(message="wrong password")
                messagebox.showwarning(message="""IF YOU HAVE A PATTERN LOCK THEN ENTER A POINT NUMBER INSTEAD OF PASSWORD LIKE FOR 
                                       UPPER LEFT POINT IS 1 AND LAST BOTTOM RIGHT IS 9 MIDDLE POINT IS 5 AND LAST BOTTOM LEFT IS 7""")
                
        else:
            if device.shell("locksettings clear").strip() == "Lock credential cleared":
                device.shell(f"#locksettings set-disabled 1")
                break
            else:
                messagebox.showwarning(message="wrong password")
                messagebox.showwarning(message="""IF YOU HAVE A PATTERN LOCK THEN ENTER A POINT NUMBER INSTEAD OF PASSWORD LIKE FOR
                                       UPPER LEFT POINT IS 1 AND LAST BOTTOM RIGHT IS 9 MIDDLE POINT IS 5 AND LAST BOTTOM LEFT IS 7""")
    device.shell("input keyevent KEYCODE_SLEEP")
    screentimeout=device.shell("settings get system screen_off_timeout")
    device.shell("settings put system screen_off_timeout 1800000")
    if device.shell(f"ls /sdcard/cfg.json").strip() != "/sdcard/cfg.json":
        device.shell("am start -n com.google.android.googlequicksearchbox/com.google.android.apps.search.googleapp.activity.GoogleAppActivity")
        device.shell("uiautomator dump")
        device.pull("/sdcard/window_dump.xml", "window_dump.xml")
        a  = [node.attrib['bounds'] for node in parse('window_dump.xml').getroot().iter() if "text" in node.attrib and node.attrib["content-desc"] == "Voice search"][0].split("][")[0].replace("[","").split(",")
        mic = [int(a[0]), int(a[1])]
        device.input_tap(mic[0], mic[1])
        sleep(1)
        device.shell("uiautomator dump")
        device.pull("/sdcard/window_dump.xml", "window_dump.xml")
        a  = [node.attrib['bounds'] for node in parse('window_dump.xml').getroot().iter() if "text" in node.attrib and node.attrib["text"] == "Search for a song"][0].split("][")[0].replace("[","").split(",")
        songbutton=[int(a[0]), int(a[1])]
        dump({"mic": mic, "songbutton": songbutton}, open("cfg.json", "w+"))
        
        device.push("cfg.json", "/sdcard/cfg.json")
        device.shell("am force-stop com.google.android.googlequicksearchbox")
        device.shell("rm /sdcard/window_dump.xml")
        remove("cfg.json")
        remove("window_dump.xml")
    else:
        device.pull("/sdcard/cfg.json", "cfg.json")
        cfg = load(open("cfg.json", "r"))
    cfg = load(open("cfg.json", "r"))
    mic = cfg["mic"]
    songbutton = cfg["songbutton"]
    
    def get_song_artist():
        device.shell("svc data enable")
        device.shell("input keyevent KEYCODE_WAKEUP")
        global mic , songbutton
        device.shell("am start -n com.google.android.googlequicksearchbox/com.google.android.apps.search.googleapp.activity.GoogleAppActivity")
        sleep(2)
        device.input_tap(mic[0],mic[1]) #mic
        device.input_tap(songbutton[0],songbutton[1]) #songbutton
        sleep(20)
        device.shell("uiautomator dump")
        device.pull("/sdcard/window_dump.xml", "window_dump.xml")
        song, artist = [node.attrib["text"] for node in parse('window_dump.xml').getroot().iter() if "text" in node.attrib and (text := node.attrib["text"].strip()) != ""][1:3]
        remove("window_dump.xml")
        device.shell("am force-stop com.google.android.googlequicksearchbox")
        device.shell("input keyevent KEYCODE_HOME")
        device.shell("svc data disable")
        device.shell("input keyevent KEYCODE_SLEEP")
        Popen(rf'data\vlc -f --audio-visual=goom --no-video-title-show --no-qt-fs-controller "{list(filter(lambda x: x.itag == 251, Search(f"{song} by {artist}").results[0].streams))[0].url}"', shell=True, stdout=DEVNULL, stderr=DEVNULL).communicate()
    while messagebox.askretrycancel(message="RECORD START"):
        get_song_artist()
    device.shell("settings put system screen_off_timeout " + screentimeout)
    Popen(r"data\adb kill-server", shell=True)
except Exception as e:
    device.shell("settings put system screen_off_timeout " + screentimeout)
    Popen(r"data\adb kill-server", shell=True)