diff --git a/form.ui b/form.ui index 0171d90..63cf7ac 100644 --- a/form.ui +++ b/form.ui @@ -31,6 +31,13 @@ Open FM + + + logo.pnglogo.png + + + + @@ -45,7 +52,7 @@ - + 130 @@ -61,14 +68,14 @@ - + - + ... diff --git a/mainwindow.py b/mainwindow.py index 7f7e56b..09de222 100644 --- a/mainwindow.py +++ b/mainwindow.py @@ -14,85 +14,115 @@ from ui_form import Ui_MainWindow import json import requests +API_URL = "https://open.fm/radio/api/v2/ofm/stations_slug.json" +DEFAULT_VOLUME = 70 + class MainWindow(QMainWindow): + """MainWindow Class.""" + def __init__(self, parent=None): + """Initialize UI, audio player and handlers.""" super().__init__(parent) self.ui = Ui_MainWindow() self.ui.setupUi(self) - self.stations_slug = self.getData() + self.__stations_data = self.getStationsData() self.__player = QMediaPlayer() self.__audio = QAudioOutput() self.__player.setAudioOutput(self.__audio) - self.setVolume() - self.getGroups() - self.ui.groupslistWidget.itemClicked.connect(self.getStations) - self.ui.stationslistWidget.itemClicked.connect(self.playRadio) - self.ui.toolButton.clicked.connect(self.togglePlayer) + self.setVolume(DEFAULT_VOLUME) + self.printGroups() + self.ui.groupsListWidget.itemClicked.connect(self.printStations) + self.ui.stationsListWidget.itemClicked.connect(self.playRadio) + self.ui.playbackToolButton.clicked.connect(self.togglePlayer) self.ui.volumeHorizontalSlider.valueChanged.connect(self.setVolume) self.ui.volumeToolButton.clicked.connect(self.toggleMute) - def getGroups(self): - for el in self.stations_slug["groups"]: - self.ui.groupslistWidget.addItem(el["name"]) - - def getStations(self): - group = self.ui.groupslistWidget.selectedItems()[0].text() - group_id = None - for i in self.stations_slug["groups"]: - if i["name"] == group: - group_id = i["id"] - - self.ui.stationslistWidget.clear() - for ch in self.stations_slug["channels"]: - if ch["group_id"] == group_id: - self.ui.stationslistWidget.addItem(ch["name"]) - - def getData(self) -> dict: - resp = requests.get("https://open.fm/radio/api/v2/ofm/stations_slug.json") + def getStationsData(self) -> dict: + """Get JSON data from API and convert it to dict.""" + resp = requests.get(API_URL) if resp.status_code not in range(200, 299 + 1): error_box = QMessageBox.critical( - self, "Błąd", + self, + "Błąd", f"Błąd połączenia o kodzie: {resp.status_code}", - QMessageBox.Cancel + QMessageBox.Cancel, ) error_box.exec() else: return json.loads(resp.text) - def setVolume(self, volume: int = None): - if volume is None: + def printGroups(self) -> None: + """Print groups (categories) in groupsListWidget.""" + self.ui.groupsListWidget.addItems( + [e["name"] for e in self.__stations_data["groups"]] + ) + + def printStations(self) -> None: + """Print stations (channels) in stationsListWidget.""" + group = self.ui.groupsListWidget.selectedItems()[0].text() + group_id = None + for e in self.__stations_data["groups"]: + if e["name"] == group: + group_id = e["id"] + + self.ui.stationsListWidget.clear() + self.ui.stationsListWidget.addItems( + [ + e["name"] + for e in self.__stations_data["channels"] + if e["group_id"] == group_id + ] + ) + + def setVolume(self, volume: int = None) -> None: + """Set playback volume to given number or slider value.""" + if not volume: volume = self.ui.volumeHorizontalSlider.value() self.__audio.setVolume(volume / 100) - def toggleMute(self): + def toggleMute(self) -> None: + """Toggle playback volume between 0 and DEFAULT_VOLUME.""" if self.ui.volumeHorizontalSlider.value() == 0: - self.ui.volumeHorizontalSlider.setValue(70) - self.ui.volumeToolButton.setIcon(QIcon.fromTheme("audio-volume-medium")) - self.setVolume(70) + self.ui.volumeHorizontalSlider.setValue(DEFAULT_VOLUME) + self.ui.volumeToolButton.setIcon( + QIcon.fromTheme("audio-volume-medium") + ) + self.setVolume(DEFAULT_VOLUME) else: self.ui.volumeHorizontalSlider.setValue(0) - self.ui.volumeToolButton.setIcon(QIcon.fromTheme("audio-volume-muted")) + self.ui.volumeToolButton.setIcon( + QIcon.fromTheme("audio-volume-muted") + ) self.setVolume(0) - def playRadio(self): - station = self.ui.stationslistWidget.selectedItems()[0].text() + def playRadio(self) -> None: + """Play station selected by user.""" + station = self.ui.stationsListWidget.selectedItems()[0].text() stream_url = None - for ch in self.stations_slug["channels"]: - if ch["name"] == station: - stream_url = f"http://stream.open.fm/{ch['id']}" + for e in self.__stations_data["channels"]: + if e["name"] == station: + stream_url = f"http://stream.open.fm/{e['id']}" self.__player.setSource(QUrl(stream_url)) - self.ui.toolButton.setIcon(QIcon.fromTheme("media-playback-start")) + self.ui.playbackToolButton.setIcon( + QIcon.fromTheme("media-playback-start") + ) self.togglePlayer() - def togglePlayer(self): - if self.__player.playbackState() == QMediaPlayer.PlaybackState.PlayingState: + def togglePlayer(self) -> None: + """Toggle playback (play/stop).""" + pb_state = QMediaPlayer.PlaybackState + if self.__player.playbackState() == pb_state.PlayingState: self.__player.stop() - self.ui.toolButton.setIcon(QIcon.fromTheme("media-playback-start")) - elif self.__player.playbackState() == QMediaPlayer.PlaybackState.StoppedState: + self.ui.playbackToolButton.setIcon( + QIcon.fromTheme("media-playback-start") + ) + elif self.__player.playbackState() == pb_state.StoppedState: self.__player.play() - self.ui.toolButton.setIcon(QIcon.fromTheme("media-playback-stop")) + self.ui.playbackToolButton.setIcon( + QIcon.fromTheme("media-playback-stop") + ) else: pass diff --git a/openfm-qt.pyproject b/openfm-qt.pyproject index 1d1f041..a600b7a 100644 --- a/openfm-qt.pyproject +++ b/openfm-qt.pyproject @@ -1,3 +1,3 @@ { - "files": ["mainwindow.py", "form.ui"] + "files": ["mainwindow.py","form.ui"] }