Проблема при попытке воспроизвести mp3 файл с QMediaPlayer PyQt5 - PullRequest
0 голосов
/ 26 марта 2020

Mp3-файл, загруженный из SoundCloud с помощью SoundScrape, не может быть воспроизведен QMediaPlayer в PyQT5. Нет ошибки, но невозможно воспроизвести файл (QMediaPlayer :: play).

# Here I'm loading the media, there's some comments because I was trying some stuff

import sys
import os
from PyQt5.QtWidgets import *
from PyQt5.QtMultimedia import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.uic.properties import QtCore

class Player(QMainWindow):
    def __init__(self, *args, **kwargs):
        super(Player, self).__init__(*args, **kwargs)

        self.setFixedSize(1920, 1080)
        self.setupUi(self)

        self.currentPlaylist = QMediaPlaylist()

        self.player = QMediaPlayer(self)
        self.player.mediaStatusChanged.connect(self.mediaStatusChange)
        self.player.positionChanged.connect(self.positionChanged)
        self.player.durationChanged.connect(self.durationChanged)

        self.player.setPlaylist(self.currentPlaylist)
        self.load_playlist()

    def on_item_clicked(self, item):

        if self.musicListWidget.currentItem().isSelected() == False:
            self.musicListWidget.currentItem().setSelected(True)

        data = self.musicListWidget.selectedIndexes()[0]
        index = data.row()
        self.playMusic(index=index)


    def playMusic(self, index=0):
        self.player.setPlaylist(self.currentPlaylist)
        self.player.playlist().setCurrentIndex(index)

        self.player.play()
        self.player.setVolume(self.musicVolumeSlider.value())

    def load_playlist(self):
        self.musicListWidget.addItem(
            os.path.basename('C:\MyStuff\Programming_Stuff\License\Eargasm\songs\Mihai Pol - Goneta.mp3'))
        self.currentPlaylist.addMedia(QMediaContent(

### here will be the full path where the file was downloaded
           QUrl.fromLocalFile('C:\MyStuff\Programming_Stuff\License\Eargasm\songs\Mihai Pol - Goneta.mp3')))

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Player()
    window.show()
    app.exec_()

Здесь я загружаю файл (download_via_soundcloud)

from difflib import SequenceMatcher
import subprocess
import requests
from bs4 import BeautifulSoup
import re

class SoundcloudScrapper:

    DOWNLOAD_PATH = 'C:/MyStuff/Programming_Stuff/License/Eargasm/songs'
    FILE_URL = "C:\MyStuff\Programming_Stuff\License\Eargasm\songs"
    SOUNDCLOUD_URL = 'https://www.soundcloud.com'
    SEARCH_QUERY = '/search?q='

    def get_search_input_by_title(self, title):
        """
        :param title: The title of the track
        :return: Search query of the track by SoundCloud rules
        """
        search_query = ""

        for char in title:
            if char == ' ':
                search_query += '%20'
            elif char == '[':
                search_query += '%5B'
            elif char == ']':
                search_query += '%5D'
            else:
                search_query += char

        return search_query

    def download_via_soundcloud(self,artist: str, title: str):
        """
        :param artist: The artist of the track
        :param title: The title of the track
        :return: True if the track has been downloaded successfully, False otherwise
        """
        track_title = artist + ' - ' + title
        search_query_value = self.get_search_input_by_title(track_title)
        soundcloud_url = self.SOUNDCLOUD_URL + self.SEARCH_QUERY + search_query_value

        url = requests.get(soundcloud_url)
        soup = BeautifulSoup(url.content, 'lxml')
        songs = soup.select("li h2 a")

        ### if there is nothing on soundcloud
        if not songs:
            return False
### checking top 2 songs from search result
        for index in range(0,1):
            song = songs[index]

            href_track_found = song.get('href')
            title_track_found = self.clean_soundcloud_title_found(song.text)
            ratio = SequenceMatcher(None, track_title, title_track_found).ratio()

            if ratio > 0.5:
                output = subprocess.check_output("soundscrape " + self.SOUNDCLOUD_URL + href_track_found + " -p " + self.DOWNLOAD_PATH, shell=True)  ## .decode("utf-8")

                return True

        return False

    def clean_soundcloud_title_found(self, track_title):

        track_title = re.sub("([\[]).*?([\]])", "", track_title)
        ### parts that can mislead us to a small ratio
        possible_blockers = ["A1.", "A2.", "B1.", "B2.", "C1.", "C2.", "D1.", "D2.", "E1.", "E2.", "F1.", "F2.",
                             "A1", "A2", "B1", "B2", "C1", "C2", "D1", "D2", "E1", "E2", "F1", "F2", "preview", "Preview" ]

        for blocker in possible_blockers:
            if blocker in track_title:
                track_title = track_title.replace(blocker, "")

        return track_title

if __name__ == '__main__':
    pass
    scrapper = SoundcloudScrapper()
    scrapper.download_via_soundcloud("Mihai Pol", "Science Friction")

SoundScrape: https://github.com/Miserlou/SoundScrape/blob/master/soundscrape/soundscrape.py

...