Beispiel #1
0
class MusicList(QListWidget):
    def __init__(self):
        super(MusicList, self).__init__()
        self.__musicList = []
        self.setFixedWidth(250)
        self.setFont(QFont('宋体', 10,))
        self.setObjectName('musicList')
        self.setStyleSheet('#musicList{background-color: rgba(0, 0, 0, 120); color: "green";} #musicList:item{height: 25;}')
        self.itemDoubleClicked.connect(self.music_double_clicked)

        # 初始化多媒体播放器和播放列表
        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist(self.player)
        self.player.setPlaylist(self.playlist)

    def add_music_item(self, file_names):
        for file in file_names:
            self.addItem(file.split('/')[-1])
            self.playlist.addMedia(QMediaContent(QUrl.fromLocalFile(file)))

    def music_double_clicked(self):
        music_list_index = self.currentRow()
        self.music_play(music_list_index)

    def music_play(self, music_list_index):
        self.playlist.setCurrentIndex(music_list_index)
        self.player.play()

    def add_network_music(self, music_name, music_url):
        print(music_name)
        self.addItem(music_name)
        self.playlist.addMedia(QMediaContent(QUrl(music_url)))
Beispiel #2
0
class VideoPlayer(QVideoWidget):
    def __init__(self):
        super(VideoPlayer, self).__init__()

        self._player = QMediaPlayer()
        self._playlist = QMediaPlaylist()
        self._stopped = True

    # プレイリストに動画を追加
    def addMedia(self, media_file):
        media_content = QMediaContent(QUrl.fromLocalFile(media_file))
        self._playlist.addMedia(media_content)

    # クリックでポーズ・再生の切り替え
    def mousePressEvent(self, event):
        if self._stopped:
            self.play()
        else:
            self._player.pause()
            self._stopped = True

    # ダブルクリックで動画を読み込み,再生
    def mouseDoubleClickEvent(self, event):
        self._player.setVideoOutput(self)
        self._player.setPlaylist(self._playlist)
        self.play()

    def play(self):
        self._player.play()
        self._stopped = False
Beispiel #3
0
class Player(QGraphicsVideoItem):
    def __init__(self, parent=None):
        super().__init__()
        self.parent = parent

        self.player = QMediaPlayer()
        self.player.setVideoOutput(self)

    def playerPlayOrOpen(self, arg=None):
        if type(arg) == list and len(arg) > 1:
            content = QMediaContent(QUrl.fromLocalFile(arg[1]))
            self.player.setMedia(content)
            self.play()

    def addVideo(self, video):
        content = QMediaContent(QUrl.fromLocalFile(video))
        self.player.setMedia(content)
        self.play()

    def sliderChanged(self, pos):
        self.player.setPosition(pos)

    def mouseDoubleClickEvent(self, event):
        if not self.parent.isFullScreen():
            self.parent.showFullScreen()
        else:
            self.parent.showNormal()

    def play(self):
        self.player.play()

    def stop(self):
        self.player.stop()

    def pause(self):
        self.player.pause()

    def setMuted(self, mute):
        self.player.setMuted(mute)

    def mutedState(self):
        if self.player.isMuted():
            self.setMuted(False)
        else:
            self.setMuted(True)

    def isMuted(self):
        return  self.player.isMuted()

    def setVolume(self, value):
        self.player.setVolume(value)

    def volume(self):
        return self.player.volume()
Beispiel #4
0
class MediaPlayer(metaclass=Observable):
    class Error(Enum):
        none = QMediaPlayer.NoError
        unsupported_format = QMediaPlayer.FormatError
        access_denied = QMediaPlayer.AccessDeniedError

    closed = signal()
    playing = signal(Track)
    stopped = signal(Track)
    error_occurred = signal(Track)

    def __init__(self):
        self._media_library = create_media_library()
        self._playlist = []
        self._player = QMediaPlayer()
        self._player.stateChanged.connect(self._state_changed)
        self._player.mediaStatusChanged.connect(self._media_status_changed)

    def play(self, track):
        self._playlist.append(track)
        self._player.setMedia(self._media_library.fetch(track.filename))
        self._player.play()

    def stop(self):
        self._player.stop()

    def _media_status_changed(self, state):
        if state == QMediaPlayer.BufferedMedia:
            self._error = QMediaPlayer.NoError
            self.playing.emit(self._playlist[0])
        elif state == QMediaPlayer.InvalidMedia:
            # On windows 8, we only get an InvalidMedia status in case of error,
            # so we need to keep track of the error that occurred
            self._error = QMediaPlayer.FormatError

    @property
    def error(self):
        return MediaPlayer.Error(self._player.error() or self._error)

    def _state_changed(self, state):
        if state == QMediaPlayer.StoppedState and self.error is not MediaPlayer.Error.none:
            self.error_occurred.emit(self._playlist.pop(0), self.error)
        elif state == QMediaPlayer.StoppedState:
            self.stopped.emit(self._playlist.pop(0))

    def dispose(self):
        self._player.stop()
        # force the deletion of the player on windows because windows
        # doesn't release the handle and prevents further instanciations
        sip.delete(self._player)
        self._player = None

        self._media_library.dispose()
        self.closed.emit()
Beispiel #5
0
class VideoPlayerWidget(QWidget):

    def __init__(self, parent=None):
        super(VideoPlayerWidget, self).__init__(parent)

        self.scene = QGraphicsScene(self)
        self.scene.setBackgroundBrush(QBrush(QColor(0, 0, 0, 255)))
        self.graphics_view = QGraphicsView(self.scene)
        self.graphics_view.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.graphics_view.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.graphics_view.setFrameStyle(0)
        self.graphics_view.setStyleSheet("QGraphicsView {background: transparent; border: 3px; outline: none;}")
        self.video_item = QGraphicsVideoItem()
        self.scene.addItem(self.video_item)

        self.layout = QVBoxLayout(self)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.layout.addWidget(self.graphics_view)

        self.media_player = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.media_player.setVideoOutput(self.video_item)

        self.video_need_replay = False
        self.video_seek_durcation = 3000 # in milliseconds

    def resizeEvent(self, event):
        self.video_item.setSize(QSizeF(event.size().width(), event.size().height()))
        QWidget.resizeEvent(self, event)

    def play(self, url):
        self.media_player.setMedia(QMediaContent(QUrl.fromLocalFile(url)))
        self.media_player.play()

    def seek_forward(self):
        video_position = self.media_player.position()
        self.media_player.setPosition(video_position + self.video_seek_durcation)

    def seek_backward(self):
        video_position = self.media_player.position()
        self.media_player.setPosition(max(video_position - self.video_seek_durcation, 0))

    def keyPressEvent(self, event):
        if event.key() == Qt.Key_Space:
            if self.media_player.state() == QMediaPlayer.PlayingState:
                self.media_player.pause()
                self.video_need_replay = False
            else:
                self.media_player.play()
                self.video_need_replay = True
        elif event.key() == Qt.Key_H:
            self.seek_backward()
        elif event.key() == Qt.Key_L:
            self.seek_forward()
Beispiel #6
0
 def __alarm(self):
     if not self.go:
         return;
     self.timer.stop()
     player = QMediaPlayer(self);
     player.setMedia(QMediaContent(QUrl.fromLocalFile(self.music)));
     player.setVolume(100);
     player.play();
     self.setEnabled(False)
     QMessageBox.critical(self, "ALERTA", "TIME TO DIE<br>" + self.ui.groupBox.title(), QMessageBox.Yes)
     self.setEnabled(True)
     player.stop()
     player.deleteLater()
Beispiel #7
0
class Window(QWidget):
    """
    The main window of the application. Houses a media player and related
    controls.
    """
    def __init__(self):
        super().__init__()

        layout = QVBoxLayout()
        self.slider = QSlider(Qt.Horizontal)
        btnOpen = QPushButton("Open")
        btnPlay = QPushButton("Play")
        self.player = QMediaPlayer()
        tl = Timeline(None, None)
        tlscroll = QScrollArea()
        tlscroll.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        tlscroll.setWidget(tl)

        btnOpen.clicked.connect(self.open)
        btnPlay.clicked.connect(self.play)

        self.player.durationChanged.connect(self.durationChanged)
        self.player.positionChanged.connect(self.positionChanged)

        layout.addWidget(self.slider)
        layout.addWidget(btnOpen)
        layout.addWidget(btnPlay)
        layout.addWidget(tlscroll)
        self.setLayout(layout)

    def open(self):
        fileName = QFileDialog.getOpenFileName(self, "Open File")[0]
        fileInfo = QFileInfo(fileName)
        if fileInfo.exists():
            url = QUrl.fromLocalFile(fileInfo.absoluteFilePath())
            self.changeMedia(QMediaContent(url))

    def play(self):
        self.player.play()

    def changeMedia(self, mediaContent):
        self.player.setMedia(mediaContent)

    def durationChanged(self, duration):
        self.slider.setRange(0, duration)

    def positionChanged(self, position):
        self.slider.setValue(position)
Beispiel #8
0
def main():
    app = QApplication(sys.argv)

    # Create media player, read media URL from first command line argument
    player = QMediaPlayer()
    media = QMediaContent(QUrl(sys.argv[1]))
    player.setMedia(media)

    # Create and set video output widget
    video = QVideoWidget()
    player.setVideoOutput(video)

    video.show()
    player.play()

    sys.exit(app.exec_())
Beispiel #9
0
class Video(QDialog):
    def __init__(self, video, parent=None):
        super(Video, self).__init__(parent)
        self.ui = Ui_Video()
        self.ui.setupUi(self)

        self.video = video
        self.setWindowTitle("Video - %s" % video.title)
        self.ui.urlEdit.setText(video.url)
        self.ui.titleLabel.setText(video.title)
        self.ui.durationLabel.setText(unicode(video.duration))
        self.ui.authorLabel.setText(unicode(video.author))
        self.ui.dateLabel.setText(unicode(video.date))
        if video.rating_max:
            self.ui.ratingLabel.setText('%s / %s' % (video.rating, video.rating_max))
        else:
            self.ui.ratingLabel.setText('%s' % video.rating)

        self.mediaPlayer = QMediaPlayer()

        self.mediaPlayer.durationChanged.connect(self._setMax)
        self.mediaPlayer.seekableChanged.connect(self.ui.seekSlider.setEnabled)
        self.mediaPlayer.positionChanged.connect(self._slide)
        self.ui.seekSlider.valueChanged.connect(self.mediaPlayer.setPosition)

        mc = QMediaContent(QUrl(video.url))
        self.mediaPlayer.setMedia(mc)
        self.ui.videoPlayer.setMediaObject(self.mediaPlayer)
        self.mediaPlayer.play()

    @Slot('qint64')
    def _slide(self, pos):
        blocking = self.ui.seekSlider.blockSignals(True)
        self.ui.seekSlider.setValue(pos)
        self.ui.seekSlider.blockSignals(blocking)

    @Slot('qint64')
    def _setMax(self, duration):
        self.ui.seekSlider.setMaximum(duration)

    def closeEvent(self, event):
        self.mediaPlayer.stop()
        event.accept()

    def hideEvent(self, event):
        self.mediaPlayer.stop()
        event.accept()
Beispiel #10
0
class AudioPlayBack():
    def __init__(self):
        self.__audioPlayback = QMediaPlayer()
        self.__audioPlayback.setVolume(50)
        self.__audioPlayback.positionChanged.connect(self.onTick)

        pass

    def onTick(self, e=None):
        print(self.__audioPlayback.position(), self.__audioPlayback.state())
        Event.dis(AudioPlaybackEvent.TICK, self.__audioPlayback.position())
        pass

    def load(self, path):
        content = QMediaContent(QUrl(path))
        self.__audioPlayback.setMedia(content)
        self.__audioPlayback.play()
        pass

    def seek(self, position):
        self.__audioPlayback.setPosition(position)
        pass

    def play(self):
        if self.__audioPlayback.state() == QMediaPlayer.PausedState:
            self.__audioPlayback.play()
            pass
        pass

    def pause(self):
        if self.__audioPlayback.state() == QMediaPlayer.PlayingState:
            self.__audioPlayback.pause()
            pass
        pass

    # 0~100
    def setVolume(self, vol):
        self.__audioPlayback.setVolume(vol)
        pass
Beispiel #11
0
class Speaker(QObject):
    def __init__(self, parent=None):
        super(Speaker,self).__init__(parent)
        self.player = QMediaPlayer(self)

        try:
            self.backup = steel.available_engines()[0]()
            self.backup.set("rate", 150)
        except:
            self.backup = None
            print("Could not start a backup offline speaker.")

    @pyqtSlot(str, str)
    def speak(self, name, text, lang="pt-br"):
        fpath = "./speeches/" + name + ".mp3"
        if not os.path.isdir("./speeches"):
            os.mkdir("./speeches")
        if not os.path.isfile(fpath):
            print("Running TTS...")
            try:
                data = urlencode( [("tl", lang), ("q", text), ("ie", "UTF-8")] )
                bin_data = data.encode("utf8")
                req = Request("http://translate.google.com/translate_tts", bin_data, {"User-Agent":"My agent !"})
                fin = urlopen(req)
                mp3 = fin.read()
                fout = open(fpath, "wb")
                fout.write(mp3)
                fout.close()
            except Exception as exc:
                print("Error trying to get TTS file:", str(exc))
                if self.backup != None:
                    print("Proceeding to use backup speaker...")
                    self.backup.speak(text)
                return
        
        self.player.stop()
        self.player.setMedia(QMediaContent(QUrl.fromLocalFile(QFileInfo(fpath).absoluteFilePath())))
        self.player.play()
Beispiel #12
0
class VideoWindow(QMainWindow):

    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)
        self.setWindowTitle("PyQt Video Player Widget Example - pythonprogramminglanguage.com")

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        videoWidget = QVideoWidget()

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)

        # Create new action
        openAction = QAction(QIcon('open.png'), '&Open', self)
        openAction.setShortcut('Ctrl+O')
        openAction.setStatusTip('Open movie')
        openAction.triggered.connect(self.openFile)

        # Create exit action
        exitAction = QAction(QIcon('exit.png'), '&Exit', self)
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(self.exitCall)

        # Create menu bar and add action
        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu('&File')
        #fileMenu.addAction(newAction)
        fileMenu.addAction(openAction)
        fileMenu.addAction(exitAction)

        # Create a widget for window contents
        wid = QWidget(self)
        self.setCentralWidget(wid)

        # Create layouts to place inside widget
        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.errorLabel)

        # Set widget to contain window contents
        wid.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                                                  QDir.homePath())

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)

    def exitCall(self):
        sys.exit(app.exec_())

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                self.style().standardIcon(QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
Beispiel #13
0
class Player(QWidget):

    fullScreenChanged = pyqtSignal(bool)

    def __init__(self, playlist, parent=None):
        super(Player, self).__init__(parent)

        self.colorDialog = None
        self.trackInfo = ""
        self.statusInfo = ""
        self.duration = 0

        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist()
        self.player.setPlaylist(self.playlist)

        self.player.durationChanged.connect(self.durationChanged)
        self.player.positionChanged.connect(self.positionChanged)
        self.player.metaDataChanged.connect(self.metaDataChanged)
        self.playlist.currentIndexChanged.connect(self.playlistPositionChanged)
        self.player.mediaStatusChanged.connect(self.statusChanged)
        self.player.bufferStatusChanged.connect(self.bufferingProgress)
        self.player.videoAvailableChanged.connect(self.videoAvailableChanged)
        self.player.error.connect(self.displayErrorMessage)

        self.videoWidget = VideoWidget()
        self.player.setVideoOutput(self.videoWidget)

        self.playlistModel = PlaylistModel()
        self.playlistModel.setPlaylist(self.playlist)

        self.playlistView = QListView()
        self.playlistView.setModel(self.playlistModel)
        self.playlistView.setCurrentIndex(
            self.playlistModel.index(self.playlist.currentIndex(), 0))

        self.playlistView.activated.connect(self.jump)

        self.slider = QSlider(Qt.Horizontal)
        self.slider.setRange(0, self.player.duration() / 1000)

        self.labelDuration = QLabel()
        self.slider.sliderMoved.connect(self.seek)

        self.labelHistogram = QLabel()
        self.labelHistogram.setText("Histogram:")
        self.histogram = HistogramWidget()
        histogramLayout = QHBoxLayout()
        histogramLayout.addWidget(self.labelHistogram)
        histogramLayout.addWidget(self.histogram, 1)

        self.probe = QVideoProbe()
        self.probe.videoFrameProbed.connect(self.histogram.processFrame)
        self.probe.setSource(self.player)

        openButton = QPushButton("Open", clicked=self.open)

        controls = PlayerControls()
        controls.setState(self.player.state())
        controls.setVolume(self.player.volume())
        controls.setMuted(controls.isMuted())

        controls.play.connect(self.player.play)
        controls.pause.connect(self.player.pause)
        controls.stop.connect(self.player.stop)
        controls.next.connect(self.playlist.next)
        controls.previous.connect(self.previousClicked)
        controls.changeVolume.connect(self.player.setVolume)
        controls.changeMuting.connect(self.player.setMuted)
        controls.changeRate.connect(self.player.setPlaybackRate)
        controls.stop.connect(self.videoWidget.update)

        self.player.stateChanged.connect(controls.setState)
        self.player.volumeChanged.connect(controls.setVolume)
        self.player.mutedChanged.connect(controls.setMuted)

        self.fullScreenButton = QPushButton("FullScreen")
        self.fullScreenButton.setCheckable(True)

        self.colorButton = QPushButton("Color Options...")
        self.colorButton.setEnabled(False)
        self.colorButton.clicked.connect(self.showColorDialog)

        displayLayout = QHBoxLayout()
        displayLayout.addWidget(self.videoWidget, 2)
        displayLayout.addWidget(self.playlistView)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addStretch(1)
        controlLayout.addWidget(controls)
        controlLayout.addStretch(1)
        controlLayout.addWidget(self.fullScreenButton)
        controlLayout.addWidget(self.colorButton)

        layout = QVBoxLayout()
        layout.addLayout(displayLayout)
        hLayout = QHBoxLayout()
        hLayout.addWidget(self.slider)
        hLayout.addWidget(self.labelDuration)
        layout.addLayout(hLayout)
        layout.addLayout(controlLayout)
        layout.addLayout(histogramLayout)

        self.setLayout(layout)

        if not self.player.isAvailable():
            QMessageBox.warning(
                self, "Service not available",
                "The QMediaPlayer object does not have a valid service.\n"
                "Please check the media service plugins are installed.")

            controls.setEnabled(False)
            self.playlistView.setEnabled(False)
            openButton.setEnabled(False)
            self.colorButton.setEnabled(False)
            self.fullScreenButton.setEnabled(False)

        self.metaDataChanged()

        self.addToPlaylist(playlist)

    def open(self):
        fileNames, _ = QFileDialog.getOpenFileNames(self, "Open Files")
        self.addToPlaylist(fileNames)

    def addToPlaylist(self, fileNames):
        for name in fileNames:
            fileInfo = QFileInfo(name)
            if fileInfo.exists():
                url = QUrl.fromLocalFile(fileInfo.absoluteFilePath())
                if fileInfo.suffix().lower() == 'm3u':
                    self.playlist.load(url)
                else:
                    self.playlist.addMedia(QMediaContent(url))
            else:
                url = QUrl(name)
                if url.isValid():
                    self.playlist.addMedia(QMediaContent(url))

    def durationChanged(self, duration):
        duration /= 1000

        self.duration = duration
        self.slider.setMaximum(duration)

    def positionChanged(self, progress):
        progress /= 1000

        if not self.slider.isSliderDown():
            self.slider.setValue(progress)

        self.updateDurationInfo(progress)

    def metaDataChanged(self):
        if self.player.isMetaDataAvailable():
            self.setTrackInfo(
                "%s - %s" % (self.player.metaData(QMediaMetaData.AlbumArtist),
                             self.player.metaData(QMediaMetaData.Title)))

    def previousClicked(self):
        # Go to the previous track if we are within the first 5 seconds of
        # playback.  Otherwise, seek to the beginning.
        if self.player.position() <= 5000:
            self.playlist.previous()
        else:
            self.player.setPosition(0)

    def jump(self, index):
        if index.isValid():
            self.playlist.setCurrentIndex(index.row())
            self.player.play()

    def playlistPositionChanged(self, position):
        self.playlistView.setCurrentIndex(self.playlistModel.index(
            position, 0))

    def seek(self, seconds):
        self.player.setPosition(seconds * 1000)

    def statusChanged(self, status):
        self.handleCursor(status)

        if status == QMediaPlayer.LoadingMedia:
            self.setStatusInfo("Loading...")
        elif status == QMediaPlayer.StalledMedia:
            self.setStatusInfo("Media Stalled")
        elif status == QMediaPlayer.EndOfMedia:
            QApplication.alert(self)
        elif status == QMediaPlayer.InvalidMedia:
            self.displayErrorMessage()
        else:
            self.setStatusInfo("")

    def handleCursor(self, status):
        if status in (QMediaPlayer.LoadingMedia, QMediaPlayer.BufferingMedia,
                      QMediaPlayer.StalledMedia):
            self.setCursor(Qt.BusyCursor)
        else:
            self.unsetCursor()

    def bufferingProgress(self, progress):
        self.setStatusInfo("Buffering %d%" % progress)

    def videoAvailableChanged(self, available):
        if available:
            self.fullScreenButton.clicked.connect(
                self.videoWidget.setFullScreen)
            self.videoWidget.fullScreenChanged.connect(
                self.fullScreenButton.setChecked)

            if self.fullScreenButton.isChecked():
                self.videoWidget.setFullScreen(True)
        else:
            self.fullScreenButton.clicked.disconnect(
                self.videoWidget.setFullScreen)
            self.videoWidget.fullScreenChanged.disconnect(
                self.fullScreenButton.setChecked)

            self.videoWidget.setFullScreen(False)

        self.colorButton.setEnabled(available)

    def setTrackInfo(self, info):
        self.trackInfo = info

        if self.statusInfo != "":
            self.setWindowTitle("%s | %s" % (self.trackInfo, self.statusInfo))
        else:
            self.setWindowTitle(self.trackInfo)

    def setStatusInfo(self, info):
        self.statusInfo = info

        if self.statusInfo != "":
            self.setWindowTitle("%s | %s" % (self.trackInfo, self.statusInfo))
        else:
            self.setWindowTitle(self.trackInfo)

    def displayErrorMessage(self):
        self.setStatusInfo(self.player.errorString())

    def updateDurationInfo(self, currentInfo):
        duration = self.duration
        if currentInfo or duration:
            currentTime = QTime((currentInfo / 3600) % 60,
                                (currentInfo / 60) % 60, currentInfo % 60,
                                (currentInfo * 1000) % 1000)
            totalTime = QTime((duration / 3600) % 60, (duration / 60) % 60,
                              duration % 60, (duration * 1000) % 1000)

            format = 'hh:mm:ss' if duration > 3600 else 'mm:ss'
            tStr = currentTime.toString(format) + " / " + totalTime.toString(
                format)
        else:
            tStr = ""

        self.labelDuration.setText(tStr)

    def showColorDialog(self):
        if self.colorDialog is None:
            brightnessSlider = QSlider(Qt.Horizontal)
            brightnessSlider.setRange(-100, 100)
            brightnessSlider.setValue(self.videoWidget.brightness())
            brightnessSlider.sliderMoved.connect(
                self.videoWidget.setBrightness)
            self.videoWidget.brightnessChanged.connect(
                brightnessSlider.setValue)

            contrastSlider = QSlider(Qt.Horizontal)
            contrastSlider.setRange(-100, 100)
            contrastSlider.setValue(self.videoWidget.contrast())
            contrastSlider.sliderMoved.connect(self.videoWidget.setContrast)
            self.videoWidget.contrastChanged.connect(contrastSlider.setValue)

            hueSlider = QSlider(Qt.Horizontal)
            hueSlider.setRange(-100, 100)
            hueSlider.setValue(self.videoWidget.hue())
            hueSlider.sliderMoved.connect(self.videoWidget.setHue)
            self.videoWidget.hueChanged.connect(hueSlider.setValue)

            saturationSlider = QSlider(Qt.Horizontal)
            saturationSlider.setRange(-100, 100)
            saturationSlider.setValue(self.videoWidget.saturation())
            saturationSlider.sliderMoved.connect(
                self.videoWidget.setSaturation)
            self.videoWidget.saturationChanged.connect(
                saturationSlider.setValue)

            layout = QFormLayout()
            layout.addRow("Brightness", brightnessSlider)
            layout.addRow("Contrast", contrastSlider)
            layout.addRow("Hue", hueSlider)
            layout.addRow("Saturation", saturationSlider)

            button = QPushButton("Close")
            layout.addRow(button)

            self.colorDialog = QDialog(self)
            self.colorDialog.setWindowTitle("Color Options")
            self.colorDialog.setLayout(layout)

            button.clicked.connect(self.colorDialog.close)

        self.colorDialog.show()
Beispiel #14
0
class MainWindowMusicPlayer(QMainWindow):
    stopState: bool

    def __init__(self):
        super().__init__()
        self.currentPlaylist = QMediaPlaylist()
        self.player = QMediaPlayer()
        self.userAction = -1  # 0 - stopped, 1 - playing 2 - paused
        self.player.mediaStatusChanged.connect(self.qmp_media_status_changed)
        self.player.stateChanged.connect(self.qmp_state_changed)
        self.player.positionChanged.connect(self.qmp_position_changed)
        self.player.volumeChanged.connect(self.qmp_volume_changed)
        self.player.setVolume(60)
        # Status bar
        self.statusBar().showMessage('No Media'
                                     ' :: %d' % self.player.volume())
        self.home_screen()

    def home_screen(self):
        self.setWindowTitle('Music Player')

        self.create_menubar()

        self.create_toolbar()

        controlBar = self.add_controls()

        # need to add both information screen
        # and control bar to the central widget.
        centralWidget = QWidget()
        centralWidget.setLayout(controlBar)
        self.setCentralWidget(centralWidget)

        # Set size of the MainWindow
        self.resize(200, 100)

        self.show()

    def create_menubar(self):
        menubar = self.menuBar()
        file_menu = menubar.addMenu('File')
        file_menu.addAction(self.file_open())
        file_menu.addAction(self.song_info())
        file_menu.addAction(self.folder_open())
        file_menu.addAction(self.exit_action())

    def create_toolbar(self):
        pass

    def add_controls(self):
        controlArea = QVBoxLayout()
        seekSliderLayout = QHBoxLayout()
        controls = QHBoxLayout()
        playlistCtrlLayout = QHBoxLayout()

        # creating buttons
        playBtn = QPushButton('Play')  # play button
        pauseBtn = QPushButton('Pause')  # pause button
        stopBtn = QPushButton('Stop')  # stop button
        volumeDescBtn = QPushButton('V (-)')  # Decrease Volume
        volumeIncBtn = QPushButton('V (+)')  # Increase Volume

        # creating playlist controls
        prevBtn = QPushButton('Prev Song')
        nextBtn = QPushButton('Next Song')

        # creating seek slider
        seekSlider = QSlider()
        seekSlider.setMinimum(0)
        seekSlider.setMaximum(100)
        seekSlider.setOrientation(Qt.Horizontal)
        seekSlider.setTracking(False)
        seekSlider.sliderMoved.connect(self.seek_position)
        # seekSlider.valueChanged.connect(self.seekPosition)

        seekSliderLabel1 = QLabel('0.00')
        seekSliderLabel2 = QLabel('0.00')
        seekSliderLayout.addWidget(seekSliderLabel1)
        seekSliderLayout.addWidget(seekSlider)
        seekSliderLayout.addWidget(seekSliderLabel2)

        # Add handler for each button. Not using the default slots.
        playBtn.clicked.connect(self.play_handler)
        pauseBtn.clicked.connect(self.pause_handler)
        stopBtn.clicked.connect(self.stop_handler)
        volumeDescBtn.clicked.connect(self.decrease_volume)
        volumeIncBtn.clicked.connect(self.increase_volume)

        # Adding to the horizontal layout
        controls.addWidget(volumeDescBtn)
        controls.addWidget(playBtn)
        controls.addWidget(pauseBtn)
        controls.addWidget(stopBtn)
        controls.addWidget(volumeIncBtn)

        # playlist control button handlers
        prevBtn.clicked.connect(self.prev_item_playlist)
        nextBtn.clicked.connect(self.next_item_playlist)
        playlistCtrlLayout.addWidget(prevBtn)
        playlistCtrlLayout.addWidget(nextBtn)

        # Adding to the vertical layout
        controlArea.addLayout(seekSliderLayout)
        controlArea.addLayout(controls)
        controlArea.addLayout(playlistCtrlLayout)
        return controlArea

    # Music playback function
    def play_handler(self):
        self.userAction = 1
        self.statusBar().showMessage('Playing at Volume %d' %
                                     self.player.volume())
        if self.player.state() == QMediaPlayer.StoppedState:
            if self.player.mediaStatus() == QMediaPlayer.NoMedia:
                print(self.currentPlaylist.mediaCount())
                if self.currentPlaylist.mediaCount() == 0:
                    self.open_file()
                if self.currentPlaylist.mediaCount() != 0:
                    self.player.setPlaylist(self.currentPlaylist)
            elif self.player.mediaStatus() ==\
                    QMediaPlayer.LoadedMedia:
                self.player.play()
            elif self.player.mediaStatus() ==\
                    QMediaPlayer.BufferedMedia:
                self.player.play()
        elif self.player.state() == QMediaPlayer.PlayingState:
            pass
        elif self.player.state() == QMediaPlayer.PausedState:
            self.player.play()

    # Music pause function
    def pause_handler(self):
        self.userAction = 2
        self.statusBar().showMessage(
            'Paused %s at position'
            ' %s at Volume %d' %
            (self.player.metaData(QMediaMetaData.Title),
             self.centralWidget().layout().itemAt(0).layout().itemAt(
                 0).widget().text(), self.player.volume()))
        self.player.pause()

    # Music stop function
    def stop_handler(self):
        self.userAction = 0
        self.statusBar().showMessage('Stopped at Volume %d' %
                                     (self.player.volume()))
        if self.player.state() == QMediaPlayer.PlayingState:
            self.stopState = True
            self.player.stop()
        elif self.player.state() == QMediaPlayer.PausedState:
            self.player.stop()
        elif self.player.state() == QMediaPlayer.StoppedState:
            pass

    # Music status change function
    def qmp_media_status_changed(self):
        if self.player.mediaStatus() == QMediaPlayer.LoadedMedia \
                and self.userAction == 1:
            durationT = self.player.duration()
            self.centralWidget().layout().itemAt(0).layout() \
                .itemAt(1).widget().setRange(0, durationT)
            self.centralWidget().layout().itemAt(0).layout() \
                .itemAt(2).widget().setText(
                '%d:%02d' % (int(durationT / 60000),
                             int((durationT / 1000) % 60)))
            self.player.play()

    # Music playing change function
    def qmp_state_changed(self):
        if self.player.state() == QMediaPlayer.StoppedState:
            self.player.stop()

    # Music time change function
    def qmp_position_changed(self, position, senderType=False):
        sliderLayout = self.centralWidget().layout().itemAt(0)\
            .layout()
        if not senderType:
            sliderLayout.itemAt(1).widget().setValue(position)
        # update the text label
        sliderLayout.itemAt(0).widget()\
            .setText('%d:%02d' %
                     (int(position / 60000),
                      int((position / 1000) % 60)))

    def seek_position(self, position):
        sender = self.sender()
        if isinstance(sender, QSlider):
            if self.player.isSeekable():
                self.player.setPosition(position)

    # Music volume change function
    def qmp_volume_changed(self):
        msg = self.statusBar().currentMessage()
        msg = msg[:-2] + str(self.player.volume())
        self.statusBar().showMessage(msg)

    # Music volume + change function
    def increase_volume(self):
        vol = self.player.volume()
        vol = min(vol + 5, 100)
        self.player.setVolume(vol)

    # Music volume - change function
    def decrease_volume(self):
        vol = self.player.volume()
        vol = max(vol - 5, 0)
        self.player.setVolume(vol)

    # File open function
    def file_open(self):
        fileAc = QAction(QIcon('icons\\open.png'), 'Open File', self)
        fileAc.setShortcut('Ctrl+O')
        fileAc.setStatusTip('Open File')
        fileAc.triggered.connect(self.open_file)
        return fileAc

    # File opening function
    def open_file(self):
        file_Chosen = QFileDialog.getOpenFileUrl(self, 'Open Music File',
                                                 expanduser('~'),
                                                 'Audio (*.mp3 *.ogg *.wav)',
                                                 '*.mp3 *.ogg *.wav')
        if file_Chosen is not None:
            self.currentPlaylist.addMedia(QMediaContent(file_Chosen[0]))

    # Folder open function
    def folder_open(self):
        folderAc = QAction(QIcon('icons\\open_fld.png'), 'Open Folder', self)
        folderAc.setShortcut('Ctrl+D')
        folderAc.setStatusTip('Open Folder '
                              '(Will add all the files in'
                              ' the folder)')
        folderAc.triggered.connect(self.add_files)
        return folderAc

    # Folder opening function
    def add_files(self):
        folder_Chosen = QFileDialog\
            .getExistingDirectory(self,
                                  'Open Music Folder',
                                  expanduser('~'))
        if folder_Chosen is not None:
            it = QDirIterator(folder_Chosen)
            it.next()
            while it.hasNext():
                if it.fileInfo().isDir() == False\
                        and it.filePath() != '.':
                    fInfo = it.fileInfo()
                    print(it.filePath(), fInfo.suffix())
                    if fInfo.suffix() in ('mp3', 'ogg', 'wav'):
                        print('added file ', fInfo.fileName())
                        self.currentPlaylist. \
                            addMedia(QMediaContent(
                            QUrl.fromLocalFile(it.filePath())))
                it.next()

    # Song information function
    def song_info(self):
        infoAc = QAction(QIcon('icons\\info.png'), 'Info', self)
        infoAc.setShortcut('Ctrl+I')
        infoAc.setStatusTip('Displays Current Song Information')
        infoAc.triggered.connect(self.display_song_info)
        return infoAc

    # Show song information
    def display_song_info(self):
        metaDataKeyList = self.player.availableMetaData()
        fullText = '<table class="tftable" border="0">'
        for key in metaDataKeyList:
            value = self.player.metaData(key)
            fullText = \
                fullText + '<tr><td>' + key + '</td><td>' + \
                str(value) + '</td></tr>'
        fullText = fullText + '</table>'
        infoBox = QMessageBox(self)
        infoBox.setWindowTitle('Detailed Song Information')
        infoBox.setTextFormat(Qt.RichText)
        infoBox.setText(fullText)
        infoBox.addButton('OK', QMessageBox.AcceptRole)
        infoBox.show()

    # Switch to previous song
    def prev_item_playlist(self):
        self.player.playlist().previous()

    # Switch to next song
    def next_item_playlist(self):
        self.player.playlist().next()

    # exit function
    def exit_action(self):
        exitAc = QAction(QIcon('icons\\exit.png'), '&Exit', self)
        exitAc.setShortcut('Ctrl+Q')
        exitAc.setStatusTip('Exit App')
        exitAc.triggered.connect(self.close)
        return exitAc

    # exiting function
    @staticmethod
    def exit():
        sys.exit(app.exec_())
Beispiel #15
0
class NotifierFrame(QWidget, Ui_notifierFrame):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.setupUi(self)
        self.cleanUp_button.setIcon(QIcon(IconFile.button_clear))
        self.table_model = NotificationHistoryModel(self)
        self.notification_table.setModel(self.table_model)
        if settings.sound_notifications == None:
            settings.sound_notifications = default_sound_notifications
        # In case loading the settings inserted bad values:
        settings.sound_notifications = {
            t
            for t in settings.sound_notifications
            if t in notification_sound_base
        }
        self.media_player = QMediaPlayer()
        self.notification_table.doubleClicked.connect(
            self.notificationDoubleClicked)
        self.cleanUp_button.clicked.connect(
            self.table_model.clearNotifications)
        # Menu
        self.PTTturnsOffSounds_action = QAction(
            'Mute on PTT (recommended if no headset)', self)
        self.PTTturnsOffSounds_action.setCheckable(True)
        self.PTTturnsOffSounds_action.setChecked(
            settings.PTT_mutes_sound_notifications)
        self.PTTturnsOffSounds_action.toggled.connect(self.togglePTTmute)
        self.sound_menu = QMenu()
        self.sound_menu.addAction(self.PTTturnsOffSounds_action)
        self.sound_menu.addSeparator()
        for t in Notification.types:  # iterate on this to control order of entries in menu
            if t in notification_sound_base:  # only notifications with sounds go in the sound toggle menu
                action = QAction(Notification.tstr(t), self)
                action.setCheckable(True)
                self.sound_menu.addAction(action)
                action.setChecked(t in settings.sound_notifications)
                action.toggled.connect(lambda b: self.enableSound(t, b))
        self.sounds_menuButton.setMenu(self.sound_menu)
        # Notification signals
        env.radar.emergencySquawk.connect(self.catchEmergencySquawk)
        env.radar.pathConflict.connect(lambda: self.notify(
            Notification.CONFLICT_WARNING, 'Anticipated conflict'))
        env.radar.nearMiss.connect(lambda: self.notify(
            Notification.SEPARATION_INCIDENT, 'Loss of separation!'))
        env.radar.runwayIncursion.connect(self.catchRwyIncursion)
        signals.cpdlcAcftConnected.connect(self.catchCpdlcInit)
        signals.cpdlcMessageReceived.connect(self.catchCpdlcMessage)
        signals.cpdlcProblem.connect(self.catchCpdlcProblem)
        signals.sessionStarted.connect(self.catchSessionStarted)
        signals.sessionEnded.connect(
            lambda: self.notify(Notification.GUI_INFO, 'Session ended.'))
        signals.sessionPaused.connect(
            lambda: self.notify(Notification.GUI_INFO, 'Simulation paused.'))
        signals.sessionResumed.connect(
            lambda: self.notify(Notification.GUI_INFO, 'Simulation resumed.'))
        signals.newWeather.connect(self.catchNewWeather)
        signals.voiceMsgNotRecognised.connect(
            lambda: self.notify(Notification.UNRECOGNISED_VOICE_INSTR,
                                'Voice instruction not recognised.'))
        signals.newATC.connect(self.catchNewATC)
        signals.newFPL.connect(self.catchNewFlightPlan)
        signals.stripAutoPrinted.connect(self.catchStripAutoPrinted)
        signals.controlledContactLost.connect(self.catchLostLinkedContact)
        signals.incomingRadioChatMsg.connect(
            lambda msg: self.notify(Notification.RADIO_CHAT_MSG, None))
        signals.incomingAtcTextMsg.connect(self.catchIncomingAtcMsg)
        signals.aircraftIdentification.connect(
            self.catchAircraftIdentification)
        signals.receiveStrip.connect(self.catchStripReceived)
        signals.wilco.connect(lambda: self.playSound(wilco_beep))

    def playSound(self, sound):
        self.media_player.setMedia(sound)
        self.media_player.play()

    def notify(self, t, msg, dblClick=None):
        if msg != None:
            signals.statusBarMsg.emit(msg)
            if t in icon_files:
                self.table_model.addNotification(t, msg, dblClick)
                self.notification_table.scrollToBottom()
        if settings.notification_sounds_enabled and not settings.session_start_sound_lock \
          and t in settings.sound_notifications \
          and not (settings.transmitting_radio and settings.PTT_mutes_sound_notifications):
            self.playSound(notification_sound_base[t])

    def notifyAlarmClockTimedOut(self, timer):
        self.notify(Notification.ALARM_TIMEOUT,
                    'Alarm clock %s timed out' % timer)

    ## USER ACTIONS/TOGGLES

    def enableSound(self, t, toggle):
        if toggle:
            settings.sound_notifications.add(t)
        else:
            settings.sound_notifications.remove(t)

    def togglePTTmute(self, toggle):
        settings.PTT_mutes_sound_notifications = toggle

    def notificationDoubleClicked(self):
        try:
            notification = self.table_model.history[
                self.notification_table.selectedIndexes()[0].row()]
        except IndexError:
            return
        if notification.double_click_function != None:
            notification.double_click_function()

    ## REACTING TO GUI SIGNALS

    def catchNewATC(self, callsign):
        if settings.session_manager.session_type == SessionType.FLIGHTGEAR_MP:
            self.notify(Notification.ATC_CONNECTED, '%s connected' % callsign)

    def catchIncomingAtcMsg(self, msg):
        if msg.isPrivate():
            self.notify(Notification.ATC_CHAT_MSG,
                        '%s: "%s"' % (msg.sender(), msg.txtOnly()))
        elif settings.ATC_chatroom_msg_notifications:
            self.notify(Notification.ATC_CHAT_MSG, 'ATC chat room message')

    def catchCpdlcInit(self, callsign):
        if settings.session_manager.session_type != SessionType.TEACHER:
            f = lambda cs=callsign: signals.cpdlcWindowRequest.emit(cs)
            self.notify(Notification.CPDLC_MSG,
                        'Data link established with %s' % callsign,
                        dblClick=f)

    def catchCpdlcMessage(self, callsign, msg):
        f = lambda cs=callsign: signals.cpdlcWindowRequest.emit(cs)
        if settings.session_manager.session_type == SessionType.TEACHER:
            self.notify(Notification.CPDLC_MSG,
                        'CPDLC transmission to %s' % callsign,
                        dblClick=f)
        elif msg.type() == CpdlcMessage.FREE_TEXT:
            self.notify(Notification.CPDLC_MSG,
                        'CPDLC text message from %s' % callsign,
                        dblClick=f)

    def catchCpdlcProblem(self, callsign, pb):
        f = lambda cs=callsign: signals.cpdlcWindowRequest.emit(cs)
        self.notify(Notification.CPDLC_PROBLEM,
                    'CPDLC problem with %s' % callsign,
                    dblClick=f)

    def catchLostLinkedContact(self, strip, pos):
        cs = strip.callsign(fpl=True)
        msg = 'Radar contact lost'
        if cs != None:
            msg += ' for ' + cs
        msg += ' ' + map_loc_str(pos)
        f = lambda coords=pos: signals.indicatePoint.emit(coords)
        self.notify(Notification.LOST_LINKED_CONTACT, msg, dblClick=f)

    def catchAircraftIdentification(self, strip, acft, modeS):
        if strip.linkedAircraft(
        ) is not acft:  # could already be hard linked if XPDR was turned off and back on (avoid too many signals)
            if modeS:
                msg = 'Callsign %s identified (mode S)' % strip.lookup(
                    FPL.CALLSIGN)
            else:
                msg = 'XPDR code %04o identified' % strip.lookup(
                    assigned_SQ_detail)
            f = lambda coords=acft.coords(): signals.indicatePoint.emit(coords)
            self.notify(Notification.RADAR_IDENTIFICATION, msg, dblClick=f)

    def catchStripReceived(self, strip):
        fromATC = strip.lookup(received_from_detail)
        if fromATC != None:
            self.notify(Notification.STRIP_RECEIVED,
                        'Strip received from %s' % fromATC)

    def catchStripAutoPrinted(self, strip, reason):
        msg = 'Strip printed'
        cs = strip.callsign(fpl=True)
        if cs != None:
            msg += ' for ' + cs
        if reason != None:
            msg += '; ' + reason
        self.notify(Notification.STRIP_AUTO_PRINTED, msg)

    def catchSessionStarted(self):
        txt = {
            SessionType.SOLO: 'Solo session started',
            SessionType.FLIGHTGEAR_MP: 'FlightGear multi-player connected',
            SessionType.STUDENT: 'Student session beginning',
            SessionType.TEACHER: 'Teacher session beginning'
        }[settings.session_manager.session_type]
        self.notify(Notification.GUI_INFO, txt)

    def catchNewWeather(self, station, weather):
        if station == settings.primary_METAR_station:
            self.notify(Notification.WEATHER_UPDATE,
                        'Weather update: %s' % weather.METAR())

    def catchNewFlightPlan(self, new_fpl):
        if new_fpl[FPL.ICAO_DEP] == settings.location_code or new_fpl[
                FPL.
                ICAO_ARR] == settings.location_code:  #STYLE use findAirfield?
            f = lambda fpl=new_fpl: signals.FPLeditRequest.emit(fpl)
            self.notify(Notification.FPL_FILED,
                        'FPL filed for %s' % settings.location_code,
                        dblClick=f)

    def catchEmergencySquawk(self, acft):
        f = lambda coords=acft.coords(): signals.indicatePoint.emit(coords)
        self.notify(Notification.EMG_SQUAWK,
                    'Aircraft squawking emergency',
                    dblClick=f)

    def catchRwyIncursion(self, phyrwy, acft):
        rwy = env.airport_data.physicalRunwayNameFromUse(phyrwy)
        f = lambda coords=acft.coords(): signals.indicatePoint.emit(coords)
        self.notify(Notification.RWY_INCURSION,
                    'Runway %s incursion!' % rwy,
                    dblClick=f)
Beispiel #16
0
class VideoWindow(QMainWindow):

    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)
        self.setWindowTitle("Beat timestamp editor") 

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        videoWidget = QVideoWidget()

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.setText("Play")
        self.playButton.clicked.connect(self.play)

        #add timestamp
        self.add = QPushButton()
        self.add.setEnabled(False)
        self.add.setIcon(self.style().standardIcon(QStyle.SP_DialogApplyButton))
        self.add.setText("Add")
        self.add.clicked.connect(self.add_timestamp)
        #clear timestamps
        self.clear = QPushButton()
        self.clear.setEnabled(False)
        self.clear.setIcon(self.style().standardIcon(QStyle.SP_DialogCancelButton))
        self.clear.setText("Clear")
        self.clear.clicked.connect(self.clear_timestamps)

        #--------------------
        #timestamp list
        self.list = QLabel()
        self.list.setText("Timestamps: ")
        self.list.setWordWrap(True)

        #*------------------

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                QSizePolicy.Maximum)

        # Create new action
        openAction = QAction(QIcon('open.png'), '&Open', self)        
        openAction.setShortcut('Ctrl+O')
        openAction.setStatusTip('Open movie')
        openAction.triggered.connect(self.openFile)

        # Create exit action
        exitAction = QAction(QIcon('exit.png'), '&Exit', self)        
        exitAction.setShortcut('Ctrl+Q')
        exitAction.setStatusTip('Exit application')
        exitAction.triggered.connect(self.exitCall)

        #Create save action
        self.saveAction = QAction(QIcon('save.png'), '&Save', self)        
        self.saveAction.setShortcut('Ctrl+S')
        self.saveAction.setStatusTip('Save .txt file')
        self.saveAction.triggered.connect(self.saveFile)
        self.saveAction.setEnabled(False)

        # Create menu bar and add action
        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu('&File')
        #fileMenu.addAction(newAction)
        fileMenu.addAction(openAction)
        fileMenu.addAction(self.saveAction)
        fileMenu.addAction(exitAction)
        

        # Create a widget for window contents
        wid = QWidget(self)
        self.setCentralWidget(wid)

        # Create layouts to place inside widget
        controlLayout = QGridLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton,0,0)
        controlLayout.addWidget(self.positionSlider,0,1)
        controlLayout.addWidget(self.add,1,0)
        controlLayout.addWidget(self.list,1,1,2,1)
        controlLayout.addWidget(self.clear,2,0)

        layout = QVBoxLayout()
        layout.addLayout(controlLayout)
        layout.addWidget(self.errorLabel)

        # Set widget to contain window contents
        wid.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

    def saveFile(self):
    	global audio_path
    	path = audio_path
    	file = ntpath.basename(path)
    	text_file = open(file + " - data.txt", "w")
    	justgimmedata = sorted(timestamps, key=float)
    	for i in justgimmedata:
    		text_file.write(str(i) + "\n")
    	text_file.close()

    def clear_timestamps(self):
    	del timestamps[:]
    	self.clear.setEnabled(False)
    	output="Timestamps: "
    	self.list.setText(output)

    def add_timestamp(self):
    	print("timestamp added: ", self.mediaPlayer.position())
    	timestamps.append(self.mediaPlayer.position()/1000)
    	iwannadie = sorted(timestamps, key=float)
    	output="Timestamps: "+str(' '.join(str(iwannadie)))
    	self.list.setText(output)
    	self.clear.setEnabled(True)

    def openFile(self):
        fileName = filedialog.askopenfilename(filetypes=(("Audio Files", ".wav .mp3"),   ("All Files", "*.*")))

        if fileName != '':
            self.mediaPlayer.setMedia(
                    QMediaContent(QUrl.fromLocalFile(fileName)))

            global audio_path
            audio_path = fileName

            self.playButton.setEnabled(True)
            self.add.setEnabled(True)

            self.saveAction.setEnabled(True)

    def exitCall(self):
        sys.exit(app.exec_())

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
            self.playButton.setText("Play")
        else:
            self.mediaPlayer.play()
            self.playButton.setText("Pause")

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
Beispiel #17
0
class jaabaGUI(QMainWindow):
    """ controller for the blob labeling GUI"""
    def __init__(self,parent=None):
        QMainWindow.__init__(self,parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        #add new slider
        # self.positionSlider=QSlider(Qt.Horizontal)
        # self.positionSlider.setGeometry (800,800,100,30)
        # self.positionSlider.setRange(0, 0)
        # self.positionSlider.sliderMoved.connect(self.setPosition)

        #setup Video
        #video player
        self.mediaPlayer1 = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.mediaPlayer2 = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        #self.mediaPlayer.metaDataChanged.connect(self.metaDataChanged)
        self.mediaPlayer1.durationChanged.connect(self.durationChanged)
        self.mediaPlayer1.positionChanged.connect(self.positionChanged)
        self.mediaPlayer2.positionChanged.connect(self.positionChanged)
        

        #visualizetion
        self.scene = QGraphicsScene()
        self.ui.graphicsView.setScene(self.scene)
        #self.scene.setBackgroundBrush(Qt.black)
        self.videoItem1 = QGraphicsVideoItem()
        self.videoItem2 = QGraphicsVideoItem()
        self.scene.addItem(self.videoItem1)
        self.scene.addItem(self.videoItem2)
        self.mediaPlayer1.setVideoOutput(self.videoItem1)
        self.mediaPlayer2.setVideoOutput(self.videoItem2)

        #slide bar
        print self.ui.horizontalSlider
        self.ui.horizontalSlider.setRange(0, 0)
        self.ui.horizontalSlider.sliderMoved.connect(self.setPosition)
        # self.ui.horizontalSlider.sliderPressed.connect(self.sliderPressed)



        #print self.ui.graphicsView.width()/2,self.ui.graphicsView.height()
        #self.videoItem1.setSize(QSizeF(self.ui.graphicsView.width()/2,self.ui.graphicsView.height()))
        #self.videoItem2.setSize(QSizeF(self.ui.graphicsView.width()*10,self.ui.graphicsView.height()*10))
       # self.videoItem2.setSize(graphicsView.size())
        #self.videoItem2.setOffset(QPointF(500,500))
        #self.videoItem2.setOffset(QPointF(self.ui.graphicsView.width()/2,0))   
        #self.videoItem2.setPos(QPointF(0,0))
        # print self.ui.graphicsView.width(), self.ui.graphicsView.height()
        # print self.ui.graphicsView.size()
        # print self.videoItem2.boundingRect().width(), self.videoItem2.boundingRect().height()
        # print self.ui.graphicsView.sceneRect()
        #self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)

        #callbacks
        self.ui.actionQuit.triggered.connect(self.quit)
        self.ui.actionLoad_Project.triggered.connect(self.loadVideo)
        #self.ui.buttonPlay.clicked[bool].connect(self.setToggleText)
        self.ui.buttonPlay.clicked.connect(self.play)
        #print self.ui.graphicsView.sizeHint()


        #initialization
        self.loaded = False
        self.videoFilename = None
        self.frame_count=None
        self.width=None
        self.height=None
        self.frame_trans=None



        
    # ###actions starts from here###
    def quit(self):
        QApplication.quit()

    def loadVideo(self):
        self.writeLog("Loading video...")

        self.videoFilename = QFileDialog.getOpenFileName(self, 'Open File', '.')[0]
        if not self.videoFilename:
            self.writeLog("User cancelled - no video loaded")
            return
        else:
       		cap=cv2.VideoCapture(self.videoFilename)
	    	self.frame_count=cap.get(cv2.CAP_PROP_FRAME_COUNT)
	    	self.width=cap.get(3)
	    	self.height=cap.get(4)
	        self.mediaPlayer2.setMedia(QMediaContent(QUrl.fromLocalFile(self.videoFilename )))
	        self.mediaPlayer1.setMedia(QMediaContent(QUrl.fromLocalFile(self.videoFilename )))
	        self.ui.buttonPlay.setEnabled(True)
            # self.mediaPlayer2.setVideoOutput(self.videoItem2)
            # self.mediaPlayer1.setVideoOutput(self.videoItem1)
            # size= self.videoItem2.nativeSize()
            # print size
            #print self.mediaPlayer.duration()
          
            #print self.mediaPlayer.metaData()
        self.writeLog("Video loaded!")

    def play(self):
    	
        self.videoItem1.setAspectRatioMode(0)
        self.videoItem2.setAspectRatioMode(0)
        self.scene.setSceneRect(0,0,self.ui.graphicsView.width(),self.ui.graphicsView.height())
        self.videoItem1.setSize(QSizeF(self.ui.graphicsView.width()/2,self.ui.graphicsView.height()))
        self.videoItem2.setSize(QSizeF(self.ui.graphicsView.width()/2,self.ui.graphicsView.height()))
        self.videoItem1.setPos(QPointF(0,0))
        self.videoItem2.setPos(QPointF(self.ui.graphicsView.width()/2,0))
        #self.ui.graphicsView.setGeometry(0,0, 600,800)
        #print 'graphicsView size', self.ui.graphicsView.size()
        #print 'graphicsScene size', self.scene.sceneRect()
        #self.videoItem2.setSize(QSizeF(1000,300))
        #print 'graphicsVideoItem size',self.videoItem2.size()
        # print 'item x',self.videoItem2.scenePos().x()
        # print 'item y', self.videoItem2.scenePos().y()
        # print 'item x',self.videoItem1.scenePos().x()
        # print 'item y', self.videoItem1.scenePos().y()

        if self.mediaPlayer1.state() == QMediaPlayer.PlayingState:
        	self.ui.buttonPlay.setIcon(self.ui.style().standardIcon(PyQt5.QtWidgets.QStyle.SP_MediaPlay))
        	self.ui.buttonPlay.setText("Play")
        	self.mediaPlayer1.pause()
        	self.writeLog("Video paused")
        else: 
        	self.ui.buttonPlay.setIcon(self.ui.style().standardIcon(PyQt5.QtWidgets.QStyle.SP_MediaPause))
	        self.ui.buttonPlay.setText("Stop")
	        self.mediaPlayer1.play()
	        self.writeLog("Playing video")

        if self.mediaPlayer2.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer2.pause()
        else: 
            self.mediaPlayer2.play()


        
        #size= self.videoItem2.nativeSize()
        # print self.mediaPlayer.duration()
      
        #print self.mediaPlayer.metaData()
      

        # print self.ui.graphicsView.width(), self.ui.graphicsView.height()
        # print self.ui.graphicsView.size()
        # print self.videoItem2.boundingRect().width(), self.videoItem2.boundingRect().height()
        # print self.ui.graphicsView.sceneRect()
        # print self.scene.sceneRect()
        # print self.ui.graphicsView.sizeHint()

    

    def setPosition(self, position):
    	self.mediaPlayer1.setPosition(position) 
    	self.mediaPlayer2.setPosition(position)  

    # when position of media changed, set slider and text box accordingly.
    def positionChanged(self, position):
        self.ui.horizontalSlider.setValue(position)
        if isinstance(self.frame_trans,float):
	        # print type(position),position
	        # print type(self.frame_trans),self.frame_trans 
	        # print position/self.frame_trans
	     	self.ui.lineEdit.setText(str(int(round(position/self.frame_trans,0))))
	       
        self.writeLog(str(position))    
    
    def durationChanged(self, duration):
	    self.ui.horizontalSlider.setRange(0, duration) 
	    self.frame_trans=self.mediaPlayer1.duration()/self.frame_count
	    print self.frame_trans

    

    def writeLog(self,text):
        self.ui.log.setText(text)
Beispiel #18
0
 def play(self, i):
     """播放指定的歌曲"""
     if hasattr(self, "playList"):
         self.playList.setCurrentIndex(i)    # 切换到第几首
         QMediaPlayer.play(self)    # 播放一次
Beispiel #19
0
class BackWindow(QWidget):
    def __init__(self, parent=None):
        super(BackWindow, self).__init__(parent)

        self.init_ui()

        self.w = None

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.main_mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        # self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

        self.main_mediaPlayer.positionChanged.connect(self.positionChanged)
        self.main_mediaPlayer.durationChanged.connect(self.durationChanged)
        self.main_mediaPlayer.error.connect(self.handleError)

        self._playlist = QMediaPlaylist()
        #self.addMedia("movie/movie1.wmv")

        self.init_play_list()

        self._stopped = True
        self.mediaPlayer.setVideoOutput(self.ui.videoWidget)

        self.mediaPlayer.setPlaylist(self._playlist)
        self.main_mediaPlayer.setPlaylist(self._playlist)

    def init_ui(self):
        ui_path = "ui/MediaPlayer.ui"
        print ui_path
        self.ui = loadUi(ui_path, self)

        self.ui.playButton.clicked.connect(self.play_movie)
        self.ui.nextButton.clicked.connect(self.next_movie)
        self.ui.launchButton.clicked.connect(self.launch_window)

        self.ui.positionSlider.setRange(0, 0)
        self.ui.positionSlider.sliderMoved.connect(self.setPosition)

    def init_play_list(self):
        movies = glob.glob(os.path.dirname("__file__") + "movie/*")

        #sort movies

        for movie in movies:
            self.addMedia(movie)

            self.ui.listWidget.addItem(movie)

    # プレイリストに動画を追加
    def addMedia(self, media_file):
        media_content = QMediaContent(QUrl.fromLocalFile(media_file))
        self._playlist.addMedia(media_content)

    """   def mousePressEvent(self, event):
        if self._stopped:
            self.play()
        else:
            self.mediaPlayer.pause()
            self._stopped = True
    """

    def play_movie(self):
        if self._stopped:
            # self.mediaPlayer.setVideoOutput(self.ui.videoWidget)
            # self.mediaPlayer.setPlaylist(self._playlist)
            self.mediaPlayer.play()
            self.main_mediaPlayer.play()
            self._stopped = False
            self.ui.playButton.setText("pause")
        else:
            self.mediaPlayer.pause()
            self.main_mediaPlayer.pause()

            self._stopped = True
            self.ui.playButton.setText("play")

    def next_movie(self):
        self._playlist.next()

    def back_movie(self):
        pass

    def launch_window(self):
        print "aaaaaaaaa"
        self.w = MainWindow()
        #self.w.show()

        self.main_mediaPlayer.setVideoOutput(self.w.ui.videoWidget)

    def positionChanged(self, position):
        self.ui.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.ui.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)
        self.main_mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
Beispiel #20
0
class VideoPlayer(QWidget):
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        videoWidget = QVideoWidget()

        openButton = QPushButton("Open...")
        openButton.clicked.connect(self.openFile)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.errorLabel)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                                                  QDir.homePath())

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
Beispiel #21
0
class VideoPlayer(QWidget):
    def __init__(self, aPath, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.setAttribute(Qt.WA_NoSystemBackground, True)
        self.setAcceptDrops(True)
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.StreamPlayback)
        self.mediaPlayer.mediaStatusChanged.connect(self.printMediaData)
        self.mediaPlayer.setVolume(80)
        self.videoWidget = QVideoWidget(self)

        self.setAcceptDrops(True)
        self.setWindowTitle("QT5 Player")
        self.setWindowIcon(QIcon.fromTheme("multimedia-video-player"))
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        self.setGeometry(100, 300, 600, 380)
        self.setContextMenuPolicy(Qt.CustomContextMenu)
        self.customContextMenuRequested[QPoint].connect(
            self.contextMenuRequested)
        self.show()
        self.widescreen = True

        self.lbl = QLineEdit('00:00:00')
        self.lbl.setReadOnly(True)
        self.lbl.setFixedWidth(70)
        self.lbl.setUpdatesEnabled(True)
        self.lbl.setStyleSheet(stylesheet(self))

        self.elbl = QLineEdit('00:00:00')
        self.elbl.setReadOnly(True)
        self.elbl.setFixedWidth(70)
        self.elbl.setUpdatesEnabled(True)
        self.elbl.setStyleSheet(stylesheet(self))

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedWidth(32)
        self.playButton.setStyleSheet("background-color: black")
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal, self)
        self.positionSlider.setStyleSheet(stylesheet(self))
        self.positionSlider.setRange(0, 100)
        self.positionSlider.sliderMoved.connect(self.setPosition)
        self.positionSlider.sliderMoved.connect(self.handleLabel)
        self.positionSlider.setSingleStep(2)
        self.positionSlider.setPageStep(20)
        self.positionSlider.setAttribute(Qt.WA_TranslucentBackground, True)

        self.clip = QApplication.clipboard()

        self.myurl = ""

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(5, 0, 5, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.lbl)
        controlLayout.addWidget(self.positionSlider)
        controlLayout.addWidget(self.elbl)

        layout = QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        layout.addWidget(self.videoWidget)
        layout.addLayout(controlLayout)

        self.setLayout(layout)

        self.myinfo = "©2016\nAxel Schneider\n\nMouse Wheel = Zoom\nUP = Volume Up\nDOWN = Volume Down\n" + \
                "LEFT = < 1 Minute\nRIGHT = > 1 Minute\n" + \
                "SHIFT+LEFT = < 10 Minutes\nSHIFT+RIGHT = > 10 Minutes"

        self.widescreen = True
        self.hideSlider()

        #### shortcuts ####
        self.shortcut = QShortcut(QKeySequence("q"), self)
        self.shortcut.activated.connect(self.handleQuit)
        self.shortcut = QShortcut(QKeySequence(" "), self)
        self.shortcut.activated.connect(self.play)
        self.shortcut = QShortcut(QKeySequence("f"), self)
        self.shortcut.activated.connect(self.handleFullscreen)
        self.shortcut = QShortcut(QKeySequence("i"), self)
        self.shortcut.activated.connect(self.handleInfo)
        self.shortcut = QShortcut(QKeySequence("s"), self)
        self.shortcut.activated.connect(self.toggleSlider)
        self.shortcut = QShortcut(QKeySequence(Qt.Key_Right), self)
        self.shortcut.activated.connect(self.forwardSlider)
        self.shortcut = QShortcut(QKeySequence(Qt.Key_Left), self)
        self.shortcut.activated.connect(self.backSlider)
        self.shortcut = QShortcut(QKeySequence(Qt.Key_Up), self)
        self.shortcut.activated.connect(self.volumeUp)
        self.shortcut = QShortcut(QKeySequence(Qt.Key_Down), self)
        self.shortcut.activated.connect(self.volumeDown)
        self.shortcut = QShortcut(
            QKeySequence(Qt.ShiftModifier + Qt.Key_Right), self)
        self.shortcut.activated.connect(self.forwardSlider10)
        self.shortcut = QShortcut(QKeySequence(Qt.ShiftModifier + Qt.Key_Left),
                                  self)
        self.shortcut.activated.connect(self.backSlider10)

        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.positionChanged.connect(self.handleLabel)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

        print("QT5 Player started")
        self.suspend_screensaver()

    def playMyURL(self, url):
        self.mediaPlayer.stop()
        print("myurl =", url)
        self.mediaPlayer.setMedia(QMediaContent(QUrl(url)))
        self.playButton.setEnabled(True)
        self.mediaPlayer.play()
        self.hideSlider()

    def suspend_screensaver(self):
        'suspend linux screensaver'
        proc = subprocess.Popen(
            'gsettings set org.gnome.desktop.screensaver idle-activation-enabled false',
            shell=True)
        proc.wait()

    def resume_screensaver(self):
        'resume linux screensaver'
        proc = subprocess.Popen(
            'gsettings set org.gnome.desktop.screensaver idle-activation-enabled true',
            shell=True)
        proc.wait()

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)
        mtime = QTime(0, 0, 0, 0)
        mtime = mtime.addMSecs(self.mediaPlayer.duration())
        self.elbl.setText(mtime.toString())

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        print("Error: ", self.mediaPlayer.errorString())

    def handleQuit(self):
        self.mediaPlayer.stop()
        self.resume_screensaver()
        print("Player versteckt ...")
        self.close()

    def contextMenuRequested(self, point):
        menu = QMenu()
        actionToggle = menu.addAction(QIcon.fromTheme("next"),
                                      "show / hide Slider (s)")
        actionFull = menu.addAction(QIcon.fromTheme("view-fullscreen"),
                                    "Fullscreen (f)")
        action169 = menu.addAction(QIcon.fromTheme("tv-symbolic"), "16 : 9")
        action43 = menu.addAction(QIcon.fromTheme("tv-symbolic"), "4 : 3")
        actionSep = menu.addSeparator()
        actionInfo = menu.addAction(QIcon.fromTheme("help-about"), "Info (i)")
        action5 = menu.addSeparator()
        actionQuit = menu.addAction(QIcon.fromTheme("application-exit"),
                                    "Exit (q)")

        actionQuit.triggered.connect(self.handleQuit)
        actionFull.triggered.connect(self.handleFullscreen)
        actionInfo.triggered.connect(self.handleInfo)
        actionToggle.triggered.connect(self.toggleSlider)
        action169.triggered.connect(self.screen169)
        action43.triggered.connect(self.screen43)
        menu.exec_(self.mapToGlobal(point))

    def wheelEvent(self, event):
        mwidth = self.frameGeometry().width()
        mheight = self.frameGeometry().height()
        mleft = self.frameGeometry().left()
        mtop = self.frameGeometry().top()
        mscale = event.angleDelta().y() / 5
        if self.widescreen == True:
            self.setGeometry(mleft, mtop, mwidth + mscale,
                             (mwidth + mscale) / 1.778)
        else:
            self.setGeometry(mleft, mtop, mwidth + mscale,
                             (mwidth + mscale) / 1.33)

    def screen169(self):
        self.widescreen = True
        mwidth = self.frameGeometry().width()
        mheight = self.frameGeometry().height()
        mleft = self.frameGeometry().left()
        mtop = self.frameGeometry().top()
        mratio = 1.778
        self.setGeometry(mleft, mtop, mwidth, mwidth / mratio)

    def screen43(self):
        self.widescreen = False
        mwidth = self.frameGeometry().width()
        mheight = self.frameGeometry().height()
        mleft = self.frameGeometry().left()
        mtop = self.frameGeometry().top()
        mratio = 1.33
        self.setGeometry(mleft, mtop, mwidth, mwidth / mratio)

    def handleFullscreen(self):
        if self.windowState() & Qt.WindowFullScreen:
            QApplication.setOverrideCursor(Qt.ArrowCursor)
            self.showNormal()
            print("no Fullscreen")
        else:
            self.showFullScreen()
            QApplication.setOverrideCursor(Qt.BlankCursor)
            print("Fullscreen entered")

    def handleInfo(self):
        msg = QMessageBox.about(self, "QT5 Player", self.myinfo)

    def toggleSlider(self):
        if self.positionSlider.isVisible():
            self.hideSlider()
        else:
            self.showSlider()

    def hideSlider(self):
        self.playButton.hide()
        self.lbl.hide()
        self.positionSlider.hide()
        self.elbl.hide()
        mwidth = self.frameGeometry().width()
        mheight = self.frameGeometry().height()
        mleft = self.frameGeometry().left()
        mtop = self.frameGeometry().top()
        if self.widescreen == True:
            self.setGeometry(mleft, mtop, mwidth, mwidth / 1.778)
        else:
            self.setGeometry(mleft, mtop, mwidth, mwidth / 1.33)

    def showSlider(self):
        self.playButton.show()
        self.lbl.show()
        self.positionSlider.show()
        self.elbl.show()
        mwidth = self.frameGeometry().width()
        mheight = self.frameGeometry().height()
        mleft = self.frameGeometry().left()
        mtop = self.frameGeometry().top()
        if self.widescreen == True:
            self.setGeometry(mleft, mtop, mwidth, mwidth / 1.55)
        else:
            self.setGeometry(mleft, mtop, mwidth, mwidth / 1.33)

    def forwardSlider(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() + 1000 * 60)

    def forwardSlider10(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() + 10000 * 60)

    def backSlider(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() - 1000 * 60)

    def backSlider10(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() - 10000 * 60)

    def volumeUp(self):
        self.mediaPlayer.setVolume(self.mediaPlayer.volume() + 10)
        print("Volume: " + str(self.mediaPlayer.volume()))

    def volumeDown(self):
        self.mediaPlayer.setVolume(self.mediaPlayer.volume() - 10)
        print("Volume: " + str(self.mediaPlayer.volume()))

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            self.move(event.globalPos() \
                        - QPoint(self.frameGeometry().width() / 2, \
                        self.frameGeometry().height() / 2))
            event.accept()

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.accept()
        elif event.mimeData().hasText():
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        if event.mimeData().hasUrls():
            url = event.mimeData().urls()[0].toString()
            print("url = ", url)
            self.mediaPlayer.stop()
            self.mediaPlayer.setMedia(QMediaContent(QUrl(url)))
            self.playButton.setEnabled(True)
            self.mediaPlayer.play()
        elif event.mimeData().hasText():
            mydrop = event.mimeData().text()
            ### YouTube url
            if "youtube" in mydrop:
                print("is YouTube", mydrop)
                self.clip.setText(mydrop)
                self.getYTUrl()
            else:
                ### normal url
                print("generic url = ", mydrop)
                self.mediaPlayer.setMedia(QMediaContent(QUrl(mydrop)))
                self.playButton.setEnabled(True)
                self.mediaPlayer.play()
                self.hideSlider()

    def loadFilm(self, f):
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(f)))
        self.playButton.setEnabled(True)
        self.mediaPlayer.play()

    def printMediaData(self):
        if self.mediaPlayer.mediaStatus() == 6:
            if self.mediaPlayer.isMetaDataAvailable():
                res = str(self.mediaPlayer.metaData("Resolution")).partition(
                    "PyQt5.QtCore.QSize(")[2].replace(", ",
                                                      " x ").replace(")", "")
                print("%s%s" % ("Video Resolution = ", res))
            else:
                print("no metaData available")

    def openFileAtStart(self, filelist):
        matching = [s for s in filelist if ".myformat" in s]
        if len(matching) > 0:
            self.loadFilm(matching)

##################### update Label ##################################

    def handleLabel(self):
        self.lbl.clear()
        mtime = QTime(0, 0, 0, 0)
        self.time = mtime.addMSecs(self.mediaPlayer.position())
        self.lbl.setText(self.time.toString())
Beispiel #22
0
class VideoWindow(QWidget):

    def __init__(self):
        super(VideoWindow, self).__init__()

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        videoWidget = QVideoWidget()

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)

        # Create layouts to place inside widget
        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.setSpacing(0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.errorLabel)

        # layout.addWidget(self.start_btn)

        # Set widget to contain window contents

        self.setLayout(layout)
        videoWidget.setFullScreen(False)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                self.style().standardIcon(QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
class VideoPlayer(QWidget):
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        self.videoItem = QGraphicsVideoItem()
        self.videoItem.setSize(QSizeF(640, 480))

        scene = QGraphicsScene(self)
        graphicsView = QGraphicsView(scene)

        scene.addItem(self.videoItem)

        rotateSlider = QSlider(Qt.Horizontal)
        rotateSlider.setRange(-180, 180)
        rotateSlider.setValue(0)
        rotateSlider.valueChanged.connect(self.rotateVideo)

        openButton = QPushButton("Open...")
        openButton.clicked.connect(self.openFile)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(graphicsView)
        layout.addWidget(rotateSlider)
        layout.addLayout(controlLayout)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(self.videoItem)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)

    def sizeHint(self):
        return QSize(800, 600)

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                                                  QDir.homePath())

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def rotateVideo(self, angle):
        x = self.videoItem.boundingRect().width() / 2.0
        y = self.videoItem.boundingRect().height() / 2.0

        self.videoItem.setTransform(QTransform().translate(
            x, y).rotate(angle).translate(-x, -y))
Beispiel #24
0
class VideoPlayer(QWidget):
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        self.playButton = QPushButton()
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Arial", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

    def play(self):
        self.playButton.setEnabled(False)

        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(path)))

        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.close()
            self.examen3 = Examen3()
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
        print(self.mediaPlayer.errorString())
Beispiel #25
0
class Cracker(object):
    """Logic for running the Cracker program"""

    SPEAKER = {Polly.__name__: Polly, Espeak.__name__: Espeak}
    _logger = logging.getLogger(__name__)

    def __init__(self, app: QApplication):
        super().__init__()
        self.app = app

        self.config = Configuration()
        _ = self.config.read_config()

        self.player = QMediaPlayer()
        self.speaker: AbstractSpeaker = self.get_speaker(
            self.config.speaker, self.player)
        self.textParser = TextParser(config_path=self.config.parser_config)

        self.gui = MainWindow(self.config, speakers=self.SPEAKER)
        self.gui.speaker = self.speaker
        self.gui.player = self.player

        self.key_manager = KeyBoardManager(self.app)

        # Event on closing GUI application
        self.gui.closeAppEvent.connect(self._close)

        self._last_pid = None

    def _close(self):
        "Handles closing whole application"
        self.key_manager.stop()

    def get_speaker(self, speaker_name, player) -> AbstractSpeaker:
        if speaker_name == Polly.__name__:
            if "profile_name" in self.config.default_values:
                profile_name = self.config.default_values["profile_name"]
                return Polly(player, profile_name)
            else:
                return Polly(player)
        elif speaker_name == Espeak.__name__:
            return Espeak(player)
        raise ValueError(
            f"No speaker was selected. Provided speaker name '{speaker_name}'")

    def run(self):
        self.gui.init()
        self.set_action()
        self.gui.show()

    def reduce_text(self):
        text = self.gui.textEdit.toPlainText()
        new_text = self.textParser.reduce_text(text)
        self.gui.textEdit.setText(new_text)

    def reduce_cite(self):
        text = self.gui.textEdit.toPlainText()
        new_text = self.textParser.reduce_cite(text)
        self.gui.textEdit.setText(new_text)

    def wiki_text(self):
        """Sets the text box with wikipedia specific cleaned text.
        Example of this is removing `citation needed` and other references.
        """
        text = self.gui.textEdit.toPlainText()
        text = self.textParser.wiki_text(text)
        self.gui.textEdit.setText(text)

    def read_text_area(self):
        """Reads out text in the text_box with selected speaker."""
        self.stop_text()
        text = self.gui.textEdit.toPlainText(
        )  # TODO: toHtml() gives more control

        self.textParser.parser_rules = self.config.regex_config
        text = self.textParser.reduce_text(text)
        self._read(text)

    def toggle_read_text_clipboard(self):
        """Reads out text from the clipboard with selected speaker."""
        if self.player.state() == QMediaPlayer.PlayingState:
            self.stop_text()
            self.player.stop()
        else:
            self.stop_text()
            text = self.app.clipboard().text()

            self.textParser.parser_rules = self.config.regex_config
            text = self.textParser.reduce_text(text)
            self._read(text)

    def _read(self, text):
        speaker_config = self._prepare_config()
        self._last_pid = self.speaker.read_text(text, **speaker_config)

    def toggle_read(self):
        if self.player.state() == QMediaPlayer.PausedState:
            self.player.play()
        else:
            self.player.pause()

    def stop_text(self):
        self.speaker.stop_text()

    def _prepare_config(self):
        config = dict(rate=self.gui.rate,
                      volume=self.gui.volume,
                      voice=self.gui.config.voice)
        return config

    def change_speaker(self, speaker_name):
        """Action on changing speaker.

        Important: Each speaker has its own configuration. These values should be updated on change."""
        self.speaker = self.SPEAKER[speaker_name](self.player)
        self.gui.change_speaker(speaker_name)

    def set_action(self):
        self.gui.stop_action.triggered.connect(self.stop_text)
        self.gui.read_action.triggered.connect(self.read_text_area)
        self.gui.clipboard_read_action.triggered.connect(
            self.toggle_read_text_clipboard)
        self.gui.toggle_action.triggered.connect(self.toggle_read)
        self.gui.reduce_action.triggered.connect(self.reduce_text)
        self.gui.wiki_action.triggered.connect(self.wiki_text)
        self.gui.speakerW.currentTextChanged.connect(self.change_speaker)

        self.key_manager.GlobalReadSignal.connect(
            self.toggle_read_text_clipboard)

        args = (["space", "control", "shift"], )
        p = Thread(target=self.key_manager.run, args=args)
        p.start()
Beispiel #26
0
class GameWindow(QWidget):
    def __init__(self, parent=None):
        super(GameWindow,self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.videoWidget = QVideoWidget()

        self.mediaPlayer.setVideoOutput(self.videoWidget)

        self.stringLabel = QLabel()
        self.stringLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)
        self.stringLabel.setTextFormat(Qt.RichText)
        self.stringLabel.setAlignment(Qt.AlignHCenter)

        layout = QVBoxLayout()
        layout.addWidget(self.videoWidget)
        layout.addWidget(self.stringLabel)

        self.setLayout(layout)

        self.mediaPlayer.positionChanged.connect(self.positionChanged)

    def openFile(self, fileName):
        if fileName != '':
            self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(fileName)))

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def playV(self, file, rate, visibility, labelString):
        self.position = 0
        self.startPos = 0
        self.duration = 0
        self.durChanged = False
        self.stopPos = False
        self.openFile(file)
        self.mediaPlayer.setPlaybackRate(rate)
        if visibility:
            self.videoWidget.show()
            self.stringLabel.show()
            self.stringLabel.setText(labelString)
        else:
            self.videoWidget.hide()
            self.stringLabel.show()
            self.stringLabel.setText(labelString)
        self.play()

    def closeEvent(self, event):
        event.ignore()
        self.mediaPlayer.stop()
        super(GameWindow, self).closeEvent(event)

    def positionChanged(self, pos):
        self.position = pos
        if not self.durChanged and self.position > 0:
            self.durationChanged(self.mediaPlayer.duration())
            self.durChanged = True
        if self.startPos > 0 and not self.stopPos and not self.videoWidget.isVisible():
            if self.position > self.startPos + 20000:
                self.play()
                self.stopPos = True

    def durationChanged(self, dur):
        self.duration = dur
        if self.duration > 40000 and not self.videoWidget.isVisible():
            self.startPos = random.randint(5000, self.duration - 25000)
            self.mediaPlayer.setPosition(self.startPos)

    def showPoints(self, pointsString):
        self.videoWidget.hide()
        self.stringLabel.show()
        self.stringLabel.setText(pointsString)
Beispiel #27
0
class Pencere(QWidget):
    def __init__(self):
        super().__init__()
        self.durum = False
        self.i = 0

        self.git()

    def git(self):
        v_box = QVBoxLayout()
        h_box = QHBoxLayout()

        self.media = QMediaPlayer()
        self.media.setMedia(
            QMediaContent(
                QUrl.fromLocalFile("C:/Users/Asus/Downloads/Payback.mp3")))
        self.buton = QPushButton("Oku")
        self.yazi = QLabel("Gelen Değer: ")
        self.yazi2 = QLabel("0")
        self.yazi3 = QLabel("1")
        self.ledbuton = QPushButton("Yak")
        self.ledbutonsondur = QPushButton("Sondur")
        self.butonmuzik = QPushButton("Çal")
        h_box.addWidget(self.buton)

        h_box.addWidget(self.yazi)
        h_box.addWidget(self.yazi2)
        h_box.addWidget(self.ledbuton)
        h_box.addWidget(self.ledbutonsondur)
        h_box.addWidget(self.butonmuzik)
        h_box.addWidget(self.yazi3)

        h_box.addStretch()
        v_box.addLayout(h_box)
        v_box.addStretch()
        self.setLayout(v_box)

        self.buton.clicked.connect(self.oku)
        self.ledbuton.clicked.connect(self.Yak)
        self.ledbutonsondur.clicked.connect(self.Sondur)
        self.butonmuzik.clicked.connect(self.cal)

        self.setGeometry(100, 100, 50, 50)
        self.show()

        #veri_yolu.flushInput()
    def oku(self):
        self.timer = QTimer()
        self.timer.timeout.connect(self.tekrarla)
        self.timer.start(10)

    def tekrarla(self):

        gelen_deger = veri_yolu.readline()

        gelen_deger = gelen_deger[:-2]
        #
        gelen_deger = gelen_deger.decode("utf-8")
        if (
                self.i != 0
        ):  #ilk okumada gelen \x ten kaçmak için.bu ifade döndürülemiyor int e.
            self.yazi2.setText(gelen_deger)

            self.ses = int(int(gelen_deger) * 100 / 1024)

            self.media.setVolume(self.ses)

    #self.ses = round(int(self.yazi2.text()) * 100 / 1024)
    #self.media.setVolume(self.ses)
        self.i += 1

    def Yak(self):
        veri_yolu.write(b'1')

    def Sondur(self):
        veri_yolu.write(b'0')

    def cal(self):
        self.media.play()
class PlaybackPanel(SpecialLabel):
    desktop_lyric_state_changed_signal = pyqtSignal(bool)
    playmode_changed_signal = pyqtSignal(int, int)
    media_player_notify_signal = pyqtSignal(int)
    muted_changed_signal = pyqtSignal(int)
    mark_favorite_completed_signal = pyqtSignal()
    current_media_changed_signal = pyqtSignal()
    music_ended_signal = pyqtSignal()
    update_window_lyric_signal = pyqtSignal(str, str)
    show_artist_info_signal = pyqtSignal(str)
    dont_hide_main_window_signal = pyqtSignal()

    def __init__(self, parent=None):
        super(PlaybackPanel, self).__init__(parent)
        self.initial_mediaplayer()
        self.create_actions()
        self.setup_ui()
        self.create_connections()
        self.initial_params()

    def create_connections(self):
        self.artistHeadLabel.clicked.connect(self.show_artist_info)
        self.desktopLyric.hide_desktop_lyric_signal.connect(self.desktop_lyric_closed)
        self.seekSlider.valueChanged.connect(self.slider_value_changed)
        self.seekSlider.sliderPressed.connect(self.slider_pressed)
        self.seekSlider.sliderReleased.connect(self.seek)
        self.mediaPlayer.positionChanged.connect(self.tick)
        self.mediaPlayer.mutedChanged.connect(self.muted_changed_signal.emit)
        self.mediaPlayer.stateChanged.connect(self.state_changed)
        self.mediaPlayer.durationChanged.connect(self.duration_changed)
        self.mediaPlayer.mediaStatusChanged.connect(self.media_status_changed)
        self.mediaPlayer.currentMediaChanged.connect(self.current_media_changed)

    def initial_mediaplayer(self):
        self.mediaPlayer = QMediaPlayer()
        self.mediaPlayer.setNotifyInterval(500)
        self.set_volume(globalSettings.Volume)

    def initial_params(self):
        self.playlist = None
        self.artistName = "Zheng-Yejian"
        self.clickPlayFlag = False  # 用来标志一首歌是否是主动点击选中的
        self.timerFlag = False
        self.timeStart = 0
        self.timeSpan = 0
        self.sourcePath = ""
        self.errorType = Configures.NoError
        self.currentSourceRow = -1
        self.nearPlayedSongs = []
        self.downloadDir = globalSettings.DownloadfilesPath
        self.songinfosManager = SonginfosManager()
        self.totalTime = Configures.ZeroTime
        self.playmode = Configures.PlaymodeRandom  # 播放模式指示器
        playlistTemp = Playlist()
        playlistTemp.fill_list(Configures.PlaylistFavorite)
        self.lovedSongs = playlistTemp.get_titles()

    def set_playlist(self, playlist):
        self.playlist = playlist
        self.currentSourceRow = self.playlist.get_current_row()

    def create_actions(self):
        self.nextAction = QAction(QIcon(IconsHub.ControlNext), "下一首", self, enabled=True, triggered=self.next_song)

        self.playAction = QAction(QIcon(IconsHub.ControlPlay), "播放/暂停", self, enabled=True, triggered=self.play_music)

        self.previousAction = QAction(
            QIcon(IconsHub.ControlPrevious), "上一首", self, enabled=True, triggered=self.previous_song
        )

        self.stopAction = QAction(
            QIcon(IconsHub.ControlStop), "停止", self, enabled=True, triggered=self.stop_music_but_timing
        )

    def get_play_button_action(self):
        return self.playAction

    def get_previous_button_action(self):
        return self.previousAction

    def get_next_button_action(self):
        return self.nextAction

    def get_stop_button_action(self):
        return self.stopAction

    def set_download_dir(self, dir):
        self.downloadDir = dir

    def get_loved_songs(self):
        return self.lovedSongs

    def get_songinfos_manager(self):
        return self.songinfosManager

    def setup_ui(self):
        self.setFixedHeight(50)
        # 桌面歌词标签
        self.desktopLyric = desktop_lyric.DesktopLyric()
        self.desktopLyric.set_color(globalSettings.DesktoplyricColors)
        # 3个标签
        self.artistHeadLabel = LabelButton()
        self.artistHeadLabel.setToolTip(self.tr("查看歌手信息"))
        self.artistHeadLabel.setFixedSize(QSize(42, 42))
        self.artistHeadLabel.setScaledContents(True)
        self.artistHeadLabel.setPixmap(QPixmap(IconsHub.Anonymous))

        self.musicTitleLabel = NewLabel()
        self.musicTitleLabel.setObjectName("musicTitleLabel")
        self.musicTitleLabel.setFixedSize(QSize(370, 20))
        self.musicTitleLabel.setText("Zheng-Yejian._.XYPLAYER")
        self.timeLabel = QLabel("00:00/00:00")
        self.timeLabel.setObjectName("timeLabel")
        self.timeLabel.setFixedHeight(20)
        self.timeLabel.setAlignment(Qt.AlignRight and Qt.AlignVCenter)

        # 五个基本按键
        self.playmodeButton = QToolButton(clicked=self.change_playmode)
        self.playmodeButton.setFocusPolicy(Qt.NoFocus)

        self.playmodeButton.setIcon(QIcon(IconsHub.PlaymodeRandom))
        self.playmodeButton.setIconSize(QSize(25, 25))
        self.playmodeButton.setToolTip("随机播放")

        self.favoriteButton = QToolButton(clicked=self.mark_as_favorite)
        self.favoriteButton.setFocusPolicy(Qt.NoFocus)
        self.favoriteButton.setToolTip("收藏")
        self.favoriteButton.setIcon(QIcon(IconsHub.Favorites))
        self.favoriteButton.setIconSize(QSize(20, 20))

        self.previousButton = QToolButton()
        self.previousButton.setFocusPolicy(Qt.NoFocus)
        self.previousButton.setIconSize(QSize(40, 40))
        self.previousButton.setShortcut(QKeySequence("Ctrl + Left"))
        self.previousButton.setDefaultAction(self.previousAction)

        self.playButton = QToolButton()
        self.playButton.setFocusPolicy(Qt.NoFocus)
        self.playButton.setIconSize(QSize(40, 40))
        self.playButton.setShortcut(QKeySequence("Ctrl + Down"))
        self.playButton.setDefaultAction(self.playAction)

        self.nextButton = QToolButton()
        self.nextButton.setFocusPolicy(Qt.NoFocus)
        self.nextButton.setIconSize(QSize(40, 40))
        self.nextButton.setFocusPolicy(Qt.NoFocus)
        self.nextButton.setShortcut(QKeySequence("Ctrl + Right"))
        self.nextButton.setDefaultAction(self.nextAction)

        self.desktopLyricButton = QToolButton(clicked=self.show_desktop_lyric)
        self.desktopLyricButton.setToolTip(self.tr("桌面歌词"))
        self.desktopLyricButton.setFocusPolicy(Qt.NoFocus)
        self.desktopLyricButton.setIcon(QIcon(IconsHub.DesktopLyric))
        self.desktopLyricButton.setIconSize(QSize(25, 25))

        self.seekSlider = QSlider(Qt.Horizontal)
        self.seekSlider.setObjectName("seekSlider")
        self.seekSlider.setFixedHeight(20)
        self.seekSlider.setFocusPolicy(Qt.NoFocus)
        self.seekSlider.setRange(0, 0)

        hbox1 = QHBoxLayout()
        hbox1.addWidget(self.favoriteButton)
        hbox1.addWidget(self.musicTitleLabel)
        hbox1.addStretch()
        hbox1.addWidget(self.timeLabel)
        vbox1 = QVBoxLayout()
        vbox1.addLayout(hbox1)
        vbox1.setSpacing(5)
        vbox1.addWidget(self.seekSlider)

        mainLayout = QHBoxLayout(self)
        mainLayout.setContentsMargins(2, 0, 0, 0)
        mainLayout.addWidget(self.artistHeadLabel)
        mainLayout.addWidget(self.previousButton)
        mainLayout.addWidget(self.playButton)
        mainLayout.addWidget(self.nextButton)
        mainLayout.addLayout(vbox1)
        mainLayout.addWidget(self.playmodeButton)
        mainLayout.addWidget(self.desktopLyricButton)

    def show_desktop_lyric(self):
        if self.desktopLyric.isHidden():
            beToOff = True
            self.desktopLyric.show()
            self.desktopLyric.original_place()
        else:
            beToOff = False
            self.desktopLyric.hide()
        self.desktop_lyric_state_changed_signal.emit(beToOff)

    def desktop_lyric_closed(self):
        self.desktop_lyric_state_changed_signal.emit(False)

    def change_playmode(self):
        oldPlaymode = self.playmode
        if self.playmode == Configures.PlaymodeRandom:
            self.set_new_playmode(Configures.PlaymodeOrder)
        elif self.playmode == Configures.PlaymodeOrder:
            self.set_new_playmode(Configures.PlaymodeSingle)
        elif self.playmode == Configures.PlaymodeSingle:
            self.set_new_playmode(Configures.PlaymodeRandom)
        self.playmode_changed_signal.emit(oldPlaymode, self.playmode)

    def set_new_playmode(self, playmode):
        self.playmode = playmode
        if playmode == Configures.PlaymodeRandom:
            iconPath = IconsHub.PlaymodeRandom
            toolTip = Configures.PlaymodeRandomText
        elif playmode == Configures.PlaymodeOrder:
            iconPath = IconsHub.PlaymodeOrder
            toolTip = Configures.PlaymodeOrderText
        else:
            iconPath = IconsHub.PlaymodeSingle
            toolTip = Configures.PlaymodeSingleText
        self.playmodeButton.setIcon(QIcon(iconPath))
        self.playmodeButton.setToolTip(toolTip)

    def ui_initial(self):
        self.mediaPlayer.stop()
        self.totalTime = "00:00"
        self.playAction.setIcon(QIcon(IconsHub.ControlPlay))
        self.musicTitleLabel.setText("Zheng-Yejian._.XYPLAYER")
        self.artistName = "Zheng-Yejian"
        self.artistHeadLabel.setPixmap(QPixmap(IconsHub.Anonymous))
        self.seekSlider.setRange(0, 0)
        self.favoriteButton.setIcon(QIcon(IconsHub.Favorites))
        self.favoriteButton.setToolTip("收藏")
        self.timeLabel.setText("00:00/00:00")

    def set_volume(self, volume):
        self.mediaPlayer.setVolume(volume)

    def set_muted(self, muted):
        self.mediaPlayer.setMuted(muted)

    def tick(self):
        currentTime = self.mediaPlayer.position()
        self.seekSlider.setValue(currentTime)
        cTime = format_position_to_mmss(currentTime // 1000)
        self.timeLabel.setText(cTime + "/" + self.totalTime)
        self.media_player_notify_signal.emit(currentTime)

    def slider_value_changed(self, value):
        cTime = format_position_to_mmss(value // 1000)
        self.timeLabel.setText("%s/%s" % (cTime, self.totalTime))
        self.media_player_notify_signal.emit(value)

    def slider_pressed(self):
        self.mediaPlayer.positionChanged.disconnect(self.tick)

    def seek(self):
        if self.mediaPlayer.state() == QMediaPlayer.StoppedState:
            self.mediaPlayer.play()
            self.mediaPlayer.setPosition(self.seekSlider.value())
        else:
            self.mediaPlayer.setPosition(self.seekSlider.value())
            self.mediaPlayer.play()
        self.mediaPlayer.positionChanged.connect(self.tick)

    def duration_changed(self, duration):
        self.seekSlider.setMaximum(duration)
        exactTotalTime = format_position_to_mmss(self.mediaPlayer.duration() // 1000)
        self.timeLabel.setText("%s/%s" % (Configures.ZeroTime, exactTotalTime))
        if self.totalTime != exactTotalTime:
            self.totalTime = exactTotalTime
            self.playlist.set_music_time_at(self.currentSourceRow, exactTotalTime)

    def check_favorite(self):
        if self.currentSourceRow >= 0:
            if self.playlist.get_music_title_at(self.currentSourceRow) in self.lovedSongs:
                self.favoriteButton.setIcon(QIcon(IconsHub.Favorites))
                self.favoriteButton.setToolTip("取消收藏")
            else:
                self.favoriteButton.setIcon(QIcon(IconsHub.FavoritesNo))
                self.favoriteButton.setToolTip("收藏")
            if self.playlist.get_name() == Configures.PlaylistFavorite:
                self.favoriteButton.setToolTip("收藏")

    def mark_as_favorite(self):
        if (
            self.playlist.get_name() == Configures.PlaylistFavorite
            or not self.playlist.length()
            or self.currentSourceRow < 0
        ):
            return
        path = self.playlist.get_music_path_at(self.currentSourceRow)
        title = self.playlist.get_music_title_at(self.currentSourceRow)
        if self.playlist.get_name() == Configures.PlaylistOnline:
            musicName = get_full_music_name_from_title(title)
            musicPath = os.path.join(self.downloadDir, musicName)
            musicPathO = os.path.join(Configures.MusicsDir, musicName)
            if not os.path.exists(musicPath) and not os.path.exists(musicPathO):
                QMessageBox.information(self, "提示", "请先下载该歌曲再添加喜欢!")
                return
            if os.path.exists(musicPath):
                path = musicPath
            else:
                path = musicPathO
        elif not os.path.exists(path):
            QMessageBox.information(self, "提示", "路径'" + "%s" % path + "'无效,无法标记喜欢!")
            return
        playlistTemp = Playlist()
        playlistTemp.fill_list(Configures.PlaylistFavorite)
        if title in self.lovedSongs:
            playlistTemp.remove_item_at(self.lovedSongs.index(title))
            playlistTemp.commit_records()
            self.lovedSongs.remove(title)
            self.favoriteButton.setIcon(QIcon(IconsHub.FavoritesNo))
            self.favoriteButton.setToolTip("收藏")
        else:
            playlistTemp.add_item_from_path(path)
            playlistTemp.commit_records()
            self.lovedSongs.append(title)
            self.favoriteButton.setIcon(QIcon(IconsHub.Favorites))
            self.favoriteButton.setToolTip("取消收藏")
        self.mark_favorite_completed_signal.emit()

    def show_artist_info(self):
        if self.artistName:
            self.show_artist_info_signal.emit(self.artistName)

    def decide_to_play_or_pause(self, row):
        if row != self.currentSourceRow:
            self.set_media_source_at_row(row, clickPlayFlag=True)
        elif self.mediaPlayer.state() in (QMediaPlayer.PausedState, QMediaPlayer.StoppedState):
            self.mediaPlayer.play()
        elif self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()

    def set_media_source_at_row(self, row, clickPlayFlag=False):
        if not self.playlist.length() or row < 0:
            return
        self.stop_music()
        self.clickPlayFlag = clickPlayFlag
        self.playlist.set_current_row(row)
        sourcePath = self.playlist.get_music_path_at(row)
        self.title = self.playlist.get_music_title_at(row)
        self.sourceTrace = "local" if self.playlist.get_music_id_at(row) == Configures.LocalMusicId else "online"
        self.artistName, self.musicName = get_artist_and_musicname_from_title(self.title)
        self.playlistName = self.playlist.get_name()
        self.totalTime = self.playlist.get_music_time_at(row)
        self.album = self.playlist.get_music_album_at(row)
        self.errorType = Configures.NoError
        isAnUrl = False
        if not os.path.exists(sourcePath):
            if self.playlist.get_name() == Configures.PlaylistOnline:
                if sourcePath == Configures.NoLink:
                    musicId = self.playlist.get_music_id_at(row)
                    sourcePath = SearchOnline.get_song_link(musicId)
                    if sourcePath:
                        self.playlist.set_music_path_at(row, sourcePath)
                    else:
                        self.errorType = Configures.UrlError
                isAnUrl = True
            else:
                self.errorType = Configures.PathError
                sourcePath = "/usr/share/sounds/error_happened.ogg"
        if self.errorType == Configures.NoError:
            self.sourcePath = sourcePath
            self.musicFileName = get_base_name_from_path(sourcePath)
            self.playedDate = get_time_of_now()
            self.songinfosManager.update_datas_of_item(
                self.musicFileName,
                self.playedDate,
                self.musicName,
                self.artistName,
                self.totalTime,
                self.album,
                self.playlistName,
            )
            if not self.timerFlag:
                self.timerFlag = True
                self.timeSpan = 0
            if isAnUrl:
                url = QUrl(sourcePath)
            else:
                url = QUrl.fromLocalFile(sourcePath)
            self.play_from_url(url)
        else:
            self.timerFlag = False
            self.dont_hide_main_window_signal.emit()
            if self.errorType == Configures.DisnetError:
                QMessageBox.critical(
                    self, "错误", "联网出错!\n无法联网播放歌曲'%s'!\n您最好在网络畅通时下载该曲目!" % self.playlist.get_music_title_at(row)
                )
            elif self.errorType == Configures.PathError:
                QMessageBox.information(self, "提示", "路径'%s'无效,请尝试重新下载并添加对应歌曲!" % self.playlist.get_music_path_at(row))

    def play_from_url(self, url):
        mediaContent = QMediaContent(url)
        self.mediaPlayer.setMedia(mediaContent)
        self.mediaPlayer.play()

    def state_changed(self, newState):
        if self and newState in [QMediaPlayer.PlayingState, QMediaPlayer.PausedState, QMediaPlayer.StoppedState]:
            if not self.playlist.length():
                return
            iconPath = IconsHub.ControlPause
            if newState in [QMediaPlayer.StoppedState, QMediaPlayer.PausedState]:
                iconPath = IconsHub.ControlPlay
            icon = QIcon(iconPath)
            self.playAction.setIcon(icon)
            if self.timerFlag:
                if newState == QMediaPlayer.PlayingState:
                    self.timeStart = time.time()
                else:
                    self.timeSpan += time.time() - self.timeStart

    def media_status_changed(self, status):
        if status == QMediaPlayer.EndOfMedia:
            self.music_finished()

    def music_finished(self):
        if self.errorType == Configures.NoError:
            self.next_song()

    def play_music(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def stop_music_but_timing(self):
        self.mediaPlayer.stop()
        self.seekSlider.setValue(0)
        self.media_player_notify_signal.emit(-0.5)

    def stop_music(self):
        self.stop_music_but_timing()
        if self.timerFlag:
            self.timerFlag = False
            InfosList = [
                self.playedDate,
                self.musicFileName,
                self.musicName,
                self.artistName,
                self.album,
                "%i" % change_mmss_to_seconds(self.totalTime),
                "%.1f" % self.timeSpan,
                self.playlistName,
                self.sourcePath,
                "%i" % (self.title in self.lovedSongs),
                self.sourceTrace,
                Configures.Playmodes[self.playmode],
                "%i" % self.clickPlayFlag,
            ]
            log_playback_history(organized_list_as_str(InfosList))
            self.songinfosManager.update_time_span_relate_of_item(self.musicFileName, self.timeSpan, self.clickPlayFlag)
            self.clickPlayFlag = False

    def get_next_random_row(self):
        listTemp = list(self.playlist.get_ids() - set(self.nearPlayedSongs))
        ran = random.randint(0, len(listTemp) - 1)
        return self.playlist.get_items_queue().index(listTemp[ran])

    def get_next_single_row(self):
        nextRow = self.currentSourceRow
        if nextRow < 0:
            nextRow = 0
        return nextRow

    def get_next_order_row(self, reverse=False):
        if reverse:
            if self.currentSourceRow < 0:
                self.currentSourceRow = 0
            return (self.currentSourceRow - 1) % self.playlist.length()
        return (self.currentSourceRow + 1) % self.playlist.length()

    def previous_song(self):
        self.play_source_on_next_row(reverse=True)

    def next_song(self):
        self.play_source_on_next_row()

    def play_source_on_next_row(self, reverse=False):
        if not self.playlist.length():
            return
        if self.mediaPlayer.position() > 20:
            self.music_ended_signal.emit()
        nextRow = 0
        if self.playmode == Configures.PlaymodeRandom:
            nextRow = self.get_next_random_row()
        elif self.playmode == Configures.PlaymodeOrder:
            nextRow = self.get_next_order_row(reverse)
        elif self.playmode == Configures.PlaymodeSingle:
            nextRow = self.get_next_single_row()
        self.set_media_source_at_row(nextRow)

    def current_media_changed(self):
        if not self.playlist.length():
            return
        self.current_media_changed_signal.emit()
        self.update_parameters()
        self.update_near_played_queue()
        self.check_favorite()

    def update_parameters(self):
        self.currentSourceRow = self.playlist.get_current_row()
        self.musicTitleLabel.setText(self.title)
        self.playAction.setText(self.musicName)
        imagePath = SearchOnline.get_artist_image_path(self.artistName)
        if imagePath:
            pixmap = QPixmap(imagePath)
        else:
            pixmap = QPixmap(IconsHub.Anonymous)
        self.artistHeadLabel.setPixmap(pixmap)
        musicId = self.playlist.get_music_id_at(self.currentSourceRow)
        self.update_window_lyric_signal.emit(self.title, musicId)

    def update_near_played_queue(self):
        self.currentSourceId = self.playlist.get_music_path_at(self.currentSourceRow)
        if self.playlist.get_name() == Configures.PlaylistOnline:
            self.currentSourceId = self.playlist.get_music_id_at(self.currentSourceRow)
        if self.currentSourceId not in self.nearPlayedSongs:
            self.nearPlayedSongs.append(self.currentSourceId)
        while len(self.nearPlayedSongs) >= self.playlist.length() * 4 / 5:
            del self.nearPlayedSongs[0]

    def add_title_into_loved_songs(self, title):
        self.lovedSongs.append(title)
Beispiel #29
0
class MainInterface(QMainWindow):
    def __init__(self, screen_scale_rate, user):

        super(MainInterface, self).__init__()

        self.rate = screen_scale_rate  # 屏幕缩放比例
        self.lock_sign = 0
        self.user = user
        self.get_settin()
        self.init_ui()

        self._padding = 5  # 设置边界宽度为5
        # 设置鼠标跟踪判断扳机默认值
        # reference: https://blog.csdn.net/qq_38528972/article/details/78573591
        self._move_drag = False
        self._corner_drag = False
        self._bottom_drag = False
        self._right_drag = False

        self._right_rect = []
        self._bottom_rect = []
        self._corner_rect = []
        self.image = None
        self.load_local_img = False
        self.load_local_img_path = folder_path
        self.save_result_path = [folder_path]  # 写成list, 传入方式为引用, 便于修改

    def init_ui(self):

        # 窗口尺寸
        self.resize(800 * self.rate, 120 * self.rate)
        self.setMouseTracking(True)  # 设置widget鼠标跟踪

        # 窗口无标题栏、窗口置顶、窗口透明
        self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint)
        # Mac系统下隐藏标题栏同时窗口透明会造成窗口不能伸缩
        self.setAttribute(Qt.WA_TranslucentBackground)
        # self.setWindowOpacity(0.7)

        # 窗口图标
        self.icon = QIcon()
        self.icon.addPixmap(QPixmap(folder_path + "/config/logo.ico"),
                            QIcon.Normal, QIcon.On)
        self.setWindowIcon(self.icon)

        # 系统托盘
        self.tray = QSystemTrayIcon(self)
        self.tray.setIcon(self.icon)
        self.tray.activated.connect(self.show)
        self.tray.show()

        # 鼠标样式
        # self.pixmap = QPixmap(folder_path + '/config/光标.png')
        # self.cursor = QCursor(self.pixmap, 0, 0)
        # self.setCursor(self.cursor)

        # 工具栏标签
        self.titleLabel = QLabel(self)
        self.titleLabel.setGeometry(0, 0, 800 * self.rate, 30 * self.rate)
        self.titleLabel.setStyleSheet(
            "background-color:rgba(62, 62, 62, 0.01)")

        self.Font = QFont()
        self.Font.setFamily("华康方圆体W7")
        self.Font.setPointSize(15)

        # 翻译框
        self.translateText = QTextBrowser(self)
        self.translateText.setGeometry(0, 30 * self.rate, 1500 * self.rate,
                                       90 * self.rate)
        self.translateText.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.translateText.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.translateText.setStyleSheet("border-width:0;\
                                          border-style:outset;\
                                          border-top:0px solid #e8f3f9;\
                                          color:white;\
                                          font-weight: bold;\
                                          background-color:rgba(62, 62, 62, %s)"
                                         % (self.horizontal))
        self.translateText.setFont(self.Font)

        # 翻译框加入描边文字
        self.format = QTextCharFormat()
        self.format.setTextOutline(
            QPen(QColor('#1E90FF'), 0.7, Qt.SolidLine, Qt.RoundCap,
                 Qt.RoundJoin))
        self.translateText.mergeCurrentCharFormat(self.format)
        self.translateText.append("欢迎~ 么么哒~")
        self.format.setTextOutline(
            QPen(QColor('#FF69B4'), 0.7, Qt.SolidLine, Qt.RoundCap,
                 Qt.RoundJoin))
        self.translateText.mergeCurrentCharFormat(self.format)
        self.translateText.append("点击设置修改待识别语言类型")
        self.format.setTextOutline(
            QPen(QColor('#674ea7'), 0.7, Qt.SolidLine, Qt.RoundCap,
                 Qt.RoundJoin))
        self.translateText.mergeCurrentCharFormat(self.format)
        self.translateText.append("点击截屏按钮选择识图区域")

        # 翻译框根据内容自适应大小
        self.document = self.translateText.document()
        self.document.contentsChanged.connect(self.textAreaChanged)

        # 此Label用于当鼠标进入界面时给出颜色反应
        self.dragLabel = QLabel(self)
        self.dragLabel.setObjectName("dragLabel")
        self.dragLabel.setGeometry(0, 0, 4000 * self.rate, 2000 * self.rate)

        # 截屏范围按钮
        self.RangeButton = QPushButton(qticon('fa.crop', color='white'), "",
                                       self)
        self.RangeButton.setIconSize(QSize(20, 20))
        self.RangeButton.setGeometry(
            QRect(193 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.RangeButton.setToolTip(
            '<b>截屏识别图片 ScreenShot Range</b><br>框选要识别的区域')
        self.RangeButton.setStyleSheet("background-color:rgba(62, 62, 62, 0);")
        self.RangeButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.RangeButton.hide()

        # 运行按钮
        self.StartButton = QPushButton(qticon('fa.play', color='white'), "",
                                       self)
        self.StartButton.setIconSize(QSize(20, 20))
        self.StartButton.setGeometry(
            QRect(233 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.StartButton.setToolTip(
            '<b>识别 Recognize</b><br>点击开始(手动)<br>开始/停止(自动)')
        self.StartButton.setStyleSheet("background: transparent")
        self.StartButton.clicked.connect(self.start_login)
        self.StartButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.StartButton.hide()

        # 手动打开文件按钮
        self.OpenButton = QPushButton(
            qticon('fa.folder-open-o', color='white'), "", self)
        self.OpenButton.setIconSize(QSize(20, 20))
        self.OpenButton.setGeometry(
            QRect(273 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.OpenButton.setToolTip('<b>打开识别图片 Open image</b><br> 识别本地图片')
        self.OpenButton.setStyleSheet("background-color:rgba(62, 62, 62, 0);")
        self.OpenButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.OpenButton.clicked.connect(self.open_image)
        self.OpenButton.hide()

        # 复制按钮
        self.CopyButton = QPushButton(qticon('fa.copy', color='white'), "",
                                      self)
        self.CopyButton.setIconSize(QSize(20, 20))
        self.CopyButton.setGeometry(
            QRect(313 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.CopyButton.setToolTip('<b>复制 Copy</b><br>将当前识别到的文本<br>复制至剪贴板')
        self.CopyButton.setStyleSheet("background-color:rgba(62, 62, 62, 0);")
        self.CopyButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.CopyButton.clicked.connect(lambda: copy(self.original))
        self.CopyButton.hide()

        # 朗读原文按钮
        self.playVoiceButton = QPushButton(qticon('fa.music', color='white'),
                                           "", self)
        self.playVoiceButton.setIconSize(QSize(20, 20))
        self.playVoiceButton.setGeometry(
            QRect(353 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.playVoiceButton.setToolTip('<b>朗读原文 Play Voice</b><br>朗读识别到的原文')
        self.playVoiceButton.setStyleSheet("background: transparent")
        self.playVoiceButton.clicked.connect(self.play_voice)
        self.playVoiceButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.playVoiceButton.hide()

        # 翻译模式按钮
        self.switchBtn = SwitchBtn(self)
        self.switchBtn.setGeometry(393 * self.rate, 5 * self.rate,
                                   50 * self.rate, 20 * self.rate)
        self.switchBtn.setToolTip('<b>模式 Mode</b><br>手动识别/自动识别')
        self.switchBtn.checkedChanged.connect(self.getState)
        self.switchBtn.setCursor(QCursor(Qt.PointingHandCursor))
        self.switchBtn.hide()

        # 识别原文字类型提示框
        languageFont = QFont()
        languageFont.setFamily("华康方圆体W7")
        languageFont.setPointSize(10)
        self.languageText = QPushButton(self)
        self.languageText.setIconSize(QSize(20, 20))
        self.languageText.setGeometry(
            QRect(463 * self.rate, 5 * self.rate, 45 * self.rate,
                  20 * self.rate))
        self.languageText.setToolTip(
            '<b>待识别的原文类型 </b><br>Original Language Type')
        self.languageText.setStyleSheet("border-width:0;\
                                                  border-style:outset;\
                                                  border-top:0px solid #e8f3f9;\
                                                  color:white;\
                                                  background-color:rgba(143, 143, 143, 0)"
                                        )
        self.languageText.setCursor(QCursor(Qt.PointingHandCursor))
        self.languageText.setText(
            config.letter_chinese_dict[self.data["language"]])
        self.languageText.setFont(languageFont)
        self.languageText.hide()

        # 设置按钮
        self.SettinButton = QPushButton(qticon('fa.cog', color='white'), "",
                                        self)
        self.SettinButton.setIconSize(QSize(20, 20))
        self.SettinButton.setGeometry(
            QRect(518 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.SettinButton.setToolTip('<b>设置 Settin</b>')
        self.SettinButton.setStyleSheet(
            "background-color:rgba(62, 62, 62, 0);")
        self.SettinButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.SettinButton.hide()

        # 锁按钮
        self.LockButton = QPushButton(qticon('fa.lock', color='white'), "",
                                      self)
        self.LockButton.setIconSize(QSize(20, 20))
        self.LockButton.setGeometry(
            QRect(562 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.LockButton.setToolTip('<b>锁定翻译界面 Lock</b>')
        self.LockButton.setStyleSheet("background-color:rgba(62, 62, 62, 0);")
        self.LockButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.LockButton.clicked.connect(self.lock)
        self.LockButton.hide()

        # 最小化按钮
        self.MinimizeButton = QPushButton(qticon('fa.minus', color='white'),
                                          "", self)
        self.MinimizeButton.setIconSize(QSize(20, 20))
        self.MinimizeButton.setGeometry(
            QRect(602 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.MinimizeButton.setToolTip('<b>最小化 Minimize</b>')
        self.MinimizeButton.setStyleSheet(
            "background-color:rgba(62, 62, 62, 0);")
        self.MinimizeButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.MinimizeButton.clicked.connect(self.showMinimized)
        self.MinimizeButton.hide()

        # 退出按钮
        self.QuitButton = QPushButton(qticon('fa.times', color='white'), "",
                                      self)
        self.QuitButton.setIconSize(QSize(20, 20))
        self.QuitButton.setGeometry(
            QRect(642 * self.rate, 5 * self.rate, 20 * self.rate,
                  20 * self.rate))
        self.QuitButton.setToolTip('<b>退出程序 Quit</b>')
        self.QuitButton.setStyleSheet("background-color:rgba(62, 62, 62, 0);")
        self.QuitButton.setCursor(QCursor(Qt.PointingHandCursor))
        self.QuitButton.hide()

        # 右下角用于拉伸界面的控件 mac系统应该注释掉
        self.statusbar = QStatusBar(self)
        self.statusbar.setStyleSheet("background-color:rgba(62, 62, 62, 0);")
        self.setStatusBar(self.statusbar)

    # 锁定界面
    def lock(self):

        try:
            if self.lock_sign == 0:
                self.LockButton.setIcon(qticon('fa.unlock', color='white'))
                self.dragLabel.hide()
                self.lock_sign = 1

                if self.horizontal == 0.01:
                    self.horizontal = 0
            else:
                self.LockButton.setIcon(qticon('fa.lock', color='white'))
                self.LockButton.setStyleSheet(
                    "background-color:rgba(62, 62, 62, 0);")
                self.dragLabel.show()
                self.lock_sign = 0

                if self.horizontal == 0:
                    self.horizontal = 0.01

            self.translateText.setStyleSheet("border-width:0;\
                                              border-style:outset;\
                                              border-top:0px solid #e8f3f9;\
                                              color:white;\
                                              font-weight: bold;\
                                              background-color:rgba(62, 62, 62, %s)"
                                             % (self.horizontal))
        except Exception:
            write_error(format_exc())

    # 当翻译内容改变时界面自适应窗口大小
    def textAreaChanged(self):

        newHeight = self.document.size().height()
        width = self.width()
        self.resize(width, newHeight + 30 * self.rate)
        self.translateText.setGeometry(0, 30 * self.rate, width, newHeight)

    # 判断翻译模式键状态
    def getState(self, checked):

        if checked:
            self.mode = True
        else:
            self.mode = False

            with open(folder_path + '/config/settin.json') as file:
                data = load(file)
                data["sign"] = 1
            with open(folder_path + '/config/settin.json', 'w') as file:
                dump(data, file, indent=2)
            self.StartButton.setIcon(qticon('fa.play', color='white'))

    # 鼠标移动事件
    def mouseMoveEvent(self, e: QMouseEvent):

        if self.lock_sign == 1:
            return

        try:
            self._endPos = e.pos() - self._startPos
            self.move(self.pos() + self._endPos)
        except Exception:
            write_error(format_exc())

    # 鼠标移动事件 mac
    # def mouseMoveEvent(self, QMouseEvent):
    #     if self.lock_sign == 1:
    #         return
    #
    #     # 判断鼠标位置切换鼠标手势
    #     if QMouseEvent.pos() in self._corner_rect:
    #         self.setCursor(Qt.SizeFDiagCursor)
    #     elif QMouseEvent.pos() in self._bottom_rect:
    #         self.setCursor(Qt.SizeVerCursor)
    #     elif QMouseEvent.pos() in self._right_rect:
    #         self.setCursor(Qt.SizeHorCursor)
    #     else:
    #         self.setCursor(self.cursor)
    #         # self.setCursor(Qt.ArrowCursor)
    #
    #     # 当鼠标左键点击不放及满足点击区域的要求后,分别实现不同的窗口调整
    #     if Qt.LeftButton and self._right_drag:
    #         # 右侧调整窗口宽度
    #         self.resize(QMouseEvent.pos().x(), self.height())
    #         QMouseEvent.accept()
    #     elif Qt.LeftButton and self._bottom_drag:
    #         # 下侧调整窗口高度
    #         self.resize(self.width(), QMouseEvent.pos().y())
    #         QMouseEvent.accept()
    #     elif Qt.LeftButton and self._corner_drag:
    #         # 右下角同时调整高度和宽度
    #         self.resize(QMouseEvent.pos().x(), QMouseEvent.pos().y())
    #         QMouseEvent.accept()
    #     elif Qt.LeftButton and self._move_drag:
    #         # 标题栏拖放窗口位置
    #         self.move(QMouseEvent.globalPos() - self.move_drag_position)
    #         QMouseEvent.accept()

    # # 鼠标按下事件
    def mousePressEvent(self, e: QMouseEvent):

        if self.lock_sign == 1:
            return

        try:
            if e.button() == Qt.LeftButton:
                self._isTracking = True
                self._startPos = QPoint(e.x(), e.y())
        except Exception:
            write_error(format_exc())

    # 鼠标按下事件 mac
    # def mousePressEvent(self, event):
    #
    #     if self.lock_sign == 1:
    #         return
    #
    #     try:
    #         # 重写鼠标点击的事件
    #         if (event.button() == Qt.LeftButton) and (event.pos() in self._corner_rect):
    #             # 鼠标左键点击右下角边界区域
    #             self._corner_drag = True
    #             event.accept()
    #         elif (event.button() == Qt.LeftButton) and (event.pos() in self._right_rect):
    #             # 鼠标左键点击右侧边界区域
    #             self._right_drag = True
    #             event.accept()
    #         elif (event.button() == Qt.LeftButton) and (event.pos() in self._bottom_rect):
    #             # 鼠标左键点击下侧边界区域
    #             self._bottom_drag = True
    #             event.accept()
    #         elif (event.button() == Qt.LeftButton) and (event.y() < self.height()):
    #             # 鼠标左键点击区域
    #             self._move_drag = True
    #             self.move_drag_position = event.globalPos() - self.pos()
    #             event.accept()
    #     except Exception:
    #         write_error(format_exc())

    # # 鼠标松开事件
    def mouseReleaseEvent(self, e: QMouseEvent):

        if self.lock_sign == 1:
            return

        try:
            if e.button() == Qt.LeftButton:
                self._isTracking = False
                self._startPos = None
                self._endPos = None
        except Exception:
            write_error(format_exc())

    # 鼠标松开事件 mac
    # def mouseReleaseEvent(self, e: QMouseEvent):
    #     if self.lock_sign == 1:
    #         return
    #
    #     try:
    #         if e.button() == Qt.LeftButton:
    #             self._isTracking = False
    #             self._startPos = None
    #             self._endPos = None
    #
    #             # 鼠标释放后,各扳机复位
    #             self._move_drag = False
    #             self._corner_drag = False
    #             self._bottom_drag = False
    #             self._right_drag = False
    #     except Exception:
    #         write_error(format_exc())

    # 鼠标进入控件事件
    def enterEvent(self, QEvent):

        if self.lock_sign == 1:
            self.LockButton.show()
            self.LockButton.setStyleSheet(
                "background-color:rgba(62, 62, 62, 0.7);")
            return

        try:
            # 显示所有顶部工具栏控件
            self.switchBtn.show()
            self.StartButton.show()
            self.SettinButton.show()
            self.RangeButton.show()
            self.OpenButton.show()
            self.CopyButton.show()
            self.QuitButton.show()
            self.MinimizeButton.show()
            self.playVoiceButton.show()
            self.LockButton.show()
            self.languageText.show()

            self.setStyleSheet(
                'QLabel#dragLabel {background-color:rgba(62, 62, 62, 0.3)}')

        except Exception:
            write_error(format_exc())

    def resizeEvent(self, QResizeEvent):
        # 重新调整边界范围以备实现鼠标拖放缩放窗口大小,采用三个列表生成式生成三个列表
        self._right_rect = [
            QPoint(x, y) for x in range(self.width() - self._padding,
                                        self.width() + 1)
            for y in range(1,
                           self.height() - self._padding)
        ]
        self._bottom_rect = [
            QPoint(x, y) for x in range(1,
                                        self.width() - self._padding)
            for y in range(self.height() - self._padding,
                           self.height() + 1)
        ]
        self._corner_rect = [
            QPoint(x, y) for x in range(self.width() - self._padding,
                                        self.width() + 1)
            for y in range(self.height() - self._padding,
                           self.height() + 1)
        ]

    # 鼠标离开控件事件
    def leaveEvent(self, QEvent):

        try:
            # 重置所有控件的位置和大小
            width = (self.width() * 213) / 800
            height = self.height() - 30

            self.RangeButton.setGeometry(
                QRect(width - 20 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.StartButton.setGeometry(
                QRect(width + 20 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.OpenButton.setGeometry(
                QRect(width + 60 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.CopyButton.setGeometry(
                QRect(width + 100 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.playVoiceButton.setGeometry(
                QRect(width + 140 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.switchBtn.setGeometry(
                QRect(width + 180 * self.rate, 5 * self.rate, 50 * self.rate,
                      20 * self.rate))
            self.languageText.setGeometry(width + 250 * self.rate,
                                          5 * self.rate, 45 * self.rate,
                                          20 * self.rate)
            self.SettinButton.setGeometry(
                QRect(width + 305 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.LockButton.setGeometry(
                QRect(width + 345 * self.rate, 5 * self.rate, 24 * self.rate,
                      20 * self.rate))
            self.MinimizeButton.setGeometry(
                QRect(width + 389 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.QuitButton.setGeometry(
                QRect(width + 429 * self.rate, 5 * self.rate, 20 * self.rate,
                      20 * self.rate))
            self.translateText.setGeometry(0, 30 * self.rate, self.width(),
                                           height * self.rate)

            # 隐藏所有顶部工具栏控件
            self.switchBtn.hide()
            self.StartButton.hide()
            self.SettinButton.hide()
            self.RangeButton.hide()
            self.OpenButton.hide()
            self.CopyButton.hide()
            self.QuitButton.hide()
            self.MinimizeButton.hide()
            self.playVoiceButton.hide()
            self.LockButton.hide()
            self.languageText.hide()

            self.setStyleSheet('QLabel#dragLabel {background-color:none}')

        except Exception:
            write_error(format_exc())

    # 获取界面预设参数
    def get_settin(self):

        with open(folder_path + '/config/settin.json') as file:
            self.data = load(file)

        # 翻译模式预设
        self.mode = False
        # 原文预设值
        self.original = ''

        # 透明度预设
        self.horizontal = (self.data["horizontal"]) / 100
        if self.horizontal == 0:
            self.horizontal = 0.01

        # 各翻译源线程状态标志
        self.thread_state = 0

    def start_login(self):

        with open(folder_path + '/config/settin.json') as file:
            data = load(file)

        if data["sign"] % 2 == 0:
            data["sign"] += 1
            with open(folder_path + '/config/settin.json', 'w') as file:
                dump(data, file, indent=2)

            self.StartButton.setIcon(qticon('fa.play', color='white'))
        else:
            thread = TranslateThread(self, self.mode)
            thread.use_translate_signal.connect(self.use_translate)
            thread.start()
            thread.exec()

    # 创造翻译线程
    def creat_thread(self, fun, original, data, translate_type):

        self.thread_state += 1  # 线程开始,增加线程数
        translation_source = UseTranslateThread(fun, original, data,
                                                translate_type)
        thread = Thread(target=translation_source.run)
        thread.setDaemon(True)
        translation_source.use_translate_signal.connect(self.display_text)
        thread.start()

    # 并发执行所有翻译源
    def use_translate(self, signal_list, original, data, result_with_location,
                      translate_result):

        # 翻译界面清屏
        self.translateText.clear()
        # 设定翻译时的字体类型和大小
        self.Font.setFamily(data["fontType"])
        self.Font.setPointSize(data["fontSize"])
        self.translateText.setFont(self.Font)

        if "original" in signal_list or "error" in signal_list:
            if data["vis_result"] == "True":
                self.vis_res = VisResult(np_img=self.image,
                                         result=result_with_location,
                                         configs=data,
                                         translate_result=translate_result,
                                         save_path=self.save_result_path)
                self.vis_res.result_signal.connect(self.display_modify_text)
                self.vis_res.show()
            if translate_result == '':
                self.creat_thread(None, original, data, "original")
            else:
                if data['showOriginal'] == "True":
                    self.creat_thread(None, original, data, "original")
            self.creat_thread(None, translate_result, data, "translated")

    # 将翻译结果打印
    def display_text(self, result, data, translate_type):

        try:
            if data["showColorType"] == "False":
                self.format.setTextOutline(
                    QPen(QColor(data["fontColor"][translate_type]), 0.7,
                         Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
                self.translateText.mergeCurrentCharFormat(self.format)
                self.translateText.append(result)
            else:
                self.translateText.append(
                    "<font color=%s>%s</font>" %
                    (data["fontColor"][translate_type], result))

            # 保存译文
            self.save_text(result, translate_type)
            self.thread_state -= 1  # 线程结束,减少线程数
        except Exception:
            write_error(format_exc())

    # 将修改后的结果打印
    def display_modify_text(self, result, data, translate_type,
                            translate_result):
        self.translateText.clear()

        if data["showColorType"] == "False":
            if translate_result == '':
                self.format.setTextOutline(
                    QPen(QColor(data["fontColor"][translate_type]), 0.7,
                         Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
                self.translateText.mergeCurrentCharFormat(self.format)
                self.translateText.append(result)
            else:
                if data["showOriginal"] == "True":
                    self.format.setTextOutline(
                        QPen(QColor(data["fontColor"][translate_type]), 0.7,
                             Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
                    self.translateText.mergeCurrentCharFormat(self.format)
                    self.translateText.append(result)

            self.format.setTextOutline(
                QPen(QColor(data["fontColor"]['translated']), 0.7,
                     Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
            self.translateText.mergeCurrentCharFormat(self.format)
            self.translateText.append(translate_result)
        else:
            if translate_result == '':
                self.translateText.append(
                    "<font color=%s>%s</font>" %
                    (data["fontColor"][translate_type], result))
            else:
                if data["showOriginal"] == "True":
                    self.translateText.append(
                        "<font color=%s>%s</font>" %
                        (data["fontColor"][translate_type], result))
            self.translateText.append(
                "<font color=%s>%s</font>" %
                (data["fontColor"]['translated'], translate_result))
        self.original = result

    # 语音朗读
    def play_voice(self):
        if not self.original:
            return
        try:
            # thread = Thread(target=Voice, args=(self.original,))
            # thread.setDaemon(True)
            # thread.start()

            self.player = None
            flag, voice_file = Voice(self.original).save_voice()
            if flag:
                file = QUrl.fromLocalFile(voice_file)
                content = QMediaContent(file)
                self.player = QMediaPlayer()
                self.player.setMedia(content)
                self.player.play()

        except Exception:
            write_error(format_exc())

    def save_text(self, text, translate_type):

        if translate_type == "caiyunPrivate":
            content = "\n[私人翻译]\n%s" % text
        else:
            content = ""

        with open(folder_path + "/config/识别结果.txt", "a+",
                  encoding="utf-8") as file:
            file.write(content)

    def open_image(self):
        file_choose, file_type = QFileDialog.getOpenFileName(
            self, "选取文件", self.load_local_img_path,
            "jpg (*.jpg);; png (*.png);; jpeg (*.jpeg);;All Files (*)")
        img = imread(file_choose)
        if img is not None:
            self.load_local_img_path = dirname(file_choose)
            self.image = img
            self.load_local_img = True
            self.start_login()
Beispiel #30
0
class QGisMap(QtWidgets.QWidget, Ui_Form):
    
    def __init__(self,projectfile,MainWidget):
        QtWidgets.QMainWindow.__init__(self)
        if os.name == 'nt':
            ffmpeg = os.path.dirname(__file__)[0:-18]+'/Video_UAV_Tracker/FFMPEG/ffmpeg.exe'
            versione = 'ffmpeg.exe'
        else:
            ffmpeg = os.path.dirname(__file__)+'/FFMPEG/./ffmpeg'
            versione = 'ffmpeg'
        if os.path.exists(ffmpeg) == True:
            self.setupUi(self)
            self.setWindowFlags(Qt.WindowStaysOnTopHint)
            self.Main = MainWidget
            self.projectfile = projectfile
            with open(self.projectfile,'r') as File:
                    for line in File:
                        if line[0:19] == 'Video file location':
                            self.videoFile = line.split('=')[-1][1:-1]
                        elif line[0:23] == 'Video start at msecond:':
                            self.fps = (1 / (float(line.split()[7]))) * 1000
                            self.StartMsecond = int(line.split()[4])
                        elif line[0:4] == 'DB =':
                            DB = line.split('=')[-1][1:-1]
                            if DB == 'None':
                                self.DB = None
                            else:
                                self.DB = DB
                            break            
            self.pushButton_3.setCheckable(True)
            self.EnableMapTool = False
            self.ExtractTool = 0
            self.dockWidget_4.hide()
            self.GPXList = []
            self.positionMarker=PositionMarker(self.Main.iface.mapCanvas())               
            self.muteButton.setIcon(
                        self.style().standardIcon(QStyle.SP_MediaVolume))
            self.playButton.setIcon(
                        self.style().standardIcon(QStyle.SP_MediaPause))
            self.player = QMediaPlayer()
            self.player.setVideoOutput(self.video_frame)  
            self.playButton.clicked.connect(self.PlayPause)
            self.muteButton.clicked.connect(self.MuteUnmute)
            self.toolButton_11.clicked.connect(self.SkipBackward)
            self.toolButton_12.clicked.connect(self.SkipForward)
            self.SkipBacktoolButton_8.clicked.connect(self.BackwardFrame)
            self.SkipFortoolButton_9.clicked.connect(self.ForwardFrame)
            self.toolButton_4.clicked.connect(self.ExtractToolbar)
            self.toolButton_5.clicked.connect(self.close)   
            self.pushButtonCut_2.clicked.connect(self.ExtractCommand)
            self.pushButtonCutA_6.clicked.connect(self.ExtractFromA)
            self.pushButtonCutB_6.clicked.connect(self.ExtractToB)
            self.pushButton_5.clicked.connect(self.CancelVertex)  
            self.progressBar.hide()     
            self.Main.pushButton_2.hide()
            self.Main.pushButton_8.hide()
            self.Main.groupBox.show()
            self.Main.groupBox_4.hide()
            self.ExtractA = False
            self.ExtractB = False
            self.ExtractedDirectory = None 
            self.pushButtonCut_2.setEnabled(False)
            self.toolButton_6.setEnabled(False)
            self.LoadGPXVideoFromPrj(self.projectfile)  
        else:
            ret = QMessageBox.warning(self, "Warning", 'missing ffmpeg binaries, please download it from https://github.com/sagost/VideoUavTracker/blob/master/FFMPEG/'+versione+' and paste it in /.qgis3/python/plugins/Video_UAV_Tracker/FFMPEG/ ', QMessageBox.Ok)
            self.close()        
    def LoadGPXVideoFromPrj(self,VideoGisPrj):
        
        self.Polyline = []
        with open(VideoGisPrj,'r') as File:
            Counter = 0
            for line in File:
                if Counter < 5:
                    pass
                else:
                    line = line.split()
                    lat = float(line[0])
                    lon = float(line[1])
                    ele = float(line[2])
                    speed = float(line[3])
                    course = float(line[4])
                    time = line[5]
                    Point = [lat,lon,ele,speed,course,time]
                    qgsPoint = QgsPoint(lon,lat)
                    self.Polyline.append(qgsPoint)
                    self.GPXList.append(Point)
                Counter = Counter + 1
        self.GpsLayer = QgsVectorLayer("LineString?crs=epsg:4326", self.videoFile.split('.')[-2].split('/')[-1], "memory")
        self.pr = self.GpsLayer.dataProvider()
        feat = QgsFeature()
        feat.setGeometry(QgsGeometry.fromPolyline(self.Polyline))
        self.pr.addFeatures([feat])
        self.GpsLayer.updateExtents()
        if self.DB != None:
            try:
                self.DBLayer = QgsVectorLayer(self.DB,self.DB.split('.')[-2].split('/')[-1],'ogr')
                QgsProject.instance().addMapLayers([self.DBLayer,self.GpsLayer]) 
                self.AddPointMapTool = AddPointTool(self.Main.iface.mapCanvas(),self.DBLayer,self)
                self.toolButton_6.clicked.connect(self.AddPointTool)   
                self.toolButton_6.setEnabled(True)
            except:
                ret = QMessageBox.warning(self, "Warning", str(self.DB)+' is not a valid shapefile.', QMessageBox.Ok)
                return
        else:
            QgsProject.instance().addMapLayers([self.GpsLayer])    
        self.duration = len(self.GPXList)
        self.ExtractToB = self.duration
        self.horizontalSlider.setSingleStep(1000)
        self.horizontalSlider.setMinimum(0)
        self.horizontalSlider.setMaximum(len(self.GPXList)*1000)
        url = QUrl.fromLocalFile(str(self.videoFile))
        mc = QMediaContent(url)
        self.player.setMedia(mc)
        self.player.setPosition(self.StartMsecond)
        self.player.play()
        self.horizontalSlider.sliderMoved.connect(self.setPosition)
        self.player.stateChanged.connect(self.mediaStateChanged)
        self.player.positionChanged.connect(self.positionChanged)
        self.pushButton_3.clicked.connect(self.MapTool)
        self.skiptracktool = SkipTrackTool( self.Main.iface.mapCanvas(),self.GpsLayer , self)

    def AddPointTool(self):
        self.Main.iface.mapCanvas().setMapTool(self.AddPointMapTool) 
             
    def MapTool(self):
        if self.EnableMapTool == False:
            self.Main.iface.mapCanvas().setMapTool(self.skiptracktool)
            self.pushButton_3.setChecked(True)
            self.EnableMapTool = True
        else:
            self.Main.iface.mapCanvas().unsetMapTool(self.skiptracktool)
            self.pushButton_3.setChecked(False)
            self.EnableMapTool = False
                           
    def closeEvent(self, *args, **kwargs):
        try:
            self.player.stop()
            self.Main.iface.mapCanvas().scene().removeItem(self.positionMarker)
            self.CancelVertex()
            self.Main.pushButton_2.show()
            #self.Main.horizontalSpacer_2.show()
            self.Main.groupBox.hide()
            self.Main.pushButton_8.show()
            self.Main.groupBox_4.show()
            self.dockWidget_2.close()
        except:
            pass
        return QtWidgets.QWidget.closeEvent(self, *args, **kwargs)                      
    def mediaStateChanged(self, state):
        if self.player.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPlay))
    
    def setPosition(self, position):
        self.player.setPosition(position+self.StartMsecond)   
    
    def secTotime(self,seconds): 
            m, s = divmod(seconds, 60)
            h, m = divmod(m, 60)
            return "%d:%02d:%02d" % (h, m, s)   
                   
    def positionChanged(self, progress):
        if progress < self.StartMsecond:
            self.player.setPosition(self.StartMsecond)
            progress = self.StartMsecond
        AssociatedGps = round((progress - self.StartMsecond )/1000)
        self.DisplayPoint(AssociatedGps)
        totalTime = self.secTotime(self.duration)
        actualTime = self.secTotime((progress - self.StartMsecond )/1000)
        self.replayPosition_label.setText(actualTime + ' / '+totalTime)
        if not self.horizontalSlider.isSliderDown():
            self.horizontalSlider.setValue(progress - self.StartMsecond ) 

    def DisplayPoint(self,Point):
        if Point >= len(self.GPXList):
            Point = len(self.GPXList) - 1
        gpx = self.GPXList[Point]
        lat = round(gpx[0],7)
        lon = round(gpx[1],7)
        ele = gpx[2]
        speed = gpx[3]
        course = gpx[4]
        time = gpx[5]
        Point = QgsPointXY()
        Point.set(lon, lat)
        canvas = self.Main.iface.mapCanvas()
        crsSrc = QgsCoordinateReferenceSystem(4326)    # .gpx is in WGS 84
        crsDest = QgsProject.instance().crs()
        xform = QgsCoordinateTransform(crsSrc, crsDest)
        self.positionMarker.setHasPosition(True)
        self.Point = xform.transform(Point)
        self.positionMarker.newCoords(self.Point)
        self.positionMarker.angle = float(course)
        extent = canvas.extent() 
        boundaryExtent=QgsRectangle(extent)
        boundaryExtent.scale(0.7)
        if not boundaryExtent.contains(QgsRectangle(Point, self.Point)):
            extentCenter= self.Point
            newExtent=QgsRectangle(
                        extentCenter.x()-extent.width()/2,
                        extentCenter.y()-extent.height()/2,
                        extentCenter.x()+extent.width()/2,
                        extentCenter.y()+extent.height()/2
                        )
            self.Main.iface.mapCanvas().setExtent(newExtent)
            self.Main.iface.mapCanvas().refresh() 
        self.Main.label_14.setText('GPS Time: '+str(time))
        self.Main.label_15.setText('Course: '+"%.2f" % (course))
        self.Main.label_16.setText('Ele: '+"%.2f" %(ele))
        self.Main.label_17.setText('Speed m/s: '+"%.2f" %(speed))
        self.Main.label_19.setText('Lat : '+str(lat))
        self.Main.label_18.setText('Lon : '+str(lon))
                  
    def MuteUnmute(self):
        if self.player.mediaStatus() == 6 :
            if self.player.isMuted() == 1:
                self.player.setMuted(0)
                self.muteButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaVolume))
            elif self.player.isMuted() == 0:
                self.player.setMuted(1)
                self.muteButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaVolumeMuted))   
    
    def SkipForward(self): 
        position = self.player.position()
        self.player.setPosition(position+1000)
       
    def SkipBackward(self): 
        position = self.player.position()
        self.player.setPosition(position-1000)
      
    def ForwardFrame(self):  
        position = self.player.position()
        self.player.setPosition(position+int(self.fps))
      
    def BackwardFrame(self):
        position = self.player.position()
        self.player.setPosition(position-int(self.fps))
     
    def PlayPause(self):
        if self.player.state() == QMediaPlayer.PlayingState:
            self.player.pause()
        else:
            self.player.play()
            
    def findNearestPointInRecording(self, x,y):
        ClickPt = QgsPoint(x,y)
        Low =  ClickPt.distanceSquared(self.Polyline[0])
        NearPoint = 0
        Counter = 0
        for Point in self.Polyline:
            dist = ClickPt.distanceSquared(Point)
            if dist < Low:
                Low = dist
                NearPoint = Counter
                Counter = Counter + 1
            else:
                Counter = Counter + 1
        self.setPosition(NearPoint*1000)
        
    def ExtractSingleFrameOnTime(self, pos, outputfile):
        if os.name == 'nt':
            ffmpeg = ('"'+os.path.dirname(__file__)[0:-18]+'/Video_UAV_Tracker/FFMPEG/ffmpeg.exe'+'"')
            os.popen(str(ffmpeg)+' -ss '+str(pos/1000)+' -i '+str('"' +self.videoFile+ '"')+ ' -t 1 '+str('"'+outputfile+'"'))
        else:
            ffmpeg = os.path.dirname(__file__)+'/FFMPEG/./ffmpeg'
            os.system(str(ffmpeg)+' -ss '+str(pos/1000)+' -i '+str(self.videoFile)+' -t 1 '+str(outputfile))
                 
    def AddPoint(self,x,y):
        self.Main.iface.mapCanvas().unsetMapTool(self.AddPointMapTool)
        Point = QgsPointXY(x,y)
        pos = self.player.position()
        if self.player.state() == QMediaPlayer.PlayingState:
            self.player.pause()
        a = self.DBLayer.name()
        last_desc = '///'
        LayerName =str(a)
        last_desc2 = LayerName + ' Point N '
        directory = str(self.DB.split('.')[0])+'_Image/'
        if not os.path.exists(directory):
            os.makedirs(directory)
        fc = int(self.DBLayer.featureCount())
        self.ExtractSingleFrameOnTime(pos,directory+LayerName+'_'+str(fc)+'_.jpg')
        fields = self.DBLayer.fields()
        attributes = []
        lat,lon = Point.y(), Point.x()
        for field in fields:
            a = str(field.name())
            b = str(field.typeName())
            if a == 'id':
                fcnr = fc
                attributes.append(fcnr)  
            elif a == 'Lon(WGS84)':
                attributes.append(str(lon))                       
            elif a == 'Lat(WGS84)':
                attributes.append(str(lat))               
            elif a == 'Image link':
                attributes.append(str(directory+LayerName+'_'+str(fc)+'_.jpg'))                   
            else:                    
                if b == 'String':      
                    (a,ok) = QInputDialog.getText(
                                                  self.Main.iface.mainWindow(), 
                                                  "Attributes",
                                                  a + ' = String',
                                                  QLineEdit.Normal)
                    attributes.append(a)               
                elif b == 'Real':                    
                    (a,ok) = QInputDialog.getDouble(
                                                    self.Main.iface.mainWindow(), 
                                                    "Attributes",
                                                    a + ' = Real', decimals = 10)
                    attributes.append(a)
                elif b == 'Integer64':                    
                    (a,ok) = QInputDialog.getInt(
                                                 self.Main.iface.mainWindow(), 
                                                 "Attributes",
                                                 a + ' = Integer')
                    attributes.append(a)                    
        feature = QgsFeature()
        feature.setGeometry(QgsGeometry.fromPoint(Point))
        feature.setAttributes(attributes)
        self.DBLayer.startEditing()
        self.DBLayer.addFeature(feature)
        self.DBLayer.commitChanges()    
        self.DBLayer.triggerRepaint()

    def ExtractCommand(self):
        if self.ExtractToB <= self.ExtractFromA:
            ret = QMessageBox.warning(self, "Warning", '"To B" point must be after "from A" point', QMessageBox.Ok)
            self.CancelVertex()
        else:
            if os.name == 'nt':
                ffmpeg = '"'+os.path.dirname(__file__)[0:-18]+'/Video_UAV_Tracker/FFMPEG/ffmpeg.exe'+'"'
            else:
                ffmpeg = os.path.dirname(__file__)+'/FFMPEG/./ffmpeg'
            Directory,_ = QFileDialog.getSaveFileName(caption= 'Save georeferenced images')
            if Directory:
                self.progressBar.show()
                self.progressBar.setValue(0)
                start = self.ExtractFromA
                if self.comboBox_6.currentText() == 'seconds':           
                    finish = self.ExtractToB - self.ExtractFromA
                    fps = self.doubleSpinBox_2.value()
                    if fps < 1.0:
                        fps = 1.0 / fps
                    elif fps > 1:
                        fps = 1.0 / fps
                        
                    if os.name == 'nt':
                        os.popen(str(ffmpeg+ ' -ss ' + str(start) + ' -i '+ str('"'+self.videoFile+'"')+ ' -t ' + str(finish) + ' -vf fps=' + str(fps) + ' ' + '"'+Directory + '_%d.png'+'"'))
                    else:
                        os.system(ffmpeg+' -ss '+ str(start) + ' -i '+ str(self.videoFile) + ' -t ' + str(finish) + ' -vf fps=' + str(fps) + ' ' + Directory + '_%d.png')
                else:
                    txtGPSFile = open(Directory + 'UTM_Coordinates.txt', 'w')
                    txtGPSFile.close()
                    txtGPSFile = open(Directory+ 'UTM_Coordinates.txt', 'a')
                    txtGPSFile.write('filename # East UTM # North UTM # Ele '+ '\n')
                    finish = self.ExtractToB
                    meters = self.doubleSpinBox_2.value()
                    Timerange = range(start, finish + 1)
                    RemainToUseMeterTotal = 0
                    if os.name == 'nt':
                        os.popen(ffmpeg+' -ss '+ str(start) + ' -i '+ str('"'+self.videoFile+'"') + ' -frames:v 1 ' + '"'+Directory + '_sec_' + str(start)+'.00.png'+'"')
                    else:
                        os.system(ffmpeg+' -ss '+ str(start) + ' -i '+ str(self.videoFile) + ' -frames:v 1 ' + Directory + '_sec_' + str(start)+'.00.png')
                    lonUTM, latUTM,quotainutile = self.transform_wgs84_to_utm(float(self.GPXList[start][1]) , float(self.GPXList[start][0]))
                    ele = float(self.GPXList[start][2])
                    txtGPSFile.write(str(Directory.split('/')[-1]) + '_sec_' + str(start)+'.00.png,'+' '+ str(lonUTM) + ', '+ str(latUTM) + ', ' + str(ele) + '\n')
                    for i in Timerange:
                        progessBarValue = ((i-start) * 100) // len(Timerange)
                        self.progressBar.setValue(int(progessBarValue))
                        latitude1,longitude1 = float(self.GPXList[i][0]) ,float(self.GPXList[i][1])
                        latitude2,longitude2 = float(self.GPXList[i+1][0]) ,float(self.GPXList[i+1][1])
                        ele1 = float(self.GPXList[i][2])
                        ele2 = float(self.GPXList[i+1][2])
                        Calculus = Geodesic.WGS84.Inverse(latitude1, longitude1, latitude2, longitude2)
                        DistanceBetweenPoint = Calculus['s12']    
                        Azimuth =   Calculus['azi2']                 
                        SpeedMeterSecond = DistanceBetweenPoint             #GPS refresh rate is actually 1, change parameter for different rates
                       # Time = 1                                            
                        if RemainToUseMeterTotal == 0:
                            if DistanceBetweenPoint >= meters:
                                decimalSecondToAdd = meters / DistanceBetweenPoint
                                RemainToUseMeter = DistanceBetweenPoint - meters
                                if os.name == 'nt':
                                    os.popen(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                             ' -i '+ str('"'+self.videoFile+'"') + ' -frames:v 1 ' +'"'+ Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png'+'"')
                                else:
                                    os.system(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                              ' -i '+ str(self.videoFile) + ' -frames:v 1 ' + Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png')
                                    
                                
                                
                                
                                
                                CalculusDirect = Geodesic.WGS84.Direct(latitude1, longitude1, Azimuth,decimalSecondToAdd* SpeedMeterSecond) 
                                X,Y,quotainutile = self.transform_wgs84_to_utm(CalculusDirect['lon2'],CalculusDirect['lat2'] )  
                                Z = ele1 + decimalSecondToAdd*(ele2 - ele1)
                                txtGPSFile.write(str(Directory.split('/')[-1]) + '_sec_'  + str(i) + str(decimalSecondToAdd)[1:4]+'.png,' + ' ' + str(X) + ', ' + str(Y) + ', ' + str(Z) + '\n')
                                while RemainToUseMeter > meters:
                                    decimalSecondToAddMore = meters / SpeedMeterSecond
                                    RemainToUseMeter = RemainToUseMeter - meters
                                    decimalSecondToAdd = decimalSecondToAdd + decimalSecondToAddMore
                                    if os.name == 'nt':
                                        os.popen(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                 ' -i '+ str('"'+self.videoFile+'"') + ' -frames:v 1 ' +'"'+ Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png'+'"')
                                    else:
                                        os.system(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                  ' -i '+ str(self.videoFile) + ' -frames:v 1 ' + Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png')
                                    
                                    CalculusDirect = Geodesic.WGS84.Direct(latitude1, longitude1, Azimuth,decimalSecondToAdd* SpeedMeterSecond) 
                                    X,Y,quotainutile = self.transform_wgs84_to_utm(CalculusDirect['lon2'],CalculusDirect['lat2'] )  
                                    Z = ele1 + decimalSecondToAdd*(ele2 - ele1)
                                    txtGPSFile.write(str(Directory.split('/')[-1]) + '_sec_'  + str(i) + str(decimalSecondToAdd)[1:4]+'.png,' + ' ' + str(X) + ', ' + str(Y) + ', ' + str(Z) + '\n')
                                if RemainToUseMeter == meters:
                                    decimalSecondToAddMore = meters / SpeedMeterSecond
                                    RemainToUseMeter = RemainToUseMeter - meters
                                    decimalSecondToAdd = decimalSecondToAdd + decimalSecondToAddMore
                                    if os.name == 'nt':
                                        os.popen(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                 ' -i '+ str('"'+self.videoFile+'"') + ' -frames:v 1 ' +'"'+ Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png'+'"')
                                    else:
                                        os.system(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                  ' -i '+ str(self.videoFile) + ' -frames:v 1 ' + Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png')
                                    
                                    CalculusDirect = Geodesic.WGS84.Direct(latitude1, longitude1, Azimuth,decimalSecondToAdd* SpeedMeterSecond) 
                                    X,Y,quotainutile = self.transform_wgs84_to_utm(CalculusDirect['lon2'],CalculusDirect['lat2'] )  
                                    Z = ele1 + decimalSecondToAdd*(ele2 - ele1)
                                    txtGPSFile.write(str(Directory.split('/')[-1]) + '_sec_'  + str(i) + str(decimalSecondToAdd)[1:4]+'.png,' + ' ' +str(X) + ', ' + str(Y) + ', ' + str(Z) + '\n')
                                    RemainToUseMeterTotal = 0  
                                elif RemainToUseMeter < meters:
                                    RemainToUseMeterTotal = RemainToUseMeter
                                    pass
                            else:
                                RemainToUseMeterTotal = meters - DistanceBetweenPoint       
                        elif RemainToUseMeterTotal > 0:
                            if DistanceBetweenPoint >= (meters - RemainToUseMeterTotal) :
                                decimalSecondToAdd = (meters - RemainToUseMeterTotal) / DistanceBetweenPoint
                                RemainToUseMeter = DistanceBetweenPoint - (meters - RemainToUseMeterTotal)
                                if os.name == 'nt':
                                    os.popen(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                             ' -i '+ str('"'+self.videoFile+'"') + ' -frames:v 1 ' +'"'+ Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png'+'"')
                                else:
                                    os.system(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                              ' -i '+ str(self.videoFile) + ' -frames:v 1 ' + Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png')
                                    
                                CalculusDirect = Geodesic.WGS84.Direct(latitude1, longitude1, Azimuth,decimalSecondToAdd* SpeedMeterSecond) 
                                X,Y,quotainutile = self.transform_wgs84_to_utm(CalculusDirect['lon2'],CalculusDirect['lat2'] )  
                                Z = ele1 + decimalSecondToAdd*(ele2 - ele1)
                                txtGPSFile.write(str(Directory.split('/')[-1]) + '_sec_'  + str(i) + str(decimalSecondToAdd)[1:4]+'.png,' + ' ' + str(X) + ', ' + str(Y) + ', ' + str(Z) + '\n')
                                while RemainToUseMeter > meters:
                                    decimalSecondToAddMore = meters / SpeedMeterSecond
                                    RemainToUseMeter = RemainToUseMeter - meters
                                    decimalSecondToAdd = decimalSecondToAdd + decimalSecondToAddMore
                                    if os.name == 'nt':
                                        os.popen(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                 ' -i '+ str('"'+self.videoFile+'"') + ' -frames:v 1 ' +'"'+ Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png'+'"')
                                    else:
                                        os.system(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                  ' -i '+ str(self.videoFile) + ' -frames:v 1 ' + Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png')
                
                                    CalculusDirect = Geodesic.WGS84.Direct(latitude1, longitude1, Azimuth,decimalSecondToAdd* SpeedMeterSecond) 
                                    X,Y,quotainutile = self.transform_wgs84_to_utm(CalculusDirect['lon2'],CalculusDirect['lat2'] )  
                                    Z = ele1 + decimalSecondToAdd*(ele2 - ele1)
                                    txtGPSFile.write(str(Directory.split('/')[-1]) + '_sec_'  + str(i) + str(decimalSecondToAdd)[1:4]+'.png,' + ' ' + str(X) + ', ' + str(Y) + ', ' + str(Z) + '\n')
                                if RemainToUseMeter == meters:
                                    decimalSecondToAddMore = meters / SpeedMeterSecond
                                    RemainToUseMeter = RemainToUseMeter - meters
                                    decimalSecondToAdd = decimalSecondToAdd + decimalSecondToAddMore
                                    if os.name == 'nt':
                                        os.popen(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                 ' -i '+ str('"'+self.videoFile+'"') + ' -frames:v 1 ' +'"'+ Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png'+'"')
                                    else:
                                        os.system(ffmpeg+ ' -ss '+ str(i + decimalSecondToAdd) +
                                                  ' -i '+ str(self.videoFile) + ' -frames:v 1 ' + Directory + '_sec_' + str(i) + str(decimalSecondToAdd)[1:4] +'.png')
                                    
                                    CalculusDirect = Geodesic.WGS84.Direct(latitude1, longitude1, Azimuth,decimalSecondToAdd* SpeedMeterSecond) 
                                    X,Y,quotainutile = self.transform_wgs84_to_utm(CalculusDirect['lon2'],CalculusDirect['lat2'] )  
                                    Z = ele1 + decimalSecondToAdd*(ele2 - ele1)
                                    txtGPSFile.write(str(Directory.split('/')[-1]) + '_sec_'  + str(i) + str(decimalSecondToAdd)[1:4]+'.png,' + ' ' + str(X) + ', ' + str(Y) + ', ' + str(Z) + '\n')
                                    RemainToUseMeterTotal = 0
                                elif RemainToUseMeter < meters:
                                    RemainToUseMeterTotal = RemainToUseMeter
                            else:
                                RemainToUseMeterTotal = (meters - DistanceBetweenPoint) + RemainToUseMeterTotal
                    txtGPSFile.close()            
            self.progressBar.hide()
            
    def ExtractFromA(self):
        
        if self.ExtractA == True:
            self.Main.iface.mapCanvas().scene().removeItem(self.ExtractAVertex)
        self.ExtractA = False
        self.ExtractFromA = round((self.player.position()- self.StartMsecond )/1000)
        canvas = self.Main.iface.mapCanvas()
        crsSrc = QgsCoordinateReferenceSystem(4326)    # .gpx is in WGS 84
        crsDest = QgsProject.instance().crs()
        xform = QgsCoordinateTransform(crsSrc, crsDest)
        latitude,longitude = self.Polyline[self.ExtractFromA].y(), self.Polyline[self.ExtractFromA].x()
        self.ExtractAVertex = QgsVertexMarker(canvas)
        self.ExtractAVertex.setCenter(xform.transform(QgsPointXY(longitude, latitude)))
        self.ExtractAVertex.setColor(QColor(0,255,0))
        self.ExtractAVertex.setIconSize(10)
        self.ExtractAVertex.setIconType(QgsVertexMarker.ICON_X)
        self.ExtractAVertex.setPenWidth(10)
        self.ExtractA = True
        if self.ExtractB == True:
            self.pushButtonCut_2.setEnabled(True)
        else:
            self.pushButtonCut_2.setEnabled(False)
            
    def ExtractToB(self):
        if self.ExtractB == True:
            self.Main.iface.mapCanvas().scene().removeItem(self.ExtractBVertex)
        self.ExtractB = False    
        self.ExtractToB = round((self.player.position()- self.StartMsecond )/1000)  
        if self.ExtractA == True:
            if self.ExtractToB > self.ExtractFromA:
                canvas = self.Main.iface.mapCanvas()
                crsSrc = QgsCoordinateReferenceSystem(4326)    # .gpx is in WGS 84
                crsDest = QgsProject.instance().crs()
                xform = QgsCoordinateTransform(crsSrc, crsDest)   
                latitude,longitude = self.Polyline[self.ExtractToB].y(), self.Polyline[self.ExtractToB].x()
                self.ExtractBVertex = QgsVertexMarker(canvas)
                self.ExtractBVertex.setCenter(xform.transform(QgsPointXY(longitude, latitude)))
                self.ExtractBVertex.setColor(QColor(255,0,0))
                self.ExtractBVertex.setIconSize(10)
                self.ExtractBVertex.setIconType(QgsVertexMarker.ICON_X)
                self.ExtractBVertex.setPenWidth(10)
                self.ExtractB = True
                self.pushButtonCut_2.setEnabled(True)
            else:
                self.pushButtonCut_2.setEnabled(False)
                           
    def CancelVertex(self): 
        if self.ExtractA == True:
            self.Main.iface.mapCanvas().scene().removeItem(self.ExtractAVertex)
            self.ExtractA = False
        if self.ExtractB == True:
            self.Main.iface.mapCanvas().scene().removeItem(self.ExtractBVertex)
            self.ExtractB = False
        self.pushButtonCut_2.setEnabled(False)
                  
    def ExtractToolbar(self):
        if self.ExtractTool == 0:
            self.dockWidget_4.show()
            self.ExtractTool = 1
        else:
            self.dockWidget_4.hide()
            self.ExtractTool = 0
            
    def transform_wgs84_to_utm(self, lon, lat): 
           
        def get_utm_zone(longitude):
            return (int(1+(longitude+180.0)/6.0))

        def is_northern(latitude):
            """
            Determines if given latitude is a northern for UTM
            """
            if (latitude < 0.0):
                return 0
            else:
                return 1
        utm_coordinate_system = osr.SpatialReference()
        utm_coordinate_system.SetWellKnownGeogCS("WGS84") # Set geographic coordinate system to handle lat/lon  
        utm_coordinate_system.SetUTM(get_utm_zone(lon), is_northern(lat))
        wgs84_coordinate_system = utm_coordinate_system.CloneGeogCS() # Clone ONLY the geographic coordinate system 
        wgs84_to_utm_transform = osr.CoordinateTransformation(wgs84_coordinate_system, utm_coordinate_system) # (<from>, <to>)
        return wgs84_to_utm_transform.TransformPoint(lon, lat, 0) # returns easting, northing, altitude 
Beispiel #31
0
class VideoPlayer(QWidget):
    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        btnSize = QSize(16, 16)
        videoWidget = QVideoWidget()

        openButton = QPushButton("Open Video")
        openButton.setToolTip("Open Video File")
        openButton.setStatusTip("Open Video File")
        openButton.setFixedHeight(24)
        openButton.setIconSize(btnSize)
        openButton.setFont(QFont("Noto Sans", 8))
        openButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        openButton.clicked.connect(self.abrir)

        speedButton = QPushButton("speedVideo")
        speedButton.setToolTip("Open Video File")
        speedButton.setStatusTip("Open Video File")
        speedButton.setFixedHeight(24)
        speedButton.setIconSize(btnSize)
        speedButton.setFont(QFont("Noto Sans", 8))
        speedButton.setIcon(
            QIcon.fromTheme("document-open", QIcon("D:/_Qt/img/open.png")))
        speedButton.clicked.connect(self.speed)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setFixedHeight(24)
        self.playButton.setIconSize(btnSize)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = slider.Slider(QtCore.Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)
        self.positionSlider.sliderPressed.connect(self.setPosition)
        self.positionSlider.sliderReleased.connect(self.setPosition)

        self.statusBar = QStatusBar()
        self.statusBar.setFont(QFont("Noto Sans", 7))
        self.statusBar.setFixedHeight(14)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(speedButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.statusBar)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)
        self.statusBar.showMessage("Ready")

    def abrir(self):

        num = 0
        cmd = "ffmpeg -y -i " + "PART/" + str(
            num
        ) + ".mkv " + "-filter_complex \"[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]\" -map \"[v]\" -map \"[a]\" " + str(
            num) + ".mkv"

        #cmd = "ffmpeg -y -i "+ "PART/" + str(num) + ".mkv" + " -filter:v \"setpts=2.0*PTS\" "+ str(num) + ".mkv"
        os.system(cmd)

        player.setWindowTitle("CLONES")
        fileName = "/home/flo/tmp/Movie-SongMaker/0.mkv"

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def speed(self):

        num = 0
        cmd = "ffmpeg -y -i " + "PART/" + str(
            num
        ) + ".mkv " + "-filter_complex \"[0:v]setpts=1.0*PTS[v];[0:a]atempo=1.0[a]\" -map \"[v]\" -map \"[a]\" " + str(
            num) + ".mkv"

        #cmd = "ffmpeg -y -i "+ "PART/" + str(num) + ".mkv" + " -filter:v \"setpts=2.0*PTS\" "+ str(num) + ".mkv"
        os.system(cmd)

        player.setWindowTitle("CLONES")
        fileName = "/home/flo/tmp/Movie-SongMaker/0.mkv"

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.statusBar.showMessage(fileName)
            self.play()

    def play(self):

        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.statusBar.showMessage("Error: " + self.mediaPlayer.errorString())
Beispiel #32
0
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist()
        self.title = 'PyTunes'
        self.left = 300
        self.top = 300
        self.width = 300
        self.height = 150
        self.color = 0  # 0- toggle to dark 1- toggle to light
        self.userAction = -1  # 0- stopped, 1- playing 2-paused
        self.initUI()

    def initUI(self):
        # Add file menu
        menubar = self.menuBar()
        filemenu = menubar.addMenu('File')
        windowmenu = menubar.addMenu('Window')

        fileAct = QAction('Open File', self)
        folderAct = QAction('Open Folder', self)
        themeAct = QAction('Toggle light/dark theme', self)

        fileAct.setShortcut('Ctrl+O')
        folderAct.setShortcut('Ctrl+D')
        themeAct.setShortcut('Ctrl+T')

        filemenu.addAction(fileAct)
        filemenu.addAction(folderAct)
        windowmenu.addAction(themeAct)

        fileAct.triggered.connect(self.openFile)
        folderAct.triggered.connect(self.addFiles)
        themeAct.triggered.connect(self.toggleColors)

        self.addControls()

        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.toggleColors()
        self.show()

    def addControls(self):
        wid = QWidget(self)
        self.setCentralWidget(wid)
        # Add song controls
        volumeslider = QSlider(Qt.Horizontal, self)
        volumeslider.setFocusPolicy(Qt.NoFocus)
        volumeslider.valueChanged[int].connect(self.changeVolume)
        volumeslider.setValue(100)
        playBtn = QPushButton('Play')  # play button
        pauseBtn = QPushButton('Pause')  # pause button
        stopBtn = QPushButton('Stop')  # stop button
        # Add playlist controls
        prevBtn = QPushButton('Prev')
        shuffleBtn = QPushButton('Shuffle')
        nextBtn = QPushButton('Next')
        # Add button layouts
        controlArea = QVBoxLayout()  # centralWidget
        controls = QHBoxLayout()
        playlistCtrlLayout = QHBoxLayout()
        # Add buttons to song controls layout
        controls.addWidget(playBtn)
        controls.addWidget(pauseBtn)
        controls.addWidget(stopBtn)
        # Add buttons to playlist controls layout
        playlistCtrlLayout.addWidget(prevBtn)
        playlistCtrlLayout.addWidget(shuffleBtn)
        playlistCtrlLayout.addWidget(nextBtn)
        # Add to vertical layout
        controlArea.addWidget(volumeslider)
        controlArea.addLayout(controls)
        controlArea.addLayout(playlistCtrlLayout)
        wid.setLayout(controlArea)
        # Connect each signal to their appropriate function
        playBtn.clicked.connect(self.playhandler)
        pauseBtn.clicked.connect(self.pausehandler)
        stopBtn.clicked.connect(self.stophandler)

        prevBtn.clicked.connect(self.prevSong)
        shuffleBtn.clicked.connect(self.shufflelist)
        nextBtn.clicked.connect(self.nextSong)

        self.statusBar()
        self.playlist.currentMediaChanged.connect(self.songChanged)

    def openFile(self):
        song = QFileDialog.getOpenFileName(
            self, "Open Song", "~", "Sound Files (*.mp3 *.ogg *.wav *.m4a)")

        if song[0] != '':
            url = QUrl.fromLocalFile(song[0])
            if self.playlist.mediaCount() == 0:
                self.playlist.addMedia(QMediaContent(url))
                self.player.setPlaylist(self.playlist)
                self.player.play()
                self.userAction = 1
            else:
                self.playlist.addMedia(QMediaContent(url))

    def addFiles(self):
        if self.playlist.mediaCount() != 0:
            self.folderIterator()
        else:
            self.folderIterator()
            self.player.setPlaylist(self.playlist)
            self.player.playlist().setCurrentIndex(0)
            self.player.play()
            self.userAction = 1

    def folderIterator(self):
        folderChosen = QFileDialog.getExistingDirectory(
            self, 'Open Music Folder', '~')
        if folderChosen != None:
            it = QDirIterator(folderChosen)
            it.next()
            while it.hasNext():
                if it.fileInfo().isDir() == False and it.filePath() != '.':
                    fInfo = it.fileInfo()
                    if fInfo.suffix() in ('mp3', 'ogg', 'wav', 'm4a'):
                        self.playlist.addMedia(
                            QMediaContent(QUrl.fromLocalFile(it.filePath())))
                it.next()
            if it.fileInfo().isDir() == False and it.filePath() != '.':
                fInfo = it.fileInfo()
                if fInfo.suffix() in ('mp3', 'ogg', 'wav', 'm4a'):
                    self.playlist.addMedia(
                        QMediaContent(QUrl.fromLocalFile(it.filePath())))

    def playhandler(self):
        if self.playlist.mediaCount() == 0:
            self.openFile()
        elif self.playlist.mediaCount() != 0:
            self.player.play()
            self.userAction = 1

    def pausehandler(self):
        self.userAction = 2
        self.player.pause()

    def stophandler(self):
        self.userAction = 0
        self.player.stop()
        self.playlist.clear()
        self.statusBar().showMessage("Stopped and cleared playlist")

    def changeVolume(self, value):
        self.player.setVolume(value)

    def prevSong(self):
        if self.playlist.mediaCount() == 0:
            self.openFile()
        elif self.playlist.mediaCount() != 0:
            self.player.playlist().previous()

    def shufflelist(self):
        self.playlist.shuffle()

    def nextSong(self):
        if self.playlist.mediaCount() == 0:
            self.openFile()
        elif self.playlist.mediaCount() != 0:
            self.player.playlist().next()

    def songChanged(self, media):
        if not media.isNull():
            url = media.canonicalUrl()
            self.statusBar().showMessage(url.fileName())

    def toggleColors(self):

        app.setStyle("Fusion")
        palette = QPalette()
        if self.color == 0:
            palette.setColor(QPalette.Window, QColor(53, 53, 53))
            palette.setColor(QPalette.WindowText, Qt.white)
            palette.setColor(QPalette.Base, QColor(25, 25, 25))
            palette.setColor(QPalette.AlternateBase, QColor(53, 53, 53))
            palette.setColor(QPalette.ToolTipBase, Qt.white)
            palette.setColor(QPalette.ToolTipText, Qt.white)
            palette.setColor(QPalette.Text, Qt.white)
            palette.setColor(QPalette.Button, QColor(53, 53, 53))
            palette.setColor(QPalette.ButtonText, Qt.white)
            palette.setColor(QPalette.BrightText, Qt.red)
            palette.setColor(QPalette.Link, QColor(235, 101, 54))
            palette.setColor(QPalette.Highlight, QColor(235, 101, 54))
            palette.setColor(QPalette.HighlightedText, Qt.black)
            app.setPalette(palette)
            self.color = 1
        elif self.color == 1:
            palette.setColor(QPalette.Window, Qt.white)
            palette.setColor(QPalette.WindowText, Qt.black)
            palette.setColor(QPalette.Base, QColor(240, 240, 240))
            palette.setColor(QPalette.AlternateBase, Qt.white)
            palette.setColor(QPalette.ToolTipBase, Qt.white)
            palette.setColor(QPalette.ToolTipText, Qt.white)
            palette.setColor(QPalette.Text, Qt.black)
            palette.setColor(QPalette.Button, Qt.white)
            palette.setColor(QPalette.ButtonText, Qt.black)
            palette.setColor(QPalette.BrightText, Qt.red)
            palette.setColor(QPalette.Link, QColor(66, 155, 248))
            palette.setColor(QPalette.Highlight, QColor(66, 155, 248))
            palette.setColor(QPalette.HighlightedText, Qt.black)
            app.setPalette(palette)
            self.color = 0
Beispiel #33
0
class MusicPlayer(QMainWindow):
    """MusicPlayer houses all of elements that directly interact with the main window."""

    def __init__(self, parent=None):
        """Initialize the QMainWindow widget.

        The window title, window icon, and window size are initialized here as well
        as the following widgets: QMediaPlayer, QMediaPlaylist, QMediaContent, QMenuBar,
        QToolBar, QLabel, QPixmap, QSlider, QDockWidget, QListWidget, QWidget, and
        QVBoxLayout. The connect signals for relavant widgets are also initialized.
        """
        super(MusicPlayer, self).__init__(parent)
        self.setWindowTitle('Mosaic')

        window_icon = utilities.resource_filename('mosaic.images', 'icon.png')
        self.setWindowIcon(QIcon(window_icon))
        self.resize(defaults.Settings().window_size, defaults.Settings().window_size + 63)

        # Initiates Qt objects to be used by MusicPlayer
        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist()
        self.playlist_location = defaults.Settings().playlist_path
        self.content = QMediaContent()
        self.menu = self.menuBar()
        self.toolbar = QToolBar()
        self.art = QLabel()
        self.pixmap = QPixmap()
        self.slider = QSlider(Qt.Horizontal)
        self.duration_label = QLabel()
        self.playlist_dock = QDockWidget('Playlist', self)
        self.library_dock = QDockWidget('Media Library', self)
        self.playlist_view = QListWidget()
        self.library_view = library.MediaLibraryView()
        self.library_model = library.MediaLibraryModel()
        self.preferences = configuration.PreferencesDialog()
        self.widget = QWidget()
        self.layout = QVBoxLayout(self.widget)
        self.duration = 0
        self.playlist_dock_state = None
        self.library_dock_state = None

        # Sets QWidget() as the central widget of the main window
        self.setCentralWidget(self.widget)
        self.layout.setContentsMargins(0, 0, 0, 0)
        self.art.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)

        # Initiates the playlist dock widget and the library dock widget
        self.addDockWidget(defaults.Settings().dock_position, self.playlist_dock)
        self.playlist_dock.setWidget(self.playlist_view)
        self.playlist_dock.setVisible(defaults.Settings().playlist_on_start)
        self.playlist_dock.setFeatures(QDockWidget.DockWidgetClosable)

        self.addDockWidget(defaults.Settings().dock_position, self.library_dock)
        self.library_dock.setWidget(self.library_view)
        self.library_dock.setVisible(defaults.Settings().media_library_on_start)
        self.library_dock.setFeatures(QDockWidget.DockWidgetClosable)
        self.tabifyDockWidget(self.playlist_dock, self.library_dock)

        # Sets the range of the playback slider and sets the playback mode as looping
        self.slider.setRange(0, self.player.duration() / 1000)
        self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)

        # OSX system menu bar causes conflicts with PyQt5 menu bar
        if sys.platform == 'darwin':
            self.menu.setNativeMenuBar(False)

        # Initiates Settings in the defaults module to give access to settings.toml
        defaults.Settings()

        # Signals that connect to other methods when they're called
        self.player.metaDataChanged.connect(self.display_meta_data)
        self.slider.sliderMoved.connect(self.seek)
        self.player.durationChanged.connect(self.song_duration)
        self.player.positionChanged.connect(self.song_position)
        self.player.stateChanged.connect(self.set_state)
        self.playlist_view.itemActivated.connect(self.activate_playlist_item)
        self.library_view.activated.connect(self.open_media_library)
        self.playlist.currentIndexChanged.connect(self.change_index)
        self.playlist.mediaInserted.connect(self.initialize_playlist)
        self.playlist_dock.visibilityChanged.connect(self.dock_visiblity_change)
        self.library_dock.visibilityChanged.connect(self.dock_visiblity_change)
        self.preferences.dialog_media_library.media_library_line.textChanged.connect(self.change_media_library_path)
        self.preferences.dialog_view_options.dropdown_box.currentIndexChanged.connect(self.change_window_size)
        self.art.mousePressEvent = self.press_playback

        # Creating the menu controls, media controls, and window size of the music player
        self.menu_controls()
        self.media_controls()
        self.load_saved_playlist()

    def menu_controls(self):
        """Initiate the menu bar and add it to the QMainWindow widget."""
        self.file = self.menu.addMenu('File')
        self.edit = self.menu.addMenu('Edit')
        self.playback = self.menu.addMenu('Playback')
        self.view = self.menu.addMenu('View')
        self.help_ = self.menu.addMenu('Help')

        self.file_menu()
        self.edit_menu()
        self.playback_menu()
        self.view_menu()
        self.help_menu()

    def media_controls(self):
        """Create the bottom toolbar and controls used for media playback."""
        self.addToolBar(Qt.BottomToolBarArea, self.toolbar)
        self.toolbar.setMovable(False)

        play_icon = utilities.resource_filename('mosaic.images', 'md_play.png')
        self.play_action = QAction(QIcon(play_icon), 'Play', self)
        self.play_action.triggered.connect(self.player.play)

        stop_icon = utilities.resource_filename('mosaic.images', 'md_stop.png')
        self.stop_action = QAction(QIcon(stop_icon), 'Stop', self)
        self.stop_action.triggered.connect(self.player.stop)

        previous_icon = utilities.resource_filename('mosaic.images', 'md_previous.png')
        self.previous_action = QAction(QIcon(previous_icon), 'Previous', self)
        self.previous_action.triggered.connect(self.previous)

        next_icon = utilities.resource_filename('mosaic.images', 'md_next.png')
        self.next_action = QAction(QIcon(next_icon), 'Next', self)
        self.next_action.triggered.connect(self.playlist.next)

        repeat_icon = utilities.resource_filename('mosaic.images', 'md_repeat_none.png')
        self.repeat_action = QAction(QIcon(repeat_icon), 'Repeat', self)
        self.repeat_action.setShortcut('R')
        self.repeat_action.triggered.connect(self.repeat_song)

        self.toolbar.addAction(self.play_action)
        self.toolbar.addAction(self.stop_action)
        self.toolbar.addAction(self.previous_action)
        self.toolbar.addAction(self.next_action)
        self.toolbar.addAction(self.repeat_action)
        self.toolbar.addWidget(self.slider)
        self.toolbar.addWidget(self.duration_label)

    def file_menu(self):
        """Add a file menu to the menu bar.

        The file menu houses the Open File, Open Multiple Files, Open Playlist,
        Open Directory, and Exit Application menu items.
        """
        self.open_action = QAction('Open File', self)
        self.open_action.setShortcut('O')
        self.open_action.triggered.connect(self.open_file)

        self.open_multiple_files_action = QAction('Open Multiple Files', self)
        self.open_multiple_files_action.setShortcut('M')
        self.open_multiple_files_action.triggered.connect(self.open_multiple_files)

        self.open_playlist_action = QAction('Open Playlist', self)
        self.open_playlist_action.setShortcut('CTRL+P')
        self.open_playlist_action.triggered.connect(self.open_playlist)

        self.open_directory_action = QAction('Open Directory', self)
        self.open_directory_action.setShortcut('D')
        self.open_directory_action.triggered.connect(self.open_directory)

        self.save_playlist_action = QAction('Save Playlist', self)
        self.save_playlist_action.setShortcut('CTRL+S')
        self.save_playlist_action.triggered.connect(self.save_playlist)

        self.exit_action = QAction('Quit', self)
        self.exit_action.setShortcut('CTRL+Q')
        self.exit_action.triggered.connect(self.closeEvent)

        self.file.addAction(self.open_action)
        self.file.addAction(self.open_multiple_files_action)
        self.file.addAction(self.open_playlist_action)
        self.file.addAction(self.open_directory_action)
        self.file.addSeparator()
        self.file.addAction(self.save_playlist_action)
        self.file.addSeparator()
        self.file.addAction(self.exit_action)

    def edit_menu(self):
        """Add an edit menu to the menu bar.

        The edit menu houses the preferences item that opens a preferences dialog
        that allows the user to customize features of the music player.
        """
        self.preferences_action = QAction('Preferences', self)
        self.preferences_action.setShortcut('CTRL+SHIFT+P')
        self.preferences_action.triggered.connect(lambda: self.preferences.exec_())

        self.edit.addAction(self.preferences_action)

    def playback_menu(self):
        """Add a playback menu to the menu bar.

        The playback menu houses
        """
        self.play_playback_action = QAction('Play', self)
        self.play_playback_action.setShortcut('P')
        self.play_playback_action.triggered.connect(self.player.play)

        self.stop_playback_action = QAction('Stop', self)
        self.stop_playback_action.setShortcut('S')
        self.stop_playback_action.triggered.connect(self.player.stop)

        self.previous_playback_action = QAction('Previous', self)
        self.previous_playback_action.setShortcut('B')
        self.previous_playback_action.triggered.connect(self.previous)

        self.next_playback_action = QAction('Next', self)
        self.next_playback_action.setShortcut('N')
        self.next_playback_action.triggered.connect(self.playlist.next)

        self.playback.addAction(self.play_playback_action)
        self.playback.addAction(self.stop_playback_action)
        self.playback.addAction(self.previous_playback_action)
        self.playback.addAction(self.next_playback_action)

    def view_menu(self):
        """Add a view menu to the menu bar.

        The view menu houses the Playlist, Media Library, Minimalist View, and Media
        Information menu items. The Playlist item toggles the playlist dock into and
        out of view. The Media Library items toggles the media library dock into and
        out of view. The Minimalist View item resizes the window and shows only the
        menu bar and player controls. The Media Information item opens a dialog that
        shows information relevant to the currently playing song.
        """
        self.dock_action = self.playlist_dock.toggleViewAction()
        self.dock_action.setShortcut('CTRL+ALT+P')

        self.library_dock_action = self.library_dock.toggleViewAction()
        self.library_dock_action.setShortcut('CTRL+ALT+L')

        self.minimalist_view_action = QAction('Minimalist View', self)
        self.minimalist_view_action.setShortcut('CTRL+ALT+M')
        self.minimalist_view_action.setCheckable(True)
        self.minimalist_view_action.triggered.connect(self.minimalist_view)

        self.view_media_info_action = QAction('Media Information', self)
        self.view_media_info_action.setShortcut('CTRL+SHIFT+M')
        self.view_media_info_action.triggered.connect(self.media_information_dialog)

        self.view.addAction(self.dock_action)
        self.view.addAction(self.library_dock_action)
        self.view.addSeparator()
        self.view.addAction(self.minimalist_view_action)
        self.view.addSeparator()
        self.view.addAction(self.view_media_info_action)

    def help_menu(self):
        """Add a help menu to the menu bar.

        The help menu houses the about dialog that shows the user information
        related to the application.
        """
        self.about_action = QAction('About', self)
        self.about_action.setShortcut('H')
        self.about_action.triggered.connect(lambda: about.AboutDialog().exec_())

        self.help_.addAction(self.about_action)

    def open_file(self):
        """Open the selected file and add it to a new playlist."""
        filename, success = QFileDialog.getOpenFileName(self, 'Open File', '', 'Audio (*.mp3 *.flac)', '', QFileDialog.ReadOnly)

        if success:
            file_info = QFileInfo(filename).fileName()
            playlist_item = QListWidgetItem(file_info)
            self.playlist.clear()
            self.playlist_view.clear()
            self.playlist.addMedia(QMediaContent(QUrl().fromLocalFile(filename)))
            self.player.setPlaylist(self.playlist)
            playlist_item.setToolTip(file_info)
            self.playlist_view.addItem(playlist_item)
            self.playlist_view.setCurrentRow(0)
            self.player.play()

    def open_multiple_files(self):
        """Open the selected files and add them to a new playlist."""
        filenames, success = QFileDialog.getOpenFileNames(self, 'Open Multiple Files', '', 'Audio (*.mp3 *.flac)', '', QFileDialog.ReadOnly)

        if success:
            self.playlist.clear()
            self.playlist_view.clear()
            for file in natsort.natsorted(filenames, alg=natsort.ns.PATH):
                file_info = QFileInfo(file).fileName()
                playlist_item = QListWidgetItem(file_info)
                self.playlist.addMedia(QMediaContent(QUrl().fromLocalFile(file)))
                self.player.setPlaylist(self.playlist)
                playlist_item.setToolTip(file_info)
                self.playlist_view.addItem(playlist_item)
                self.playlist_view.setCurrentRow(0)
                self.player.play()

    def open_playlist(self):
        """Load an M3U or PLS file into a new playlist."""
        playlist, success = QFileDialog.getOpenFileName(self, 'Open Playlist', '', 'Playlist (*.m3u *.pls)', '', QFileDialog.ReadOnly)

        if success:
            playlist = QUrl.fromLocalFile(playlist)
            self.playlist.clear()
            self.playlist_view.clear()
            self.playlist.load(playlist)
            self.player.setPlaylist(self.playlist)

            for song_index in range(self.playlist.mediaCount()):
                file_info = self.playlist.media(song_index).canonicalUrl().fileName()
                playlist_item = QListWidgetItem(file_info)
                playlist_item.setToolTip(file_info)
                self.playlist_view.addItem(playlist_item)

            self.playlist_view.setCurrentRow(0)
            self.player.play()

    def save_playlist(self):
        """Save the media in the playlist dock as a new M3U playlist."""
        playlist, success = QFileDialog.getSaveFileName(self, 'Save Playlist', '', 'Playlist (*.m3u)', '')
        if success:
            saved_playlist = "{}.m3u" .format(playlist)
            self.playlist.save(QUrl().fromLocalFile(saved_playlist), "m3u")

    def load_saved_playlist(self):
        """Load the saved playlist if user setting permits."""
        saved_playlist = "{}/.m3u" .format(self.playlist_location)
        if os.path.exists(saved_playlist):
            playlist = QUrl().fromLocalFile(saved_playlist)
            self.playlist.load(playlist)
            self.player.setPlaylist(self.playlist)

            for song_index in range(self.playlist.mediaCount()):
                file_info = self.playlist.media(song_index).canonicalUrl().fileName()
                playlist_item = QListWidgetItem(file_info)
                playlist_item.setToolTip(file_info)
                self.playlist_view.addItem(playlist_item)

            self.playlist_view.setCurrentRow(0)

    def open_directory(self):
        """Open the selected directory and add the files within to an empty playlist."""
        directory = QFileDialog.getExistingDirectory(self, 'Open Directory', '', QFileDialog.ReadOnly)

        if directory:
            self.playlist.clear()
            self.playlist_view.clear()
            for dirpath, __, files in os.walk(directory):
                for filename in natsort.natsorted(files, alg=natsort.ns.PATH):
                    file = os.path.join(dirpath, filename)
                    if filename.endswith(('mp3', 'flac')):
                        self.playlist.addMedia(QMediaContent(QUrl().fromLocalFile(file)))
                        playlist_item = QListWidgetItem(filename)
                        playlist_item.setToolTip(filename)
                        self.playlist_view.addItem(playlist_item)

            self.player.setPlaylist(self.playlist)
            self.playlist_view.setCurrentRow(0)
            self.player.play()

    def open_media_library(self, index):
        """Open a directory or file from the media library into an empty playlist."""
        self.playlist.clear()
        self.playlist_view.clear()

        if self.library_model.fileName(index).endswith(('mp3', 'flac')):
            self.playlist.addMedia(QMediaContent(QUrl().fromLocalFile(self.library_model.filePath(index))))
            self.playlist_view.addItem(self.library_model.fileName(index))

        elif self.library_model.isDir(index):
            directory = self.library_model.filePath(index)
            for dirpath, __, files in os.walk(directory):
                for filename in natsort.natsorted(files, alg=natsort.ns.PATH):
                    file = os.path.join(dirpath, filename)
                    if filename.endswith(('mp3', 'flac')):
                        self.playlist.addMedia(QMediaContent(QUrl().fromLocalFile(file)))
                        playlist_item = QListWidgetItem(filename)
                        playlist_item.setToolTip(filename)
                        self.playlist_view.addItem(playlist_item)

        self.player.setPlaylist(self.playlist)
        self.player.play()

    def display_meta_data(self):
        """Display the current song's metadata in the main window.

        If the current song contains metadata, its cover art is extracted and shown in
        the main window while the track number, artist, album, and track title are shown
        in the window title.
        """
        if self.player.isMetaDataAvailable():
            file_path = self.player.currentMedia().canonicalUrl().toLocalFile()
            (album, artist, title, track_number, *__, artwork) = metadata.metadata(file_path)

            try:
                self.pixmap.loadFromData(artwork)
            except TypeError:
                self.pixmap = QPixmap(artwork)

            meta_data = '{} - {} - {} - {}' .format(track_number, artist, album, title)

            self.setWindowTitle(meta_data)
            self.art.setScaledContents(True)
            self.art.setPixmap(self.pixmap)
            self.layout.addWidget(self.art)

    def initialize_playlist(self, start):
        """Display playlist and reset playback mode when media inserted into playlist."""
        if start == 0:
            if self.library_dock.isVisible():
                self.playlist_dock.setVisible(True)
                self.playlist_dock.show()
                self.playlist_dock.raise_()

            if self.playlist.playbackMode() != QMediaPlaylist.Sequential:
                self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)
                repeat_icon = utilities.resource_filename('mosaic.images', 'md_repeat_none.png')
                self.repeat_action.setIcon(QIcon(repeat_icon))

    def press_playback(self, event):
        """Change the playback of the player on cover art mouse event.

        When the cover art is clicked, the player will play the media if the player is
        either paused or stopped. If the media is playing, the media is set
        to pause.
        """
        if event.button() == 1 and configuration.Playback().cover_art_playback.isChecked():
            if (self.player.state() == QMediaPlayer.StoppedState or
                    self.player.state() == QMediaPlayer.PausedState):
                self.player.play()
            elif self.player.state() == QMediaPlayer.PlayingState:
                self.player.pause()

    def seek(self, seconds):
        """Set the position of the song to the position dragged to by the user."""
        self.player.setPosition(seconds * 1000)

    def song_duration(self, duration):
        """Set the slider to the duration of the currently played media."""
        duration /= 1000
        self.duration = duration
        self.slider.setMaximum(duration)

    def song_position(self, progress):
        """Move the horizontal slider in sync with the duration of the song.

        The progress is relayed to update_duration() in order
        to display the time label next to the slider.
        """
        progress /= 1000

        if not self.slider.isSliderDown():
            self.slider.setValue(progress)

        self.update_duration(progress)

    def update_duration(self, current_duration):
        """Calculate the time played and the length of the song.

        Both of these times are sent to duration_label() in order to display the
        times on the toolbar.
        """
        duration = self.duration

        if current_duration or duration:
            time_played = QTime((current_duration / 3600) % 60, (current_duration / 60) % 60,
                                (current_duration % 60), (current_duration * 1000) % 1000)
            song_length = QTime((duration / 3600) % 60, (duration / 60) % 60, (duration % 60),
                                (duration * 1000) % 1000)

            if duration > 3600:
                time_format = "hh:mm:ss"
            else:
                time_format = "mm:ss"

            time_display = "{} / {}" .format(time_played.toString(time_format), song_length.toString(time_format))

        else:
            time_display = ""

        self.duration_label.setText(time_display)

    def set_state(self, state):
        """Change the icon in the toolbar in relation to the state of the player.

        The play icon changes to the pause icon when a song is playing and
        the pause icon changes back to the play icon when either paused or
        stopped.
        """
        if self.player.state() == QMediaPlayer.PlayingState:
            pause_icon = utilities.resource_filename('mosaic.images', 'md_pause.png')
            self.play_action.setIcon(QIcon(pause_icon))
            self.play_action.triggered.connect(self.player.pause)

        elif (self.player.state() == QMediaPlayer.PausedState or self.player.state() == QMediaPlayer.StoppedState):
            self.play_action.triggered.connect(self.player.play)
            play_icon = utilities.resource_filename('mosaic.images', 'md_play.png')
            self.play_action.setIcon(QIcon(play_icon))

    def previous(self):
        """Move to the previous song in the playlist.

        Moves to the previous song in the playlist if the current song is less
        than five seconds in. Otherwise, restarts the current song.
        """
        if self.player.position() <= 5000:
            self.playlist.previous()
        else:
            self.player.setPosition(0)

    def repeat_song(self):
        """Set the current media to repeat and change the repeat icon accordingly.

        There are four playback modes: repeat none, repeat all, repeat once, and shuffle.
        Clicking the repeat button cycles through each playback mode.
        """
        if self.playlist.playbackMode() == QMediaPlaylist.Sequential:
            self.playlist.setPlaybackMode(QMediaPlaylist.Loop)
            repeat_on_icon = utilities.resource_filename('mosaic.images', 'md_repeat_all.png')
            self.repeat_action.setIcon(QIcon(repeat_on_icon))

        elif self.playlist.playbackMode() == QMediaPlaylist.Loop:
            self.playlist.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
            repeat_on_icon = utilities.resource_filename('mosaic.images', 'md_repeat_once.png')
            self.repeat_action.setIcon(QIcon(repeat_on_icon))

        elif self.playlist.playbackMode() == QMediaPlaylist.CurrentItemInLoop:
            self.playlist.setPlaybackMode(QMediaPlaylist.Random)
            repeat_icon = utilities.resource_filename('mosaic.images', 'md_shuffle.png')
            self.repeat_action.setIcon(QIcon(repeat_icon))

        elif self.playlist.playbackMode() == QMediaPlaylist.Random:
            self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)
            repeat_icon = utilities.resource_filename('mosaic.images', 'md_repeat_none.png')
            self.repeat_action.setIcon(QIcon(repeat_icon))

    def activate_playlist_item(self, item):
        """Set the active media to the playlist item dobule-clicked on by the user."""
        current_index = self.playlist_view.row(item)
        if self.playlist.currentIndex() != current_index:
            self.playlist.setCurrentIndex(current_index)

        if self.player.state() != QMediaPlayer.PlayingState:
            self.player.play()

    def change_index(self, row):
        """Highlight the row in the playlist of the active media."""
        self.playlist_view.setCurrentRow(row)

    def minimalist_view(self):
        """Resize the window to only show the menu bar and audio controls."""
        if self.minimalist_view_action.isChecked():

            if self.playlist_dock.isVisible():
                self.playlist_dock_state = True
            if self.library_dock.isVisible():
                self.library_dock_state = True

            self.library_dock.close()
            self.playlist_dock.close()

            QTimer.singleShot(10, lambda: self.resize(500, 0))

        else:
            self.resize(defaults.Settings().window_size, defaults.Settings().window_size + 63)

            if self.library_dock_state:
                self.library_dock.setVisible(True)

            if self.playlist_dock_state:
                self.playlist_dock.setVisible(True)

    def dock_visiblity_change(self, visible):
        """Change the size of the main window when the docks are toggled."""
        if visible and self.playlist_dock.isVisible() and not self.library_dock.isVisible():
            self.resize(defaults.Settings().window_size + self.playlist_dock.width() + 6,
                        self.height())

        elif visible and not self.playlist_dock.isVisible() and self.library_dock.isVisible():
            self.resize(defaults.Settings().window_size + self.library_dock.width() + 6,
                        self.height())

        elif visible and self.playlist_dock.isVisible() and self.library_dock.isVisible():
            self.resize(defaults.Settings().window_size + self.library_dock.width() + 6,
                        self.height())

        elif (not visible and not self.playlist_dock.isVisible() and not
                self.library_dock.isVisible()):
            self.resize(defaults.Settings().window_size, defaults.Settings().window_size + 63)

    def media_information_dialog(self):
        """Show a dialog of the current song's metadata."""
        if self.player.isMetaDataAvailable():
            file_path = self.player.currentMedia().canonicalUrl().toLocalFile()
        else:
            file_path = None
        dialog = information.InformationDialog(file_path)
        dialog.exec_()

    def change_window_size(self):
        """Change the window size of the music player."""
        self.playlist_dock.close()
        self.library_dock.close()
        self.resize(defaults.Settings().window_size, defaults.Settings().window_size + 63)

    def change_media_library_path(self, path):
        """Change the media library path to the new path selected in the preferences dialog."""
        self.library_model.setRootPath(path)
        self.library_view.setModel(self.library_model)
        self.library_view.setRootIndex(self.library_model.index(path))

    def closeEvent(self, event):
        """Override the PyQt close event in order to handle save playlist on close."""
        playlist = "{}/.m3u" .format(self.playlist_location)
        if defaults.Settings().save_playlist_on_close:
            self.playlist.save(QUrl().fromLocalFile(playlist), "m3u")
        else:
            if os.path.exists(playlist):
                os.remove(playlist)
        QApplication.quit()
Beispiel #34
0
class VideoWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = "video player"
        self.left = 500
        self.top = 300
        self.width = 800
        self.height = 600
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.videoWidget = QVideoWidget()
        self.playButton = QPushButton()
        self.grabPictureButton = QPushButton("Grab")
        self.positionSlider = QSlider(Qt.Horizontal)
        self.errorLabel = QLabel()
        self.frameCounter = 0

        #list và table, có 2 loại dùng cái nào tuỳ em
        self.listWidget = QListWidget()
        self.tableWidget = QTableWidget(0, 3)  #0 là số hàng 3 là số cột
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        #menu
        menuBar = self.menuBar()
        fileMenu = menuBar.addMenu('&File')
        openAction = QAction(QIcon('open.png'), '&Open', self)
        openAction.triggered.connect(self.openFile)
        exitAction = QAction(QIcon('exit.png'), '&Exit', self)
        exitAction.triggered.connect(self.exitCall)

        screenshotAction = QAction(QIcon('screenshot.png'), '&Screenshot',
                                   self)
        screenshotAction.setShortcut('Ctrl+S')
        screenshotAction.setStatusTip('Screenshot scenes')
        screenshotAction.triggered.connect(self.grab)

        fileMenu.addAction(openAction)
        fileMenu.addAction(screenshotAction)
        fileMenu.addAction(exitAction)

        # nút play, nút chụp và thanh kéo
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.grabPictureButton.setEnabled(False)
        self.grabPictureButton.setIcon(QIcon('grabpick.png'))
        self.grabPictureButton.setToolTip('click to grab current frame')
        self.grabPictureButton.clicked.connect(self.grab)

        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)
        # Hộp điều khiển chứa nút play và slider
        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.grabPictureButton)
        controlLayout.addWidget(self.positionSlider)

        # Hộp chứa video và hộp điều khiển

        vboxlayout = QVBoxLayout()
        vboxlayout.addWidget(self.videoWidget)
        vboxlayout.addLayout(controlLayout)
        vboxlayout.addWidget(self.errorLabel)

        #add vào table với list như này nhé
        x = 1
        y = 2
        t = 45
        self.listWidget.addItem('X      Y       T ')
        self.listWidget.addItem(str(x) + '      ' + str(y) + '      ' + str(t))
        self.tableWidget.insertRow(0)
        self.tableWidget.insertRow(1)
        self.tableWidget.setItem(0, 0, QTableWidgetItem("X"))
        self.tableWidget.setItem(0, 1, QTableWidgetItem("Y"))
        self.tableWidget.setItem(0, 2, QTableWidgetItem("T"))
        self.tableWidget.setItem(1, 0, QTableWidgetItem(str(x)))
        self.tableWidget.setItem(1, 1, QTableWidgetItem(str(y)))
        self.tableWidget.setItem(1, 2, QTableWidgetItem(str(t)))

        layout = QGridLayout(self)
        layout.addLayout(vboxlayout, 0, 0)
        layout.addWidget(self.listWidget, 0, 1)
        layout.addWidget(self.tableWidget, 0, 2)
        wid = QWidget(self)
        self.setCentralWidget(wid)
        wid.setLayout(layout)

        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

        self.show()

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                                                  QDir.homePath())

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
            self.grabPictureButton.setEnabled(True)

    def exitCall(self):
        sys.exit(app.exec_())

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()
            self.mediaPlayer.setVideoOutput(self.videoWidget)

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def grab(self):
        self.grabber = VideoFrameGrabber(self.videoWidget, self)
        self.mediaPlayer.setVideoOutput(self.grabber)
        self.grabber.frameAvailable.connect(self.process_frame)
        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.play()

    def process_frame(self, image):
        filename = "screenshot" + str(self.frameCounter).zfill(6)
        self.path = 'C:/Users/donam/OneDrive/Desktop/temp'
        image.save(self.path + '/{}.png'.format(str(filename)))
        self.frameCounter += 1

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
Beispiel #35
0
class QDeckDirtyDozenWidget(QWidget):

    deckpath = None

    grid = None

    selectDeck = pyqtSignal()

    dataset = None
    #audio_data = None
    audioPlayer = None

    curent_audio_deck_id = None

    last_random_audio = None
    """ holds one of DISPLAY_COMBO_ITEMS: """
    test_mode = 'image'

    def __init__(self):
        super().__init__()

    def initialize(self, deckpath):
        self.deckpath = deckpath

        self.clear()

        self.audioPlayer = QMediaPlayer()

        db_path = path.join(deckpath, "database.sqlite")
        self.dbAdapter = DeckDbAdapter()
        self.dbAdapter.initialize(db_path)
        self.dataset = self.dbAdapter.selectDeckDirtyDozenItems()

        deck_select_button = QPushButton("<<<")
        deck_select_button.clicked.connect(self.selectDeckButtonClicked)

        replay_audio_button = QPushButton("replay audio")
        replay_audio_button.setIcon(QIcon.fromTheme('media-playback-start'))
        replay_audio_button.clicked.connect(self.replayAudioClicked)

        select_display_combo_label = QLabel('select display:')
        select_display_combo_label.setAlignment(QtCore.Qt.AlignRight)
        select_display_combo = QComboBox()
        select_display_combo.addItems(DISPLAY_COMBO_ITEMS)
        select_display_combo.setCurrentIndex(
            DISPLAY_COMBO_ITEMS.index(self.test_mode))
        select_display_combo.currentIndexChanged.connect(
            self.selectDisplayCurrentIndexChanged)

        if not self.layout():
            self.grid = QGridLayout()
            self.grid.setContentsMargins(0, 0, 0, 0)

        self.grid.addWidget(deck_select_button, 0, 0)
        self.grid.addWidget(select_display_combo_label, 0, 1)
        self.grid.addWidget(select_display_combo, 0, 2)
        self.grid.addWidget(replay_audio_button, 0, 3)

        for i, value in enumerate(self.dataset, COLUMNS):
            label = QClickLabel()
            if self.test_mode == 'image':
                preview_pixmap = QPixmap()
                try:
                    preview_pixmap.load(path.join(deckpath, value["image"]))
                except (KeyError, TypeError):
                    try:
                        preview_pixmap.load(
                            path.join(deckpath, value["svg_filename"]))
                    except (KeyError, TypeError):
                        pass
                scaled_pixmap = preview_pixmap.scaled(
                    QtCore.QSize(200, 200), QtCore.Qt.KeepAspectRatio)
                label.setGeometry(scaled_pixmap.rect())
                label.setPixmap(scaled_pixmap)
            elif self.test_mode == 'name':
                label.setText(value['name'])
            elif self.test_mode == 'word':
                label.setText(value['word'])
            elif self.test_mode == 'translation':
                label.setText(value['translation'])

            label.setAlignment(QtCore.Qt.AlignCenter)
            label.clicked.connect(
                functools.partial(self.labelClicked, value["rowid"]))

            self.grid.addWidget(label, int(i / COLUMNS), i % COLUMNS)

        self.setLayout(self.grid)

        self.playRandomAudio()

    def clear(self):
        if self.grid:
            for i in range(0, self.layout().count()):
                widget = self.layout().itemAt(i).widget()
                widget.setVisible(False)
        #for widget in self.findChildren:
        #print(widget)
        #if self.grid:
        ## just reparent the layout to a temporary one for delete it
        #QWidget().setLayout(self.grid)

    def selectDeckButtonClicked(self):
        self.selectDeck.emit()

    def labelClicked(self, row_id):
        try:
            if row_id == self.current_audio_deck_id:
                self.playRandomAudio()
        except AttributeError:
            """ we probably have no audio file in this module """
            pass

    def playRandomAudio(self):
        try:
            selector = randint(0, len(self.dataset) - 1)
            """ we do not want the same audio played multiple times on a row """
            depth = 0
            while selector == self.last_random_audio:
                selector = randint(0, len(self.dataset) - 1)
                """ to avoid infinite loops with just one element """
                depth += 1
                if depth > 20:
                    break
            self.last_random_audio = selector

            filename = self.dataset[selector]["filename"]
            self.current_audio_deck_id = self.dataset[selector]["rowid"]

            filepath = path.join(self.deckpath, filename)
            url = QtCore.QUrl.fromLocalFile(
                QtCore.QFileInfo(filepath).absoluteFilePath())
            content = QMediaContent(url)
            self.audioPlayer.setMedia(content)
            self.audioPlayer.play()
        except ValueError:
            """ probably an empty deck. just do nothing"""
            pass

    def replayAudioClicked(self):
        self.audioPlayer.play()

    def selectDisplayCurrentIndexChanged(self, test):
        selected_label = DISPLAY_COMBO_ITEMS[test]
        self.clear()
        self.test_mode = selected_label

        self.initialize(self.deckpath)
Beispiel #36
0
class VideoWindow(QMainWindow):
    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)
        self.setWindowTitle(
            "PyQt Video Player Widget Example - pythonprogramminglanguage.com")

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        videoWidget = QVideoWidget()

        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile("resources/movie/movie1.wmv")))

        self.playButton = QPushButton()
        self.playButton.setEnabled(True)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)

        # Create a widget for window contents
        wid = QWidget(self)
        self.setCentralWidget(wid)

        # Create layouts to place inside widget
        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.errorLabel)

        # Set widget to contain window contents
        wid.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
Beispiel #37
0
class Player(QWidget):
    def __init__(self, playlist, playlist_copy, parent=None):
        super().__init__(parent)
        uic.loadUi('player.ui', self)

        # Устанавливаем начальное значение громкости музыки
        self.volume = 50
        # Создаем объект список для плейлиста, это нужно для перемешки треков в функции mix.
        # Является копией оригинального плейлиста
        self.playlist_list = playlist_copy
        # Создаем плейлист и плеер
        self.playlist = playlist
        self.playlist.setPlaybackMode(QMediaPlaylist.Loop)
        self.player = QMediaPlayer()
        # Задаем начальную громкость плееру
        self.player.setVolume(self.volume)
        self.player.setPlaylist(self.playlist)

        # self.slider.setFocusPolicy(Qt.NoFocus)
        self.slider.valueChanged[int].connect(self.changeValue)

        self.pushButton.clicked.connect(self.play_music)
        self.pushButton_2.clicked.connect(self.next)
        self.pushButton_3.clicked.connect(self.prev)
        self.pushButton_4.clicked.connect(self.mix)
        self.pushButton_5.clicked.connect(self.pause)

    def mix(self):
        # Останавливаем плеер и очищаем плейлист
        self.player.stop()
        self.playlist.clear()
        # С помощью копии перемешиваем треки в сам плейлист
        playlist_copy = self.playlist_list
        for i in range(len(self.playlist_list)):
            track = random.choice(playlist_copy)
            del playlist_copy[playlist_copy.index(track)]
            self.playlist.addMedia(track)
        # Добавляем плейлист в плеер и запускаем плеер
        self.player.setPlaylist(self.playlist)
        self.player.play()

    def next(self):
        self.playlist.next()
        print(self.playlist.currentMedia().canonicalUrl())

    def prev(self):
        self.playlist.previous()
        print(self.playlist.currentMedia().canonicalUrl())

    def play_music(self):
        self.player.play()

    def changeValue(self, value):
        self.volume = value
        self.player.setVolume(self.volume)

    def closeEvent(self, event):
        self.playlist.clear()
        self.player.stop()

    def pause(self):
        self.player.pause()
Beispiel #38
0
class VideoWindow(QMainWindow):
    def __init__(self, parent=None):
        super(VideoWindow, self).__init__(parent)
        self.setWindowTitle(
            "PyQt Video Player Widget Example - pythonprogramminglanguage.com")

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.camera = QCamera(0)
        self.cameraviewfinder = QCameraViewfinder()
        self.cameramode = self.camera.CaptureMode(2)
        self.cameraimgcap = QCameraImageCapture(self.camera)

        videoWidget = QVideoWidget()
        self.imageView = QLabel("add a image file")
        self.imageView.setAlignment(Qt.AlignCenter)
        self.playButton = QPushButton()
        self.playButton.setEnabled(True)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)

        self.scene1 = QGraphicsScene()
        self.view1 = QGraphicsView(self.scene1)

        # Create new action

        # Create exit action

        # Create a widget for window contents
        wid = QWidget(self)
        self.setCentralWidget(wid)

        # Create layouts to place inside widget
        # controlLayout = QHBoxLayout()
        # controlLayout.setContentsMargins(0, 0, 0, 0)
        # controlLayout.addWidget(self.playButton)
        # controlLayout.addWidget(self.positionSlider)

        videolayout = QVBoxLayout()
        videolayout.addWidget(videoWidget)

        # videolayout.addLayout(controlLayout)
        # Set widget to contain window contents

        layout = QHBoxLayout()
        layout.addLayout(videolayout)
        layout.addWidget(self.cameraviewfinder)
        # layout.addWidget(self.view1)
        wid.setLayout(layout)
        self.mediaPlayer.setVideoOutput(videoWidget)
        self.cameraviewfinder.show()
        self.camera.setViewfinder(self.cameraviewfinder)

    def exitCall(self):
        sys.exit(app.exec_())

    def play(self):
        self.showFullScreen()

        fileName = 'D:\\桌面\\some.mp4'

        if fileName != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)
        self.cameraviewfinder.resize(640, 480)
        self.camera.start()
        self.mediaPlayer.play()

        camera_capture = cv2.VideoCapture(0)

        while True:
            ret, camera_frame = camera_capture.read()
            if ret:
                self.displayImage(camera_frame)
            else:
                break
        camera_capture.release()
        cv2.destroyAllWindows()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def displayImage(self, img):
        self.scene1.clear()
        pixMap = QPixmap(img)
        w, h = pixMap.width(), pixMap.height()
        self.scene1.addPixmap(pixMap)
        self.view1.fitInView(QRectF(0, 0, w, h), Qt.KeepAspectRatio)
        self.scene1.update()
Beispiel #39
0
class NativeVideoDialog(QMainWindow):
    def __init__(self):
        super().__init__()
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        video_widget = QVideoWidget()

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.set_position)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                                      QSizePolicy.Maximum)

        # Create exit action
        exit_action = QAction(QIcon('exit.png'), '&Exit', self)
        exit_action.setShortcut('Ctrl+Q')
        exit_action.setStatusTip('Close window')
        exit_action.triggered.connect(self.exit_call)

        # Create a widget for window contents
        wid = QWidget(self)
        self.setCentralWidget(wid)

        # Create layouts to place inside widget
        control_layout = QHBoxLayout()
        control_layout.setContentsMargins(0, 0, 0, 0)
        control_layout.addWidget(self.playButton)
        control_layout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(video_widget)
        layout.addLayout(control_layout)
        layout.addWidget(self.errorLabel)

        # Set widget to contain window contents
        wid.setLayout(layout)

        self.mediaPlayer.setVideoOutput(video_widget)
        self.mediaPlayer.stateChanged.connect(self.media_state_changed)
        self.mediaPlayer.positionChanged.connect(self.position_changed)
        self.mediaPlayer.durationChanged.connect(self.duration_changed)
        self.mediaPlayer.error.connect(self.handle_error)

    def open_file_for_playing(self, file_name):
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(file_name)))
        self.playButton.setEnabled(True)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def media_state_changed(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                self.style().standardIcon(QStyle.SP_MediaPlay))

    def position_changed(self, position):
        self.positionSlider.setValue(position)

    def duration_changed(self, duration):
        self.positionSlider.setRange(0, duration)

    def set_position(self, position):
        self.mediaPlayer.setPosition(position)

    def handle_error(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())

    def exit_call(self):
        self.close()
    cap = cv2.VideoCapture(webcam)

    cv2.imshow('window', cv2.imread('images/Smile_detection_intro3.png'))
    while True:
        ret, frame = cap.read()
        if ret:
            frame = resize(frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                saveImage(frame)
                rgb_frame = frame[:, :, ::-1]
                gray = preproc(frame)
                faces = detector(rgb_frame, 1)
                if len(faces) > 0:
                    toRightN, toLeftN, eyeRightN, eyeLeftN, faceDN = getValues(
                        faces, gray)
                break
        else:
            break

    cap.release()
    cv2.destroyAllWindows()

    player.play()
    wgt_video.showFullScreen()

    detectorThread.start()
    timerThread.start()

    app.exec_()
class clipEditor(QMainWindow):

    downloaded_more_scripts = pyqtSignal()

    def __init__(self, videoWrapper):
        QtWidgets.QWidget.__init__(self)
        uic.loadUi(f"{current_path}/UI/ClipEditor.ui", self)

        try:
            self.setWindowIcon(QIcon('Assets/twitchlogo.png'))
        except Exception as e:
            pass


        #Variables and stuff for the editor to send to the video generator
        self.videoWrapper = videoWrapper
        self.mainCommentIndex = 0
        self.populateTreeWidget()
        self.treeWidget.currentItemChanged.connect(self.setSelection)
        self.treeWidget.clicked.connect(self.setSelection)
        self.downloaded_more_scripts.connect(self.receiveMoreClips)
        self.introClipPath = None
        self.firstClipPath = None
        self.intervalClipPath = None
        self.outroClipPath = None


        self.keep = []
        self.skipped_paths = []
        self.endCut = []
        self.startCut = []
        self.clipStatus = []
        self.firstTwoClips = []
        #All of the stuff to make the clip editor work
        self.playlist = QMediaPlaylist()
        vid_path = QUrl.fromLocalFile(f'{current_path}/VideoFiles')
        self.mediaPlayer = QMediaPlayer()
        self.playPauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        #self.addClipsToPlaylist()
        self.mediaPlayer.stateChanged.connect(self.playPauseMedia)
        self.mediaPlayer.setVideoOutput(self.clipPlayer)
        self.mediaPlayer.setPlaylist(self.playlist)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.videoDurationSlider.sliderMoved.connect(self.setPosition)
        self.endCutSlider.sliderMoved.connect(self.getEndCut)
        self.startCutSlider.sliderMoved.connect(self.getStartCut)
        self.audioSlider.sliderMoved.connect(self.audioChanged)
        self.defaultIntro.stateChanged.connect(self.defaultIntroToggle)
        self.chooseFirstClip.clicked.connect(self.firstClipFileDialog)
        self.chooseIntro.clicked.connect(self.introFileDialog)
        self.chooseInterval.clicked.connect(self.intervalFileDialog)
        self.chooseOutro.clicked.connect(self.outroFileDialog)
        self.noBackgroundMusic.clicked.connect(self.muteBackgroundVolume)
        self.timer = QTimer(self, interval=1)
        self.timer.start()
        self.timer.timeout.connect(self.updateMusicCats)

        self.endCutSlider.sliderPressed.connect(self.getEndCut)
        self.startCutSlider.sliderPressed.connect(self.getStartCut)

        self.mediaPlayer.positionChanged.connect(self.vidTimeStamp)
        self.playPauseButton.clicked.connect(self.play)
        #self.skipButton.clicked.connect(self.skipClip)
        self.skipButton.clicked.connect(self.skipComment)
        #self.backButton.clicked.connect(self.previousClip)
        #self.keepButton.clicked.connect(self.keepClip)
        #self.takeScreenshot.clicked.connect(self.screenshotCall)
        self.downloadMore.clicked.connect(self.downloadMoreScripts)
        self.keepButton.clicked.connect(self.keepComment)
        self.exportButton.clicked.connect(self.videoExportConfirmation)

        self.moveDown.clicked.connect(self.moveClipDown)
        self.moveUp.clicked.connect(self.moveClipUp)

        #self.nextButton.clicked.connect(self.nextClip)
        self.playlist.currentIndexChanged.connect(self.checkForLastClip)
        if settings.enforceInterval:
            self.loadDefaultInterval()
        else:
            self.chooseInterval.setEnabled(False)
            self.defaultInterval.setEnabled(False)

        if settings.enforceIntro:
            self.loadDefaultIntro()
        else:
            self.chooseIntro.setEnabled(False)
            self.defaultIntro.setEnabled(False)

        self.loadDefaultColours()
        if settings.enforceOutro:
            self.loadDefaultOutro()
        else:
            self.chooseOutro.setEnabled(False)
            self.defaultOutro.setEnabled(False)

        if not settings.enforceFirstClip:
            self.chooseFirstClip.setEnabled(False)

        self.updateDisplay()

    def updateMusicCats(self):
        try:
            if not self.lastCheckedMusicOptions == client.music_categories:
                self.musicOption.clear()
                self.lastCheckedMusicOptions = client.music_categories
                self.musicOption.addItems(client.music_categories)
        except Exception as e:
            self.musicOption.clear()
            self.lastCheckedMusicOptions = client.music_categories
            self.musicOption.addItems(client.music_categories)


    def muteBackgroundVolume(self):
        self.backgroundVolume.setText("0")

    def audioChanged(self):
        position = self.audioSlider.sliderPosition()
        self.mediaPlayer.setVolume(position)
        self.volumeClip.setText("Volume: %s" % position)


    def defaultIntroToggle(self):
        print(self.defaultIntro.isChecked())

    def receiveMoreClips(self):
        self.populateTreeWidget()

    def downloadMoreScripts(self):
        self.gameSelect = ClipDownloadMenu(self)
        self.gameSelect.show()
        pass

    def moveClipDown(self):
        self.videoWrapper.scriptWrapper.moveUp(self.mainCommentIndex)
        self.updateDisplay()

    def moveClipUp(self):
        self.videoWrapper.scriptWrapper.moveDown(self.mainCommentIndex)
        self.updateDisplay()

    def updateDisplay(self):
        #self.scriptWrapper.saveScriptWrapper()
        self.getCurrentWidget(self.mainCommentIndex).setForeground(0, QtGui.QBrush(QtGui.QColor("blue")))

        twitchclip = self.videoWrapper.scriptWrapper.getCommentInformation(self.mainCommentIndex)
        mp4file = twitchclip.mp4
        video_duration = twitchclip.vid_duration
        start_cut = twitchclip.start_cut
        end_cut = twitchclip.end_cut
        audio = twitchclip.audio
        self.startCutSlider.setValue(start_cut)
        self.endCutSlider.setValue(end_cut)
        self.clipTitle.setText(f'{twitchclip.streamer_name}-{twitchclip.clip_name}')
        self.updateClipDuration()
        self.mediaPlayer.stop()
        if len(mp4file.split("/")) > 2:
            self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(f'{mp4file}')));
        else:
            self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile(f'TempClips/{mp4file}.mp4')))
        self.mediaPlayer.setVolume(audio * 100)
        self.volumeClip.setText("Volume: %s" % (audio * 100))
        self.audioSlider.setValue(audio * 100)
        self.estTime.setText(str(self.videoWrapper.scriptWrapper.getEstimatedVideoTime()))
        self.videoLength.setText(f'{round(video_duration, 1)}')
        self.startCutLabel.setText(f'Start: {round(start_cut / 1000, 1)}')
        self.endCutLabel.setText(f'End: {end_cut}')
        self.mediaPlayer.play()
        self.clipCountLabel.setText(f"Clip {self.mainCommentIndex+1}/{len(self.videoWrapper.scriptWrapper.rawScript)}")


    def setSelection(self):


        try:
            self.currentTreeWidget = self.treeWidget.currentItem()
            if self.currentTreeWidget.parent() is None:
                self.mainCommentIndex = int(str(self.currentTreeWidget.text(0)).split(" ")[1])

            self.updateColors()
            self.updateDisplay()
        except Exception:
            print("error trying to update selection index")




    def getCurrentWidget(self, x):
        return self.getTopLevelByName("Vid %s" % str(x))

    def incrimentSelection(self):
        if not self.mainCommentIndex + 1 > self.videoWrapper.scriptWrapper.getCommentAmount() - 1:
            self.mainCommentIndex += 1

    def updateColors(self):
        for x, mainComment in enumerate(self.videoWrapper.scriptWrapper.scriptMap):
            self.selectedMainComment = self.getTopLevelByName("Vid %s" % str(x))
            if mainComment is True:
                self.selectedMainComment.setForeground(0, QtGui.QBrush(QtGui.QColor("green")))
            else:
                self.selectedMainComment.setForeground(0, QtGui.QBrush(QtGui.QColor("red")))

    def keepComment(self):
        self.videoWrapper.scriptWrapper.setCommentStart(self.mainCommentIndex, self.startCutSlider.sliderPosition())
        self.videoWrapper.scriptWrapper.setCommentEnd(self.mainCommentIndex, self.endCutSlider.sliderPosition())
        self.videoWrapper.scriptWrapper.setCommentAudio(self.mainCommentIndex, self.audioSlider.sliderPosition() / 100)
        self.videoWrapper.scriptWrapper.keep(self.mainCommentIndex)
        self.incrimentSelection()
        self.updateColors()
        self.updateDisplay()

    def skipComment(self):
        self.videoWrapper.scriptWrapper.setCommentStart(self.mainCommentIndex, self.startCutSlider.sliderPosition())
        self.videoWrapper.scriptWrapper.setCommentEnd(self.mainCommentIndex, self.endCutSlider.sliderPosition())
        self.videoWrapper.scriptWrapper.setCommentAudio(self.mainCommentIndex, self.audioSlider.sliderPosition() / 100)
        self.videoWrapper.scriptWrapper.skip(self.mainCommentIndex)
        self.updateColors()
        self.nextMainComment()
        self.updateDisplay()

    def nextMainComment(self):
        if not self.mainCommentIndex + 1 > self.videoWrapper.scriptWrapper.getCommentAmount() - 1:
            self.mainCommentIndex += 1
            self.selectedMainComment = self.getTopLevelByName("Main Comment %s" % str(self.mainCommentIndex))


    def populateTreeWidget(self):
        self.treeWidget.clear()
        for i, clip in enumerate(self.videoWrapper.scriptWrapper.rawScript):
            treeParentName = "Vid %s"%str(i)
            self.addTopLevel(treeParentName)
        self.selectedMainComment = self.getTopLevelByName("Vid %s" % str(0))
        self.updateColors()


    def getTopLevelByName(self, name):
        for index in range(self.treeWidget.topLevelItemCount()):
            item = self.treeWidget.topLevelItem(index)
            if item.text(0) == name:
                return item
        return None

    def addTopLevel(self, name):
        if self.getTopLevelByName(name) is None:
            QTreeWidgetItem(self.treeWidget, [name])


    def checkForLastClip(self):
        if self.playlist.currentIndex() == len(self.startCut) - 1:
            self.playlist.setPlaybackMode(0)


    def updateClipDuration(self):
        twitchclip = self.videoWrapper.scriptWrapper.getCommentInformation(self.mainCommentIndex)
        duration = round(twitchclip.vid_duration - (self.startCutSlider.sliderPosition() / 1000) - (self.endCutSlider.sliderPosition() / 1000), 1)
        self.clipDurationLabel.setText(f'Clip Duration: {duration}')


    #Getting the timestamp for the video player
    def vidTimeStamp(self):
        self.timeStamp.setText(f"00:{self.getPositionInSecs()}")
    
    #Controlling the play/pause of the videos, kinda obvious
    def playPauseMedia(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playPauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playPauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        
    #Giving the play button function
    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()
    
    #This makes the duration slider move with the video
    def positionChanged(self, position):
        self.videoDurationSlider.setValue(position)

    #Sets the range of each slider to the duration of each video
    def durationChanged(self, duration):
        self.videoDurationSlider.setRange(0, duration)
        self.endCutSlider.setRange(0, duration)
        self.startCutSlider.setRange(0, duration)
    
    #This is to control the position of the video in the media player so I can control the video with the duration slider
    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)
        self.mediaPlayer.play()


    def introFileDialog(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self,"Select The Intro Clip", f"{current_path}/Intros","All Files (*);;MP4 Files (*.mp4)", options=options)
        if fileName:
            try:
                vid = cv2.VideoCapture(fileName)
                height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
                width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
                if width != int(1920) or height != int(1080):
                    self.uploadFail("Incorrect resolution for file %s.\n Resolution was %sx%s, required 1920x1080" % (fileName, width, height))
                else:
                    self.introClipPath = fileName
                    self.chooseIntro.setText("Reselect Intro")
            except Exception as e:
                self.uploadFail("Error occured uploading file \n %s" % (e))





    def outroFileDialog(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self,"Select The Outro Clip", f"{current_path}/Outros","All Files (*);;MP4 Files (*.mp4)", options=options)
        if fileName:
            try:
                vid = cv2.VideoCapture(fileName)
                height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
                width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
                if int(width) != 1920 or int(height) != 1080:
                    self.uploadFail("Incorrect resolution for file %s.\n Resolution was %sx%s, required 1920x1080" % (fileName, width, height))
                else:
                    self.outroClipPath = fileName
                    self.chooseOutro.setText("Reselect Outro")
            except Exception as e:
                self.uploadFail("Error occured uploading file \n %s" % (e))


    def intervalFileDialog(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self,"Select The Interval Clip", f"{current_path}/Intervals","All Files (*);;MP4 Files (*.mp4)", options=options)
        if fileName:
            try:
                vid = cv2.VideoCapture(fileName)
                height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
                width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
                if int(width) != 1920 or int(height) != 1080:
                    self.uploadFail("Incorrect resolution for file %s.\n Resolution was %sx%s, required 1920x1080" % (fileName, width, height))
                else:
                    self.intervalClipPath = fileName
                    self.chooseInterval.setText("Reselect Interval")
            except Exception as e:
                self.uploadFail("Error occured uploading file \n %s" % (e))


    def firstClipFileDialog(self):
        options = QFileDialog.Options()
        fileName, _ = QFileDialog.getOpenFileName(self,"Select The First Clip", f"{current_path}/FirstClips","All Files (*);;MP4 Files (*.mp4)", options=options)
        if fileName:
            # name = len(fileName.split("/"))
            # self.firstClipPath = (fileName.split("/")[name-1])

            try:
                vid = cv2.VideoCapture(fileName)
                height = vid.get(cv2.CAP_PROP_FRAME_HEIGHT)
                width = vid.get(cv2.CAP_PROP_FRAME_WIDTH)
                if int(width) != 1920 or int(height) != 1080:
                    self.uploadFail("Incorrect resolution for file %s.\n Resolution was %sx%s, required 1920x1080" % (fileName, width, height))
                else:
                    self.firstClipPath = fileName
                    name = len(self.firstClipPath.split("/"))
                    new_name = (self.firstClipPath.split("/")[name-1]).replace(".mp4", "")
                    self.firstClipCred.setText(new_name)

                    firstClip = scriptwrapper.DownloadedTwitchClipWrapper("", "", "", "", None)
                    firstClip.streamer_name = new_name
                    firstClip.mp4 = self.firstClipPath
                    firstClip.upload = True

                    media_info = MediaInfo.parse(self.firstClipPath)
                    duration = media_info.tracks[0].duration / 1000
                    firstClip.vid_duration = float(duration)



                    self.videoWrapper.scriptWrapper.addClipAtStart(firstClip)
                    self.populateTreeWidget()
                    self.chooseFirstClip.setText("Reselect First Clip")
            except Exception as e:
                self.uploadFail("Error occured uploading file \n %s" % (e))



    def saveDefaultIntro(self):
        with open(f'Save Data/defaultintro.save', 'wb') as pickle_file:
            pickle.dump(self.introClip, pickle_file)

    def saveDefaultInterval(self):
        with open(f'Save Data/defaultinterval.save', 'wb') as pickle_file:
            pickle.dump(self.intervalClipPath, pickle_file)

    def saveDefaultColours(self):
        with open(f'Save Data/defaultcolours.save', 'wb') as pickle_file:
            pickle.dump([self.mainColour.currentText(), self.outlineColour.currentText()], pickle_file)

    def saveDefaultOutro(self):
        with open(f'Save Data/defaultoutro.save', 'wb') as pickle_file:
            pickle.dump(self.outroClipPath, pickle_file)


    def loadDefaultIntro(self):
        if os.path.exists("Save Data/defaultintro.save"):
            with open(f'Save Data/defaultintro.save', 'rb') as pickle_file:
                self.introClip = pickle.load(pickle_file)
                self.introClipPath = self.introClip.mp4
                self.defaultIntro.setChecked(True)
                self.chooseIntro.setText("Reselect Intro")

    def loadDefaultInterval(self):
        if os.path.exists("Save Data/defaultinterval.save"):
            with open(f'Save Data/defaultinterval.save', 'rb') as pickle_file:
                self.intervalClip = pickle.load(pickle_file)
                self.intervalClipPath = self.intervalClip
                self.defaultInterval.setChecked(True)
                self.chooseInterval.setText("Reselect Interval")


    def loadDefaultOutro(self):
        if os.path.exists("Save Data/defaultoutro.save"):
            with open(f'Save Data/defaultoutro.save', 'rb') as pickle_file:
                self.outroClip = pickle.load(pickle_file)
                self.outroClipPath = self.outroClip
                self.defaultOutro.setChecked(True)
                self.chooseOutro.setText("Reselect Outro")


    def loadDefaultColours(self):
        if os.path.exists("Save Data/defaultcolours.save"):
            with open(f'Save Data/defaultcolours.save', 'rb') as pickle_file:
                colours = pickle.load(pickle_file)
                colour1 = colours[0]
                colour2 = colours[1]

                index1 = self.mainColour.findText(colour1, QtCore.Qt.MatchFixedString)
                if index1 >= 0:
                    self.mainColour.setCurrentIndex(index1)

                index2 = self.outlineColour.findText(colour2, QtCore.Qt.MatchFixedString)
                if index2 >= 0:
                    self.outlineColour.setCurrentIndex(index2)

                self.defaultColor.setChecked(True)


    #Collecting all of the information for video generator
    def exportVideo(self):
        intervalCheck = True if (self.intervalClipPath is not None and settings.enforceInterval) or not settings.enforceInterval else False
        firstClipCheck = True if (self.firstClipPath is not None and settings.enforceFirstClip) or not settings.enforceFirstClip else False
        introClipCheck = True if (self.introClipPath is not None and settings.enforceIntro) or not settings.enforceIntro else False
        outroClipCheck = True if (self.outroClipPath is not None and settings.enforceOutro) or not settings.enforceOutro else False

        if intervalCheck is True and firstClipCheck is True and introClipCheck is True and outroClipCheck is True:
            self.mediaPlayer.stop()
            final_clips = self.videoWrapper.scriptWrapper.getFinalClips()


            self.videoWrapper.colour1 = self.mainColour.currentText()
            self.videoWrapper.colour2 = self.outlineColour.currentText()
            self.videoWrapper.background_audio = self.backgroundVolume.text()
            self.videoWrapper.audio_cat = self.musicOption.currentText()


            with_intro = []

            if settings.enforceIntro:
                self.introClip = scriptwrapper.DownloadedTwitchClipWrapper("", "", " ", "", None)
                self.introClip.streamer_name = None
                self.introClip.mp4 = self.introClipPath
                self.introClip.isIntro = True
                self.introClip.isInterval = False
                self.introClip.upload = True
                self.introClip.isUsed = True


                media_info_intro = MediaInfo.parse(self.introClipPath)
                duration_intro = media_info_intro.tracks[0].duration / 1000

                self.introClip.vid_duration = float(duration_intro)


            if settings.enforceInterval:
                self.intervalClip = scriptwrapper.DownloadedTwitchClipWrapper("", "", " ", "", None)
                self.intervalClip.streamer_name = None
                self.intervalClip.mp4 = self.intervalClipPath
                self.intervalClip.isInterval = True
                self.intervalClip.isIntro = False
                self.intervalClip.upload = True
                self.intervalClip.isUsed = True

                media_info_interval = MediaInfo.parse(self.intervalClipPath)
                duration_interval = media_info_interval.tracks[0].duration / 1000

                self.intervalClip.vid_duration = float(duration_interval)


            if settings.enforceOutro:
                self.outroClip = scriptwrapper.DownloadedTwitchClipWrapper("", "", " ", "", None)
                self.outroClip.streamer_name = None
                self.outroClip.mp4 = self.outroClipPath
                self.outroClip.isOutro = True
                self.outroClip.upload = True
                self.outroClip.isUsed = True
                media_info_outro = MediaInfo.parse(self.outroClipPath)
                duration_outro = media_info_outro.tracks[0].duration / 1000
                self.outroClip.vid_duration = float(duration_outro)



            if self.defaultIntro.isChecked():
                self.saveDefaultIntro()

            if self.defaultInterval.isChecked():
                self.saveDefaultInterval()

            if self.defaultColor.isChecked():
                self.saveDefaultColours()

            if self.defaultOutro.isChecked():
                self.saveDefaultOutro()


            for i, clip in enumerate(final_clips):
                clip.colour1 = self.mainColour.currentText()
                clip.colour2 = self.outlineColour.currentText()
                with_intro.append(clip)
                if i == 0:
                    if settings.enforceInterval:
                        with_intro.append(self.intervalClip)
                    if settings.enforceIntro:
                        with_intro.append(self.introClip)

            if settings.enforceOutro:
                with_intro.append(self.outroClip)


            self.videoWrapper.final_clips = with_intro
            self.clipupload = ClipUploadMenu(self.videoWrapper)
            self.clipupload.show()



        else:
            print("Choose intro clip and first clip")

    #Converting the video duration/position to seconds so it makes sense
    def getPositionInSecs(self):
        try:
            index = self.playlist.currentIndex()
            vid_position = self.mediaPlayer.position()
            vid_duration = self.mediaPlayer.duration()
            vid_percentage = (vid_position / vid_duration)
            twitchclip = self.videoWrapper.scriptWrapper.getCommentInformation(self.mainCommentIndex)
            return int(twitchclip.vid_duration * vid_percentage)
        except:
            pass
    
    #Gets the value of the start position and also updates the text, kinda not needed to get the value but whatever
    def getStartCut(self):
        sCut = self.getSliderPositionInSecs(self.startCutSlider)
        self.startCutLabel.setText(f'Start: {sCut}')
        self.mediaPlayer.setPosition(self.startCutSlider.sliderPosition())
        return sCut
    
    #Same same
    def getEndCut(self):
        eCut = self.getSliderPositionInSecs(self.endCutSlider)

        twitchclip = self.videoWrapper.scriptWrapper.getCommentInformation(self.mainCommentIndex)
        video_duration = twitchclip.vid_duration
        self.mediaPlayer.setPosition((video_duration * 1000) - self.endCutSlider.sliderPosition())
        self.endCutLabel.setText(f'End: {video_duration - eCut}')
        return eCut
    
    #Gets the position of the startCutSlider in seconds
    def getSliderPositionInSecs(self, slider):
        try:
            vid_position = slider.sliderPosition()
            if vid_position is None:
                vid_position = 0
            vid_duration = self.mediaPlayer.duration()
            vid_percentage = (vid_position / vid_duration)
            twitchclip = self.videoWrapper.scriptWrapper.getCommentInformation(self.mainCommentIndex)
            self.updateClipDuration()
            self.mediaPlayer.play()
            return round(twitchclip.vid_duration * vid_percentage, 1)
        except:
            pass

    def videoExportConfirmation(self):
        msg = 'Is the video long enough?\nIs everything properly cut?'
        buttonReply = QMessageBox.information(self, 'Video Export Confirmation', msg, QMessageBox.Yes | QMessageBox.Cancel, QMessageBox.Cancel)
        if buttonReply == QMessageBox.Yes:

            try:
                volume_test =  float(self.backgroundVolume.text())
            except Exception:
                print("audio is not of float format")
                return

            intervalCheck = True if (self.intervalClipPath is not None and settings.enforceInterval) or not settings.enforceInterval else False
            firstClipCheck = True if (self.firstClipPath is not None and settings.enforceFirstClip) or not settings.enforceFirstClip else False
            introClipCheck = True if (self.introClipPath is not None and settings.enforceIntro) or not settings.enforceIntro else False
            outroClipCheck = True if (self.outroClipPath is not None and settings.enforceOutro) or not settings.enforceOutro else False


            msg = "Could not publish due to the following reasons: \n"
            if not intervalCheck:
                msg += "No interval selected, but interval expected (see config.ini)\n"
            if not firstClipCheck:
                msg += "No first clip selected, but first clip expected (see config.ini)\n"
            if not introClipCheck:
                msg += "No intro clip selected, but intro expected (see config.ini)\n"
            if not outroClipCheck:
                msg += "No outro clip selected, but outro expected (see config.ini)\n"

            amountClips = len(self.videoWrapper.scriptWrapper.getKeptClips())
            if amountClips < 2:
                msg += "Not enough clips! Need at least two clips to be kept."

            if intervalCheck is False or firstClipCheck is False or introClipCheck is False or outroClipCheck is False or amountClips < 2:
                self.publishFail(msg)
                return



            self.mediaPlayer.stop()
            self.close()
            self.exportVideo()
            print('Yes clicked.')
        if buttonReply == QMessageBox.Cancel:
            print('Cancel')

    def uploadFail(self, msg):
        buttonReply = QMessageBox.information(self, 'Upload fail', msg, QMessageBox.Ok)

    def publishFail(self, msg):
        buttonReply = QMessageBox.information(self, 'Publish fail', msg, QMessageBox.Ok)
class Window(QtWidgets.QDialog):

    def __init__(self):
        super().__init__()
        self.setGeometry(50, 50, 300, 400)
        self.setWindowTitle("Rolev Player")

# LIBRARY ROOT DIR FOLDER
        self.search_label = QtWidgets.QLabel("Select a music folder:", self)
        self.search_label.setGeometry(10, 5, 205, 10)

        self.btn_root_folder = QtWidgets.QPushButton("Browse", self)
        self.btn_root_folder.setGeometry(215, 20, 75, 25)

        # the text field of the currently selected root directory
        self.dir_text_field = QtWidgets.QLineEdit(self)
        self.dir_text_field.setGeometry(10, 20, 200, 25)

        self.btn_root_folder.clicked.connect(self.on_btn_root_folder)

# CURRENT MEDIA LABEL
        self.current_media_label = QtWidgets.QLabel("Now Playing: ", self)
        self.current_media_label.setGeometry(10, 260, 250, 15)

# CURRENT ALBUM COVER
        self.current_album_cover = QtWidgets.QLabel("Image", self)
        self.current_album_cover.setGeometry(10, 180, 75, 75)
        self.current_album_cover.setScaledContents(True)

# ARTIST DROP BOX
        self.artist_select_label = QtWidgets.QLabel("Artist", self)
        self.artist_select_label.setGeometry(10, 50, 250, 25)

        self.artist_select = QtWidgets.QComboBox(self)
        self.artist_select.setGeometry(10, 70, 250, 25)
        self.artist_select.activated[str].connect(self.on_artist_selection)

# ALBUMS DROP BOX
        self.album_select_label = QtWidgets.QLabel("Albums", self)
        self.album_select_label.setGeometry(10, 90, 250, 25)

        self.album_select = QtWidgets.QComboBox(self)
        self.album_select.setGeometry(10, 110, 250, 25)
        self.album_select.activated[str].connect(self.on_album_selection)

# SONGS DROP BOX
        self.song_select_label = QtWidgets.QLabel("Current Playlist", self)
        self.song_select_label.setGeometry(10, 130, 250, 25)

        self.song_select = QtWidgets.QComboBox(self)
        self.song_select.setGeometry(10, 150, 250, 25)
        self.song_select.activated[str].connect(self.on_song_selection)

# PLAYLIST
        self.playlist = QMediaPlaylist()
        self.playlist.currentIndexChanged.connect(self.meta_data_changed)

# MEDIA PLAYER
        self.player = QMediaPlayer()
        self.player.setPlaylist(self.playlist)
        self.player.playlist().setPlaybackMode(QMediaPlaylist.Loop)
        self.player.setVolume(50)

        self.player.durationChanged.connect(self.on_dur_change)
        self.player.positionChanged.connect(self.on_pos_change)

# VOLUME SLIDER
        self.slider_volume_label = QtWidgets.QLabel("Volume", self)
        self.slider_volume_label.setGeometry(10, 345, 50, 25)

        self.slider_volume = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
        self.slider_volume.setGeometry(60, 350, 130, 20)
        self.slider_volume.setRange(0, 100)
        self.slider_volume.setValue(50)
        self.slider_volume.valueChanged.connect(self.volume_change)

# PROGRESS SLIDER
        self.slider_progress_label = QtWidgets.QLabel("Progress", self)
        self.slider_progress_label.setGeometry(10, 315, 50, 25)

        self.slider_progress = QtWidgets.QSlider(QtCore.Qt.Horizontal, self)
        self.slider_progress.setGeometry(60, 320, 130, 20)
        self.slider_progress.sliderMoved.connect(self.progress_change)

# LYRICS SEARCH
        self.btn_lyrics = QtWidgets.QPushButton("Search\n Lyrics", self)
        self.btn_lyrics.setGeometry(220, 310, 70, 80)
        self.btn_lyrics.clicked.connect(self.on_lyrics)

# ALBUM INFO SEARCH
        self.btn_album_info = QtWidgets.QPushButton(
            "Search\nAlbum\nInfo", self)
        self.btn_album_info.setGeometry(105, 180, 75, 75)
        self.btn_album_info.clicked.connect(self.on_album_info)

# ARTIST INFO SEARCH
        self.btn_artist_info = QtWidgets.QPushButton(
            "Search\nArtist\nInfo", self)
        self.btn_artist_info.setGeometry(200, 180, 75, 75)
        self.btn_artist_info.clicked.connect(self.on_artist_info)

# PREV SONG BUTTON
        self.btn_prev = QtWidgets.QPushButton("Prev", self)
        self.btn_prev.setGeometry(10, 280, 75, 25)
        self.btn_prev.clicked.connect(self.on_btn_prev)

# NEXT SONG BUTTON
        self.btn_next = QtWidgets.QPushButton("Next", self)
        self.btn_next.setGeometry(200, 280, 75, 25)
        self.btn_next.clicked.connect(self.on_btn_next)

# PLAY/PAUSE BUTTON
        self.btn_play_pause = QtWidgets.QPushButton("Play", self)
        self.btn_play_pause.setGeometry(105, 280, 75, 30)
        self.btn_play_pause.clicked.connect(self.on_btn_play_pause)

        self.show()

    def on_btn_root_folder(self):
        self.root_dir = QtWidgets.QFileDialog().getExistingDirectory()
        self.dir_text_field.setText(self.root_dir)
        self.library = LibraryLoader.load_music_from_dir(
            self.dir_text_field.text())

        self.artist_select.clear()
        self.album_select.clear()
        self.song_select.clear()
        self.playlist.clear()

        self.btn_play_pause.setText("Play")
        self.artist_select.addItem("All Artists")
        for artist in self.library:
            self.artist_select.addItem(artist)
            for album in self.library[artist]:
                self.album_select.addItem(album)
        self.load_all_songs()

    def on_artist_selection(self):
        current_artist = self.artist_select.currentText()

        self.album_select.clear()
        self.song_select.clear()
        self.playlist.clear()

        self.btn_play_pause.setText("Play")
        self.album_select.addItem("All Albums")
        if current_artist == "All Artists":
            for artist in self.library:
                for album in self.library[artist]:
                    self.album_select.addItem(album)
            self.load_all_songs()
        else:
            for album in self.library[current_artist]:
                self.album_select.addItem(album)
            self.load_all_from_artist(current_artist)

    def load_all_songs(self):
        for artist in self.library:
            for album in self.library[artist]:
                for song in self.library[artist][album]:
                    self.song_select.addItem(song[0])
                    self.playlist.addMedia(
                        QMediaContent(QtCore.QUrl.fromLocalFile(song[1])))

    def load_all_from_artist(self, artist):
        for album in self.library[artist]:
            for song in self.library[artist][album]:
                self.song_select.addItem(song[0])
                self.playlist.addMedia(
                    QMediaContent(QtCore.QUrl.fromLocalFile(song[1])))

    def on_album_selection(self):
        current_artist = self.artist_select.currentText()
        current_album = self.album_select.currentText()
        self.song_select.clear()
        self.playlist.clear()
        self.btn_play_pause.setText("Play")
        if current_album == "All Albums" and current_artist == "All Artists":
            self.load_all_songs()

        elif current_album == "All Albums":
            self.load_all_from_artist(current_artist)

        elif current_artist == "All Artists":
            for artist in self.library:
                for album in self.library[artist]:
                    if album == self.album_select.currentText():
                        for song in self.library[artist][album]:
                            self.song_select.addItem(song[0])
                            self.playlist.addMedia(
                                QMediaContent(
                                    QtCore.QUrl.fromLocalFile(song[1])))
        else:
            for song in self.library[current_artist][current_album]:
                self.song_select.addItem(song[0])
                self.playlist.addMedia(
                    QMediaContent(QtCore.QUrl.fromLocalFile(song[1])))

    def on_song_selection(self):
        index = self.song_select.currentIndex()
        self.playlist.setCurrentIndex(index)

# GETTING THE CURRENT SONG METADATA
    # Returns a SONG OBJECT and not the current song title
    # For the title of the currently playing song use get_current_title()
    def get_current_song(self):
        curr_url = self.playlist.currentMedia().canonicalUrl().toString()[8:]
        if curr_url:
            return LibraryLoader.create_song(curr_url)

    def get_current_artist(self):
        if self.get_current_song() is not None:
            return self.get_current_song().artist

    def get_current_album(self):
        if self.get_current_song() is not None:
            return self.get_current_song().album

    def get_current_path(self):
        if self.get_current_song() is not None:
            return self.get_current_song().path

    def get_current_album_path(self):
        if self.get_current_path() is not None:
            return self.get_current_path().rsplit("/", 1)[0]

    def get_current_title(self):
        if self.get_current_song() is not None:
            return self.get_current_song().name

    def on_lyrics(self):
        if self.get_current_song() is not None:
            curr_artist = self.get_current_artist()
            curr_song = self.get_current_title()

            found_lyrics = RequestLyrics.search_song_lyrics(
                curr_artist, curr_song)
            choice = QtWidgets.QMessageBox.question(
                self, "Lyrics", found_lyrics[0],
                QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No)
            if choice == QtWidgets.QMessageBox.Yes:
                webbrowser.open(found_lyrics[1])
        else:
            QtWidgets.QMessageBox.information(
                self, "Lyrics", "No lyrics found or no media is loaded!")

    def on_album_info(self):
        album = self.get_current_album()
        artist = self.get_current_artist()
        if (album is None) or (artist is None):
            print("Please, load a song first!")
        else:
            artist_info, album_info = AlbumArtwork.album_artist_info(
                artist, album)
            if album_info is not None:
                webbrowser.open(album_info)

    def on_artist_info(self):
        album = self.get_current_album()
        artist = self.get_current_artist()
        if (album is None) or (artist is None):
            print("Please, load a song first!")
        else:
            artist_info, album_info = AlbumArtwork.album_artist_info(
                artist, album)
            if artist_info is not None:
                webbrowser.open(artist_info)

    def on_btn_play_pause(self):
        if self.player.state() in (0, 2):
            self.player.play()
            if self.player.state() == 1:
                self.btn_play_pause.setText("Pause")
        else:
            self.player.pause()
            self.btn_play_pause.setText("Play")

    def on_btn_next(self):
        self.player.playlist().next()

    def on_btn_prev(self):
        self.player.playlist().previous()

    def on_dur_change(self, length):
        self.slider_progress.setMaximum(length)

    def on_pos_change(self, position):
        self.slider_progress.setValue(position)

    def volume_change(self):
        volume = self.slider_volume.value()
        self.player.setVolume(volume)

    def progress_change(self):
        position = self.slider_progress.value()
        self.player.setPosition(position)

    def meta_data_changed(self):

        now_playing = self.get_current_title()
        self.current_media_label.setText("Now Playing: " + now_playing)

        # Updating the currently playing album cover
        curr_album_path = self.get_current_album_path()
        curr_album = self.get_current_album()
        curr_artist = self.get_current_artist()
        cover_url = AlbumArtwork.album_cover(
            curr_album_path, curr_artist, curr_album)

        self.current_album_cover.setPixmap(QPixmap(cover_url))
        Scrobbler.scrobble(self.get_current_artist(), self.get_current_title())
Beispiel #43
0
class EventAction():
    def __init__(self):
        #self.parent = parent
        self.isLoop = 0         #0循环列表,1单曲循环
        self.isRandom = 0       #0不随机,1随机
        self.fileList = []      #曲目名称列表
        self.randomList =[]     #播放列表
        self.soundID = 0        #当前歌曲ID
        self.playStat = False  #当前播放状态 (0未播放,1播放)
        self.openPath = "F:/mp3/" #歌曲目录
        self.isPreview = 0       #试用开关,0正常播放,1列表中的歌曲每首歌曲放10秒
        self.currentVolume = 0.1#默认的起始音量
        self.isInitPlay = 1     #是否是初始播放
        #==>>打开目录
        self.config=configparser.ConfigParser()
        self.config.read('config.ini')
        self.openDir()
        #打开目录<<==
        self.playObj = QMediaPlayer()

        self.currentImg = ""    #当前图片
        self.songText = {}      #歌词
        self.songTextKey=[]     #歌词KEY



    #打开歌曲目录
    def openDir(self):
        self.openPath = self.config.get('Save','musicPath')
        isMusicDir = os.path.isdir(self.openPath)#检查是否为目录
        if isMusicDir:
            dirFile = os.listdir(self.openPath)#目录中的所有文件
            #遍历有效音乐文件
            i=0;
            for file in dirFile:
                fileName,fileType=os.path.splitext(file)
                if fileType==".mp3" or fileType==".wav":
                    self.fileList.append(file)
                    self.randomList.append(i)
                    i+=1
        if self.isRandom==1:
            self.shuffleMusic(1)

    #随机(打乱播放顺序)
    def shuffleMusic(self,isshuffle):
        if isshuffle:
            random.shuffle(self.randomList)#乱序
        else:
            self.randomList.sort()#排序

    #初始化播放
    def initPlay(self):
        self.soundID = int(self.config.get('Save','soundID'))
        self.playStat = self.config.get('Save','playStat')
        self.pastTime = self.config.getint('Save','pastTime')
        self.currentVolume = self.config.getint('Save','volume')
        self.isRandom = self.config.getint('Save','isRandom')
        self.isLoop = self.config.getint('Save','isLoop')

        if self.soundID!="":
            self.play(self.soundID)
        if self.isRandom:#打乱列表
            self.shuffleMusic(1)
        self.playObj.setVolume(self.currentVolume)


    #播放
    def play(self,i):
        source = self.openPath + self.fileList[i]
        self.playObj.setMedia(QMediaContent(QUrl.fromLocalFile(source)))
        #解析文件中的ID3V2
        self.currentImg = ""
        f = QFile(source)
        if f.open(QIODevice.ReadOnly):
            #读取标签
            headData = f.read(10)
            data = headData[:0]
            if self.id3v2(headData):#检测是否有ID3
                #标签的大小计算
                tag = headData[6:10]
                tagSize = (tag[0]&0x7f)*0x200000+(tag[1]&0x7f)*0x4000+(tag[2]&0x7f)*0x80+(tag[3]&0x7f)
                data =f.read(tagSize)
                while len(data)>10:
                    data = self.resolve(data)
        f.close()
        self.playObj.play()

    def testPlay(self):
        #ps =QMediaMetaData()
        #print("QMediaMetaData",ps)
        #print("metaData",self.playObj.metaData(QMediaMetaData.Title))
        #print("position",self.playObj.position())
        #print("playlist",self.playObj.playlist)
        #print("availability",self.playObj.availability())
        #print("bufferStatus",self.playObj.bufferStatus())
        #print("currentMedia",self.playObj.currentMedia())
        #print("currentNetworkConfiguration",self.playObj.currentNetworkConfiguration())
        #print("duration",self.playObj.duration())
        #print("error",self.playObj.error())
        #print("errorString",self.playObj.errorString())
        #print("isAudioAvailable",self.playObj.isAudioAvailable())
        #print("isMuted",self.playObj.isMuted())
        #print("isSeekable",self.playObj.isSeekable())
        #print("media",self.playObj.media())
        #print("media:::::::A",self.playObj.media().canonicalResource().audioBitRate())
        #print("media:::::::B",self.playObj.media().canonicalResource().audioCodec())
        #print("media:::::::C",self.playObj.media().canonicalResource().channelCount())
        #print("media:::::::D",self.playObj.media().canonicalResource().dataSize())
        #print("media:::::::e",self.playObj.media().canonicalResource().isNull())
        #print("media:::::::f",self.playObj.media().canonicalResource().language())
        #print("media:::::::g",self.playObj.media().canonicalResource().mimeType())
        #print("media:::::::h",self.playObj.media().canonicalResource().request())
        #print("isVideoAvailable",self.playObj.isVideoAvailable())
        #print("mediaStatus",self.playObj.mediaStatus())
        #print("mediaStream",self.playObj.mediaStream())
        #print("playbackRate",self.playObj.playbackRate())
        #print("state",self.playObj.state())
        #print("volume",self.playObj.volume())
        # print("volume",self.playObj.filename)
        pass



    #换歌之前先停止,释放内存
    def stopPlay(self):
        self.playObj.pause()

    #上一首
    def prevPlay(self):
        self.stopPlay()
        if self.isRandom:
            key = self.searchID(self.soundID)-1
            if key<0:
                key=0
            self.soundID = self.randomList[key]
        else:
            self.soundID-=1
            if self.soundID< 0:
                self.soundID = len(self.randomList)-1
        self.play(self.soundID)

    #下一首
    def nextPlay(self):
        self.stopPlay()
        if self.isRandom:
            key = self.searchID(self.soundID)+1
            if key>(len(self.randomList)-1):
                key=len(self.randomList)-1
            self.soundID = self.randomList[key]
        else:
            self.soundID+=1
            if self.soundID > (len(self.randomList)-1):
                self.soundID = 0
        #print("next:::",self.soundID)
        self.play(self.soundID)

    #快退
    def rewindPlay(self):
        #print("<<")
        rewindTime = int(self.playObj.position()) - 10*1000
        if rewindTime < 0:
            rewindTime = 0
        self.playObj.setPosition(rewindTime)

    #快进
    def forwardPlay(self):
        #print(">>")
        forwardTime = int(self.playObj.position()) + 10*1000
        if forwardTime > int(self.playObj.duration()):
            forwardTime = int(self.playObj.duration())
        self.playObj.setPosition(forwardTime)

    #播放/暂停
    def playORpause(self):
        if self.playObj.state()==1:
            self.playObj.pause()
        else:
            self.playObj.play()

    #音量加
    def raisevolPlay(self):
        self.playObj.setVolume(self.playObj.volume()+10)
        self.currentVolume = self.playObj.volume()
    #音量减
    def lowervolPlay(self):
        self.playObj.setVolume(self.playObj.volume()-10)
        self.currentVolume = self.playObj.volume()

    #静音
    def mutePlay(self):
        if self.playObj.isMuted():
            self.playObj.setMuted(False)
        else:
            self.playObj.setMuted(True)
    #volume

    #跟据v找K
    def searchID(self,v):
        for index, item in enumerate(self.randomList):
            if item ==v:
                return index
        return 0

    #解析文件中是否有id3v2
    def id3v2(self,headData):
        if str(headData[:3],encoding=("utf-8")) != "ID3":
            return False
        return True

    #解析文件中的歌词与图片
    def resolve(self,data):
        tagName =  str(data[:4],encoding=("utf-8"))
        size = data[4:8]
        #sizeS = size[0]*0x1000000 + size[1]*0x10000 + size[2]*0x100 + size[3]
        sizeS=int.from_bytes(size, byteorder='big')
        flags = data[8:10]
        tagContent = data[10:sizeS+10]

        if tagName=="TEXT":#歌词
            #print("歌词")
            condingType=int.from_bytes(tagContent[:1], byteorder='big')
            if condingType == 0:#0代表字符使用ISO-8859-1编码方式;
                try:
                    content = str(tagContent[1:],encoding="gbk")
                except:
                    content =""
            elif condingType == 1:#1代表字符使用UTF-16编码方式;
                try:
                    content = str(tagContent[1:],encoding="UTF-16")
                except:
                    content =""
            elif condingType == 2:#2代表字符使用 UTF-16BE编码方式;
                content =""
            elif condingType == 3:#3代表字符使用UTF-8编码方式。
                try:
                    content = str(tagContent[1:],encoding="UTF-8")
                except:
                    content =""
            if content!="":
                temp={}
                self.songTextKey=[]
                contentSplit = content.splitlines()
                for k in range(len(contentSplit)):
                    if contentSplit[k][1].isdigit():
                        xxx = contentSplit[k].split("]")
                        tempKey = "%d" %(int(xxx[0][1:3])*60 +int(xxx[0][4:6]) )
                        temp[str(tempKey)] = xxx[1]
                        self.songTextKey.append(tempKey)
                    else:
                        endKey = contentSplit[k].find("]",0)
                        self.songTextKey.append(k)
                        temp[str(k)] = contentSplit[k][1:endKey]
                self.songText = temp
            else:
                self.songText = {}
        elif tagName=="APIC":#图片
            #print("图片")
            self.currentImg = tagContent[17:]
        return data[10+sizeS:]
import sys
from PyQt5.QtWidgets import QApplication
from PyQt5.QtMultimedia import QMediaPlayer, QMediaContent
from PyQt5.QtCore import QUrl

if __name__ == '__main__':
    app = QApplication(sys.argv)
    path = '/home/zetta/音乐/周柏豪._.哦.mp3'
    mediaContent = QMediaContent(QUrl.fromLocalFile(path))
    player = QMediaPlayer()
    player.setMedia(mediaContent)
    player.play()
    sys.exit(app.exec_())
class AudioPlayer(QObject):

    songPositionChanged = pyqtSignal(int)
    songDurationChanged = pyqtSignal(int)
    stateChanged = pyqtSignal(int)
    playlistChanged = pyqtSignal(QMediaPlaylist, int)

    currentSongChanged = pyqtSignal(str, str, bytes)
    currentSelectionChanged = pyqtSignal(UUID, int)

    customPlaylistCreated = pyqtSignal(UUID, str)
    libraryPlaylistCreated = pyqtSignal(UUID)

    addedToLibraryPlaylist = pyqtSignal(UUID, list)
    addedToCustomPlaylist = pyqtSignal(UUID, list)

    updatedLibraryPlaylist = pyqtSignal(UUID, list)

    playlistRemoved = pyqtSignal(UUID)

    def __init__(self, volumeLevel=40, playbackMode=QMediaPlaylist.Sequential,
                 parent=None):
        super(AudioPlayer, self).__init__(parent)

        self.__player = QMediaPlayer()
        self.__player.setVolume(volumeLevel)

        self.__player.currentMediaChanged.connect(self._onMediaChanged)
        self.__player.stateChanged.connect(
            lambda state: self.stateChanged.emit(int(state)))
        self.__player.positionChanged.connect(
            lambda x: self.songPositionChanged.emit(x))
        self.__player.durationChanged.connect(
            lambda x: self.songDurationChanged.emit(x))

        self.__playlistManager = PlaylistManger()

        self.__playlistManager.customPlaylistCreated.connect(
            lambda uuid, name: self.customPlaylistCreated.emit(uuid, name))
        self.__playlistManager.libraryPlaylistCreated.connect(
            lambda p: self.libraryPlaylistCreated.emit(p))
        
        self.__playlistManager.currentPlaylistChanged.connect(
            self._onChangedPlaylist)
        self.__playlistManager.currentPlaylistChanged.connect(
            lambda p, i: self.playlistChanged.emit(p, i))

        self.__playlistManager.playlistRemoved.connect(
            lambda uuid: self.playlistRemoved.emit(uuid))

        self.__playlistManager.addedToLibraryPlaylist.connect(
            lambda uuid, l: self.addedToLibraryPlaylist.emit(uuid, l))
        self.__playlistManager.addedToCustomPlaylist.connect(
            lambda uuid, l: self.addedToCustomPlaylist.emit(uuid, l))

        self.__playlistManager.updatedLibraryPlaylist.connect(
            lambda uuid, l: self.updatedLibraryPlaylist.emit(uuid, l))

    def createCustomPlaylist(self, name=None, urls=None):
        self.__playlistManager.createCustomPlaylist(name, urls)

    def createLibraryPlaylist(self, urls=None):
        self.__playlistManager.createLibraryPlaylist(urls)

    def addToLibraryPlaylist(self, url=None):
        self.__playlistManager.addToLibraryPlaylist(url)

    def updateLibraryPlaylist(self, url=None):
        self.__playlistManager.updateLibraryPlaylist(url)

    def renamePlaylist(self, uuid, newName):
        self.__playlistManager.renamePlaylist(uuid, newName)

    def addSongsToCustomPlaylist(self, uuid, urls=[]):
        self.__playlistManager.addSongsToCustomPlaylist(uuid, urls)

    def removeSong(self, uuid, row):
        self.__playlistManager.removeSong(uuid, row)

    def setPlaylist(self, uuid, index=0):
        if (self.__player.playlist() and
                self.__playlistManager.isCurrentPlaylist(uuid)):
            if index == self.__player.playlist().currentIndex():
                if self.__player.state() == QMediaPlayer.PlayingState:
                    self.__player.pause()
                else:
                    self.__player.play()
            else:
                self.__player.playlist().setCurrentIndex(index)
        else:
            self.__playlistManager.setPlaylist(uuid, index)

    def hasLibraryPlaylist(self):
        return self.__playlistManager.hasLibraryPlaylist()

    def removePlaylist(self, uuid):
        self.__playlistManager.removePlaylist(uuid)

    def getCurrentPlaylist(self):
        self.__playlistManager.getCurrentPlaylist()

    def getCurrentQMediaPlaylist(self):
        self.__player.playlist()

    def isPlayerAvailable(self):
        return self.__player.isAvailable()

    def getDuration(self):
        return self.__player.duration()

    def getPlayer(self):
        return self.__player

    def getState(self):
        return self.__player.state()

    def play(self):
        if self.__player.playlist():
            self.__player.play()

    def pause(self):
        if self.__player.playlist():
            self.__player.pause()

    def stop(self):
        if self.__player.playlist():
            self.__player.stop()

    def previousEnhanced(self, sameSongMillis):
        if self.__player.position() <= sameSongMillis:
            self.previous()
        else:
            self.__player.setPosition(0)

    def previous(self):
        if self.__player.playlist():
            self.__player.playlist().previous()

    def next(self):
        if self.__player.playlist():
            self.__player.playlist().next()

    def setVolume(self, value):
        self.__player.setVolume(value)

    def setPosition(self, milliseconds):
        self.__player.setPosition(milliseconds)

    def playlistCurrentIndex(self):
        if self.__player.playlist():
            return self.__player.playlist().currentIndex()

    def setCurrentPlaylistIndex(self, index):
        if self.__player.playlist():
            self.__player.playlist().setCurrentIndex(index)

    def _onChangedPlaylist(self, playlist, index, playIt=False):
        self.__player.setPlaylist(playlist)
        if playlist:
            playlist.setCurrentIndex(index)
        if playIt:
            self.play()

    def _onMediaChanged(self, media):
        if media.isNull() and self.__player.playlist():
            self.__player.playlist().setCurrentIndex(0)
            media = self.__player.playlist().media(0)
        if media.isNull():
            return

        title, artist, cover = self.__playlistManager.getBasicSongInfo(media)

        self.currentSongChanged.emit(title, artist, cover)

        uuid = self.__playlistManager.getCurrentPlaylistUuid()
        index = self.__playlistManager.getCurrentSongIndex()
        self.currentSelectionChanged.emit(uuid, index)

    # def saveSettings(self):
    #     # settings = QSettings(QSettings.IniFormat, QSettings.UserScope,
    #     #                      QCoreApplication.organizationName(),
    #     #                      QCoreApplication.applicationName())

    #     # settings.beginGroup("music_player")

    #     # # if self.__playlistManager.getLibraryPlaylist():
    #     # #     libraryDirectories = self.__playlistManager.getLibraryPlaylist().getDirectories()
    #     # #     settings.beginWriteArray('library_playlist',
    #     # #                              len(libraryDirectories))
    #     # #     for index, value in enumerate(libraryDirectories):
    #     # #         settings.setArrayIndex(index)
    #     # #         settings.setValue("url", value)
    #     # #     settings.endArray()

    #     # customPlaylists = self.__playlistManager.getCustomPlaylists()
    #     # settings.beginWriteArray('custom_playlists',
    #     #                          len(customPlaylists))
    #     # for index, value in enumerate(customPlaylists):
    #     #     settings.setArrayIndex(index)
    #     #     playlistName = settings.value('name', value.getName())
    #     #     playlistUrls = value.getAddedSongUrls()
    #     #     settings.beginWriteArray(playlistName,
    #     #                              len(playlistUrls))
    #     #     for i, v in enumerate(playlistUrls):
    #     #         settings.setArrayIndex(i)
    #     #         settings.setValue("url", v)
    #     #     settings.endArray()
    #     # settings.endArray()

    #     # settings.endGroup()
    #     # if self.__playlistManager.getLibraryPlaylist():
    #     #     libraryDirectories = self.__playlistManager.getLibraryPlaylist().getDirectories()
    #     #     settings.beginWriteArray('library_playlist',
    #     #                              len(libraryDirectories))
    #     #     for index, value in enumerate(libraryDirectories):
    #     #         settings.setArrayIndex(index)
    #     #         settings.setValue("url", value)
    #     #     settings.endArray()

    #     customPlaylists = self.__playlistManager.getCustomPlaylists()
    #     for playlist in customPlaylists:
    #         playlistName = playlist.getName()
    #         for url in playlist:
    #             pass

    # def restoreSettings(self):
    #     settings = QSettings(QSettings.IniFormat, QSettings.UserScope,
    #                          QCoreApplication.organizationName(),
    #                          QCoreApplication.applicationName())

    #     settings.beginGroup("music_player")

    #     # size = settings.beginReadArray('library_playlist')
    #     # libraryDirectories = []
    #     # for i in range(size):
    #     #     settings.setArrayIndex(i)
    #     #     libraryDirectories.append(settings.value("url"))
    #     # settings.endArray()

    #     customPlaylists = {}
    #     size = settings.beginReadArray('custom_playlists')
    #     for i in range(size):
    #         urls = []
    #         settings.setArrayIndex(i)
    #         playlistName = settings.value('name')
    #         print(playlistName)
    #         size2 = settings.beginReadArray(playlistName)
    #         for j in range(size2):
    #             settings.setArrayIndex(j)
    #             url = settings.value("url")
    #             urls.append(url)
    #         settings.endArray()
    #         customPlaylists[playlistName] = urls
    #     settings.endArray()

    #     settings.endGroup()

    #     print('-------')
    #     print(customPlaylists)





        # settings = QSettings(QCoreApplication.organizationName(),
        #                      QCoreApplication.applicationName())
        # settings.beginGroup("music_player")

        # size = settings.beginReadArray('library_playlist')
        # if not size == 0:
        #     for i in range(0, size):
        #         settings.setArrayIndex(i)
        #         url = settings.value("url")
        # settings.endArray()

        # if url:
        #     from audio.playlist_models import DirectoryPlaylist

        #     playlist = DirectoryPlaylist()
        #     playlist.add_directory(url)
        #     self.addAndSetPlaylist(playlist, 2)

        # settings.endGroup()
        pass
Beispiel #46
0
class Player(Qt.QWidget):
    """docstring for Player"""
    fullScreenChanged = Qt.pyqtSignal(bool)

    def __init__(self, playlist, parent=None):
        # create player
        super(Player, self).__init__(parent)

        self.trackInfo = ''
        self.statusInfo = ''
        self.duration = 0

        # create player object
        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist()
        self.name = 'Current playlist'
        self.player.setPlaylist(self.playlist)

        self.player.durationChanged.connect(self.durationChanged)
        self.player.positionChanged.connect(self.positionChanged)
        self.player.metaDataChanged.connect(self.metaDataChanged)
        self.playlist.currentIndexChanged.connect(self.playlistPositionChanged)

        self.player.mediaStatusChanged.connect(self.statusChanged)
        self.player.bufferStatusChanged.connect(self.bufferingProgress)
        # self.player.videoAvailableChanged.connect(self.videoAvailableChanged)
        self.player.error.connect(self.displayErrorMessage)

        # connect with VideoWidget
        # self.videoWidget = VideoWidget()
        # self.player.setVideoOutput(self.videoWidget)

        # connect with PlaylistModel
        self.playlistModel = PlaylistModel()
        self.playlistModel.setPlaylist(self.playlist)

        self.playlistView = Qt.QListView()
        self.playlistView.setModel(self.playlistModel)
        self.playlistView.setCurrentIndex(self.playlistModel.index(
            self.playlist.currentIndex(), 0))

        # change to next song
        self.playlistView.activated.connect(self.jump)

        self.slider = Qt.QSlider(QtCore.Qt.Horizontal)
        self.slider.setRange(0, self.player.duration() / 1000)

        self.labelDuration = Qt.QLabel()
        self.slider.sliderMoved.connect(self.seek)

        # create histogram
        self.labelHistogram = Qt.QLabel()
        self.labelHistogram.setText('Histogram: ')
        self.histogram = HistogramWidget()
        histogramLayout = Qt.QHBoxLayout()
        histogramLayout.addWidget(self.labelHistogram)
        histogramLayout.addWidget(self.histogram, 1)

        # create videoProbe
        self.videoProbe = Qt.QVideoProbe()
        self.videoProbe.videoFrameProbed.connect(self.histogram.processFrame)
        self.videoProbe.setSource(self.player)

        # add control
        controls = Controllers()
        controls.setState(self.player.state())
        controls.setVolume(self.player.volume())
        controls.setMuted(controls.isMuted())

        # connect player's controls with Controllers
        controls.play.connect(self.player.play)
        controls.pause.connect(self.player.pause)
        controls.stop.connect(self.player.stop)
        controls.next.connect(self.playlist.next)
        controls.previous.connect(self.previousAction)
        controls.changeVolume.connect(self.player.setVolume)
        controls.changeMuting.connect(self.player.setMuted)
        # setPlaybackRate is from QMediaPlayer
        controls.changeSpeed.connect(self.player.setPlaybackRate)
        # controls.stop.connect(self.videoWidget.update)

        self.player.stateChanged.connect(controls.setState)
        self.player.volumeChanged.connect(controls.setVolume)
        self.player.mutedChanged.connect(controls.setMuted)

        # create fullScreenButton
        # self.fullScreenButton = Qt.QPushButton('FullScreen')
        # self.fullScreenButton.setCheckable(True)

        # displayLayout
        displayLayout = Qt.QHBoxLayout()
        # displayLayout.addWidget(self.videoWidget, 2)
        displayLayout.addWidget(self.playlistView)

        # controlLayout
        controlLayout = Qt.QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        # connect controlLayout with controls
        controlLayout.addWidget(controls)
        controlLayout.addStretch(1)
        # connect controlLayout with fullScreenButton
        # controlLayout.addWidget(self.fullScreenButton)

        # visualize player
        layout = Qt.QVBoxLayout()
        layout.addLayout(displayLayout)

        # layout for sliding song playing
        hLayout = Qt.QHBoxLayout()
        hLayout.addWidget(self.slider)
        hLayout.addWidget(self.labelDuration)

        layout.addLayout(hLayout)
        layout.addLayout(controlLayout)
        layout.addLayout(histogramLayout)

        # set icon
        self.setWindowIcon(Qt.QIcon('favicon.ico'))

        # create menus
        toolBar = Qt.QToolBar()

        # create basic actions
        self.createActions()

        # create simple button to repeat song
        self.repeatButton = Qt.QToolButton()
        self.repeatButton.setDefaultAction(self.repeatAct)

        # create playOnceButton
        self.playOnceButton = Qt.QToolButton()
        self.playOnceButton.setDefaultAction(self.playOnceAct)
        self.playOnceButton.setEnabled(False)

        # create shuffleButton
        self.shuffleButton = Qt.QToolButton()
        self.shuffleButton.setDefaultAction(self.shuffleAct)

        # create sequentialButton
        self.sequentialButton = Qt.QToolButton()
        self.sequentialButton.setDefaultAction(self.sequentialAct)

        # create fileButton for fileMenu
        fileButton = Qt.QToolButton()
        fileButton.setText('File')
        fileButton.setPopupMode(Qt.QToolButton.MenuButtonPopup)
        fileButton.setMenu(self.popFileMenu())

        # create editButton for editMenu
        closeButton = Qt.QToolButton()
        closeButton.setText('Edit')
        closeButton.setDefaultAction(self.fileCloseAct)

        # display in toolBar these buttons
        toolBar.addWidget(self.repeatButton)
        toolBar.addWidget(self.playOnceButton)
        toolBar.addWidget(self.shuffleButton)
        toolBar.addWidget(self.sequentialButton)
        toolBar.addWidget(fileButton)
        toolBar.addWidget(closeButton)

        # add toolBar to layout of the player
        layout.addWidget(toolBar)
        layout.addWidget(Qt.QGroupBox())

        self.setWindowTitle("Python Music Player")
        self.setLayout(layout)

        if not self.player.isAvailable():
            Qt.QMessageBox(self, 'Unavailable service')
            # self.displayErrorMessage()
            controls.setEnabled(False)
            self.playlistView.setEnabled(False)
            self.fullScreenButton.setEnabled(False)

        self.metaDataChanged()

        self.addToPlaylist(playlist)

    # create fileMenu
    def popFileMenu(self):
        aMenu = Qt.QMenu(self)
        aMenu.addAction(self.fileOpenAct)
        aMenu.addAction(self.fileCloseAct)
        return aMenu

    def createActions(self):
        self.repeatAct = Qt.QAction('Repeat', self, triggered=self.repeatSong)
        self.playOnceAct = Qt.QAction(
            'Play once', self, triggered=self.playOnceSong)
        self.shuffleAct = Qt.QAction(
            'Shuffle', self, triggered=self.playlist.shuffle)
        self.sequentialAct = Qt.QAction(
            'Sequential', self, triggered=self.playSequential)
        self.fileOpenAct = Qt.QAction('Open', self, triggered=self.open)
        self.fileOpenAct.setShortcut('Ctrl+O')

        self.fileCloseAct = Qt.QAction('Close', self, triggered=self.close)
        self.fileCloseAct.setShortcut('Ctrl+Q')

    def repeatSong(self):
        self.playlist.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
        self.repeatButton.setEnabled(False)
        self.playOnceButton.setEnabled(True)

    def playOnceSong(self):
        self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)
        self.playOnceButton.setEnabled(False)
        self.repeatButton.setEnabled(True)

    # unproperly used
    def playSequential(self):
        self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)

    # get and display song duration
    def durationChanged(self, duration):
        duration /= 1000

        self.duration = duration
        self.slider.setMaximum(duration)

    # change slider position
    def positionChanged(self, progress):
        progress /= 1000

        if not self.slider.isSliderDown():
            self.slider.setValue(progress)

        self.updateDurationInfo(progress)

    def updateDurationInfo(self, currentInfo):
        duration = self.duration
        if currentInfo or duration:
            currentTime = QtCore.QTime(
                (currentInfo / 3600) % 60,  # hours
                (currentInfo / 60) % 60,  # minutes
                currentInfo % 60,  # seconds
                (currentInfo * 1000) % 1000)  # miliseconds
            totalTime = QtCore.QTime(
                (duration / 3600) % 60,  # hours
                (duration / 60) % 60,  # minutes
                duration % 60,  # seconds
                (duration * 1000) % 1000)  # miliseconds
            formating = 'hh:mm:ss' if duration > 3600 else 'mm:ss'
            toString = (currentTime.toString(formating) + ' / ' +
                        totalTime.toString(formating))
        else:
            toString = ''

        self.labelDuration.setText(toString)

    def metaDataChanged(self):
        if self.player.isMetaDataAvailable():
            self.setTrackInfo('{0} - {1}'.format(
                self.player.metaData(Qt.QMediaMetaData.AlbumArtist),
                self.player.metaData(Qt.QMediaMetaData.Title)))

    def setTrackInfo(self, info):
        self.trackInfo = info

        if self.statusInfo:
            self.setWindowTitle('{0} | {1}'.format(
                self.trackInfo, self.statusInfo))
        else:
            self.setWindowTitle(self.trackInfo)

    def playlistPositionChanged(self, position):
        self.playlistView.setCurrentIndex(
            self.playlistModel.index(position, 0))

    def statusChanged(self, status):
        self.handleCursor(status)

        if status == QMediaPlayer.LoadingMedia:
            self.setStatusInfo('Loading...')
        elif status == QMediaPlayer.StalledMedia:
            self.setStatusInfo('Media Stalled')
        elif status == QMediaPlayer.EndOfMedia:
            Qt.QApplication.alert(self)
        elif status == QMediaPlayer.InvalidMedia:
            self.displayErrorMessage()
        else:
            self.setStatusInfo('')

    def handleCursor(self, status):
        if status in [QMediaPlayer.LoadingMedia, QMediaPlayer.BufferingMedia,
                      QMediaPlayer.StalledMedia]:
            self.setCursor(QtCore.Qt.BusyCursor)
        else:
            self.unsetCursor()

    def setStatusInfo(self, info):
        self.statusInfo = info

        if self.statusInfo:
            self.setWindowTitle('{0} | {1}'.format(
                self.trackInfo, self.statusInfo))
        else:
            self.setWindowTitle(self.trackInfo)

    def bufferingProgress(self, progress):
        self.setStatusInfo('Buffering {0}'.format(progress))

    def displayErrorMessage(self):
        self.statusInfo(self.player.errorString())

    def jump(self, index):
        if index.isValid():
            self.playlist.setCurrentIndex(index.row())
            self.player.play()

    def seek(self, seconds):
        self.player.setPosition(seconds * 1000)

    def previousAction(self):
        self.playlist.previous()

    def close(self):
        choice = Qt.QMessageBox.question(
            self,
            'Close',
            'Close the app?',
            Qt.QMessageBox.Yes | Qt.QMessageBox.No)

        if choice == Qt.QMessageBox.Yes:
            sys.exit()

    def open(self):
        names, _ = Qt.QFileDialog.getOpenFileNames(self, 'Open Files')
        # ['/home/milka/Documents/MusicPlayer/song.mp3']
        self.addToPlaylist(names)

    def addToPlaylist(self, names):
        for name in names:
            fileInfo = Qt.QFileInfo(name)
            if fileInfo.exists():
                url = QtCore.QUrl.fromLocalFile(fileInfo.absoluteFilePath())

                # save_to_db song url
                create_song(
                    url.path(), self.duration, playlist_name=self.name)

                if fileInfo.suffix().lower() == 'm3u':
                    self.playlist.load(url)
                else:
                    self.playlist.addMedia(Qt.QMediaContent(url))
            else:
                url = QtCore.QUrl(name)
                if url.isValid():
                    self.playlist.addMedia(Qt.QMediaContent(url))
Beispiel #47
0
class Ui_MainWindow(QWidget):
    def __init__(self, feature=feature):
        super().__init__()
        self.feature = feature
        self.points_CAM1 = []
        self.points_CAM2 = []
        self.points_CAM3 = []
        self.numWarning = 0

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(1048, 375)
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.tabWidget = QtWidgets.QTabWidget(Form)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")

        # View CAM 1
        self.gridLayout = QtWidgets.QGridLayout(self.tab)
        self.gridLayout.setHorizontalSpacing(20)
        self.gridLayout.setObjectName("gridLayout")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setSpacing(10)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.CAM1 = QtWidgets.QLabel(self.tab)
        self.CAM1.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM1.setMaximumSize(QtCore.QSize(426, 400))
        self.CAM1.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM1.setObjectName("CAM1")
        self.verticalLayout_3.addWidget(self.CAM1)
        self.horizontalLayout_6 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")
        self.startCAM1 = QtWidgets.QPushButton(self.tab)
        self.startCAM1.setObjectName("startCAM1")
        self.horizontalLayout_6.addWidget(self.startCAM1)
        self.carProtectionCAM1 = QtWidgets.QPushButton(self.tab)
        self.carProtectionCAM1.setObjectName("carProtectionCAM1")
        self.horizontalLayout_6.addWidget(self.carProtectionCAM1)
        self.monitorAreaCAM1 = QtWidgets.QPushButton(self.tab)
        self.monitorAreaCAM1.setObjectName("monitorAreaCAM1")
        self.horizontalLayout_6.addWidget(self.monitorAreaCAM1)
        self.verticalLayout_3.addLayout(self.horizontalLayout_6)
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        self.stopCAM1 = QtWidgets.QPushButton(self.tab)
        self.stopCAM1.setEnabled(False)
        self.stopCAM1.setObjectName("stopCAM1")
        self.horizontalLayout_7.addWidget(self.stopCAM1)
        self.personSearchingCAM1 = QtWidgets.QPushButton(self.tab)
        self.personSearchingCAM1.setObjectName("personSearchingCAM1")
        self.horizontalLayout_7.addWidget(self.personSearchingCAM1)
        self.illegalCAM1 = QtWidgets.QPushButton(self.tab)
        self.illegalCAM1.setObjectName("illegalCAM1")
        self.horizontalLayout_7.addWidget(self.illegalCAM1)
        self.verticalLayout_3.addLayout(self.horizontalLayout_7)
        self.gridLayout.addLayout(self.verticalLayout_3, 0, 0, 1, 1)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setSpacing(10)
        self.verticalLayout.setObjectName("verticalLayout")

        # View CAM 2
        self.CAM2 = QtWidgets.QLabel(self.tab)
        self.CAM2.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM2.setMaximumSize(QtCore.QSize(426, 400))
        self.CAM2.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM2.setObjectName("CAM2")
        self.verticalLayout.addWidget(self.CAM2)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.startCAM2 = QtWidgets.QPushButton(self.tab)
        self.startCAM2.setObjectName("startCAM2")
        self.horizontalLayout_2.addWidget(self.startCAM2)
        self.carProtectionCAM2 = QtWidgets.QPushButton(self.tab)
        self.carProtectionCAM2.setObjectName("carProtectionCAM2")
        self.horizontalLayout_2.addWidget(self.carProtectionCAM2)
        self.monitorAreaCAM2 = QtWidgets.QPushButton(self.tab)
        self.monitorAreaCAM2.setObjectName("monitorAreaCAM2")
        self.horizontalLayout_2.addWidget(self.monitorAreaCAM2)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.stopCAM2 = QtWidgets.QPushButton(self.tab)
        self.stopCAM2.setEnabled(False)
        self.stopCAM2.setObjectName("stopCAM2")
        self.horizontalLayout_3.addWidget(self.stopCAM2)
        self.personSearchingCAM2 = QtWidgets.QPushButton(self.tab)
        self.personSearchingCAM2.setObjectName("personSearchingCAM2")
        self.horizontalLayout_3.addWidget(self.personSearchingCAM2)
        self.illegalCAM2 = QtWidgets.QPushButton(self.tab)
        self.illegalCAM2.setObjectName("illegalCAM2")
        self.horizontalLayout_3.addWidget(self.illegalCAM2)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.gridLayout.addLayout(self.verticalLayout, 0, 1, 1, 1)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setSpacing(10)
        self.verticalLayout_2.setObjectName("verticalLayout_2")

        # View CAM 3
        self.CAM3 = QtWidgets.QLabel(self.tab)
        self.CAM3.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM3.setMaximumSize(QtCore.QSize(426, 400))
        self.CAM3.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM3.setObjectName("CAM3")
        self.verticalLayout_2.addWidget(self.CAM3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.startCAM3 = QtWidgets.QPushButton(self.tab)
        self.startCAM3.setObjectName("startCAM3")
        self.horizontalLayout_4.addWidget(self.startCAM3)
        self.carProtectionCAM3 = QtWidgets.QPushButton(self.tab)
        self.carProtectionCAM3.setObjectName("carProtectionCAM3")
        self.horizontalLayout_4.addWidget(self.carProtectionCAM3)
        self.monitorAreaCAM3 = QtWidgets.QPushButton(self.tab)
        self.monitorAreaCAM3.setObjectName("monitorAreaCAM3")
        self.horizontalLayout_4.addWidget(self.monitorAreaCAM3)
        self.verticalLayout_2.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.stopCAM3 = QtWidgets.QPushButton(self.tab)
        self.stopCAM3.setEnabled(False)
        self.stopCAM3.setObjectName("stopCAM3")
        self.horizontalLayout_5.addWidget(self.stopCAM3)
        self.personSearchingCAM3 = QtWidgets.QPushButton(self.tab)
        self.personSearchingCAM3.setObjectName("personSearchingCAM3")
        self.horizontalLayout_5.addWidget(self.personSearchingCAM3)
        self.illegalCAM3 = QtWidgets.QPushButton(self.tab)
        self.illegalCAM3.setObjectName("illegalCAM3")
        self.horizontalLayout_5.addWidget(self.illegalCAM3)
        self.verticalLayout_2.addLayout(self.horizontalLayout_5)
        self.gridLayout.addLayout(self.verticalLayout_2, 0, 2, 1, 1)
        self.tabWidget.addTab(self.tab, "")

        # Media Tab
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.tabWidget.addTab(self.tab_2, "")

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        videowidget = QVideoWidget()
        self.openBtn = QtWidgets.QPushButton('Open Video')
        self.playBtn = QtWidgets.QPushButton()
        self.playBtn.setEnabled(False)
        self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.stopBtn = QtWidgets.QPushButton()
        self.stopBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.slowBtn = QtWidgets.QPushButton()
        self.slowBtn.setIcon(self.style().standardIcon(
            QStyle.SP_MediaSeekBackward))
        self.fastBtn = QtWidgets.QPushButton()
        self.fastBtn.setIcon(self.style().standardIcon(
            QStyle.SP_MediaSeekForward))
        self.volumeBtn = QtWidgets.QPushButton()
        self.volumeBtn.setIcon(self.style().standardIcon(
            QStyle.SP_MediaVolume))
        self.fullscreenBtn = QPushButton("Full Screen")
        self.slider = QSlider(Qt.Horizontal)
        self.slider.setRange(0, 0)
        self.volume_slider = QSlider(Qt.Horizontal)
        self.volume_slider.setRange(0, 100)
        self.volume_slider.setValue(100)
        self.label_2_1 = QLabel()
        self.label_2_1.setSizePolicy(QSizePolicy.Preferred,
                                     QSizePolicy.Maximum)
        self.label_2_2 = QLabel()
        hboxLayout_2_1 = QHBoxLayout()
        hboxLayout_2_2 = QHBoxLayout()
        hboxLayout_2_3 = QHBoxLayout()
        hboxLayout_2_1.addWidget(self.slider)
        hboxLayout_2_2.addWidget(self.openBtn)
        hboxLayout_2_2.addWidget(self.stopBtn)
        hboxLayout_2_2.addWidget(self.slowBtn)
        hboxLayout_2_2.addWidget(self.playBtn)
        hboxLayout_2_2.addWidget(self.fastBtn)
        hboxLayout_2_2.addWidget(self.volumeBtn)
        hboxLayout_2_2.addWidget(self.volume_slider)
        hboxLayout_2_2.addStretch(1)
        hboxLayout_2_2.addWidget(self.fullscreenBtn)
        hboxLayout_2_3.addWidget(videowidget)
        vboxLayout_2_1 = QVBoxLayout()
        vboxLayout_2_1.addLayout(hboxLayout_2_3)
        vboxLayout_2_1.addLayout(hboxLayout_2_1)
        vboxLayout_2_1.addLayout(hboxLayout_2_2)
        vboxLayout_2_1.addWidget(self.label_2_1)
        self.tab_2.setLayout(vboxLayout_2_1)

        # Setting CAM 1
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.gridLayout_2 = QtWidgets.QGridLayout(self.tab_3)
        self.gridLayout_2.setHorizontalSpacing(20)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
        self.verticalLayout_5.setSpacing(10)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.CAM1_draw = QtWidgets.QLabel(self.tab_3)
        self.CAM1_draw.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM1_draw.setMaximumSize(QtCore.QSize(426, 400))
        self.CAM1_draw.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM1_draw.setObjectName("CAM1_draw")
        self.verticalLayout_5.addWidget(self.CAM1_draw)
        self.horizontalLayout_8 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")
        self.drawCAM1 = QtWidgets.QPushButton(self.tab_3)
        self.drawCAM1.setObjectName("drawCAM1")
        self.horizontalLayout_8.addWidget(self.drawCAM1)
        self.removeCAM1 = QtWidgets.QPushButton(self.tab_3)
        self.removeCAM1.setObjectName("removeCAM1")
        self.horizontalLayout_8.addWidget(self.removeCAM1)
        self.verticalLayout_5.addLayout(self.horizontalLayout_8)
        self.gridLayout_2.addLayout(self.verticalLayout_5, 0, 0, 1, 1)
        self.verticalLayout_6 = QtWidgets.QVBoxLayout()
        self.verticalLayout_6.setSpacing(10)
        self.verticalLayout_6.setObjectName("verticalLayout_6")

        # Setting CAM 2
        self.CAM2_draw = QtWidgets.QLabel(self.tab_3)
        self.CAM2_draw.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM2_draw.setMaximumSize(QtCore.QSize(426, 400))
        self.CAM2_draw.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM2_draw.setObjectName("CAM2_draw")
        self.verticalLayout_6.addWidget(self.CAM2_draw)
        self.horizontalLayout_10 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_10.setObjectName("horizontalLayout_10")
        self.drawCAM2 = QtWidgets.QPushButton(self.tab_3)
        self.drawCAM2.setObjectName("drawCAM2")
        self.horizontalLayout_10.addWidget(self.drawCAM2)
        self.removeCAM2 = QtWidgets.QPushButton(self.tab_3)
        self.removeCAM2.setObjectName("removeCAM2")
        self.horizontalLayout_10.addWidget(self.removeCAM2)
        self.verticalLayout_6.addLayout(self.horizontalLayout_10)
        self.gridLayout_2.addLayout(self.verticalLayout_6, 0, 1, 1, 1)
        self.verticalLayout_7 = QtWidgets.QVBoxLayout()
        self.verticalLayout_7.setSpacing(10)
        self.verticalLayout_7.setObjectName("verticalLayout_7")

        # Setting CAM 3
        self.CAM3_draw = QtWidgets.QLabel(self.tab_3)
        self.CAM3_draw.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM3_draw.setMaximumSize(QtCore.QSize(426, 400))
        self.CAM3_draw.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM3_draw.setObjectName("CAM3_draw")
        self.verticalLayout_7.addWidget(self.CAM3_draw)
        self.horizontalLayout_12 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_12.setObjectName("horizontalLayout_12")
        self.drawCAM3 = QtWidgets.QPushButton(self.tab_3)
        self.drawCAM3.setObjectName("drawCAM3")
        self.horizontalLayout_12.addWidget(self.drawCAM3)
        self.removeCAM3 = QtWidgets.QPushButton(self.tab_3)
        self.removeCAM3.setObjectName("removeCAM3")
        self.horizontalLayout_12.addWidget(self.removeCAM3)
        self.verticalLayout_7.addLayout(self.horizontalLayout_12)
        self.gridLayout_2.addLayout(self.verticalLayout_7, 0, 2, 1, 1)
        self.tabWidget.addTab(self.tab_3, "")
        self.verticalLayout_4.addWidget(self.tabWidget)

        # Setup Connect
        # Setup enable
        self.removeCAM1.setEnabled(False)
        self.removeCAM2.setEnabled(False)
        self.removeCAM3.setEnabled(False)
        # Setup choosing feature
        self.carProtectionCAM1.setVisible(self.feature['car1'])
        self.carProtectionCAM2.setVisible(self.feature['car2'])
        self.carProtectionCAM3.setVisible(self.feature['car3'])

        self.illegalCAM1.setVisible(self.feature['illegal1'])
        self.illegalCAM2.setVisible(self.feature['illegal2'])
        self.illegalCAM3.setVisible(self.feature['illegal3'])

        self.monitorAreaCAM1.setVisible(self.feature['mpa1'])
        self.monitorAreaCAM1.toggle()
        self.monitorAreaCAM1.setCheckable(True)
        self.monitorAreaCAM2.setVisible(self.feature['mpa2'])
        self.monitorAreaCAM3.setVisible(self.feature['mpa3'])

        self.personSearchingCAM1.setVisible(self.feature['person1'])
        self.personSearchingCAM2.setVisible(self.feature['person2'])
        self.personSearchingCAM3.setVisible(self.feature['person3'])
        # setup media player
        self.mediaPlayer.setVideoOutput(videowidget)
        self.openBtn.clicked.connect(self.open_file)
        self.playBtn.clicked.connect(self.play_video)
        self.stopBtn.clicked.connect(self.stop_video)
        self.fastBtn.clicked.connect(self.fast)
        self.slowBtn.clicked.connect(self.slow)
        self.volumeBtn.clicked.connect(self.mute)
        self.fullscreenBtn.clicked.connect(self.fullscreen)
        self.volume_slider.sliderMoved.connect(self.set_volume)
        self.slider.sliderMoved.connect(self.set_position)

        self.mediaPlayer.stateChanged.connect(self.mediastate_changed)
        self.mediaPlayer.positionChanged.connect(self.position_changed)
        self.mediaPlayer.durationChanged.connect(self.duration_changed)

        # setup image processing
        #  create a timer
        self.timer = QTimer()
        self.timer2 = QTimer()
        self.timer3 = QTimer()
        # set timer timeout callback function
        self.timer.timeout.connect(self.viewCam1)
        self.startCAM1.clicked.connect(self.start_view1)
        self.stopCAM1.clicked.connect(self.stop_view1)

        self.timer2.timeout.connect(self.viewCam2)
        self.startCAM2.clicked.connect(self.start_view2)
        self.stopCAM2.clicked.connect(self.stop_view2)

        self.timer3.timeout.connect(self.viewCam3)
        self.startCAM3.clicked.connect(self.start_view3)
        self.stopCAM3.clicked.connect(self.stop_view3)

        self.CAM1_draw.mousePressEvent = self.mouseEventCAM1
        self.CAM2_draw.mousePressEvent = self.mouseEventCAM2
        self.CAM3_draw.mousePressEvent = self.mouseEventCAM3

        self.drawCAM1.clicked.connect(self.startDrawAreaCAM1)
        self.removeCAM1.clicked.connect(self.removeAreaCAM1)

        self.drawCAM2.clicked.connect(self.startDrawAreaCAM2)
        self.removeCAM2.clicked.connect(self.removeAreaCAM2)

        self.drawCAM3.clicked.connect(self.startDrawAreaCAM3)
        self.removeCAM3.clicked.connect(self.removeAreaCAM3)

        self.retranslateUi(Form)
        self.tabWidget.setCurrentIndex(0)
        QtCore.QMetaObject.connectSlotsByName(Form)
# All function
# Function retranslateUI

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.CAM1.setText(_translate("Form", "IP CAM 1"))
        self.startCAM1.setText(_translate("Form", "Start"))
        self.carProtectionCAM1.setText(_translate("Form", "Car protection"))
        self.monitorAreaCAM1.setText(
            _translate("Form", "Monitor prohibited area"))
        self.stopCAM1.setText(_translate("Form", "Stop"))
        self.personSearchingCAM1.setText(_translate("Form",
                                                    "Person searching"))
        self.illegalCAM1.setText(_translate("Form", "Illegal access action"))
        self.CAM2.setText(_translate("Form", "IP CAM 2"))
        self.startCAM2.setText(_translate("Form", "Start"))
        self.carProtectionCAM2.setText(_translate("Form", "Car protection"))
        self.monitorAreaCAM2.setText(
            _translate("Form", "Monitor prohibited area"))
        self.stopCAM2.setText(_translate("Form", "Stop"))
        self.personSearchingCAM2.setText(_translate("Form",
                                                    "Person searching"))
        self.illegalCAM2.setText(_translate("Form", "Illegal access action"))
        self.CAM3.setText(_translate("Form", "IP CAM 3"))
        self.startCAM3.setText(_translate("Form", "Start"))
        self.carProtectionCAM3.setText(_translate("Form", "Car protection"))
        self.monitorAreaCAM3.setText(
            _translate("Form", "Monitor prohibited area"))
        self.stopCAM3.setText(_translate("Form", "Stop"))
        self.personSearchingCAM3.setText(_translate("Form",
                                                    "Person searching"))
        self.illegalCAM3.setText(_translate("Form", "Illegal access action"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab),
                                  _translate("Form", "3 IP CAMs"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2),
                                  _translate("Form", "PLAY RECORD"))
        self.CAM1_draw.setText(_translate("Form", "TextLabel"))
        self.drawCAM1.setText(_translate("Form", "Draw"))
        self.removeCAM1.setText(_translate("Form", "Clear"))
        self.CAM2_draw.setText(_translate("Form", "TextLabel"))
        self.drawCAM2.setText(_translate("Form", "Draw"))
        self.removeCAM2.setText(_translate("Form", "Clear"))
        self.CAM3_draw.setText(_translate("Form", "TextLabel"))
        self.drawCAM3.setText(_translate("Form", "Draw"))
        self.removeCAM3.setText(_translate("Form", "Clear"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3),
                                  _translate("Form", "SETTING"))
# Function for media player

    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, "Open Video")

        if filename != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(filename)))
            self.playBtn.setEnabled(True)

    def play_video(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def stop_video(self):
        self.mediaPlayer.stop()

    def mediastate_changed(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def position_changed(self, position):
        self.slider.setValue(position)

    def duration_changed(self, duration):
        self.slider.setRange(0, duration)

    def set_position(self, position):
        self.mediaPlayer.setPosition(position)
        print(position)

    def set_volume(self, volume):
        self.mediaPlayer.setVolume(volume)

    def mute(self):
        if not self.mediaPlayer.isMuted():
            self.mediaPlayer.setMuted(True)
            self.volumeBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaVolumeMuted))
        else:
            self.mediaPlayer.setMuted(False)
            self.volumeBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaVolume))

    def handle_errors(self):
        self.playBtn.setEnabled(False)
        self.label.setText("Error: " + self.mediaPlayer.errorString())

        self.startCAM1.clicked.connect(self.start)
        self.stopCAM1.clicked.connect(self.stop)

    def fullscreen(self):
        if self.windowState() & Qt.WindowFullScreen:
            QApplication.setOverrideCursor(Qt.ArrowCursor)
            self.showNormal()
            print("no Fullscreen")
        else:
            Form.showFullScreen()
            QApplication.setOverrideCursor(Qt.BlankCursor)
            print("Fullscreen entered")

    def fast(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() + 10 * 60)

    def slow(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() - 10 * 60)

# Function for image processing

    def image_to_QImage(self, image, label: QLabel):
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        image = cv2.resize(image, (label.width(), label.height()))
        height, width, channel = image.shape
        step = channel * width
        return QImage(image.data, width, height, step, QImage.Format_RGB888)

    def start_view1(self):
        self.stopCAM1.setEnabled(True)
        self.startCAM1.setEnabled(False)
        self.vs1 = VideoStream(src=IP_CAM_ADDRESS['CAM1'])
        self.flag_CAM1 = self.vs1.flag
        if self.vs1.flag:
            self.vs1.start()
            now = datetime.now()
            self.savePath1 = self.createDir('IP_CAM_1')
            self.startTime1 = str(now.day) + ' - ' + str(now.hour) + 'h' + str(
                now.minute) + ' - '
            fourcc = cv2.VideoWriter_fourcc(*'XVID')
            self.outVivdeo = cv2.VideoWriter(
                self.savePath1 + 'output.avi', fourcc, 30,
                (int(self.vs1.stream.get(3)), int(self.vs1.stream.get(4))))
            self.timer.start(20)
        else:
            self.startCAM1.setEnabled(True)
            self.stopCAM1.setEnabled(False)
            image = cv2.imread('no-connection.jpg')
            self.CAM1.setPixmap(
                QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))

    def viewCam1(self):
        image = self.vs1.read()
        self.outVivdeo.write(image)
        self.CAM1.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))
        if self.feature['mpa1'] and self.monitorAreaCAM1.isChecked():
            image, self.numWarning = detectObject(image,
                                                  self.points_CAM1,
                                                  flag_Warning=1,
                                                  numWarning=self.numWarning)
        self.CAM1_draw.setPixmap(
            QPixmap.fromImage(
                self.image_to_QImage(
                    self.drawArea(image, self.points_CAM1, self.CAM1_draw),
                    self.CAM1_draw)))

    def stop_view1(self):
        self.startCAM1.setEnabled(True)
        self.stopCAM1.setEnabled(False)
        self.timer.stop()
        self.vs1.stop()
        image = cv2.imread('stopVideo.png')
        self.CAM1.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))
        now = datetime.now()
        fileName = self.startTime1 + str(now.hour) + 'h' + str(
            now.minute) + '.avi'
        os.rename(self.savePath1 + 'output.avi', self.savePath1 + fileName)

    def start_view2(self):
        self.stopCAM2.setEnabled(True)
        self.startCAM2.setEnabled(False)
        self.vs2 = VideoStream(src=IP_CAM_ADDRESS['CAM2'])
        print('ok')
        if self.vs2.flag:
            self.vs2.start()
            now = datetime.now()
            self.savePath2 = self.createDir('IP_CAM_2')
            self.startTime2 = str(now.day) + ' - ' + str(now.hour) + 'h' + str(
                now.minute) + ' - '
            fourcc = cv2.VideoWriter_fourcc(*'XVID')
            self.outVivdeo2 = cv2.VideoWriter(
                self.savePath2 + 'output2.avi', fourcc, 30,
                (int(self.vs2.stream.get(3)), int(self.vs2.stream.get(4))))
            self.timer2.start(20)
        else:
            self.startCAM2.setEnabled(True)
            self.stopCAM2.setEnabled(False)
            image = cv2.imread('no-connection.jpg')
            self.CAM2.setPixmap(
                QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))

    def viewCam2(self):
        image = self.vs2.read()
        self.outVivdeo2.write(image)
        self.CAM2.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))

    def stop_view2(self):
        self.startCAM2.setEnabled(True)
        self.stopCAM2.setEnabled(False)
        self.timer2.stop()
        self.vs2.stop()
        image = cv2.imread('stopVideo.png')
        self.CAM2.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))
        now = datetime.now()
        fileName = self.startTime2 + str(now.hour) + 'h' + str(
            now.minute) + '.avi'
        os.rename(self.savePath2 + 'output2.avi', self.savePath2 + fileName)

    # def viewCam(self):
    #     # while True:
    #     ret, image = self.cap.read()
    #     self.outVivdeo.write(image)
    #     self.CAM1.setPixmap(QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))
    #     if self.feature['mpa1'] and self.monitorAreaCAM1.isChecked():
    #       image, self.numWarning = detectObject(image, self.points_CAM1, flag_Warning=1, numWarning=self.numWarning)
    #     self.CAM1_draw.setPixmap(QPixmap.fromImage(self.image_to_QImage(self.drawArea(image, self.points_CAM1, self.CAM1_draw), self.CAM1_draw)))

    # def start_view(self):
    #         self.stopCAM1.setEnabled(True)
    #         self.startCAM1.setEnabled(False)
    #         self.cap = cv2.VideoCapture(IP_CAM_ADDRESS['CAM1'])
    #         self.flag_CAM1 = self.cap.isOpened()
    #         if self.cap.isOpened():
    #             now = datetime.now()
    #             self.savePath1 = self.createDir('IP_CAM_1')
    #             self.startTime1 = str(now.day)+' - '+str(now.hour)+'h'+str(now.minute)+ ' - '
    #             fourcc = cv2.VideoWriter_fourcc(*'XVID')
    #             self.outVivdeo = cv2.VideoWriter(self.savePath1+'output.avi', fourcc, 30, (int(self.cap.get(3)), int(self.cap.get(4))))
    #             self.timer.start(0)
    #         else:
    #             self.startCAM1.setEnabled(True)
    #             self.stopCAM1.setEnabled(False)
    #             image = cv2.imread('no-connection.jpg')
    #             self.CAM1.setPixmap(QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))

    # def stop_view(self):
    #     self.startCAM1.setEnabled(True)
    #     self.stopCAM1.setEnabled(False)
    #     self.timer.stop()
    #     self.cap.release()
    #     self.outVivdeo.release()
    #     print("ok")
    #     image = cv2.imread('stopVideo.png')
    #     self.CAM1.setPixmap(QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))
    #     print('ok2')
    #     now = datetime.now()
    #     fileName = self.startTime1+str(now.hour)+'h'+str(now.minute)+'.avi'
    #     os.rename(self.savePath1+'output.avi', self.savePath1+fileName)

    # def viewCam2(self):
    #     ret, image = self.cap2.read()
    #     self.outVivdeo2.write(image)
    #     self.CAM2_draw.setPixmap(QPixmap.fromImage(self.image_to_QImage(self.drawArea(image, self.points_CAM2, self.CAM2_draw), self.CAM2_draw)))
    #     self.CAM2.setPixmap(QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))

    # def start_view2(self):
    #     if not self.timer2.isActive():
    #         self.stopCAM2.setEnabled(True)
    #         self.startCAM2.setEnabled(False)
    #         self.cap2 = cv2.VideoCapture(IP_CAM_ADDRESS['CAM2'])
    #         self.flag_CAM2 = self.cap2.isOpened()
    #         if self.cap2.isOpened():
    #             now = datetime.now()
    #             self.savePath2 = self.createDir('IP_CAM_2')
    #             self.startTime2 = str(now.day)+' - '+str(now.hour)+'h'+str(now.minute)+ ' - '
    #             # fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    #             fourcc = cv2.VideoWriter_fourcc(*'XVID')
    #             self.outVivdeo2 = cv2.VideoWriter(self.savePath2+'output2.avi', fourcc, 30, (int(self.cap2.get(3)), int(self.cap2.get(4))))
    #             self.timer2.start(0)
    #         else:
    #             self.startCAM2.setEnabled(True)
    #             self.stopCAM2.setEnabled(False)
    #             image = cv2.imread('no-connection.jpg')
    #             self.CAM2.setPixmap(QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))

    # def stop_view2(self):
    #     self.startCAM2.setEnabled(True)
    #     self.stopCAM2.setEnabled(False)
    #     self.timer2.stop()
    #     self.outVivdeo2.release()
    #     image = cv2.imread('stopVideo.png')
    #     self.CAM2.setPixmap(QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))
    #     self.cap2.release()
    #     now = datetime.now()
    #     fileName = self.startTime2+str(now.hour)+'h'+str(now.minute)+'.avi'
    #     os.rename(self.savePath2+'output2.avi', self.savePath2+fileName)

    def viewCam3(self):
        ret, image = self.cap3.read()
        self.outVivdeo3.write(image)
        self.CAM3_draw.setPixmap(
            QPixmap.fromImage(
                self.image_to_QImage(
                    self.drawArea(image, self.points_CAM3, self.CAM3_draw),
                    self.CAM3_draw)))
        self.CAM3.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM3)))

    def start_view3(self):
        if not self.timer3.isActive():
            self.stopCAM3.setEnabled(True)
            self.startCAM3.setEnabled(False)
            self.cap3 = cv2.VideoCapture(IP_CAM_ADDRESS['CAM3'])
            self.flag_CAM3 = self.cap3.isOpened()
            if self.cap3.isOpened():
                now = datetime.now()
                self.savePath3 = self.createDir('IP_CAM_3')
                self.startTime3 = str(now.day) + ' - ' + str(
                    now.hour) + 'h' + str(now.minute) + ' - '
                # fourcc = cv2.VideoWriter_fourcc(*'mp4v')
                fourcc = cv2.VideoWriter_fourcc(*'XVID')
                self.outVivdeo3 = cv2.VideoWriter(
                    self.savePath3 + 'output3.avi', fourcc, 30,
                    (int(self.cap3.get(3)), int(self.cap3.get(4))))
                self.timer3.start(0)
            else:
                self.startCAM3.setEnabled(True)
                self.stopCAM3.setEnabled(False)
                image = cv2.imread('no-connection.jpg')
                self.CAM3.setPixmap(
                    QPixmap.fromImage(self.image_to_QImage(image, self.CAM3)))

    def stop_view3(self):
        self.startCAM3.setEnabled(True)
        self.stopCAM3.setEnabled(False)
        self.timer3.stop()
        self.outVivdeo3.release()
        image = cv2.imread('stopVideo.png')
        self.CAM3.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM3)))
        self.cap3.release()
        now = datetime.now()
        fileName = self.startTime3 + str(now.hour) + 'h' + str(
            now.minute) + '.avi'
        os.rename(self.savePath3 + 'output3.avi', self.savePath3 + fileName)

    def createDir(self, IP_CAM_Number: str):
        now = datetime.now()
        year = now.year
        month = MONTH[now.month]

        curPath = os.getcwd()
        if not path.exists(curPath + '/IVA'):
            os.mkdir(curPath + '/IVA')
        if not path.exists(curPath + '/IVA/' + IP_CAM_Number):
            os.mkdir(curPath + '/IVA/' + IP_CAM_Number)

        # check path exists
        if path.exists(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year)):
            if path.exists(curPath + '/IVA/' + IP_CAM_Number + '/' +
                           str(year) + '/' + month):
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'
            else:
                os.mkdir(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year) +
                         '/' + month)
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'
        else:
            os.mkdir(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year))
            if path.exists(curPath + '/IVA/' + IP_CAM_Number + '/' +
                           str(year) + '/' + month):
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'
            else:
                os.mkdir(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year) +
                         '/' + month)
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'

    # Create Mouse Event for draw protected area
    def mouseEventCAM1(self, event):
        if self.removeCAM1.isEnabled() and (
                not self.startCAM1.isEnabled()) and self.flag_CAM1 == True:
            # print(self.CAM1_draw.width(), self.CAM1_draw.height())
            x = event.pos().x()
            y = event.pos().y()
            print(x, y)
            x = round((x / self.CAM1_draw.width()), 10)
            y = round((y / self.CAM1_draw.height()), 10)
            self.points_CAM1.append([x, y])
            print("Position clicked is ({}, {})".format(
                int(x * self.CAM1_draw.width()),
                int(y * self.CAM1_draw.height())))
            # print(self.points_CAM1)

    def mouseEventCAM2(self, event):
        if self.removeCAM2.isEnabled() and (
                not self.startCAM2.isEnabled()) and self.flag_CAM2 == True:
            x = event.pos().x()
            y = event.pos().y()
            self.points_CAM2.append([x, y])
            print("Position clicked is ({}, {})".format(x, y))

    def mouseEventCAM3(self, event):
        if self.removeCAM3.isEnabled() and (
                not self.startCAM3.isEnabled()) and self.flag_CAM3 == True:
            x = event.pos().x()
            y = event.pos().y()
            self.points_CAM3.append([x, y])
            print("Position clicked is ({}, {})".format(x, y))

    def startDrawAreaCAM1(self):
        self.drawCAM1.setEnabled(False)
        self.removeCAM1.setEnabled(True)

    def removeAreaCAM1(self):
        while len(self.points_CAM1):
            self.points_CAM1.pop()
        self.drawCAM1.setEnabled(True)
        self.removeCAM1.setEnabled(False)

    def startDrawAreaCAM2(self):
        self.drawCAM2.setEnabled(False)
        self.removeCAM2.setEnabled(True)

    def removeAreaCAM2(self):
        while len(self.points_CAM2):
            self.points_CAM2.pop()
        self.drawCAM2.setEnabled(True)
        self.removeCAM2.setEnabled(False)

    def startDrawAreaCAM3(self):
        self.drawCAM3.setEnabled(False)
        self.removeCAM3.setEnabled(True)

    def removeAreaCAM3(self):
        while len(self.points_CAM3):
            self.points_CAM3.pop()
        self.drawCAM3.setEnabled(True)
        self.removeCAM3.setEnabled(False)

    def drawArea(self, image, points: list, qlabel: QtWidgets.QLabel):
        image_draw = image.copy()
        (width, height) = image.shape[:2]
        image_draw = cv2.resize(image_draw, (qlabel.width(), qlabel.height()))

        if len(points) > 1:
            point1 = []
            for point in points:
                x = int(point[0] * qlabel.width())
                y = int(point[1] * qlabel.height())
                point1.append((x, y))
            cv2.polylines(image_draw, np.array([point1]), 1, (255, 0, 0), 1)
            b, g, r = cv2.split(image_draw)
            cv2.fillPoly(b, np.array([point1]), (0, 255, 0))
            cv2.fillPoly(r, np.array([point1]), (0, 255, 0))
            image_draw = cv2.merge([b, g, r])
        return image_draw

# Function for IVA tasks

    def monitorProhibitedArea(self, frame, points: list, flag_Warning: int):
        pass
Beispiel #48
0
class Player(QWidget):
    audio_path = "audio"
    lyrics_path = "lyrics"
    timings_path = os.path.join("lyrics", "timing")
    settings_path = "settings.json"

    fullScreenChanged = pyqtSignal(bool)

    def __init__(self, parent=None):
        super(Player, self).__init__(parent)

        self.setWindowTitle("SongScreen")

        self.setFocusPolicy(Qt.StrongFocus)

        self.colorDialog = None
        self.trackInfo = ""
        self.statusInfo = ""
        self.duration = 0

        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist()
        self.player.setPlaylist(self.playlist)

        self.player.durationChanged.connect(self.durationChanged)
        self.player.positionChanged.connect(self.positionChanged)
        self.player.metaDataChanged.connect(self.metaDataChanged)
        # self.playlist.currentIndexChanged.connect(self.playlistPositionChanged)
        self.player.mediaStatusChanged.connect(self.statusChanged)
        self.player.bufferStatusChanged.connect(self.bufferingProgress)
        self.player.videoAvailableChanged.connect(self.videoAvailableChanged)
        self.player.error.connect(self.displayErrorMessage)

        # self.videoWidget = VideoWidget()
        # self.player.setVideoOutput(self.videoWidget)

        self.slider = MediaProgressWidget()  # QSlider(Qt.Horizontal)
        self.markers = []

        self.songtext_widget = SongTextWidget()
        self.songtext_widget.show()

        # self.playlistModel = PlaylistModel()
        # self.playlistModel.setPlaylist(self.playlist)
        #
        # self.playlistView = QListView()
        # self.playlistView.setModel(self.playlistModel)
        # self.playlistView.setCurrentIndex(
        #     self.playlistModel.index(self.playlist.currentIndex(), 0))
        #
        # self.playlistView.activated.connect(self.jump)

        self.slider.setRange(0, self.player.duration() / 1000)

        self.labelDuration = QLabel()
        self.slider.sliderMoved.connect(self.seek)

        # openButton = QPushButton("Open", clicked=self.open)

        controls = PlayerControlsWidget()
        controls.setState(self.player.state())
        controls.setVolume(self.player.volume())
        # controls.setMuted(controls.isMuted())

        controls.play.connect(self.player.play)
        controls.pause.connect(self.player.pause)
        controls.stop.connect(self.stop_clicked)
        # controls.stop.connect(self.videoWidget.update)
        # controls.next.connect(self.playlist.next)
        # controls.previous.connect(self.previousClicked)
        controls.changeVolume.connect(self.player.setVolume)
        # controls.changeMuting.connect(self.player.setMuted)
        # controls.changeRate.connect(self.player.setPlaybackRate)

        self.player.stateChanged.connect(controls.setState)
        self.player.stateChanged.connect(self.setState)
        self.player.volumeChanged.connect(controls.setVolume)
        # self.player.mutedChanged.connect(controls.setMuted)

        # self.fullScreenButton = QPushButton("FullScreen")
        # self.fullScreenButton.setCheckable(True)
        #
        # self.colorButton = QPushButton("Color Options...")
        # self.colorButton.setEnabled(False)
        # self.colorButton.clicked.connect(self.showColorDialog)

        displayLayout = QHBoxLayout()
        # displayLayout.addWidget(self.videoWidget, 2)
        # displayLayout.addWidget(self.songtext_widget)
        # displayLayout.addWidget(self.playlistView)

        self.song_select_widget = SongSelectWidget()
        self.song_select_widget.song_selected.connect(self.load_song)

        self.screen_select_widget = ScreenSelectWidget()
        self.screen_select_widget.screen_selected.connect(self.display_lyrics_on_screen)
        self.screen_select_widget.active_screen = QApplication.desktop().screenNumber(self.songtext_widget)

        self.settings_button = QPushButton()
        self.settings_button.setText(self.tr("Settings..."))
        self.settings_button.clicked.connect(self.show_settings)

        sidebarLayout = QVBoxLayout()
        sidebarLayout.setContentsMargins(10, 1, 0, 1);

        sidebarLayout.addWidget(self.settings_button)
        sidebarLayout.addStretch(1);
        sidebarLayout.addWidget(self.screen_select_widget)

        displayLayout.addWidget(self.song_select_widget)
        displayLayout.addLayout(sidebarLayout)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        # controlLayout.addWidget(openButton)
        # controlLayout.addStretch(1)
        controlLayout.addWidget(controls)
        controlLayout.addStretch(1)
        controlLayout.addWidget(self.labelDuration)
        # controlLayout.addWidget(self.fullScreenButton)
        # controlLayout.addWidget(self.colorButton)

        layout = QVBoxLayout()
        layout.addLayout(displayLayout)
        hLayout = QHBoxLayout()
        hLayout.addWidget(self.slider)
        # hLayout.addWidget(self.labelDuration)
        layout.addLayout(hLayout)
        layout.addLayout(controlLayout)

        self.setLayout(layout)

        if not self.player.isAvailable():
            QMessageBox.warning(self, "Service not available",
                                "The QMediaPlayer object does not have a valid service.\n"
                                "Please check the media service plugins are installed.")

            controls.setEnabled(False)
            self.playlistView.setEnabled(False)
            # openButton.setEnabled(False)
            self.colorButton.setEnabled(False)
            self.fullScreenButton.setEnabled(False)

        self.metaDataChanged()

        self._loading_audio = False
        self._finished_song = False
        self._lyrics_fading = False

        self._song_number = -1

        self.settings = {
            'font_size': 40,
            'line_increment': 2,
            'lyrics_language': '',
        }
        self._load_settings()

        self.settings_widget = SettingsWidget(self.settings, self.lyrics_path)
        self.settings_widget.font_size_changed.connect(self.songtext_widget.set_font_size)
        self.settings_widget.line_increment_changed.connect(self.songtext_widget.set_line_increment)
        self.settings_widget.language_changed.connect(self._language_changed)

        self.song_select_widget.reset(self.available_song_numbers)

    @property
    def lyrics_language_path(self):
        path = QStandardPaths.locate(QStandardPaths.AppDataLocation, self.lyrics_path, QStandardPaths.LocateDirectory)
        return os.path.join(path, self.settings['lyrics_language'])

    @property
    def available_song_numbers(self):
        audios = set(
            [int(os.path.splitext(filename)[0]) for filename in os.listdir(self.audio_path) if filename[0] != '.'])
        try:
            lyrics = set(
                [int(os.path.splitext(filename)[0])
                 for filename in os.listdir(self.lyrics_language_path)
                 if filename[0] != '.']
            )
        except (ValueError, FileNotFoundError):
            lyrics = set()

        return sorted(list(audios.intersection(lyrics)))

    def show_settings(self):
        self.settings_widget.hide()
        self.settings_widget.show()

    def display_lyrics_on_screen(self, screen_number):
        desktop = QApplication.desktop()

        if screen_number >= desktop.screenCount():
            screen_number = desktop.screenNumber(self)

        rect = desktop.availableGeometry(screen_number)

        for _ in range(3):
            if screen_number != desktop.screenNumber(self):
                self.songtext_widget.setWindowFlags(Qt.FramelessWindowHint)
                self.songtext_widget.hide()
                self.songtext_widget.move(rect.x(), rect.y())
                self.songtext_widget.resize(rect.width(), rect.height())
                self.songtext_widget.showFullScreen()
            else:
                self.songtext_widget.setWindowFlags(Qt.WindowTitleHint)
                self.songtext_widget.hide()
                self.songtext_widget.move(rect.x(), rect.y())
                self.songtext_widget.resize(self.songtext_widget.minimumSize())
                self.songtext_widget.show()

        self.screen_select_widget.active_screen = screen_number

        self.activateWindow()

    def load_song(self, song_number):
        if self._song_number == song_number:
            self.seek(0)
        else:
            if self._song_number > 0:
                self._save_timings()

            self._song_number = song_number
            self.slider.dirty = False
            self._load_audio()
            self._load_lyrics()

            # self.player.play()

    def _load_audio(self):
        filename = os.path.join(self.audio_path, "{:03}.mp3".format(self._song_number))
        self.playlist.clear()
        fileInfo = QFileInfo(filename)
        if fileInfo.exists():
            url = QUrl.fromLocalFile(fileInfo.absoluteFilePath())
            if fileInfo.suffix().lower() == 'm3u':
                self.playlist.load(url)
            else:
                self.playlist.addMedia(QMediaContent(url))
                self._loading_audio = True

            self.player.play()

    def _load_lyrics(self):
        with open(os.path.join(self.lyrics_language_path, "{}.json".format(self._song_number)), 'r') as f:
            song_markers = json.load(f)

            self.markers = []

            for m in song_markers['markers']:
                marker = MediaMarker(self.slider, m['name'])
                marker.text = m['text']
                marker.progress = 0.0
                self.markers.append(marker)

            self.songtext_widget.title = "{}  {}".format(self._song_number, song_markers['title'])
            self.songtext_widget.markers = self.markers
            self.songtext_widget.fade_in()

        try:
            with open(os.path.join(self.timings_path, "{}.json".format(self._song_number)), 'r') as f:
                timings = json.load(f)
                for m, t in zip(self.markers, timings):
                    m.progress = t
        except FileNotFoundError:
            pass

        self.slider.markers = self.markers

    def _language_changed(self, _):
        available_song_numbers = self.available_song_numbers
        self.song_select_widget.reset(available_song_numbers)
        if self._song_number in available_song_numbers:
            self._load_lyrics()

    # def open(self):
    #     fileNames, _ = QFileDialog.getOpenFileNames(self, "Open Files")
    #     self.addToPlaylist(fileNames)
    #
    # def addToPlaylist(self, fileNames):
    #     for name in fileNames:
    #         fileInfo = QFileInfo(name)
    #         if fileInfo.exists():
    #             url = QUrl.fromLocalFile(fileInfo.absoluteFilePath())
    #             if fileInfo.suffix().lower() == 'm3u':
    #                 self.playlist.load(url)
    #             else:
    #                 self.playlist.addMedia(QMediaContent(url))
    #         else:
    #             url = QUrl(name)
    #             if url.isValid():
    #                 self.playlist.addMedia(QMediaContent(url))

    def durationChanged(self, duration):
        duration /= 1000

        self.duration = duration
        self.slider.setMaximum(duration)

        if self._loading_audio:
            self._loading_audio = False

            line_total = 0
            for marker in self.markers:
                line_total += marker.linecount - 1

            silence_ratio = 5.0 / self.duration
            offset = 1.8 / line_total

            linecount = 0
            for marker in self.markers:
                if marker.progress == 0.0:
                    marker.progress = offset + (1 - offset) * (1 - silence_ratio) * linecount / line_total
                linecount += marker.linecount - 1

            self.player.pause()

    @property
    def _should_fade_out(self):
        return self.player.position() / 1000 >= self.duration - 5

    def positionChanged(self, progress):
        progress /= 1000

        if not self.slider.isSliderDown():
            self.slider.setValue(progress)

        self.updateDurationInfo(progress)

        if self.duration > 0:
            # if self.player.state() == QMediaPlayer.PlayingState:
            self.songtext_widget.progress = progress / self.duration

            if self._should_fade_out:
                self._fade_out_lyrics()

    def _fade_out_lyrics(self):
        if not self._lyrics_fading:
            self._lyrics_fading = True
            self.songtext_widget.fade_out()

    def metaDataChanged(self):
        if self.player.isMetaDataAvailable():
            self.setTrackInfo("%s - %s" % (
                self.player.metaData(QMediaMetaData.AlbumArtist),
                self.player.metaData(QMediaMetaData.Title)))

    def previousClicked(self):
        # Go to the previous track if we are within the first 5 seconds of
        # playback.  Otherwise, seek to the beginning.
        if self.player.position() <= 5000:
            self.playlist.previous()
        else:
            self.player.setPosition(0)

    def jump(self, index):
        if index.isValid():
            self.playlist.setCurrentIndex(index.row())
            self.player.play()

    def seek(self, seconds):
        self.player.setPosition(seconds * 1000)

    def setState(self, status):

        if status == QMediaPlayer.StoppedState:
            self._finished_song = True

        elif status == QMediaPlayer.PlayingState:
            if self._finished_song or (self._lyrics_fading and not self._should_fade_out):
                self._finished_song = False
                self._lyrics_fading = False
                self.songtext_widget.fade_in()

    def stop_clicked(self):
        self.player.stop()
        self._fade_out_lyrics()

    def statusChanged(self, status):
        self.handleCursor(status)

        if status == QMediaPlayer.LoadingMedia:
            self.setStatusInfo("Loading...")
        elif status == QMediaPlayer.StalledMedia:
            self.setStatusInfo("Media Stalled")
        elif status == QMediaPlayer.EndOfMedia:
            QApplication.alert(self)
        elif status == QMediaPlayer.InvalidMedia:
            self.displayErrorMessage()
        else:
            self.setStatusInfo("")

    def handleCursor(self, status):
        if status in (QMediaPlayer.LoadingMedia, QMediaPlayer.BufferingMedia, QMediaPlayer.StalledMedia):
            self.setCursor(Qt.BusyCursor)
        else:
            self.unsetCursor()

    def bufferingProgress(self, progress):
        self.setStatusInfo("Buffering %d%" % progress)

    def videoAvailableChanged(self, available):
        if available:
            self.fullScreenButton.clicked.connect(
                self.videoWidget.setFullScreen)
            self.videoWidget.fullScreenChanged.connect(
                self.fullScreenButton.setChecked)

            if self.fullScreenButton.isChecked():
                self.videoWidget.setFullScreen(True)
        else:
            self.fullScreenButton.clicked.disconnect(
                self.videoWidget.setFullScreen)
            self.videoWidget.fullScreenChanged.disconnect(
                self.fullScreenButton.setChecked)

            self.videoWidget.setFullScreen(False)

        self.colorButton.setEnabled(available)

    def setTrackInfo(self, info):
        self.trackInfo = info

        # if self.statusInfo != "":
        #     self.setWindowTitle("%s | %s" % (self.trackInfo, self.statusInfo))
        # else:
        #     self.setWindowTitle(self.trackInfo)

    def setStatusInfo(self, info):
        self.statusInfo = info

        # if self.statusInfo != "":
        #     self.setWindowTitle("%s | %s" % (self.trackInfo, self.statusInfo))
        # else:
        #     self.setWindowTitle(self.trackInfo)

    def displayErrorMessage(self):
        self.setStatusInfo(self.player.errorString())

    def updateDurationInfo(self, currentInfo):
        duration = self.duration
        if currentInfo or duration:
            currentTime = QTime((currentInfo / 3600) % 60, (currentInfo / 60) % 60,
                                currentInfo % 60, (currentInfo * 1000) % 1000)
            totalTime = QTime((duration / 3600) % 60, (duration / 60) % 60,
                              duration % 60, (duration * 1000) % 1000);

            format = 'hh:mm:ss' if duration > 3600 else 'mm:ss'
            tStr = currentTime.toString(format) + " / " + totalTime.toString(format)
        else:
            tStr = ""

        self.labelDuration.setText(tStr)

    def showColorDialog(self):
        if self.colorDialog is None:
            brightnessSlider = QSlider(Qt.Horizontal)
            brightnessSlider.setRange(-100, 100)
            brightnessSlider.setValue(self.videoWidget.brightness())
            brightnessSlider.sliderMoved.connect(
                self.videoWidget.setBrightness)
            self.videoWidget.brightnessChanged.connect(
                brightnessSlider.setValue)

            contrastSlider = QSlider(Qt.Horizontal)
            contrastSlider.setRange(-100, 100)
            contrastSlider.setValue(self.videoWidget.contrast())
            contrastSlider.sliderMoved.connect(self.videoWidget.setContrast)
            self.videoWidget.contrastChanged.connect(contrastSlider.setValue)

            hueSlider = QSlider(Qt.Horizontal)
            hueSlider.setRange(-100, 100)
            hueSlider.setValue(self.videoWidget.hue())
            hueSlider.sliderMoved.connect(self.videoWidget.setHue)
            self.videoWidget.hueChanged.connect(hueSlider.setValue)

            saturationSlider = QSlider(Qt.Horizontal)
            saturationSlider.setRange(-100, 100)
            saturationSlider.setValue(self.videoWidget.saturation())
            saturationSlider.sliderMoved.connect(
                self.videoWidget.setSaturation)
            self.videoWidget.saturationChanged.connect(
                saturationSlider.setValue)

            layout = QFormLayout()
            layout.addRow("Brightness", brightnessSlider)
            layout.addRow("Contrast", contrastSlider)
            layout.addRow("Hue", hueSlider)
            layout.addRow("Saturation", saturationSlider)

            button = QPushButton("Close")
            layout.addRow(button)

            self.colorDialog = QDialog(self)
            self.colorDialog.setWindowTitle("Color Options")
            self.colorDialog.setLayout(layout)

            button.clicked.connect(self.colorDialog.close)

        self.colorDialog.show()

    def closeEvent(self, close_event):
        self._save_timings()
        self._save_settings()
        self.songtext_widget.close()
        self.settings_widget.close()

    def keyPressEvent(self, key_event):
        if key_event.key() == Qt.Key_Space:
            key_event.accept()
            if self.player.state() == QMediaPlayer.PlayingState:
                self.player.pause()
            elif self.player.state() in [QMediaPlayer.PausedState, QMediaPlayer.StoppedState]:
                self.player.play()
        elif key_event.key() == Qt.Key_M:
            key_event.accept()
            self.slider.set_closest_marker_to_current_progress()

    def _save_timings(self):
        if self.slider.dirty:
            with open(os.path.join(self.timings_path, "{}.json".format(self._song_number)), 'w') as f:
                json.dump([marker.progress for marker in self.markers], f, indent=2)

    def _save_settings(self):
        # TODO : refactor and use QSettings directly

        # with open(self.settings_path, 'w') as f:
        self.settings.update({
            'lyrics_screen': QApplication.desktop().screenNumber(self.songtext_widget),
            'control_window_position': self.pos(),
        })

        # json.dump(self.settings, f, indent=2)

        settings = QSettings("Maccesch", "SongScreen")

        for key, value in self.settings.items():
            settings.setValue(key, value)

    def _load_settings(self):
        # try:
        #     with open(self.settings_path, 'r') as f:
        #         settings = json.load(f)
        settings = QSettings("Maccesch", "SongScreen")

        if settings.contains('lyrics_screen'):
            self.display_lyrics_on_screen(settings.value('lyrics_screen'))

        if settings.contains('control_window_position'):
            self.move(settings.value('control_window_position'))

        for key in settings.allKeys():
            self.settings[key] = settings.value(key)

        # self.settings.update(settings)

        self.songtext_widget.set_font_size(self.settings['font_size'])
        self.songtext_widget.set_line_increment(self.settings['line_increment'])

        # except (FileNotFoundError, ValueError):
        #     pass

        if not os.path.exists(self.lyrics_language_path) or not self.settings['lyrics_language']:
            languages = list(
                filter(lambda p: os.path.isdir(os.path.join(self.lyrics_path, p)) and p != "timings",
                       os.listdir(self.lyrics_path))
            )
            self.settings['lyrics_language'] = languages[0] if languages else ""
Beispiel #49
0
class Controller:
    def __init__(self, view, log):
        self.log = log
        self.view = view
        self._player = QMediaPlayer()
        self._player.mediaStatusChanged.connect(self._player_status_changed)
        self._player.mediaChanged.connect(self._player_media_changed)
        self._player.currentMediaChanged.connect(self._player_current_media_changed)
        self._player.stateChanged.connect(self._player_state_changed)
        self._player.positionChanged.connect(self._player_position_changed)
        self._player.durationChanged.connect(self._player_duration_changed)
        self._searched_tracks = []
        self.playlists = []
        self.playing_playlist = 0
        self.last_colored_item = None

    def _player_status_changed(self, status):
        self.log.debug('_player_status_changed: %s', str(status))
        if status in [QMediaPlayer.EndOfMedia, QMediaPlayer.InvalidMedia]:
            self.next()

        if status in [QMediaPlayer.EndOfMedia, QMediaPlayer.NoMedia, QMediaPlayer.UnknownMediaStatus,
                      QMediaPlayer.InvalidMedia]:
            self.view.set_title()
        else:
            try:
                pos = self.playlists[self.playing_playlist].active_track
                if pos >= 0:
                    track = self.playlists[self.playing_playlist].tracks[pos]
                    self.view.set_title(track.title)
                self.update_list_position(pos)
            except IndexError:
                self.log.error('Index error in _player_status_changed')

    def _player_media_changed(self, media):
        self.log.debug('_player_media_changed: %s' % str(media))

    def _player_current_media_changed(self, media):
        self.log.debug('_player_current_media_changed: %s' % str(media))

    def _player_state_changed(self, state):
        self.log.debug('_player_state_changed: %s' % str(state))

    def _player_duration_changed(self, duration):
        self.log.debug('_player_duration_changed: %s' % str(duration))
        self.view.track_position.setMaximum(duration)

    def _player_position_changed(self, pos):
        self.view.track_position.setValue(pos)

    def volume_changed(self, value):
        self._player.setVolume(value)

    def update_status(self):
        total_duration = 0
        playlist_index = self.view.tabs.currentIndex()
        for track in self.playlists[playlist_index].tracks:
            total_duration += track.duration
        self.view.playlist_status.setText("%i tracks. Total duration %i:%02i:%02i:%02i" %
                                          (self.playlists[playlist_index].count(), total_duration // 86400,
                                           total_duration // 3600 % 24,
                                           total_duration // 60 % 60, total_duration % 60))

    def add_track(self, track, playlist_index=None):
        if playlist_index is None:
            playlist_index = self.view.tabs.currentIndex()
        self.playlists[playlist_index].add(track)
        self.view.tabs.widget(playlist_index).addItem(track.title)

    def remove_track(self, track_pos=None):
        if track_pos is None:
            track_pos = self.view.tabs.currentWidget().currentRow()
        if track_pos != -1:
            self.view.tabs.currentWidget().takeItem(track_pos)
            playlist_index = self.view.tabs.currentIndex()
            self.playlists[playlist_index].remove(track_pos)
            self.update_status()

    def remove_all_tracks(self):
        playlist_index = self.view.tabs.currentIndex()
        self.playlists[playlist_index].clear()
        self.view.tabs.currentWidget().clear()
        self.update_status()

    def next(self):
        self.log.debug('next')
        # if we close last tab with current track, after it ended, we stop playing
        # todo: need check, that if we close not last tab with current song, we also need stop after song ended
        if self.playing_playlist >= len(self.playlists):
            return
        next_pos = self.playlists[self.playing_playlist].get_next_track(shuffle=bool(self.view.shuffle.checkState()))
        if next_pos is not None:
            self.playlists[self.playing_playlist].active_track = next_pos
            url = self.playlists[self.playing_playlist].tracks[next_pos].stream_url()
            self._player.setMedia(QMediaContent(QUrl(url)))
            self.play()

    def previous(self):
        self.log.debug('previous')
        prev_pos = self.playlists[self.playing_playlist].get_prev_track(shuffle=bool(self.view.shuffle.checkState()))
        if prev_pos is not None:
            self.playlists[self.playing_playlist].active_track = prev_pos
            url = self.playlists[self.playing_playlist].tracks[prev_pos].stream_url()
            self._player.setMedia(QMediaContent(QUrl(url)))
            self.play()

    def play(self):
        self.log.debug('play')
        self._player.play()

    def pause(self):
        self.log.debug('pause')
        self._player.pause()

    def update_list_position(self, position):
        showed_list = self.view.tabs.currentWidget()
        if self.last_colored_item:
            self.last_colored_item.setBackground(QBrush())
        if (position >= 0) and (position <= showed_list.count()):
            self.last_colored_item = showed_list.item(position)
            self.last_colored_item.setBackground(QBrush(QColor('red')))

    def change_track(self):
        self.log.debug('change_track')
        playlist_index = self.view.tabs.currentIndex()
        self.playing_playlist = playlist_index
        position = self.view.tabs.currentWidget().currentRow()
        self.playlists[self.playing_playlist].active_track = position
        self.log.debug('position: %i' % position)
        url = self.playlists[self.playing_playlist].tracks[position].stream_url()
        self._player.setMedia(QMediaContent(QUrl(url)))
        if self._player.state() in [QMediaPlayer.StoppedState, QMediaPlayer.PausedState]:
            self.play()

    def change_track_position(self):
        self._player.setPosition(self.view.track_position.value())

    def remove_dublicates(self):
        selected_playlist = self.view.tabs.currentIndex()
        playlist = self.playlists[selected_playlist]
        processed_ids = []
        position_for_removing = []
        for index in range(len(playlist.tracks)):
            if playlist.tracks[index].id in processed_ids:
                position_for_removing.append(index)
            else:
                processed_ids.append(playlist.tracks[index].id)

        self.log.debug('tracks count: %i' % len(playlist.tracks))
        counter = 0
        for index in reversed(position_for_removing):
            self.log.debug('track index for removing: %i' % index)
            self.remove_track(track_pos=index)
            counter += 1
        self.log.info('Removed %i tracks.' % counter)

    def save_track(self, playlist_pos=None, track_pos=None):
        if track_pos is None:
            track_pos = self.view.tabs.currentWidget().currentRow()
        if playlist_pos is None:
            playlist_pos = self.view.tabs.currentIndex()
        playlist = self.playlists[playlist_pos]
        track = playlist.tracks[track_pos]
        track.save()

    def download_playlist(self):
        selected_playlist = self.view.tabs.currentIndex()
        playlist = self.playlists[selected_playlist]
        for track_pos in range(playlist.count()):
            self.log.info('Saving %i/%s track...' % (track_pos+1, playlist.count()))
            self.save_track(playlist_pos=selected_playlist, track_pos=track_pos)
        self.log.info('Saving done.')

    def load_playlist(self):
        playlist_index = self.view.tabs.currentIndex()
        playlist = self.playlists[playlist_index]
        loaded_playlist = sc_load_playlist(playlist.name)
        if not loaded_playlist:
            self.log.error('Playlist not exists.')
            return
        self.remove_all_tracks()
        for track in loaded_playlist:
            self.add_track(track)
        self.update_status()

    def save_playlist(self):
        playlist_index = self.view.tabs.currentIndex()
        playlist = self.playlists[playlist_index]
        sc_save_playlist(playlist.name, playlist)

    def add_playlist(self, name):
        self.playlists.append(Playlist(name))

    def remove_playlist(self, index):
        self.log.debug('remove playlist with index = %i' % index)
        del (self.playlists[index])

    def search_tracks(self):
        self.view.search_list.clear()
        tracks = sc_search_tracks(self.view.input.text())
        self._searched_tracks = tracks
        total_duration = 0
        for track in self._searched_tracks:
            self.view.search_list.addItem(track.title)
            total_duration += track.duration
        self.view.search_status.setText("Founded %i tracks. Total duration %i:%02i:%02i:%02i" %
                                        (len(self._searched_tracks),
                                         total_duration // 86400000, total_duration // 3600000 % 24,
                                         total_duration // 60000 % 60, total_duration // 1000 % 60))

    def search_similar(self):
        self.view.search_list.clear()
        position = self.view.tabs.currentWidget().currentRow()
        playlist_index = self.view.tabs.currentIndex()
        track = self.playlists[playlist_index].tracks[position]

        related_tracks = track.search_related()
        self._searched_tracks = related_tracks
        total_duration = 0
        for track in self._searched_tracks:
            self.view.search_list.addItem(track.title)
            total_duration += track.duration
        self.view.search_status.setText("Founded %i tracks. Total duration %i:%02i:%02i:%02i" %
                                        (len(self._searched_tracks),
                                         total_duration // 86400000, total_duration // 3600000 % 24,
                                         total_duration // 60000 % 60, total_duration // 1000 % 60))

    def clicked_add_track(self):
        position = self.view.search_list.currentRow()
        self.add_track(self._searched_tracks[position])

    def clicked_add_all_tracks(self):
        for row in range(self.view.search_list.count()):
            self.add_track(self._searched_tracks[row])

    def load_current_state(self):
        if not os.path.isfile('state.pickle'):
            return
        f = open('state.pickle', 'rb')
        state = pickle.load(f)
        f.close()
        loaded_playlists = state['playlists']
        self.log.debug('loaded %i playlists.' % len(loaded_playlists))
        for i in range(len(loaded_playlists) - len(self.playlists)):
            self.view.tab_add()
        self.playlists.clear()
        index = 0
        for playlist in loaded_playlists:
            self.log.debug('playlist: %s, len: %i' % (playlist.name, len(playlist.tracks)))
            self.add_playlist(playlist.name)
            for track in playlist.tracks:
                self.add_track(track, playlist_index=index)
            index += 1
        self.log.debug(len(self.playlists))
        self.log.debug('curent tab: %i' % state['current_playlist'])
        self.view.tabs.setCurrentIndex(state['current_playlist'])
        self.log.debug('volume: %i' % state['volume'])
        self.view.volume.setValue(state['volume'])
        self.view.shuffle.setCheckState(state['shuffle'])

    def save_current_state(self):
        state = dict()
        self.log.debug('playlists count: %i' % len(self.playlists))
        state['playlists'] = self.playlists
        state['current_playlist'] = self.view.tabs.currentIndex()
        state['volume'] = self.view.volume.value()
        state['shuffle'] = self.view.shuffle.checkState()
        f = open('state.pickle', 'wb')
        pickle.dump(state, f)
        f.close()
Beispiel #50
0
class Player(QGraphicsVideoItem):

    isSubtitle = pyqtSignal(bool)
    subtitlePos = pyqtSignal(int)
    def __init__(self, parent=None):
        super().__init__()
        self.parent = parent

        self.player = QMediaPlayer()
        self.player.setVolume(int(settings().value("Player/volume") or 100))
        self.player.setVideoOutput(self)

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.timerPos)

        self.player.currentMediaChanged.connect(self.signalStart)
        self.player.currentMediaChanged.connect(self.parent.subtitleitem.subtitleControl)
        self.player.currentMediaChanged.connect(self.videoConfigure)
        """self.player.mediaStatusChanged.connect(self.metadata)

    def metadata(self, data):
        if data and self.player.isMetaDataAvailable():
            print(self.player.metaData("VideoCodec"))"""

    def videoConfigure(self, media):
        video_name = os.path.basename(media.canonicalUrl().toLocalFile())
        videos = settings().value("Player/video_names") or []
        videos_time = settings().value("Player/videos_time") or []
        try:
            self.player.setPosition(int(videos_time[videos.index(video_name)]))
        except ValueError:
            pass

    def timerStart(self):
        self.timer.start(200)

    def signalStart(self, content):
        srt = content.canonicalUrl().toLocalFile().split(".")
        srt.pop(-1)
        srt.append("srt")
        srt = ".".join(srt)
        if QFile.exists(srt):
            self.isSubtitle.emit(True)
            self.timer.start(100)
        else:
            self.isSubtitle.emit(False)
            self.timer.stop()

    def timerPos(self):
        self.subtitlePos.emit(self.player.position())

    def playerPlayOrOpen(self, arg=None):
        if type(arg) == list and len(arg) > 1:
            content = QMediaContent(QUrl.fromLocalFile(arg[1]))
            self.player.setMedia(content)
            self.play()

    def addVideo(self, video):
        content = QMediaContent(QUrl.fromLocalFile(video))
        self.player.setMedia(content)
        self.play()

    def addYoutubeVideo(self, video):
        dm = DownloadManager(self)

        content = QMediaContent(dm.addUrl(video))
        self.player.setMedia(content)
        self.play()

    def sliderChanged(self, pos):
        self.player.setPosition(pos)

    def play(self):
        self.player.play()

    def stop(self):
        self.player.stop()

    def pause(self):
        self.player.pause()

    def setMuted(self, mute):
        self.player.setMuted(mute)

    def mutedState(self):
        if self.player.isMuted():
            self.setMuted(False)
        else:
            self.setMuted(True)

    def isMuted(self):
        return  self.player.isMuted()

    def setVolume(self, value):
        self.player.setVolume(value)

    def volume(self):
        return self.player.volume()
Beispiel #51
0
class Ui_Form(QWidget):
    def __init__(self):
        super().__init__()
        self.points_CAM1 = []
        self.points_CAM2 = []
        self.points_CAM3 = []

    def setupUi(self, Form):
        Form.setObjectName("Form")
        self.tabWidget = QtWidgets.QTabWidget(Form)
        self.tabWidget.setObjectName("tabWidget")
        self.multiTab = QtWidgets.QWidget()
        self.multiTab.setObjectName("multiTab")
        # cam1
        self.cam_1 = QtWidgets.QWidget(self.multiTab)
        self.cam_1.setObjectName("cam_1")
        self.CAM1 = QtWidgets.QLabel(self.cam_1)
        self.CAM1.setFrameShape(QtWidgets.QFrame.Box)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred,
                                           QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.CAM1.sizePolicy().hasHeightForWidth())
        self.CAM1.setSizePolicy(sizePolicy)
        self.CAM1.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM1.setMaximumSize(QtCore.QSize(400, 320))
        self.CAM1.setSizeIncrement(QtCore.QSize(3, 2))
        self.CAM1.setScaledContents(True)
        self.CAM1.setObjectName("CAM1")
        self.startCAM1 = QtWidgets.QPushButton(self.cam_1)
        self.startCAM1.setObjectName("startCAM1")
        self.stopCAM1 = QtWidgets.QPushButton(self.cam_1)
        self.stopCAM1.setObjectName("stopCAM1")
        self.reIDBtn_1 = QtWidgets.QPushButton(self.cam_1)
        self.reIDBtn_1.setObjectName("reIDBtn_1")
        self.falldetectionBtn_1 = QtWidgets.QPushButton(self.cam_1)
        self.falldetectionBtn_1.setObjectName("falldetectionBtn_1")
        self.peoplecntBtn_1 = QtWidgets.QPushButton(self.cam_1)
        self.peoplecntBtn_1.setObjectName("peoplecntBtn_1")
        self.areaprotectionBtn_1 = QtWidgets.QPushButton(self.cam_1)
        self.areaprotectionBtn_1.setObjectName("areaprotectionBtn_1")

        layoutCam_1 = QGridLayout(self.cam_1)
        layoutCam_1.addWidget(self.CAM1, 0, 0, 7, 3)
        layoutCam_1.addWidget(self.startCAM1, 8, 0)
        layoutCam_1.addWidget(self.stopCAM1, 9, 0)
        layoutCam_1.addWidget(self.reIDBtn_1, 8, 1)
        layoutCam_1.addWidget(self.falldetectionBtn_1, 8, 2)
        layoutCam_1.addWidget(self.peoplecntBtn_1, 9, 1)
        layoutCam_1.addWidget(self.areaprotectionBtn_1, 9, 2)
        self.cam_1.setLayout(layoutCam_1)

        # Setting Multi_tab Cam 2
        self.cam_2 = QtWidgets.QWidget(self.multiTab)
        self.cam_2.setObjectName("cam_2")
        self.CAM2 = QtWidgets.QLabel(self.cam_2)
        self.CAM2.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM2.setSizePolicy(sizePolicy)
        self.CAM2.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM2.setMaximumSize(QtCore.QSize(400, 320))
        self.CAM2.setSizeIncrement(QtCore.QSize(3, 2))
        self.CAM2.setObjectName("CAM2")
        self.CAM2.setScaledContents(True)
        self.peoplecntBtn_2 = QtWidgets.QPushButton(self.cam_2)
        self.peoplecntBtn_2.setObjectName("peoplecntBtn_2")
        self.falldetectionBtn_2 = QtWidgets.QPushButton(self.cam_2)
        self.falldetectionBtn_2.setObjectName("falldetectionBtn_2")
        self.reIDBtn_2 = QtWidgets.QPushButton(self.cam_2)
        self.reIDBtn_2.setObjectName("reIDBtn_2")
        self.stop_CAM2 = QtWidgets.QPushButton(self.cam_2)
        self.stop_CAM2.setObjectName("stop_CAM2")
        self.start_CAM2 = QtWidgets.QPushButton(self.cam_2)
        self.start_CAM2.setObjectName("start_CAM2")
        self.areaprotectionBtn_2 = QtWidgets.QPushButton(self.cam_2)
        self.areaprotectionBtn_2.setObjectName("areaprotectionBtn_2")

        layoutCam_2 = QGridLayout(self.cam_2)
        layoutCam_2.addWidget(self.CAM2, 0, 0, 7, 3)
        layoutCam_2.addWidget(self.start_CAM2, 8, 0)
        layoutCam_2.addWidget(self.stop_CAM2, 9, 0)
        layoutCam_2.addWidget(self.reIDBtn_2, 8, 1)
        layoutCam_2.addWidget(self.falldetectionBtn_2, 8, 2)
        layoutCam_2.addWidget(self.peoplecntBtn_2, 9, 1)
        layoutCam_2.addWidget(self.areaprotectionBtn_2, 9, 2)
        self.cam_2.setLayout(layoutCam_2)

        # Setting Multi_tab Cam 3
        self.cam_3 = QtWidgets.QWidget(self.multiTab)
        self.cam_3.setObjectName("cam_3")
        self.CAM3 = QtWidgets.QLabel(self.cam_3)
        self.CAM3.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM3.setSizePolicy(sizePolicy)
        self.CAM3.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM3.setMaximumSize(QtCore.QSize(400, 320))
        self.CAM3.setSizeIncrement(QtCore.QSize(3, 2))
        self.CAM3.setObjectName("CAM3")
        self.CAM3.setScaledContents(True)
        self.peoplecntBtn_3 = QtWidgets.QPushButton(self.cam_3)
        self.peoplecntBtn_3.setObjectName("peoplecntBtn_3")
        self.falldetectionBtn_3 = QtWidgets.QPushButton(self.cam_3)
        self.falldetectionBtn_3.setObjectName("falldetectionBtn_3")
        self.reIDBtn_3 = QtWidgets.QPushButton(self.cam_3)
        self.reIDBtn_3.setObjectName("reIDBtn_3")
        self.stop_CAM3 = QtWidgets.QPushButton(self.cam_3)
        self.stop_CAM3.setObjectName("stop_CAM3")
        self.start_CAM3 = QtWidgets.QPushButton(self.cam_3)
        self.start_CAM3.setObjectName("start_CAM3")
        self.areaprotectionBtn_3 = QtWidgets.QPushButton(self.cam_3)
        self.areaprotectionBtn_3.setObjectName("areaprotectionBtn_3")

        layoutCam_3 = QGridLayout(self.cam_3)
        layoutCam_3.addWidget(self.CAM3, 0, 0, 7, 3)
        layoutCam_3.addWidget(self.start_CAM3, 8, 0)
        layoutCam_3.addWidget(self.stop_CAM3, 9, 0)
        layoutCam_3.addWidget(self.reIDBtn_3, 8, 1)
        layoutCam_3.addWidget(self.falldetectionBtn_3, 8, 2)
        layoutCam_3.addWidget(self.peoplecntBtn_3, 9, 1)
        layoutCam_3.addWidget(self.areaprotectionBtn_3, 9, 2)
        self.cam_3.setLayout(layoutCam_3)

        # Setting layout multi_tab
        layoutMultitab = QGridLayout(self.multiTab)
        layoutMultitab.addWidget(self.cam_1, 0, 0)
        layoutMultitab.addWidget(self.cam_2, 0, 1)
        layoutMultitab.addWidget(self.cam_3, 0, 2)
        self.multiTab.setLayout(layoutMultitab)
        self.tabWidget.addTab(self.multiTab, "")

        # Media Player

        self.playRec = QtWidgets.QWidget()
        self.playRec.setObjectName("playRec")
        self.tabWidget.addTab(self.playRec, "")
        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        videowidget = QVideoWidget()
        self.openBtn = QtWidgets.QPushButton('Open Video')
        self.playBtn = QtWidgets.QPushButton()
        self.playBtn.setEnabled(False)
        self.playBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.stopBtn = QtWidgets.QPushButton()
        self.stopBtn.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.slowBtn = QtWidgets.QPushButton()
        self.slowBtn.setIcon(self.style().standardIcon(
            QStyle.SP_MediaSeekBackward))
        self.fastBtn = QtWidgets.QPushButton()
        self.fastBtn.setIcon(self.style().standardIcon(
            QStyle.SP_MediaSeekForward))
        self.volumeBtn = QtWidgets.QPushButton()
        self.volumeBtn.setIcon(self.style().standardIcon(
            QStyle.SP_MediaVolume))
        self.fullscreenBtn = QPushButton("Full Screen")
        self.slider = QSlider(Qt.Horizontal)
        self.slider.setRange(0, 0)
        self.volume_slider = QSlider(Qt.Horizontal)
        self.volume_slider.setRange(0, 100)
        self.volume_slider.setValue(100)
        self.label_2_1 = QLabel()
        self.label_2_1.setSizePolicy(QSizePolicy.Preferred,
                                     QSizePolicy.Maximum)
        self.label_2_2 = QLabel()
        hboxLayout_2_1 = QHBoxLayout()
        hboxLayout_2_2 = QHBoxLayout()
        hboxLayout_2_3 = QHBoxLayout()
        hboxLayout_2_1.addWidget(self.slider)
        hboxLayout_2_2.addWidget(self.openBtn)
        hboxLayout_2_2.addWidget(self.stopBtn)
        hboxLayout_2_2.addWidget(self.slowBtn)
        hboxLayout_2_2.addWidget(self.playBtn)
        hboxLayout_2_2.addWidget(self.fastBtn)
        hboxLayout_2_2.addWidget(self.volumeBtn)
        hboxLayout_2_2.addWidget(self.volume_slider)
        hboxLayout_2_2.addStretch(1)
        hboxLayout_2_2.addWidget(self.fullscreenBtn)
        hboxLayout_2_3.addWidget(videowidget)
        vboxLayout_2_1 = QVBoxLayout()
        vboxLayout_2_1.addLayout(hboxLayout_2_3)
        vboxLayout_2_1.addLayout(hboxLayout_2_1)
        vboxLayout_2_1.addLayout(hboxLayout_2_2)
        vboxLayout_2_1.addWidget(self.label_2_1)
        self.playRec.setLayout(vboxLayout_2_1)

        #Tab Setting
        self.setting = QtWidgets.QWidget()
        self.setting.setObjectName("setting")
        self.tabWidget.addTab(self.setting, "")
        # Cam 1
        self.camSetting_1 = QtWidgets.QWidget(self.setting)
        self.camSetting_1.setObjectName("camSetting_1")
        self.CAM1_Draw = QtWidgets.QLabel(self.camSetting_1)
        self.CAM1_Draw.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM1_Draw.setSizePolicy(sizePolicy)
        self.CAM1_Draw.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM1_Draw.setMaximumSize(QtCore.QSize(400, 320))
        self.CAM1_Draw.setSizeIncrement(QtCore.QSize(3, 2))
        self.CAM1_Draw.setObjectName("CAM1_Draw")
        self.draw_CAM1 = QtWidgets.QPushButton(self.camSetting_1)
        self.draw_CAM1.setObjectName("draw_CAM1")
        self.remove_CAM1 = QtWidgets.QPushButton(self.camSetting_1)
        self.remove_CAM1.setObjectName("remove_CAM1")

        layoutCamSetting_1 = QGridLayout()
        layoutCamSetting_1.addWidget(self.CAM1_Draw, 0, 0, 7, 4)
        layoutCamSetting_1.addWidget(self.draw_CAM1, 8, 1)
        layoutCamSetting_1.addWidget(self.remove_CAM1, 8, 2)
        self.camSetting_1.setLayout(layoutCamSetting_1)

        #camSetting 2
        self.camSetting_2 = QtWidgets.QWidget(self.setting)
        self.camSetting_2.setObjectName("camSetting_2")
        self.CAM2_Draw = QtWidgets.QLabel(self.camSetting_2)
        self.CAM2_Draw.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM2_Draw.setSizePolicy(sizePolicy)
        self.CAM2_Draw.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM2_Draw.setMaximumSize(QtCore.QSize(400, 320))
        self.CAM2_Draw.setSizeIncrement(QtCore.QSize(3, 2))
        self.CAM2_Draw.setObjectName("CAM2_Draw")
        self.draw_CAM2 = QtWidgets.QPushButton(self.camSetting_2)
        self.draw_CAM2.setObjectName("draw_CAM2")
        self.remove_CAM2 = QtWidgets.QPushButton(self.camSetting_2)
        self.remove_CAM2.setObjectName("remove_CAM2")

        layoutCamSetting_2 = QGridLayout()
        layoutCamSetting_2.addWidget(self.CAM2_Draw, 0, 0, 7, 4)
        layoutCamSetting_2.addWidget(self.draw_CAM2, 8, 1)
        layoutCamSetting_2.addWidget(self.remove_CAM2, 8, 2)
        self.camSetting_2.setLayout(layoutCamSetting_2)

        #camSeting 3
        self.camSetting_3 = QtWidgets.QWidget(self.setting)
        self.camSetting_3.setObjectName("camSetting_3")
        self.CAM3_Draw = QtWidgets.QLabel(self.camSetting_3)
        self.CAM3_Draw.setFrameShape(QtWidgets.QFrame.Box)
        self.CAM3_Draw.setSizePolicy(sizePolicy)
        self.CAM3_Draw.setMinimumSize(QtCore.QSize(320, 240))
        self.CAM3_Draw.setMaximumSize(QtCore.QSize(400, 320))
        self.CAM3_Draw.setSizeIncrement(QtCore.QSize(3, 2))
        self.CAM3_Draw.setObjectName("CAM3_Draw")
        self.draw_CAM3 = QtWidgets.QPushButton(self.camSetting_3)
        self.draw_CAM3.setObjectName("draw_CAM3")
        self.remove_CAM3 = QtWidgets.QPushButton(self.camSetting_3)
        self.remove_CAM3.setObjectName("remove_CAM3")

        layoutCamSetting_3 = QGridLayout()
        layoutCamSetting_3.addWidget(self.CAM3_Draw, 0, 0, 7, 4)
        layoutCamSetting_3.addWidget(self.draw_CAM3, 8, 1)
        layoutCamSetting_3.addWidget(self.remove_CAM3, 8, 2)
        self.camSetting_3.setLayout(layoutCamSetting_3)

        #layout Setting
        layoutSetting = QGridLayout()
        layoutSetting.addWidget(self.camSetting_1, 0, 0)
        layoutSetting.addWidget(self.camSetting_2, 0, 1)
        layoutSetting.addWidget(self.camSetting_3, 0, 2)

        self.setting.setLayout(layoutSetting)

        self.mediaPlayer.setVideoOutput(videowidget)
        self.openBtn.clicked.connect(self.open_file)
        self.playBtn.clicked.connect(self.play_video)
        self.stopBtn.clicked.connect(self.stop_video)
        self.fastBtn.clicked.connect(self.fast)
        self.slowBtn.clicked.connect(self.slow)
        self.volumeBtn.clicked.connect(self.mute)
        self.fullscreenBtn.clicked.connect(self.fullscreen)
        self.volume_slider.sliderMoved.connect(self.set_volume)
        self.slider.sliderMoved.connect(self.set_position)

        self.mediaPlayer.stateChanged.connect(self.mediastate_changed)
        self.mediaPlayer.positionChanged.connect(self.position_changed)
        self.mediaPlayer.durationChanged.connect(self.duration_changed)

        self.startCAM1.setEnabled(True)
        self.start_CAM2.setEnabled(True)
        self.start_CAM3.setEnabled(True)

        self.stopCAM1.setEnabled(False)
        self.stop_CAM2.setEnabled(False)
        self.stop_CAM3.setEnabled(False)

        #  create a timer
        self.timer = QTimer()
        self.timer2 = QTimer()
        self.timer3 = QTimer()
        # set timer timeout callback function
        self.timer.timeout.connect(self.viewCam)
        self.startCAM1.clicked.connect(self.start_view)
        self.stopCAM1.clicked.connect(self.stop_view)

        self.timer2.timeout.connect(self.viewCam2)
        self.start_CAM2.clicked.connect(self.start_view2)
        self.stop_CAM2.clicked.connect(self.stop_view2)

        self.timer3.timeout.connect(self.viewCam3)
        self.start_CAM3.clicked.connect(self.start_view3)
        self.stop_CAM3.clicked.connect(self.stop_view3)

        self.CAM1_Draw.mousePressEvent = self.mouseEventCAM1
        self.CAM2_Draw.mousePressEvent = self.mouseEventCAM2
        self.CAM3_Draw.mousePressEvent = self.mouseEventCAM3

        self.draw_CAM1.clicked.connect(self.startDrawAreaCAM1)
        self.remove_CAM1.clicked.connect(self.removeAreaCAM1)

        self.draw_CAM2.clicked.connect(self.startDrawAreaCAM2)
        self.remove_CAM2.clicked.connect(self.removeAreaCAM2)

        self.draw_CAM3.clicked.connect(self.startDrawAreaCAM3)
        self.remove_CAM3.clicked.connect(self.removeAreaCAM3)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)
        a = QVBoxLayout()
        a.addWidget(self.tabWidget)
        Form.setLayout(a)


# all function

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.CAM1.setText(_translate("Form", "Cam 1"))
        self.peoplecntBtn_1.setText(_translate("Form", "People Counting"))
        self.falldetectionBtn_1.setText(_translate("Form", "Fall Detection"))
        self.reIDBtn_1.setText(_translate("Form", "Person Re-ID"))
        self.stopCAM1.setText(_translate("Form", "Stop"))
        self.startCAM1.setText(_translate("Form", "Start"))
        self.areaprotectionBtn_1.setText(_translate("Form", "Area Protection"))

        self.CAM2.setText(_translate("Form", "cam 2"))
        self.peoplecntBtn_2.setText(_translate("Form", "People Counting"))
        self.falldetectionBtn_2.setText(_translate("Form", "Fall Detection"))
        self.reIDBtn_2.setText(_translate("Form", "Person Re-ID"))
        self.stop_CAM2.setText(_translate("Form", "Stop"))
        self.start_CAM2.setText(_translate("Form", "Start"))
        self.areaprotectionBtn_2.setText(_translate("Form", "Area Protection"))

        self.CAM3.setText(_translate("Form", "cam 3"))
        self.peoplecntBtn_3.setText(_translate("Form", "People Counting"))
        self.falldetectionBtn_3.setText(_translate("Form", "Fall Detection"))
        self.reIDBtn_3.setText(_translate("Form", "Person Re-ID"))
        self.stop_CAM3.setText(_translate("Form", "Stop"))
        self.start_CAM3.setText(_translate("Form", "Start"))
        self.areaprotectionBtn_3.setText(_translate("Form", "Area Protection"))

        self.CAM1_Draw.setText(_translate("Form", "cam 1"))
        self.draw_CAM1.setText(_translate("Form", "Draw"))
        self.remove_CAM1.setText(_translate("Form", "Clean"))

        self.CAM2_Draw.setText(_translate("Form", "cam 2"))
        self.draw_CAM2.setText(_translate("Form", "Draw"))
        self.remove_CAM2.setText(_translate("Form", "Clean"))

        self.CAM3_Draw.setText(_translate("Form", "cam 3"))
        self.draw_CAM3.setText(_translate("Form", "Draw"))
        self.remove_CAM3.setText(_translate("Form", "Clean"))

        self.tabWidget.setTabText(self.tabWidget.indexOf(self.multiTab),
                                  _translate("Form", "Multi_IPCam"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.playRec),
                                  _translate("Form", "Play Record"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.setting),
                                  _translate("Form", "Setting"))

    def open_file(self):
        filename, _ = QFileDialog.getOpenFileName(self, "Open Video")

        if filename != '':
            self.mediaPlayer.setMedia(
                QMediaContent(QUrl.fromLocalFile(filename)))
            self.playBtn.setEnabled(True)

    def play_video(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def stop_video(self):
        self.mediaPlayer.stop()

    def mediastate_changed(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPause))
        else:
            self.playBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaPlay))

    def position_changed(self, position):
        self.slider.setValue(position)

    def duration_changed(self, duration):
        self.slider.setRange(0, duration)

    def set_position(self, position):
        self.mediaPlayer.setPosition(position)
        print(position)

    def set_volume(self, volume):
        self.mediaPlayer.setVolume(volume)

    def mute(self):
        if not self.mediaPlayer.isMuted():
            self.mediaPlayer.setMuted(True)
            self.volumeBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaVolumeMuted))
        else:
            self.mediaPlayer.setMuted(False)
            self.volumeBtn.setIcon(self.style().standardIcon(
                QStyle.SP_MediaVolume))

    def handle_errors(self):
        self.playBtn.setEnabled(False)
        self.label.setText("Error: " + self.mediaPlayer.errorString())

        self.startCAM1.clicked.connect(self.start)
        self.stopCAM1.clicked.connect(self.stop)

    def fullscreen(self):
        if self.windowState() & Qt.WindowFullScreen:
            QApplication.setOverrideCursor(Qt.ArrowCursor)
            self.showNormal()
            print("no Fullscreen")
        else:
            Form.showFullScreen()
            QApplication.setOverrideCursor(Qt.BlankCursor)
            print("Fullscreen entered")

    def fast(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() + 10 * 60)

    def slow(self):
        self.mediaPlayer.setPosition(self.mediaPlayer.position() - 10 * 60)

    def image_to_QImage(self, image, label):
        # print(label.width(), label.height())
        # image = cv2.resize(image, (label.width(), label.height()))
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        height, width, channel = image.shape
        # print(height, width, channel)
        step = channel * width
        return QImage(image.data, width, height, step, QImage.Format_RGB888)

    def viewCam(self):
        ret, image = self.cap.read()
        self.outVivdeo.write(image)
        self.CAM1_Draw.setPixmap(
            QPixmap.fromImage(
                self.image_to_QImage(
                    self.drawArea(image, self.points_CAM1, self.CAM1_Draw),
                    self.CAM1_Draw)))
        self.CAM1.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))

    def start_view(self):
        if not self.timer.isActive():
            self.stopCAM1.setEnabled(True)
            self.startCAM1.setEnabled(False)
            self.cap = cv2.VideoCapture(IP_CAM_ADDRESS['CAM1'])
            self.flag_CAM1 = self.cap.isOpened()
            if self.cap.isOpened():
                now = datetime.now()
                self.savePath1 = self.createDir('IP_CAM_1')
                self.startTime1 = str(now.day) + ' - ' + str(
                    now.hour) + 'h' + str(now.minute) + ' - '
                # fourcc = cv2.VideoWriter_fourcc(*'mp4v')
                fourcc = cv2.VideoWriter_fourcc(*'XVID')
                self.outVivdeo = cv2.VideoWriter(
                    self.savePath1 + 'output.avi', fourcc, 30,
                    (int(self.cap.get(3)), int(self.cap.get(4))))
                self.timer.start(0)
            else:
                self.startCAM1.setEnabled(True)
                self.stopCAM1.setEnabled(False)
                image = cv2.imread('no-connection.jpg')
                self.CAM1.setPixmap(
                    QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))

    def stop_view(self):
        self.startCAM1.setEnabled(True)
        self.stopCAM1.setEnabled(False)
        self.timer.stop()
        self.cap.release()
        self.outVivdeo.release()
        print("ok")
        image = cv2.imread('stopVideo.png')
        self.CAM1.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM1)))
        print('ok2')
        now = datetime.now()
        fileName = self.startTime1 + str(now.hour) + 'h' + str(
            now.minute) + '.avi'
        os.rename(self.savePath1 + 'output.avi', self.savePath1 + fileName)

    def viewCam2(self):
        ret, image = self.cap2.read()
        self.outVivdeo2.write(image)
        self.CAM2_Draw.setPixmap(
            QPixmap.fromImage(
                self.image_to_QImage(
                    self.drawArea(image, self.points_CAM2, self.CAM2_Draw),
                    self.CAM2_Draw)))
        self.CAM2.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))

    def start_view2(self):
        if not self.timer2.isActive():
            self.stop_CAM2.setEnabled(True)
            self.start_CAM2.setEnabled(False)
            self.cap2 = cv2.VideoCapture(IP_CAM_ADDRESS['CAM2'])
            self.flag_CAM2 = self.cap2.isOpened()
            if self.cap2.isOpened():
                now = datetime.now()
                self.savePath2 = self.createDir('IP_CAM_2')
                self.startTime2 = str(now.day) + ' - ' + str(
                    now.hour) + 'h' + str(now.minute) + ' - '
                # fourcc = cv2.VideoWriter_fourcc(*'mp4v')
                fourcc = cv2.VideoWriter_fourcc(*'XVID')
                self.outVivdeo2 = cv2.VideoWriter(
                    self.savePath2 + 'output2.avi', fourcc, 30,
                    (int(self.cap2.get(3)), int(self.cap2.get(4))))
                self.timer2.start(0)
            else:
                self.start_CAM2.setEnabled(True)
                self.stop_CAM2.setEnabled(False)
                image = cv2.imread('no-connection.jpg')
                self.CAM2.setPixmap(
                    QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))

    def stop_view2(self):
        self.start_CAM2.setEnabled(True)
        self.stop_CAM2.setEnabled(False)
        self.timer2.stop()
        self.outVivdeo2.release()
        image = cv2.imread('stopVideo.png')
        self.CAM2.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM2)))
        self.cap2.release()
        now = datetime.now()
        fileName = self.startTime2 + str(now.hour) + 'h' + str(
            now.minute) + '.avi'
        os.rename(self.savePath2 + 'output2.avi', self.savePath2 + fileName)

    def viewCam3(self):
        ret, image = self.cap3.read()
        self.outVivdeo3.write(image)
        self.CAM3_Draw.setPixmap(
            QPixmap.fromImage(
                self.image_to_QImage(
                    self.drawArea(image, self.points_CAM3, self.CAM3_Draw),
                    self.CAM3_Draw)))
        self.CAM3.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM3)))

    def start_view3(self):
        if not self.timer3.isActive():
            self.stop_CAM3.setEnabled(True)
            self.start_CAM3.setEnabled(False)
            self.cap3 = cv2.VideoCapture(IP_CAM_ADDRESS['CAM3'])
            self.flag_CAM3 = self.cap3.isOpened()
            if self.cap3.isOpened():
                now = datetime.now()
                self.savePath3 = self.createDir('IP_CAM_3')
                self.startTime3 = str(now.day) + ' - ' + str(
                    now.hour) + 'h' + str(now.minute) + ' - '
                # fourcc = cv2.VideoWriter_fourcc(*'mp4v')
                fourcc = cv2.VideoWriter_fourcc(*'XVID')
                self.outVivdeo3 = cv2.VideoWriter(
                    self.savePath3 + 'output3.avi', fourcc, 30,
                    (int(self.cap3.get(3)), int(self.cap3.get(4))))
                self.timer3.start(0)
            else:
                self.start_CAM3.setEnabled(True)
                self.stop_CAM3.setEnabled(False)
                image = cv2.imread('no-connection.jpg')
                self.CAM3.setPixmap(
                    QPixmap.fromImage(self.image_to_QImage(image, self.CAM3)))

    def stop_view3(self):
        self.start_CAM3.setEnabled(True)
        self.stop_CAM3.setEnabled(False)
        self.timer3.stop()
        self.outVivdeo3.release()
        image = cv2.imread('stopVideo.png')
        self.CAM3.setPixmap(
            QPixmap.fromImage(self.image_to_QImage(image, self.CAM3)))
        self.cap3.release()
        now = datetime.now()
        fileName = self.startTime3 + str(now.hour) + 'h' + str(
            now.minute) + '.avi'
        os.rename(self.savePath3 + 'output3.avi', self.savePath3 + fileName)

    def createDir(self, IP_CAM_Number: str):
        now = datetime.now()
        year = now.year
        month = MONTH[now.month]

        curPath = os.getcwd()
        if not path.exists(curPath + '/IVA'):
            os.mkdir(curPath + '/IVA')
        if not path.exists(curPath + '/IVA/' + IP_CAM_Number):
            os.mkdir(curPath + '/IVA/' + IP_CAM_Number)

        # check path exists
        if path.exists(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year)):
            if path.exists(curPath + '/IVA/' + IP_CAM_Number + '/' +
                           str(year) + '/' + month):
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'
            else:
                os.mkdir(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year) +
                         '/' + month)
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'
        else:
            os.mkdir(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year))
            if path.exists(curPath + '/IVA/' + IP_CAM_Number + '/' +
                           str(year) + '/' + month):
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'
            else:
                os.mkdir(curPath + '/IVA/' + IP_CAM_Number + '/' + str(year) +
                         '/' + month)
                return curPath + '/IVA/' + IP_CAM_Number + '/' + str(
                    year) + '/' + month + '/'

    # Create Mouse Event for draw protected area
    def mouseEventCAM1(self, event):
        if self.remove_CAM1.isEnabled() and (
                not self.startCAM1.isEnabled()) and self.flag_CAM1 == True:
            x = event.pos().x()
            y = event.pos().y()
            self.points_CAM1.append([x, y])
            print("Position clicked is ({}, {})".format(x, y))

    def mouseEventCAM2(self, event):
        if self.remove_CAM2.isEnabled() and (
                not self.start_CAM2.isEnabled()) and self.flag_CAM2 == True:
            x = event.pos().x()
            y = event.pos().y()
            self.points_CAM2.append([x, y])
            print("Position clicked is ({}, {})".format(x, y))

    def mouseEventCAM3(self, event):
        if self.remove_CAM3.isEnabled() and (
                not self.start_CAM3.isEnabled()) and self.flag_CAM3 == True:
            x = event.pos().x()
            y = event.pos().y()
            self.points_CAM3.append([x, y])
            print("Position clicked is ({}, {})".format(x, y))

    def startDrawAreaCAM1(self):
        self.draw_CAM1.setEnabled(False)
        self.remove_CAM1.setEnabled(True)

    def removeAreaCAM1(self):
        while len(self.points_CAM1):
            self.points_CAM1.pop()
        self.draw_CAM1.setEnabled(True)
        self.remove_CAM1.setEnabled(False)

    def startDrawAreaCAM2(self):
        self.draw_CAM2.setEnabled(False)
        self.remove_CAM2.setEnabled(True)

    def removeAreaCAM2(self):
        while len(self.points_CAM2):
            self.points_CAM2.pop()
        self.draw_CAM2.setEnabled(True)
        self.remove_CAM2.setEnabled(False)

    def startDrawAreaCAM3(self):
        self.draw_CAM3.setEnabled(False)
        self.remove_CAM3.setEnabled(True)

    def removeAreaCAM3(self):
        while len(self.points_CAM3):
            self.points_CAM3.pop()
        self.draw_CAM3.setEnabled(True)
        self.remove_CAM3.setEnabled(False)

    def drawArea(self, image, points: list, qlabel: QtWidgets.QLabel):
        image_draw = image.copy()
        image_draw = cv2.resize(image_draw, (qlabel.width(), qlabel.height()))
        if len(points) > 1:
            cv2.polylines(image_draw, np.array([points]), 1, (255, 0, 0), 1)
            b, g, r = cv2.split(image_draw)
            cv2.fillPoly(b, np.array([points]), (0, 255, 0))
            cv2.fillPoly(r, np.array([points]), (0, 255, 0))
            image_draw = cv2.merge([b, g, r])
        return image_draw
Beispiel #52
0
class MainWindow(QMainWindow):
    """docstring for MainWindow"""

    def __init__(self):
        super(MainWindow, self).__init__()
        self.setupUi(self)

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(800, 600)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        gridlayout = QGridLayout(self.centralwidget)

        hlayout = QHBoxLayout()
        self.button1 = QPushButton(' add image ')
        self.button3 = QPushButton('add video')
        self.button2 = QPushButton('remove')
        self.playbutton = QPushButton('play')
        self.stopbutton = QPushButton('stop')

        hlayout.addWidget(self.button1)
        hlayout.addWidget(self.button3)
        hlayout.addWidget(self.button2)
        hlayout.addWidget(self.playbutton)
        hlayout.addWidget(self.stopbutton)

        self.scene = QGraphicsScene()
        self.item = QGraphicsPixmapItem()

        imgpath = 'C:\\Users\Administrator\Pictures\Saved Pictures\\1.jpg'
        self.item.setPixmap(QtGui.QPixmap(imgpath))
        self.scene.addItem(self.item)
        self.graphicsview = QGraphicsView()
        self.graphicsview.setScene(self.scene)
        self.tabwidget = QTabWidget()

        vlayout = QVBoxLayout()
        vlayout.addLayout(hlayout)
        vlayout.addWidget(self.tabwidget)

        MainWindow.setCentralWidget(self.centralwidget)
        gridlayout.addLayout(vlayout, 0, 0, 1, 1)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        self.button1.clicked.connect(self.addTab)
        self.button2.clicked.connect(self.closeTab)
        self.button3.clicked.connect(self.addVideo)
        self.playbutton.clicked.connect(self.palyMedia)
        self.stopbutton.clicked.connect(self.stopMedia)
        pass

    def addTab(self, signal):
        scene = QGraphicsScene()
        item = QGraphicsPixmapItem()
        # imgpath = 'C:/Users/liesmars/Desktop/1.jpg'

        item.setPixmap(QtGui.QPixmap(imgpath))
        scene.addItem(item)
        graphicsview = QGraphicsView()
        graphicsview.setScene(scene)
        self.tabwidget.addTab(graphicsview, "tab2")
        self.tabwidget.setCurrentWidget(graphicsview)

    def addVideo(self, signal):
        videowidget = QVideoWidget()
        self.videoplayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.videoplayer.setVideoOutput(videowidget)
        # videopath = 'C:/Users/liesmars/Desktop/1.mp4'
        self.videoplayer.setMedia(QMediaContent(QUrl.fromLocalFile(videopath)))

        self.tabwidget.addTab(videowidget, "tab4")
        self.tabwidget.setCurrentWidget(videowidget)

    def closeTab(self):
        tabID = self.tabwidget.currentIndex()
        self.tabwidget.removeTab(tabID)
        pass

    def palyMedia(self, signal):
        self.videoplayer.play()
        pass

    def stopMedia(self, signal):
        self.videoplayer.pause()
        pass
Beispiel #53
0
class DPlayerCore(QWidget):
    def __init__(self):
        """Initialize player and load playlist if any."""
        super().__init__()

        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist()
        self.player.setPlaylist(self.playlist)

        self.shuffling = False
        self.repeatingPlaylist = False
        self.repeatingSong = False

        self.musicOrder = []
        self.loadPlaylist(QUrl(
            'file://{}/lastListened.m3u'.format(os.getcwd())))

        self.lyricsApi = 'http://api.musixmatch.com/ws/1.1/'
        self.lyricsApiKey = '4b364f0652e471aa50813a22cdf830ea'
        self.lastFMapi = 'http://ws.audioscrobbler.com/2.0/'
        self.lastFMapikey = '052c43a00a4fc294bb3c9e0c38bdf710'
        self.lastFMsecret = '14c66392fa9c6c142a41ccc2b0674e19'
        self.username = None
        self.password = None
        self.network = None
        self.error = 'Something went wrong! Try again later.'

    def play(self):
        """Start the player."""
        self.player.play()

    def pause(self):
        """Pause the player."""
        self.player.pause()

    def stop(self):
        """Stop the player."""
        self.player.stop()

    def previous(self):
        """Play previous song."""
        self.playlist.previous()

    def next(self):
        """Play next song."""
        self.playlist.next()

    def mute(self):
        """Mute the player."""
        self.player.setMuted(True)

    def unmute(self):
        """Unmute the player."""
        self.player.setMuted(False)

    def setVolume(self, value):
        """Set player's volume to value."""
        self.player.setVolume(value)

    def add(self, fileNames):
        """Add fileNames to the playlist."""
        for name in fileNames:
            url = QUrl.fromLocalFile(QFileInfo(name).absoluteFilePath())
            self.playlist.addMedia(QMediaContent(url))
            self.musicOrder.append([name])

        self.added(len(fileNames))

    def added(self, added):
        """Saves music info in musicOrder."""
        for name, index in zip(
                self.musicOrder[self.playlist.mediaCount() - added:],
                range(self.playlist.mediaCount() - added,
                      len(self.musicOrder))):
            name = name[0]
            artist = self.getArtist(name)[0]
            title = self.getTitle(name)[0]
            album = self.getAlbum(name)[0]
            seconds = self.getDuration(name)
            duration = QTime(0, seconds // 60, seconds % 60)
            duration = duration.toString('mm:ss')
            self.musicOrder[index].extend(
                [artist, title, album, duration])

    def remove(self, songIndexes):
        """Remove songIndexes from the playlist."""
        for index in songIndexes:
            self.songChanged = True
            del self.musicOrder[index]
            self.playlist.removeMedia(index)
        self.songChanged = False

    def savePlaylist(self, path):
        """Save playlist to path."""
        if path.toString()[len(path.toString()) - 4:] != '.m3u':
            path = QUrl('{}.m3u'.format(path.toString()))
        self.playlist.save(path, 'm3u')

    def loadPlaylist(self, path):
        """Load playlist form path."""
        count = self.playlist.mediaCount()
        self.playlist.load(path)

        for index in range(count, self.playlist.mediaCount()):
            self.musicOrder.append(
                [self.playlist.media(index).canonicalUrl().path()])

        self.added(self.playlist.mediaCount() - count)

    def clearPlaylist(self):
        """Delete all songs in the playlist."""
        self.playlist.clear()
        self.musicOrder = []

    def shuffle(self, value):
        """Shuffle playlist if value = True."""
        self.shuffling = value

        if self.repeatingSong:
            return
        if self.shuffling:
            self.playlist.setPlaybackMode(QMediaPlaylist.Random)
        elif self.repeatingPlaylist:
            self.playlist.setPlaybackMode(QMediaPlaylist.Loop)
        else:
            self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)

    def repeatPlaylist(self, value):
        """Repeat playlist after the last song is finished if value = True."""
        self.repeatingPlaylist = value

        if self.repeatingSong or self.shuffling:
            return
        if self.repeatingPlaylist:
            self.playlist.setPlaybackMode(QMediaPlaylist.Loop)
        else:
            self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)

    def repeatSong(self, value):
        """Repeat current song if value = True."""
        self.repeatingSong = value

        if self.repeatingSong:
            self.playlist.setPlaybackMode(QMediaPlaylist.CurrentItemInLoop)
        elif self.shuffling:
            self.playlist.setPlaybackMode(QMediaPlaylist.Random)
        elif self.repeatingPlaylist:
            self.playlist.setPlaybackMode(QMediaPlaylist.Loop)
        else:
            self.playlist.setPlaybackMode(QMediaPlaylist.Sequential)

    def sort(self, column, order):
        """Sort playlist by column in order."""
        ordered = sorted(self.musicOrder, key=itemgetter(column + 1),
                         reverse=order)

        self.clearPlaylist()
        for song in ordered:
            url = QUrl.fromLocalFile(QFileInfo(song[0]).absoluteFilePath())
            self.playlist.addMedia(QMediaContent(url))

        self.musicOrder = ordered

    def findLyrics(self, index):
        """Returns lyrics for song at index."""
        if self.musicOrder[index][2] == 'Unknown':
            return 'Unknown song.'

        searchSong = '{}track.search?q_track={}'.format(
            self.lyricsApi, self.musicOrder[index][2].replace(' ', '%20'))
        if self.musicOrder[index][1] != 'Unknown':
            searchSong = '{}&q_artist={}'.format(
                searchSong, self.musicOrder[index][1].replace(' ', '%20'))
        searchSong = '{}&f_has_lyrics=1&apikey={}'.format(
            searchSong, self.lyricsApiKey)

        try:
            requestSong = requests.get(searchSong)
        except requests.ConnectionError:
            return self.error

        songJson = requestSong.json()
        if requestSong.status_code != 200 or \
                songJson['message']['header']['available'] == 0:
            return self.error

        songId = songJson[
            'message']['body']['track_list'][0]["track"]["track_id"]
        searchLyrics = '{}track.lyrics.get?track_id={}&apikey={}'.format(
            self.lyricsApi, songId, self.lyricsApiKey)

        try:
            requestLyrics = requests.get(searchLyrics)
        except requests.ConnectionError:
            return self.error

        if requestLyrics.status_code != 200 or \
                songJson['message']['header']['available'] == 0:
            return self.error
        return requestLyrics.json()[
            'message']['body']['lyrics']['lyrics_body'][:-58]  # spam and bacon

    def findInfo(self, index):
        """Returns info about artist and album for index if any."""
        info = []

        if self.musicOrder[index][1] != 'Unknown':
            artist = self.artistInfo(self.musicOrder[index][1])
            if artist != self.error:
                info += artist

        if self.musicOrder[index][1] != 'Unknown' and \
                self.musicOrder[index][3] != 'Unknown':
            album = self.albumInfo(self.musicOrder[index][1],
                                   self.musicOrder[index][3])
            if album != self.error:
                info += album

        if info:
            return info
        else:
            return ['Unknown artist and song!']

    def artistInfo(self, artist):
        """Returns info about artist if any."""
        try:
            response = requests.get(
                ('{}/?method=artist.getinfo&artist={}&api_key={}&'
                    'format=json&autocorrect=1').format(
                    self.lastFMapi, artist, self.lastFMapikey))
        except Exception:
            return self.error

        if response.status_code != 200:
            return self.error

        artist = 'Artist: {}'.format(response.json()['artist']['name'])
        bio = 'Bio: {}'.format(
            response.json()['artist']['bio']['summary'].replace('.', '.\n'))
        spam = bio.find('<a')
        bio = bio[:spam]

        return [artist, bio]

    def albumInfo(self, artist, album):
        """Returns info about album if any."""
        try:
            response = requests.get(
                ('{}/?method=album.getinfo&artist={}&album={}&api_key={}&'
                    'format=json&autocorrect=1').format(
                    self.lastFMapi, artist, album, self.lastFMapikey))
        except Exception:
            return self.error

        if response.status_code != 200 or \
                'album' not in response.json().keys():
            return self.error

        album = 'Album: {}'.format(response.json()['album']['name'])
        tracks = ['Tracks: ']
        t = response.json()['album']['tracks']['track']
        for track, index in zip(t, range(len(t))):
            tracks.append('{}. {}'.format(index + 1, track['name']))

        info = [album, '\n'.join(tracks)]

        if 'wiki' in response.json()['album'].keys():
            wiki = response.json()['album']['wiki']
            if 'published' in wiki.keys():
                info.append('Published: {}'.format(wiki['published']))
            if 'summary' in wiki.keys():
                summary = wiki['summary'].replace('.', '.\n')
                spam = summary.find('<a')
                info.append('Summary: {}'.format(summary[:spam]))
            if 'Musical style' in wiki.keys():
                info.append('Musical style: {}'.format(wiki['Musical style']))

        return info

    def login(self, username, password):
        """Creates lastFM network."""
        self.username = username
        self.password = pylast.md5(password)
        try:
            self.network = pylast.LastFMNetwork(api_key=self.lastFMapikey,
                                                api_secret=self.lastFMsecret,
                                                username=self.username,
                                                password_hash=self.password)
        except Exception:
            self.username = None
            self.password = None
            self.network = None
            return False
        return True

    def logout(self):
        """Destoys lastFM network and current user info."""
        self.username = None
        self.password = None
        self.network = None

    def loveTrack(self, index):
        """Love track at index in lastFM."""
        if self.network is None:
            return False

        track = self.network.get_track(self.musicOrder[index][1],
                                       self.musicOrder[index][2])
        try:
            track.love()
        except Exception:
            return False
        return True

    def unloveTrack(self, index):
        """Unlove track at index in lastFM."""
        if self.network is None:
            return False

        track = self.network.get_track(self.musicOrder[index][1],
                                       self.musicOrder[index][2])
        try:
            track.unlove()
        except Exception:
            return False
        return True

    def isMuted(self):
        """Returns True if player is muted."""
        return self.player.isMuted()

    def getArtist(self, song):
        """Returns the artist of song."""
        if song[-4:] == '.mp3':
            obj = EasyID3(song)
            if 'artist' in obj.keys():
                return obj['artist']
        elif 'TAG' in mediainfo(song).keys():
            obj = mediainfo(song)['TAG']
            if 'artist' in obj.keys():
                return [obj['artist']]
            elif 'ARTIST' in obj.keys():
                return [obj['ARTIST']]
            else:
                return ['Unknown']
        else:
            return ['Unknown']

    def getTitle(self, song):
        """Returns the title of song."""
        if song[-4:] == '.mp3':
            obj = EasyID3(song)
            if 'title' in obj.keys():
                return obj['title']
        elif 'TAG' in mediainfo(song).keys():
            obj = mediainfo(song)['TAG']
            if 'title' in obj.keys():
                return [obj['title']]
            elif 'TITLE' in obj.keys():
                return [obj['TITLE']]
            else:
                return ['Unknown']
        else:
            return ['Unknown']

    def getAlbum(self, song):
        """Returns the album of song."""
        if song[-4:] == '.mp3':
            obj = EasyID3(song)
            if 'album' in obj.keys():
                return obj['album']
        elif 'TAG' in mediainfo(song).keys():
            obj = mediainfo(song)['TAG']
            if 'album' in obj.keys():
                return [obj['album']]
            elif 'ALBUM' in obj.keys():
                return [obj['ALBUM']]
            else:
                return ['Unknown']
        else:
            return ['Unknown']

    def getDuration(self, song):
        """Returns the duration of song."""
        if song[-4:] == '.mp3':
            return MP3(song).info.length
        return int(float(mediainfo(song)['duration']))
Beispiel #54
0
class ApplicationWindow(QtWidgets.QMainWindow):
    global wavFileName
    global fig,chartFig
    global duration, counterClick
    global colorName, text_
    global startAnnotation, endTimeToPlay

    # >> QtMultimedia Signals
    #----------------------
    play = pyqtSignal()
    pause = pyqtSignal()
    stop = pyqtSignal()

    def __init__(self):
        global playerStarted
        global wavFileName, fig, chartFig
        global playerStarted, durationFlag, duration
        global colorName, text_, counterClick
        global startAnnotation, endTimeToPlay

        QtWidgets.QMainWindow.__init__(self)
        self.setAttribute(QtCore.Qt.WA_DeleteOnClose)

        self.main_widget = QtWidgets.QWidget(self)
        playerStarted = False

        #DEFINE PLAYER-PLAYLIST   
        #----------------------
        self.source = QtCore.QUrl.fromLocalFile(os.path.abspath(wavFileName))
        self.content = QMediaContent(self.source)
        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist(self)
        self.playlist.addMedia(self.content)
        self.player.setPlaylist(self.playlist)

        # >> Define annotations and gantt chart 
        #---------------------- 
        self.wave = Waveform()
        fig = self.wave
        self.chart = Chart()
        chartFig = self.chart

        # >> Define player buttons 
        #---------------------- 
        playButton = QPushButton("Play")
        pauseButton = QPushButton("Pause")
        stopButton = QPushButton("Stop")

        # >> Define layouts 
        #---------------------- 
        waveLayout = QVBoxLayout()
        waveLayout.addWidget(self.wave)
        waveLayout.addWidget(self.chart)

        line = QFrame()
        line.setFrameShape(QFrame.VLine)
        line.setSizePolicy(QSizePolicy.Minimum,QSizePolicy.Expanding)
        waveLayout.addWidget(line)

        #Buttons layout
        buttonLayout = QVBoxLayout()
        buttonLayout.addWidget(playButton)
        buttonLayout.addWidget(pauseButton)
        buttonLayout.addWidget(stopButton)
        buttonLayout.setAlignment(Qt.AlignTop)


        # >> Specify final layout align 
        #----------------------
        layout = QHBoxLayout(self.main_widget)
        layout.addLayout(waveLayout)
        layout.addLayout(buttonLayout)
        
        # >> Define buttons connections 
        #---------------------- 
        playButton.clicked.connect(self.Play)
        pauseButton.clicked.connect(self.Pause)
        stopButton.clicked.connect(self.Stop)


        self.main_widget.setFocus()
        self.setCentralWidget(self.main_widget)


    # PLAYER BUTTON FUNCTIONS

    # >> Play audio (whole signal or segment) 
    #---------------------- 
    def Play(self):
        global playerStarted
        global durationFlag
        global duration, counterClick
        global startTimeToPlay, endTimeToPlay, first

        #GET CLICKS FROM WAVEFORM
        #---------------------- 
        #Initialize connection-position ONCE
        if not playerStarted:
            #10ms for changePosition -> Not Delaying
            self.player.positionChanged.connect(self.checkPositionToStop)
            self.player.setNotifyInterval(10)
            if durationFlag==0:
                playerStarted = True
                startTimeToPlay = 0
                self.start = startTimeToPlay
                self.end = duration*1000 - 10
                endTimeToPlay = self.end
                counterClick = 3
            elif durationFlag==1:
                playerStarted = True
                self.start = startTimeToPlay
                self.end = duration*1000 - 10
                endTimeToPlay = self.end
                counterClick = 3
            elif durationFlag==2:
                playerStarted = True
                self.start = startTimeToPlay
                self.end = endTimeToPlay
            self.player.setPosition(self.start)

        playFlag = True
        self.player.play()

    # >> Pause audio playing 
    #----------------------
    def Pause(self):
        #Not begging from self.start
        playerStarted = True
        self.player.setPosition(self.time_)
        self.player.pause()

    # >> Stop audio playing 
    #----------------------
    def Stop(self):
        self.player.stop()
        #Begin again segment
        self.start = startTimeToPlay
        self.player.setPosition(self.start)

    # >> Check ms in audio to stop play 
    #----------------------
    def checkPositionToStop(self):
        self.time_ = self.player.position()
        print self.time_
        if self.time_ >= self.end:
            self.Stop()
            self.player.setPosition(self.start)

    def fileQuit(self):
        self.close()

    def closeEvent(self, ce):
        self.fileQuit()
Beispiel #55
0
class Game(QObject):
    next_tetromino_updated = pyqtSignal(Tetromino)
    field_updated = pyqtSignal(list)
    score_updated = pyqtSignal(int)
    level_updated = pyqtSignal(int)
    lines_updated = pyqtSignal(int)
    stamped_tetromino = pyqtSignal()
    pre_clear = pyqtSignal(list)
    game_window_action = pyqtSignal(GameWindowAction)

    def __init__(self, height, width, main_window, start_level=0):
        QObject.__init__(self)

        self.tetris_music = str(Path(__file__).parent / "sounds" / "Tetris_theme.wav")

        self.playlist = QMediaPlaylist()
        self.playlist.addMedia(QMediaContent(QUrl.fromLocalFile(self.tetris_music)))
        self.playlist.setPlaybackMode(QMediaPlaylist.Loop)

        self.player = QMediaPlayer()
        self.player.setPlaylist(self.playlist)
        self.player.setVolume(50)

        self.main_window = main_window
        self.sound_manager = SoundManager(self)

        # Connections
        self.game_window_action.connect(self.sound_manager.on_game_window_action)
        self.next_tetromino_updated.connect(self.main_window.on_next_tetromino_update)
        self.field_updated.connect(self.main_window.on_field_update)
        self.score_updated.connect(self.main_window.on_score_update)
        self.level_updated.connect(self.main_window.on_level_update)
        self.lines_updated.connect(self.main_window.on_lines_update)
        self.lines_updated.connect(self.update_level)
        self.stamped_tetromino.connect(self.check_complete_lines)
        self.pre_clear.connect(self.main_window.pre_clear_animation)

        # https://tetris.wiki/Scoring
        self.line_score_base = [40, 100, 300, 1200]

        # https://tetris.wiki/Tetris_(Game_Boy)
        self.frames_per_second = 59.73
        self.level_speed_frames = [
            53,
            49,
            45,
            41,
            37,
            33,
            28,
            22,
            17,
            11,
            10,
            9,
            8,
            7,
            6,
            6,
            5,
            5,
            4,
            4,
            3,
        ]
        self.on_hard_dropping = False
        self.is_running = False
        self.height = height
        self.width = width
        self.playing_cursor = (0, 0)
        self.current_tetromino = None
        # PROPERTY!
        self._total_removed_lines = 0
        self.soft_drops = 0
        self.level = start_level
        # PROPERTY!
        self._score = 0
        self.field = [[0] * self.width for i in range(self.height)]
        self.initialise_field(self.field)

        self.pause = False
        self.move_timer = None
        self.collision_detected = False
        self.next_tetromino = Tetromino(choice(list(TetrominoType)))
        self.build_next_tetromino()

    def initialise_field(self, field):
        # initialise/draw walls and ground
        for h in range(self.height):
            field[h][0] = -1
            field[h][-1] = -1

        for w in range(self.width):
            field[-1][w] = -2

    def update_field(self):
        final_field = deepcopy(self.field)
        self.draw_shadow_tetromino(final_field)
        self.merge_tetromino_with_field(self.current_tetromino, final_field)
        self.field_updated.emit(final_field)

    def draw_shadow_tetromino(self, final_field):
        shadow_h, shadow_w = self.playing_cursor

        while self.is_possible((shadow_h, shadow_w), self.current_tetromino):
            shadow_h += 1

        shadow_h -= 1

        shadow_cursor = (shadow_h, shadow_w)

        self.merge_tetromino_with_field(self.current_tetromino, final_field, shadow_cursor)

    def on_game_over(self):
        self.sound_manager.on_game_window_action(GameWindowAction.GAME_OVER)

    def handle_input(self, key):
        # MOVE
        if (key == QtCore.Qt.Key_Left or key == QtCore.Qt.Key_A) and not self.pause:
            self.move(Action.LEFT)

        # MOVE
        elif (key == QtCore.Qt.Key_Right or key == QtCore.Qt.Key_D) and not self.pause:
            self.move(Action.RIGHT)

        # MOVE
        elif (key == QtCore.Qt.Key_Down or key == QtCore.Qt.Key_S) and not self.pause:
            self.move_timer.stop()
            self.move(Action.DOWN)
            self.move_timer.setInterval(self.calculate_move_speed())
            self.move_timer.start()
            self.soft_drops += 1

        # ROTATION
        elif key == QtCore.Qt.Key_K and not self.pause:
            if self.current_tetromino.tetromio_type == TetrominoType.O_BRICK:
                self.game_window_action.emit(GameWindowAction.NONSENSE_ROTATION)
            elif self.rotate_clockwise_tetromino():
                self.game_window_action.emit(GameWindowAction.ROTATION)

        # ROTATION
        elif key == QtCore.Qt.Key_J and not self.pause:
            if self.current_tetromino.tetromio_type == TetrominoType.O_BRICK:
                self.game_window_action.emit(GameWindowAction.NONSENSE_ROTATION)
            else:
                if self.rotate_counter_clockwise_tetromino():
                    self.game_window_action.emit(GameWindowAction.ROTATION)

        # HARD DROP
        elif key == QtCore.Qt.Key_Space and not self.pause:
            self.game_window_action.emit(GameWindowAction.HARD_DROP)
            self.move_timer.stop()
            self.move(Action.DROP)
            self.move_timer.setInterval(self.calculate_move_speed())
            self.move_timer.start()

        # PAUSE
        elif key == QtCore.Qt.Key_P:
            self.pause_game()

        if key != QtCore.Qt.Key_P and not self.pause:
            self.update_field()

    def pause_game(self, play_sound=True):
        self.pause = not self.pause

        if self.pause:
            if play_sound:
                self.game_window_action.emit(GameWindowAction.PAUSE_ACTIVED)

            self.move_timer.stop()
            self.main_window.game_timer.stop()
            self.main_window.write_pause()

            self.player.pause()
        else:
            self.player.play()

            if play_sound:
                self.game_window_action.emit(GameWindowAction.PAUSE_INACTIVATED)

            self.move_timer.start()
            self.main_window.game_timer.start()
            self.main_window.clear_pause_label()

    def rotate_clockwise_tetromino(self):
        return self._rotate(RotationType.CLOCKWISE)

    def rotate_counter_clockwise_tetromino(self):
        return self._rotate(RotationType.COUNTER_CLOCKWISE)

    def _rotate(self, rotation_type):
        rotated_tetromino = deepcopy(self.current_tetromino)
        rotated_tetromino.rotate(rotation_type)

        if self.is_possible(self.playing_cursor, rotated_tetromino):
            self.current_tetromino = rotated_tetromino
            return True

        return False

    def move(self, action=Action.DOWN):
        h, w = self.playing_cursor

        if action == Action.DOWN:
            h += 1
        elif action == Action.LEFT:
            w -= 1
        elif action == Action.RIGHT:
            w += 1
        elif action == Action.DROP:
            self.on_hard_dropping = True

            while self.move(Action.DOWN):
                pass

            # self.on_hard_dropping = False
            return

        new_pos = (h, w)

        if self.is_possible(new_pos, self.current_tetromino):
            self.playing_cursor = new_pos

            if not self.on_hard_dropping:
                self.update_field()

            return True
        else:
            if action != Action.LEFT and action != Action.RIGHT:
                self.collision_detected = True

            return False

    def calculate_move_speed(self):
        level = min(self.level, len(self.level_speed_frames) - 1)
        speed_frames = self.level_speed_frames[level]

        return (speed_frames / self.frames_per_second) * 1000  # ms

    def running(self):
        if not self.move_timer:
            self.move_timer = QTimer()
            self.move_timer.timeout.connect(self.move)
            self.move_timer.start(self.calculate_move_speed())
            self.update_field()

            # if first round, start in pause-mode
            if self.main_window.rounds == 1:
                self.pause_game()

        if self.collision_detected:
            self.stamp_tetromino()

            # spawn next tetomino
            self.collision_detected = self.build_next_tetromino()

            self.is_running = not self.collision_detected

        return self.is_running

    def build_next_tetromino(self):
        next_tetromino = self.next_tetromino
        self.next_tetromino = Tetromino(choice(list(TetrominoType)))
        if self.spawn(next_tetromino):
            self.update_field()
            self.next_tetromino_updated.emit(self.next_tetromino)
            return False
        else:
            # draw collided tetromino in spawn (game over collision)
            self.update_field()
            return True

    def spawn(self, tetromino, pos=None):
        # https://tetris.fandom.com/wiki/Tetris_Guideline
        # (last visit 2020-03-14)
        self.current_tetromino = tetromino
        tetromino_type = tetromino.tetromio_type

        if pos:
            self.playing_cursor = pos
        else:
            if tetromino_type == TetrominoType.I_BRICK:
                self.playing_cursor = (0, 4)
            elif tetromino_type == TetrominoType.J_BRICK:
                self.playing_cursor = (1, 4)
            elif tetromino_type == TetrominoType.L_BRICK:
                self.playing_cursor = (1, 4)
            elif tetromino_type == TetrominoType.O_BRICK:
                self.playing_cursor = (1, 4)
            elif tetromino_type == TetrominoType.S_BRICK:
                self.playing_cursor = (1, 4)
            elif tetromino_type == TetrominoType.T_BRICK:
                self.playing_cursor = (1, 4)
            elif tetromino_type == TetrominoType.Z_BRICK:
                self.playing_cursor = (1, 4)
            else:
                raise "UNKNOWN TETROMINO"

        return self.is_possible(self.playing_cursor, self.current_tetromino)

    def is_possible(self, pos, tetromino):
        future_cursor_h, future_cursor_w = pos

        tetromino_h = len(tetromino.brick_matrix)
        tetromino_w = len(tetromino.brick_matrix[0])

        for h in range(tetromino_h):
            for w in range(tetromino_w):
                value = tetromino.brick_matrix[h][w]

                if value != 0:
                    if (future_cursor_h + h) not in range(self.height) or (
                            future_cursor_w + w
                    ) not in range(self.width):
                        return False

                    field_value = self.field[future_cursor_h + h][future_cursor_w + w]

                    if field_value != 0:
                        return False

        return True

    def stamp_tetromino(self):
        if self.on_hard_dropping:
            self.on_hard_dropping = False
        else:
            self.game_window_action.emit(GameWindowAction.STAMP)

        self.merge_tetromino_with_field(self.current_tetromino, self.field)
        self.stamped_tetromino.emit()
        self.score += self.soft_drops
        self.soft_drops = 0

    def check_complete_lines(self):
        complete_lines = []

        for h in reversed(range(self.height - 1)):
            completed_line = True

            for w in range(1, self.width - 1):
                if self.field[h][w] == 0:
                    completed_line = False
                    break

            if completed_line:
                complete_lines.append(h)

        cnt_complete_lines = len(complete_lines)
        if cnt_complete_lines > 0:
            if cnt_complete_lines == 1:
                self.game_window_action.emit(GameWindowAction.SINGLE_LINE_CLEAR)
            elif cnt_complete_lines == 2:
                self.game_window_action.emit(GameWindowAction.DOUBLE_LINE_CLEAR)
            elif cnt_complete_lines == 3:
                self.game_window_action.emit(GameWindowAction.TRIPLE_LINE_CLEAR)
            else:
                self.game_window_action.emit(GameWindowAction.TETRIS_LINE_CLEAR)

            self.remove_complete_lines(complete_lines)

    def remove_complete_lines(self, complete_lines):
        self.update_field()
        self.main_window.pre_clear_animation(complete_lines)

        new_field = [[0] * self.width for i in range(self.height)]
        self.initialise_field(new_field)

        row_behind = 0
        for h in reversed(range(self.height - 1)):
            if h in complete_lines:
                row_behind += 1
                continue

            for w in range(1, self.width - 1):
                new_field[h + row_behind][w] = self.field[h][w]

        self.field = new_field
        calculated_score = self.line_score_base[len(complete_lines) - 1] * (
                self.level + 1
        )

        self.score += calculated_score
        self.total_removed_lines += len(complete_lines)

    @property
    def total_removed_lines(self):
        return self._total_removed_lines

    @total_removed_lines.setter
    def total_removed_lines(self, value):
        self._total_removed_lines = value
        self.lines_updated.emit(self._total_removed_lines)

    @property
    def score(self):
        return self._score

    @score.setter
    def score(self, value):
        self._score = value
        self.score_updated.emit(self._score)

    def update_level(self):
        old_level = self.level

        self.level = self.total_removed_lines // 10

        if old_level < self.level:
            self.game_window_action.emit(GameWindowAction.LEVEL_UP)

            self.level_updated.emit(self.level)
            self.update_speed()

    def update_speed(self):
        self.move_timer.setInterval(self.calculate_move_speed())

    def merge_tetromino_with_field(self, tetromino, field, shadowed_pos=None):
        if shadowed_pos:
            cursor_h, cursor_w = shadowed_pos
        else:
            cursor_h, cursor_w = self.playing_cursor

        tetromino_h = len(tetromino.brick_matrix)
        tetromino_w = len(tetromino.brick_matrix[0])

        try:
            for h in range(tetromino_h):
                for w in range(tetromino_w):
                    if (cursor_h + h) in range(self.height) and (cursor_w + w) in range(
                            self.width
                    ):
                        value = tetromino.brick_matrix[h][w]

                        if value != 0:
                            if shadowed_pos:
                                field[cursor_h + h][cursor_w + w] = -3
                            else:
                                field[cursor_h + h][cursor_w + w] = value
        except Exception as e:
            print(e)
class VideoPlayer(QWidget):

    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        self.videoItem = QGraphicsVideoItem()
        self.videoItem.setSize(QSizeF(640, 480))

        scene = QGraphicsScene(self)
        graphicsView = QGraphicsView(scene)

        scene.addItem(self.videoItem)

        rotateSlider = QSlider(Qt.Horizontal)
        rotateSlider.setRange(-180,  180)
        rotateSlider.setValue(0)
        rotateSlider.valueChanged.connect(self.rotateVideo)

        openButton = QPushButton("Open...")
        openButton.clicked.connect(self.openFile)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(graphicsView)
        layout.addWidget(rotateSlider)
        layout.addLayout(controlLayout)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(self.videoItem)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)

    def sizeHint(self):
        return QSize(800, 600)

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                QDir.homePath())

        if fileName != '':
            self.mediaPlayer.setMedia(
                    QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def rotateVideo(self, angle):
        x = self.videoItem.boundingRect().width() / 2.0
        y = self.videoItem.boundingRect().height() / 2.0

        self.videoItem.setTransform(
                QTransform().translate(x, y).rotate(angle).translate(-x, -y))
Beispiel #57
0
class MyForm(QMainWindow):
    def __init__(self):
        super().__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.ui.lineEdit.textChanged.connect(self.aramaMetniDegistir)
        self.ui.listWidget.itemClicked.connect(self.listedeKiElemanSecildi)
        self.ui.comboBox.activated.connect(self.comboBoxTiklama)
        self.ui.actionKategori_Ekle.triggered.connect(self.yeniKategoriEkle)
        self.ui.actionKategori_Sil.triggered.connect(self.kategoriSil)
        self.ui.actionKategori_Duzenle.triggered.connect(self.kategoriDuzenle)
        self.ui.actionCoktanSecmeliSinav.triggered.connect(self.sinavCoktanSecmeli)
        self.ui.actionHafizaOyunu.triggered.connect(self.hafizaOyunuAc)
        self.ui.actionHafizaOyunu2.triggered.connect(self.hafizaOyunuAc2)
        self.ui.actionKisaCevap.triggered.connect(self.kisacevapOyunuAc)

        self.ui.actionYardim.triggered.connect(self.Yardim)
        self.ui.actionHakkinda.triggered.connect(self.Hakkinda)
        self.ui.actionKelime_Ekle.triggered.connect(self.yeniKelimeEkle)
        self.ui.actionKelime_Sil.triggered.connect(self.kelimeSil)
        self.ui.actionKelime_Duzenle.triggered.connect(self.kelimeDuzenle)

        self.secilenKelime = Kelime()
        self.secilenKategori = Kategori()
        self.yeniKategori = Kategori()

        self.silinecekKategori = Kategori()
        self.kelimeListesi = []
        self.kategoriListesi = []
        self.seciliListe = []
        self.listeleriHazirla()

        self.listeyiHazirla()
        self.comboListeHazirla()

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)
        self.videoWidget = QVideoWidget()

        self.buton = KayitButonu(self)
        self.buton.setIcon(QIcon('micro.png'))
        self.buton.setIconSize(QSize(40, 40))
        self.buton.setGeometry(0, 0, 50, 50)
        self.buton.setStyleSheet('border-radius:60')
        self.buton.setCursor(QCursor(Qt.PointingHandCursor))
        self.buton.setFixedSize(self.buton.size())
        self.buton.setEnabled(True)
        self.buton.clicked.connect(self.butonTiklandi)

        self.progress = QProgressBar(self, minimum=0, maximum=0, objectName="RedProgressBar")
        self.progress.setGeometry(0, 0, 300, 25)
        self.progress.setMaximum(5)
        self.progress.setFormat('')
        self.progress.setStyleSheet("#RedProgressBar::chunk {"
                                    "background-color: #F44336;"
                                    "}")

        hBox = QHBoxLayout()
        hBox.setContentsMargins(0, 0, 0, 0)
        hBox.addWidget(self.buton)
        hBox.setAlignment(Qt.AlignHCenter)
        hBox2 = QHBoxLayout()
        hBox2.setContentsMargins(0, 0, 0, 0)
        hBox2.addWidget(self.progress)
        hBox2.setAlignment(Qt.AlignHCenter)
        hBox3 = QHBoxLayout()
        hBox3.setContentsMargins(0, 2, 0, 2)

        hBox3.setAlignment(Qt.AlignHCenter)

        vBoxLayout = QVBoxLayout()
        vBoxLayout.addLayout(hBox)
        vBoxLayout.addLayout(hBox2)
        vBoxLayout.addLayout(hBox3)
        vBoxLayout.addWidget(self.videoWidget)

        self.ui.layout.addLayout(vBoxLayout)
        self.mediaPlayer.setVideoOutput(self.videoWidget)
        self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile("VIDEOLAR\MERHABA.mp4")))
        self.progress.hide()
        self.videoWidget.show()
        self.mediaPlayer.play()
        self.videoWidget.show()
        self.show()

    def recognize_speech_from_mic(self, recognizer, microphone):
        if not isinstance(recognizer, sr.Recognizer):
            raise TypeError("`recognizer` must be `Recognizer` instance")
        if not isinstance(microphone, sr.Microphone):
            print('HATA 2')
            raise TypeError("`microphone` must be `Microphone` instance")

        response = {"success": True, "error": None, "transcription": None}

        try:
            with microphone as source:
                recognizer.adjust_for_ambient_noise(source)
                audio = recognizer.listen(source, timeout=4)
        except sr.WaitTimeoutError:
            response["error"] = "Zamanında kelime söylemediniz."
            # self.uyariLbl.setText(response["error"])
            # self.uyariLbl.show()
            self.buton.setIcon(QIcon('micro.png'))

        except:
            print("Bir şeyler ters gitti. Tekrar deneyin.")
            # self.uyariLbl.show()
            self.buton.setIcon(QIcon('micro.png'))
        else:
            try:
                response["transcription"] = recognizer.recognize_google(audio, language='tr')
            except sr.RequestError:
                response["success"] = False
                response["error"] = "API hatası! Arayüze ulaşılamadı."
                # self.uyariLbl.setText(response["error"])
                # self.uyariLbl.show()
            except sr.UnknownValueError:
                response["error"] = "Konuşmanız anlaşılamadı."
                # self.uyariLbl.setText(response["error"])
                # self.uyariLbl.show()
        return response

    def sesleAra(self):

        # self.uyariLbl.hide()

        recognizer = sr.Recognizer()
        microphone = sr.Microphone()

        self.guess = self.recognize_speech_from_mic(recognizer, microphone)
        if not self.guess["transcription"] or not self.guess["success"]:
            print("anlaşılamadı")
            # self.uyariLbl.show()
        elif self.guess["error"]:
            print(self.guess["error"])
            # self.uyariLbl.show()
        else:
            try:
                yol = seslearamavb.yolDondur(self.guess["transcription"])
                self.videoyuOynat(yol)
                self.ui.listWidget.clear()
                self.ui.lineEdit.setText(self.guess["transcription"])
            except Exception as e:
                self.ui.lineEdit.setText("Sözcük Bulunamadı")


        self.buton.setIcon(QIcon('micro.png'))
        self.buton.setEnabled(True)

    def onCountChanged(self, value):
        self.progress.setValue(value)

    def onButtonClick(self):
        self.calc = External()
        self.calc.countChanged.connect(self.onCountChanged)
        self.calc.start()

    def butonTiklandi(self):
        self.progress.show()
        thread = threading.Thread(target=self.sesleAra)
        thread.start()
        self.onButtonClick()

    def listeleriHazirla(self):
        try:
            kelimeListesiTupple = KelimeBLL.KelimeleriListele()
            kategoriListesiTupple = KategoriBLL.KategorileriListele()
            self.kelimeListesi = [item[0] for item in kelimeListesiTupple]
            self.kategoriListesi = [item[0] for item in kategoriListesiTupple]
            self.kategoriListesi.insert(0, "Kategori Seçin")
        except Exception as exp:
            print(exp)

    def yeniKelimeEkle(self):
        try:
            self.yenikelimeEkle = YeniKelimeEkle()
            self.yenikelimeEkle.show()
            if self.yenikelimeEkle.close:
                print("Deneme")
        except Exception as e:
            print(e)
        donusDurumu=self.yenikelimeEkle.exec_()
        if  donusDurumu== 1:
            QMessageBox.information(self, "Yeni Kelime", "Yeni Kelime Eklendi")
        else:
            QMessageBox.warning(self, "Yeni Kelime", "Yeni kelime eklenemedi.")
        self.listeleriHazirla()
        self.comboListeHazirla()
        self.listeyiHazirla()


    def kelimeSil(self):
        try:
            self.kelimeSil = SilinecekKelimeForm()
            self.kelimeSil.show()

        except Exception as e:
            print(e)
        donusDurumu = self.kelimeSil.exec_()
        if donusDurumu == 1:
            QMessageBox.information(self, "Kelime Sil", "Kelime Silindi")
        else:
            QMessageBox.warning(self, "Kelime Sil", "Kelime Silinemedi.")

        self.listeleriHazirla()
        self.comboListeHazirla()
        self.listeyiHazirla()

    def kelimeDuzenle(self):

        print("Kelime Düzenle menü basıldı")
        try:
            self.KelimeDuzenle = DuzenlenecekKelimeForm()
            print("Kelime Düzenle yaratıldı")
            self.KelimeDuzenle.show()
            if self.KelimeDuzenle.close:
                print("Kelime Düzenle Kapatıldı")
        except Exception as e:
            print(e)

        donusDurumu= self.KelimeDuzenle.exec_()
        if donusDurumu== 1:
            QMessageBox.information(self, "Kelime Düzenle", "Kelime Düzeltildi.")
        else:
            QMessageBox.warning(self, "Kelime Düzenle", "Kelime Düzenlenemedi.")

        self.listeleriHazirla()
        self.comboListeHazirla()
        self.listeyiHazirla()

    def kategoriDuzenle(self):

        try:
            self.kategoriDuzenle = KategoriDuzenle()
            self.kategoriDuzenle.show()
            if self.kategoriDuzenle.close:
                print("Deneme")
        except Exception as e:
            print(e)

        donusDurumu = self.kategoriDuzenle.exec_()
        if donusDurumu == 1:

            QMessageBox.information(self, "Kategori Düzenle", "Kategori Düzenlendi.")
        else:
            QMessageBox.warning(self, "Kategori Düzenle", "Kategori Düzenlenemedi.")

        self.listeleriHazirla()
        self.comboListeHazirla()
        self.listeyiHazirla()


    def yeniKategoriEkle(self):
        try:
            self.yeniKategoriEkle = YeniKategoriEkle()
            self.yeniKategoriEkle.show()

            if self.yeniKategoriEkle.close:
                print("Yeni Kategori Sayfası kapatıldı.")

        except Exception as e:
            print(e)
        donusDurumu = self.yeniKategoriEkle.exec_()
        if donusDurumu == 1:
            QMessageBox.information(self, "Yeni Kelime", "Yeni Kelime Eklendi")
        else:
            QMessageBox.warning(self, "Yeni Kategori", "Yeni Kategori Eklenemedi")

        self.listeleriHazirla()
        self.listeyiHazirla()
        self.comboListeHazirla()

    def kategoriSil(self):
        try:
            self.kategoriSil = KategoriSil()
            self.kategoriSil.show()
            donusDurumu = self.kategoriSil.exec_()
            if donusDurumu == 1:
                QMessageBox.information(self, "Kategori Sil", "Kategori ve ilişileri Silindi")
            else:
                QMessageBox.warning(self, "Kategori Sil", "Kategori ve/veya ilişkileri silinemedi.")
        except Exception as e:
            print(e)

        self.listeleriHazirla()
        self.comboListeHazirla()
        self.listeyiHazirla()

    def comboBoxTiklama(self):
        print("tıklandı")
        self.secilenKategori.kategori = self.ui.comboBox.itemText(self.ui.comboBox.currentIndex())

        if (self.ui.comboBox.currentIndex() != 0):  # düzeltilmesi gerekiyor  bütün hepsinde çıkması lazım
            try:
                kelimeListesi = KategoriBLL.KategoriyeAitKelimeler(self.secilenKategori)
                self.ui.listWidget.clear()
                self.ui.listWidget.addItems(kelimeListesi)
            except Exception as e:
                print(e)
        else:
            self.listeleriHazirla()
            self.listeyiHazirla()

    def comboListeHazirla(self):
        self.ui.comboBox.clear()
        self.ui.comboBox.addItems(self.kategoriListesi)

    def listeyiHazirla(self):
        self.ui.listWidget.clear()
        self.ui.listWidget.addItems(self.kelimeListesi)

    def videoyuOynat(self, video):
        ##self.mediaPlayer.setMedia(QMediaContent(QUrl.fromLocalFile("VIDEOLAR/RAHAT.mp4")))
        self.progress.hide()
        self.videoWidget.show()
        self.mediaPlayer.setMedia(
            QMediaContent(QUrl.fromLocalFile(video)))
        self.mediaPlayer.play()

    def listedeKiElemanSecildi(self):

        self.secilenKelime.kelime = self.ui.listWidget.currentItem().text()
        sonuc = KelimeBLL.KelimeVideoBul(self.secilenKelime)
        print(sonuc)
        self.videoyuOynat(sonuc)

    def sinavCoktanSecmeli(self):
        self.Form = QtWidgets.QWidget()
        self.Form.ui = Sinav_coktan_secme()
        self.Form.ui.show()

    def aramaMetniDegistir(self):
        self.ui.listWidget.clear()
        self.seciliListe.clear()
        aramaMetni = self.ui.lineEdit.text()
        for v in self.kelimeListesi:
            if v.startswith(Helper.KucukHarfleriBuyukYap(aramaMetni)):
                self.seciliListe.append(v)

        self.ui.listWidget.addItems(self.seciliListe)

    def hafizaOyunuAc(self):
        h = HafizaOyunu()
        h.oyunuBaslat()
    
    def hafizaOyunuAc2(self):
        h = HafizaOyunu2()
        h.oyunuBaslat()

    def kisacevapOyunuAc(self):
        KisaCevapFrom()

    def Hakkinda(self):
        self.hakkinda = Hakkinda()
        self.hakkinda.show()

    def Yardim(self):
        webbrowser.open('https://github.com/munel/is_en')
Beispiel #58
0
class VideoPlayer(QWidget):

    def __init__(self, parent=None):
        super(VideoPlayer, self).__init__(parent)

        self.mediaPlayer = QMediaPlayer(None, QMediaPlayer.VideoSurface)

        videoWidget = QVideoWidget()

        openButton = QPushButton("Open...")
        openButton.clicked.connect(self.openFile)

        self.playButton = QPushButton()
        self.playButton.setEnabled(False)
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.clicked.connect(self.play)

        self.positionSlider = QSlider(Qt.Horizontal)
        self.positionSlider.setRange(0, 0)
        self.positionSlider.sliderMoved.connect(self.setPosition)

        self.errorLabel = QLabel()
        self.errorLabel.setSizePolicy(QSizePolicy.Preferred,
                QSizePolicy.Maximum)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addWidget(self.playButton)
        controlLayout.addWidget(self.positionSlider)

        layout = QVBoxLayout()
        layout.addWidget(videoWidget)
        layout.addLayout(controlLayout)
        layout.addWidget(self.errorLabel)

        self.setLayout(layout)

        self.mediaPlayer.setVideoOutput(videoWidget)
        self.mediaPlayer.stateChanged.connect(self.mediaStateChanged)
        self.mediaPlayer.positionChanged.connect(self.positionChanged)
        self.mediaPlayer.durationChanged.connect(self.durationChanged)
        self.mediaPlayer.error.connect(self.handleError)

    def openFile(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open Movie",
                QDir.homePath())

        if fileName != '':
            self.mediaPlayer.setMedia(
                    QMediaContent(QUrl.fromLocalFile(fileName)))
            self.playButton.setEnabled(True)

    def play(self):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.mediaPlayer.pause()
        else:
            self.mediaPlayer.play()

    def mediaStateChanged(self, state):
        if self.mediaPlayer.state() == QMediaPlayer.PlayingState:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPause))
        else:
            self.playButton.setIcon(
                    self.style().standardIcon(QStyle.SP_MediaPlay))

    def positionChanged(self, position):
        self.positionSlider.setValue(position)

    def durationChanged(self, duration):
        self.positionSlider.setRange(0, duration)

    def setPosition(self, position):
        self.mediaPlayer.setPosition(position)

    def handleError(self):
        self.playButton.setEnabled(False)
        self.errorLabel.setText("Error: " + self.mediaPlayer.errorString())
Beispiel #59
0
            self.singsTable.setItem(i, 2, item)
            item = QTableWidgetItem(transSeconds(data["duration"] / 1000))
            self.singsTable.setItem(i, 3, item)

    @addToLoop
    async def palyMusic(self, data):
        url = await self.seivice.getMusicUrlInfo(data["id"])
        if url:
            player = self.parent.player
            player.playMusic(QUrl(url))


def transSeconds(seconds):
    m, s = divmod(seconds, 60)
    h, m = divmod(m, 60)
    return "%02d:%02d:%02d" % (h, m, s)


if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    content = QMediaContent(
        QUrl(
            "http://m10.music.126.net/20190323193124/9f385ee03ede3f967a9c72152a911a8c/ymusic/46a6/061d/57b9/dca63fbd90a9bcba54084db8b1209593.mp3"
        ))
    #content = QMediaContent(QUrl.fromLocalFile(r"F:\musicdowmload\处处吻__杨千嬅.MP3"))
    play = QMediaPlayer()
    play.setMedia(content)
    play.play()
    sys.exit(app.exec_())
Beispiel #60
-1
class Player(QWidget):

    fullScreenChanged = pyqtSignal(bool)

    def __init__(self, playlist, parent=None):
        super(Player, self).__init__(parent)

        self.colorDialog = None
        self.trackInfo = ""
        self.statusInfo = ""
        self.duration = 0

        self.player = QMediaPlayer()
        self.playlist = QMediaPlaylist()
        self.player.setPlaylist(self.playlist)

        self.player.durationChanged.connect(self.durationChanged)
        self.player.positionChanged.connect(self.positionChanged)
        self.player.metaDataChanged.connect(self.metaDataChanged)
        self.playlist.currentIndexChanged.connect(self.playlistPositionChanged)
        self.player.mediaStatusChanged.connect(self.statusChanged)
        self.player.bufferStatusChanged.connect(self.bufferingProgress)
        self.player.videoAvailableChanged.connect(self.videoAvailableChanged)
        self.player.error.connect(self.displayErrorMessage)

        self.videoWidget = VideoWidget()
        self.player.setVideoOutput(self.videoWidget)

        self.playlistModel = PlaylistModel()
        self.playlistModel.setPlaylist(self.playlist)

        self.playlistView = QListView()
        self.playlistView.setModel(self.playlistModel)
        self.playlistView.setCurrentIndex(
                self.playlistModel.index(self.playlist.currentIndex(), 0))

        self.playlistView.activated.connect(self.jump)

        self.slider = QSlider(Qt.Horizontal)
        self.slider.setRange(0, self.player.duration() / 1000)

        self.labelDuration = QLabel()
        self.slider.sliderMoved.connect(self.seek)

        self.labelHistogram = QLabel()
        self.labelHistogram.setText("Histogram:")
        self.histogram = HistogramWidget()
        histogramLayout = QHBoxLayout()
        histogramLayout.addWidget(self.labelHistogram)
        histogramLayout.addWidget(self.histogram, 1)

        self.probe = QVideoProbe()
        self.probe.videoFrameProbed.connect(self.histogram.processFrame)
        self.probe.setSource(self.player)

        openButton = QPushButton("Open", clicked=self.open)

        controls = PlayerControls()
        controls.setState(self.player.state())
        controls.setVolume(self.player.volume())
        controls.setMuted(controls.isMuted())

        controls.play.connect(self.player.play)
        controls.pause.connect(self.player.pause)
        controls.stop.connect(self.player.stop)
        controls.next.connect(self.playlist.next)
        controls.previous.connect(self.previousClicked)
        controls.changeVolume.connect(self.player.setVolume)
        controls.changeMuting.connect(self.player.setMuted)
        controls.changeRate.connect(self.player.setPlaybackRate)
        controls.stop.connect(self.videoWidget.update)

        self.player.stateChanged.connect(controls.setState)
        self.player.volumeChanged.connect(controls.setVolume)
        self.player.mutedChanged.connect(controls.setMuted)

        self.fullScreenButton = QPushButton("FullScreen")
        self.fullScreenButton.setCheckable(True)

        self.colorButton = QPushButton("Color Options...")
        self.colorButton.setEnabled(False)
        self.colorButton.clicked.connect(self.showColorDialog)

        displayLayout = QHBoxLayout()
        displayLayout.addWidget(self.videoWidget, 2)
        displayLayout.addWidget(self.playlistView)

        controlLayout = QHBoxLayout()
        controlLayout.setContentsMargins(0, 0, 0, 0)
        controlLayout.addWidget(openButton)
        controlLayout.addStretch(1)
        controlLayout.addWidget(controls)
        controlLayout.addStretch(1)
        controlLayout.addWidget(self.fullScreenButton)
        controlLayout.addWidget(self.colorButton)

        layout = QVBoxLayout()
        layout.addLayout(displayLayout)
        hLayout = QHBoxLayout()
        hLayout.addWidget(self.slider)
        hLayout.addWidget(self.labelDuration)
        layout.addLayout(hLayout)
        layout.addLayout(controlLayout)
        layout.addLayout(histogramLayout)

        self.setLayout(layout)

        if not self.player.isAvailable():
            QMessageBox.warning(self, "Service not available",
                    "The QMediaPlayer object does not have a valid service.\n"
                    "Please check the media service plugins are installed.")

            controls.setEnabled(False)
            self.playlistView.setEnabled(False)
            openButton.setEnabled(False)
            self.colorButton.setEnabled(False)
            self.fullScreenButton.setEnabled(False)

        self.metaDataChanged()

        self.addToPlaylist(playlist)

    def open(self):
        fileNames, _ = QFileDialog.getOpenFileNames(self, "Open Files")
        self.addToPlaylist(fileNames)

    def addToPlaylist(self, fileNames):
        for name in fileNames:
            fileInfo = QFileInfo(name)
            if fileInfo.exists():
                url = QUrl.fromLocalFile(fileInfo.absoluteFilePath())
                if fileInfo.suffix().lower() == 'm3u':
                    self.playlist.load(url)
                else:
                    self.playlist.addMedia(QMediaContent(url))
            else:
                url = QUrl(name)
                if url.isValid():
                    self.playlist.addMedia(QMediaContent(url))

    def durationChanged(self, duration):
        duration /= 1000

        self.duration = duration
        self.slider.setMaximum(duration)

    def positionChanged(self, progress):
        progress /= 1000

        if not self.slider.isSliderDown():
            self.slider.setValue(progress)

        self.updateDurationInfo(progress)

    def metaDataChanged(self):
        if self.player.isMetaDataAvailable():
            self.setTrackInfo("%s - %s" % (
                    self.player.metaData(QMediaMetaData.AlbumArtist),
                    self.player.metaData(QMediaMetaData.Title)))

    def previousClicked(self):
        # Go to the previous track if we are within the first 5 seconds of
        # playback.  Otherwise, seek to the beginning.
        if self.player.position() <= 5000:
            self.playlist.previous()
        else:
            self.player.setPosition(0)

    def jump(self, index):
        if index.isValid():
            self.playlist.setCurrentIndex(index.row())
            self.player.play()

    def playlistPositionChanged(self, position):
        self.playlistView.setCurrentIndex(
                self.playlistModel.index(position, 0))

    def seek(self, seconds):
        self.player.setPosition(seconds * 1000)

    def statusChanged(self, status):
        self.handleCursor(status)

        if status == QMediaPlayer.LoadingMedia:
            self.setStatusInfo("Loading...")
        elif status == QMediaPlayer.StalledMedia:
            self.setStatusInfo("Media Stalled")
        elif status == QMediaPlayer.EndOfMedia:
            QApplication.alert(self)
        elif status == QMediaPlayer.InvalidMedia:
            self.displayErrorMessage()
        else:
            self.setStatusInfo("")

    def handleCursor(self, status):
        if status in (QMediaPlayer.LoadingMedia, QMediaPlayer.BufferingMedia, QMediaPlayer.StalledMedia):
            self.setCursor(Qt.BusyCursor)
        else:
            self.unsetCursor()

    def bufferingProgress(self, progress):
        self.setStatusInfo("Buffering %d%" % progress)

    def videoAvailableChanged(self, available):
        if available:
            self.fullScreenButton.clicked.connect(
                    self.videoWidget.setFullScreen)
            self.videoWidget.fullScreenChanged.connect(
                    self.fullScreenButton.setChecked)

            if self.fullScreenButton.isChecked():
                self.videoWidget.setFullScreen(True)
        else:
            self.fullScreenButton.clicked.disconnect(
                    self.videoWidget.setFullScreen)
            self.videoWidget.fullScreenChanged.disconnect(
                    self.fullScreenButton.setChecked)

            self.videoWidget.setFullScreen(False)

        self.colorButton.setEnabled(available)

    def setTrackInfo(self, info):
        self.trackInfo = info

        if self.statusInfo != "":
            self.setWindowTitle("%s | %s" % (self.trackInfo, self.statusInfo))
        else:
            self.setWindowTitle(self.trackInfo)

    def setStatusInfo(self, info):
        self.statusInfo = info

        if self.statusInfo != "":
            self.setWindowTitle("%s | %s" % (self.trackInfo, self.statusInfo))
        else:
            self.setWindowTitle(self.trackInfo)

    def displayErrorMessage(self):
        self.setStatusInfo(self.player.errorString())

    def updateDurationInfo(self, currentInfo):
        duration = self.duration
        if currentInfo or duration:
            currentTime = QTime((currentInfo/3600)%60, (currentInfo/60)%60,
                    currentInfo%60, (currentInfo*1000)%1000)
            totalTime = QTime((duration/3600)%60, (duration/60)%60,
                    duration%60, (duration*1000)%1000);

            format = 'hh:mm:ss' if duration > 3600 else 'mm:ss'
            tStr = currentTime.toString(format) + " / " + totalTime.toString(format)
        else:
            tStr = ""

        self.labelDuration.setText(tStr)

    def showColorDialog(self):
        if self.colorDialog is None:
            brightnessSlider = QSlider(Qt.Horizontal)
            brightnessSlider.setRange(-100, 100)
            brightnessSlider.setValue(self.videoWidget.brightness())
            brightnessSlider.sliderMoved.connect(
                    self.videoWidget.setBrightness)
            self.videoWidget.brightnessChanged.connect(
                    brightnessSlider.setValue)

            contrastSlider = QSlider(Qt.Horizontal)
            contrastSlider.setRange(-100, 100)
            contrastSlider.setValue(self.videoWidget.contrast())
            contrastSlider.sliderMoved.connect(self.videoWidget.setContrast)
            self.videoWidget.contrastChanged.connect(contrastSlider.setValue)

            hueSlider = QSlider(Qt.Horizontal)
            hueSlider.setRange(-100, 100)
            hueSlider.setValue(self.videoWidget.hue())
            hueSlider.sliderMoved.connect(self.videoWidget.setHue)
            self.videoWidget.hueChanged.connect(hueSlider.setValue)

            saturationSlider = QSlider(Qt.Horizontal)
            saturationSlider.setRange(-100, 100)
            saturationSlider.setValue(self.videoWidget.saturation())
            saturationSlider.sliderMoved.connect(
                    self.videoWidget.setSaturation)
            self.videoWidget.saturationChanged.connect(
                    saturationSlider.setValue)

            layout = QFormLayout()
            layout.addRow("Brightness", brightnessSlider)
            layout.addRow("Contrast", contrastSlider)
            layout.addRow("Hue", hueSlider)
            layout.addRow("Saturation", saturationSlider)

            button = QPushButton("Close")
            layout.addRow(button)

            self.colorDialog = QDialog(self)
            self.colorDialog.setWindowTitle("Color Options")
            self.colorDialog.setLayout(layout)

            button.clicked.connect(self.colorDialog.close)

        self.colorDialog.show()