mpv Πότε ανοίγει σε παράθυρο πότε όχι

...βίντεο, ήχος, players, codecs, κλπ (όχι προβλήματα καρτών εδώ)

Συντονιστές: adem1, konnn

Κανόνες Δ. Συζήτησης
Για εγκατάσταση codec, java, flash και εφαρμογών πολυμέσων τρέξτε στο τερματικό
Για ubuntu
sudo apt-get -y install ubuntu-restricted-extras
Για kubuntu
sudo apt-get -y install kubuntu-restricted-extras

mpv Πότε ανοίγει σε παράθυρο πότε όχι

Δημοσίευσηαπό malos » 30 Μαρ 2024, 18:42

Έχω ένα κώδικα που του ζητάω να αναπαράγει αρχεία στον mpv.

(Το ζητάω φωνητικά με την εντολή "παίξε" και λέω ένα όνομα κι αν βρει το κατάλληλο έχει καλώς. Αν όχι και παίξει κάποιο με παραπλήσιο όνομα ή γενικά ό,τι κατάλαβε και πάλι έχει καλώς! Συνηθισμένα τα βουνά. Λέω στην Αλέξα να παίξει Τζαζ και ακούει Τζακ και μου ανοίγει στο Σπότιφάι το χιτ δε ρόουντ Τζακ. Είπα να κάνω ένα τοπικό σποτιφάι να ακούω τουλάχιστον τις εκτελέσεις που περιμένω όχι τη συναυλία του τραγουδιστή το 2020 στο κολλέγιο της Μασαχουσέτης.)

Ψιλο-ικανοποιημένος από την αναζήτηση, αλλά η αναπαραγωγή γίνεται πότε σε παράθυρο του mpv και πότε στο παρασκήνιο χωρίς παράθυρο. Αυτό είναι πρόβλημα γιατί δεν μπορώ να το κλείνω. Θα πρέπει να δώσω ps -A για να δω στο τέλος τέλος (ευτυχώς) τον αριθμό διαδικασίας να μπορέσω να τον κάνω kill
(παρόλο που έχω στο κάτω panel εικονιδιάκι που εκτελεί killall mpv, αλλά τρέχει κι άλλο mpv εκείνη τη στιγμή που δεν θέλω να κλείνει.)

Πως θα το κάνω να ανοίγει τον mpv αποκλειστικά σε παράθυρο;

Να το κομμάτι του κώδικα που λέει για τον mpv

Κώδικας: Επιλογή όλων
    def play_music(self, query=None):
        music_directories = [
            "/media/SELINI/Enjoy/music/mp3",
            "/home/family/Μουσική",
        ]

        music_files = []
        for directory in music_directories:
            if os.path.exists(directory):
                for root, dirs, files in os.walk(directory):
                    for file in files:
                        if file.lower().endswith((".mp3", ".wav", ".ogg", ".mp4", ".avi", ".m3u")):
                            file_path = os.path.join(root, file)
                            music_files.append(file_path)

        if music_files:
            if query:
                query = unidecode(query)  # Μετατρέπουμε το ερώτημα σε αγγλικούς χαρακτήρες
                matching_files = []
                for file in music_files:
                    file_name = os.path.basename(file).lower()
                    if fuzz.partial_ratio(query.lower(), file_name) >= 90:
                        matching_files.append(file)
                if matching_files:
                    music_file = matching_files[0]
                else:
                    print("Δεν βρέθηκαν μουσικά αρχεία που να ταιριάζουν στην αναζήτηση.")
                    os.system('notify-send "Δεν βρέθηκαν μουσικά αρχεία που να ταιριάζουν στην αναζήτηση."')
                    return
            else:
                music_file = music_files[0]

            subprocess.Popen(["mpv", "--no-terminal", music_file])
        else:
            print("Δεν βρέθηκαν μουσικά αρχεία.")
            os.system('notify-send "Δεν βρέθηκαν μουσικά αρχεία."')



Τη γραμμή subprocess.Popen(["mpv", "--no-terminal", music_file]) την είχα και σκέτη, χωρίς "--no-terminal" αλλά δεν είδα διαφορά.


Άλλες δύο συναρτήσεις που αφορούν το κομμάτι της μουσικής από την όλη λειτουργικότητα του κώδικα:

Κώδικας: Επιλογή όλων
    def execute_command(self, command):
        if command:
............................................................................
#Άλλες γραμμές που αγορούν άλλες λειτουργίες
............................................................................

            elif command.startswith(("παίξε", "play")):
                query = command.split(" ", 1)[-1]
                self.play_music(query)



και

Κώδικας: Επιλογή όλων
   def search_music_files(self, query):
        query = query.lower()
        results = []
        for root, dirs, files in os.walk("/media/SELINI/Enjoy/music/mp3"):
            for file in files:
                file_name = file.lower()
                if query in file_name:
                    file_path = os.path.join(root, file)
                    results.append(file_path)
        return results
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1234
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: mpv Πότε ανοίγει σε παράθυρο πότε όχι

Δημοσίευσηαπό Maras » 30 Μαρ 2024, 19:59

Καλησπέρα, για δοκίμασε αυτό:
Κώδικας: Επιλογή όλων
subprocess.Popen(["mpv", "--force-window --no-terminal", music_file])
“Long is the way, and hard, that out of hell leads up to light.”
Άβαταρ μέλους
Maras
saintTUX
saintTUX
 
Δημοσιεύσεις: 1494
Εγγραφή: 25 Ιούλ 2017, 12:49
Εκτύπωση

Re: mpv Πότε ανοίγει σε παράθυρο πότε όχι

Δημοσίευσηαπό malos » 30 Μαρ 2024, 23:28

Μπα όχι. Δεν αναπαράγει τίποτα. Ούτε αυτά που ανοίγανε με το παράθυρο του, ούτε αυτά που ανοίγανε στο παρασκήνιο.

Δεν έχω καταλάβει τη συμπεριφορά. όταν είναι ελληνικό όνομα αλλά greeklish, το ανοίγει σε παράθυρο, αλλά μόνο όταν πω την πρώτη λέξη.
Δηλαδή αν πω "παίξε καλέ μου μπάσταρδε ήρωα" και το ακούσει έτσι και το γράψει έτσι στο widget, δεν βρίσκει αρχεία. Αν του πω σκέτο
"παίξε καλέ", ανοίγει το παράθυρο και παίζει αυτό /media/left/SELINI/Enjoy/music/mp3/11 - Kale mou bastarde Hrwa.mp3

Όταν είναι ελληνικό και το γράφει κιόλας στα ελληνικά, λέει ότι δεν βρέθηκαν αρχεία. Όταν είναι αγγλικό με το όνομά του φυσικά στα αγγλικά θα το παίξει σίγουρα αλλά στο παρασκήνιο.

Το μελετάω ακόμα.
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1234
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση

Re: mpv Πότε ανοίγει σε παράθυρο πότε όχι

Δημοσίευσηαπό malos » 31 Μαρ 2024, 20:13

Το κατατρόπωσα ρε! Που θα κάνει αυτό ό,τι θέλει.

Κατ' αρχάς διορθώθηκε η αδυναμία που δεν έβρισκε όλα τα αρχεία.

Κώδικας: Επιλογή όλων
   
    def play_music(self, query=None):
        music_directories = [
            "/media/left/SELINI/Enjoy/music/mp3",
            "/home/left/Μουσική",
        ]

        music_files = []
        for directory in music_directories:
            if os.path.exists(directory):
                for root, dirs, files in os.walk(directory):
                    for file in files:
                        if file.lower().endswith((".mp3", ".wav", ".ogg", ".mp4", ".avi", ".m3u")):
                            file_path = os.path.join(root, file)
                            music_files.append(file_path)

        if music_files:
            if query:
                # Μετατροπή του ερωτήματος σε lowercase και αφαίρεση των ελληνικών χαρακτήρων
                query_normalized = unidecode(query.lower())
                matching_files = []

                for file in music_files:
                    file_name = os.path.basename(file)
                    file_name_normalized = unidecode(file_name.lower())

                    # Αναγνώριση με βάση την προσέγγιση συμφωνίας
                    if fuzz.partial_ratio(query_normalized, file_name_normalized) >= 90:
                        matching_files.append(file)

                if matching_files:
                    music_file = matching_files[0]
                else:
                    print("Δεν βρέθηκαν μουσικά αρχεία που να ταιριάζουν στην αναζήτηση.")
                    os.system('notify-send "Δεν βρέθηκαν μουσικά αρχεία που να ταιριάζουν στην αναζήτηση."')
                    return
            else:
                music_file = music_files[0]

            self.mpv_process = subprocess.Popen(["mpv", music_file])
            mpv_pid = self.mpv_process.pid
            print("Started mpv with PID:", mpv_pid)
        else:
            print("Δεν βρέθηκαν μουσικά αρχεία.")
            os.system('notify-send "Δεν βρέθηκαν μουσικά αρχεία."')


Και τώρα του λες ό,τι θες. Είτε όλες τις λέξεις, είτε μόνο μία (χαρακτηριστική όσο γίνεται), και είτε το λάβει με ελληνικά γράμματα είτε λατινικά και ο τίτλος είτε είναι ελληνικός είτε greeklish, τα παίζει όλα.
Μου αρέσει και η ανταπόκρισή του. Αμέσως ακούς το τραγούδι.
Βεβαίως ακόμα υπάρχει το φαινόμενο άλλα να τα ανοίγει σε παράθυρο και άλλα να παίζει στο παρασκήνιο. Αλλά το έλυσα κι αυτό με μια εντολή stop και ησύχασα

Κώδικας: Επιλογή όλων
    def stop_mpv(self):
        if self.mpv_process:
            mpv_pid = self.mpv_process.pid
            os.system(f"kill {mpv_pid}")
            print("Stopped mpv with PID:", mpv_pid)
        else:
            print("No mpv process running.")


Η προηγούμενη συνάρτηση ( def play_music ( τσιμπάει το pid του επί τόπου εκτλεσμένου mpv ) και με την εντολή "σταμάτα" τον κλείνει.

Κώδικας: Επιλογή όλων
    def execute_command(self, command):
        if command:
..........................................
# άλλα
..........................................

            elif command.startswith(("stop", "στοπ", "σταμάτα", "σκάσε")):
                self.stop_mpv()
                os.system('notify-send "Δεν υπάρχει διαδικασία mpv." --icon=/home/left/Εικόνες/χρήση/icons/desperate.png')


Προτιμώ το "σταμάτα¨ και το "σκάσε", γιατί το "στοπ" κατα 70% μου το άκουσε "στο"
Επεξεργαστής: AMD Ryzen 9 5900x
Μνήμη Gskill 16gb (2X8gb), 3200 mh, CL 14
Μητρική: Asrock X570 phantom gaming X
Τροφοδοτικό: Corsair 850 platinum
Δίσκος: SSD Corsair MP600 (1 TB)
Άβαταρ μέλους
malos
saintTUX
saintTUX
 
Δημοσιεύσεις: 1234
Εγγραφή: 02 Νοέμ 2008, 12:00
Εκτύπωση


  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Εφαρμογές για Πολυμέσα