diff options
Diffstat (limited to 'mediaplayer/mediaplayer.py')
-rw-r--r-- | mediaplayer/mediaplayer.py | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/mediaplayer/mediaplayer.py b/mediaplayer/mediaplayer.py deleted file mode 100644 index fe4cc50..0000000 --- a/mediaplayer/mediaplayer.py +++ /dev/null @@ -1,185 +0,0 @@ -from PyQt5.QtGui import * -from PyQt5.QtWidgets import * -from PyQt5.QtCore import * -from PyQt5.QtMultimedia import * -from PyQt5.QtMultimediaWidgets import * - -from MainWindow import Ui_MainWindow - -def hhmmss(ms): - # s = 1000 - # m = 60000 - # h = 360000 - h, r = divmod(ms, 36000) - m, r = divmod(r, 60000) - s, _ = divmod(r, 1000) - return ("%d:%02d:%02d" % (h,m,s)) if h else ("%d:%02d" % (m,s)) - -class ViewerWindow(QMainWindow): - state = pyqtSignal(bool) - - def closeEvent(self, e): - # Emit the window state, to update the viewer toggle button. - self.state.emit(False) - - -class PlaylistModel(QAbstractListModel): - def __init__(self, playlist, *args, **kwargs): - super(PlaylistModel, self).__init__(*args, **kwargs) - self.playlist = playlist - - def data(self, index, role): - if role == Qt.DisplayRole: - media = self.playlist.media(index.row()) - return media.canonicalUrl().fileName() - - def rowCount(self, index): - return self.playlist.mediaCount() - - -class MainWindow(QMainWindow, Ui_MainWindow): - def __init__(self, *args, **kwargs): - super(MainWindow, self).__init__(*args, **kwargs) - self.setupUi(self) - - self.player = QMediaPlayer() - - self.player.error.connect(self.erroralert) - self.player.play() - - # Setup the playlist. - self.playlist = QMediaPlaylist() - self.player.setPlaylist(self.playlist) - - # Add viewer for video playback, separate floating window. - self.viewer = ViewerWindow(self) - self.viewer.setWindowFlags(self.viewer.windowFlags() | Qt.WindowStaysOnTopHint) - self.viewer.setMinimumSize(QSize(480,360)) - - videoWidget = QVideoWidget() - self.viewer.setCentralWidget(videoWidget) - self.player.setVideoOutput(videoWidget) - - # Connect control buttons/slides for media player. - self.playButton.pressed.connect(self.player.play) - self.pauseButton.pressed.connect(self.player.pause) - self.stopButton.pressed.connect(self.player.stop) - self.volumeSlider.valueChanged.connect(self.player.setVolume) - - self.viewButton.toggled.connect(self.toggle_viewer) - self.viewer.state.connect(self.viewButton.setChecked) - - self.previousButton.pressed.connect(self.playlist.previous) - self.nextButton.pressed.connect(self.playlist.next) - - self.model = PlaylistModel(self.playlist) - self.playlistView.setModel(self.model) - self.playlist.currentIndexChanged.connect(self.playlist_position_changed) - selection_model = self.playlistView.selectionModel() - selection_model.selectionChanged.connect(self.playlist_selection_changed) - - self.player.durationChanged.connect(self.update_duration) - self.player.positionChanged.connect(self.update_position) - self.timeSlider.valueChanged.connect(self.player.setPosition) - - self.open_file_action.triggered.connect(self.open_file) - - self.setAcceptDrops(True) - - self.show() - - def dragEnterEvent(self, e): - if e.mimeData().hasUrls(): - e.acceptProposedAction() - - def dropEvent(self, e): - for url in e.mimeData().urls(): - self.playlist.addMedia( - QMediaContent(url) - ) - - self.model.layoutChanged.emit() - - # If not playing, seeking to first of newly added + play. - if self.player.state() != QMediaPlayer.PlayingState: - i = self.playlist.mediaCount() - len(e.mimeData().urls()) - self.playlist.setCurrentIndex(i) - self.player.play() - - def open_file(self): - path, _ = QFileDialog.getOpenFileName(self, "Open file", "", "mp3 Audio (*.mp3);mp4 Video (*.mp4);Movie files (*.mov);All files (*.*)") - - if path: - self.playlist.addMedia( - QMediaContent( - QUrl.fromLocalFile(path) - ) - ) - - self.model.layoutChanged.emit() - - def update_duration(self, duration): - print("!", duration) - print("?", self.player.duration()) - - self.timeSlider.setMaximum(duration) - - if duration >= 0: - self.totalTimeLabel.setText(hhmmss(duration)) - - def update_position(self, position): - if position >= 0: - self.currentTimeLabel.setText(hhmmss(position)) - - # Disable the events to prevent updating triggering a setPosition event (can cause stuttering). - self.timeSlider.blockSignals(True) - self.timeSlider.setValue(position) - self.timeSlider.blockSignals(False) - - def playlist_selection_changed(self, ix): - # We receive a QItemSelection from selectionChanged. - i = ix.indexes()[0].row() - self.playlist.setCurrentIndex(i) - - def playlist_position_changed(self, i): - if i > -1: - ix = self.model.index(i) - self.playlistView.setCurrentIndex(ix) - - def toggle_viewer(self, state): - if state: - self.viewer.show() - else: - self.viewer.hide() - - def erroralert(self, *args): - print(args) - - - - -if __name__ == '__main__': - app = QApplication([]) - app.setApplicationName("Failamp") - app.setStyle("Fusion") - - # Fusion dark palette from https://gist.github.com/QuantumCD/6245215. - palette = QPalette() - 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(42, 130, 218)) - palette.setColor(QPalette.Highlight, QColor(42, 130, 218)) - palette.setColor(QPalette.HighlightedText, Qt.black) - app.setPalette(palette) - app.setStyleSheet("QToolTip { color: #ffffff; background-color: #2a82da; border: 1px solid white; }") - - window = MainWindow() - app.exec_() |