diff --git a/.idea/misc.xml b/.idea/misc.xml index fe0b0da..cf03873 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ - + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 41e6bb7..6a424ab 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,6 +14,12 @@ repositories { dependencies { implementation("com.github.anas-elgarhy:alquran-cloud-api:0.4.0-v1") implementation("com.miglayout:miglayout-swing:11.0") + implementation("com.github.goxr3plus:java-stream-player:10.0.2") + implementation("com.googlecode.soundlibs:jlayer:1.0.1.4") +} +java { + sourceCompatibility = JavaVersion.VERSION_11 + targetCompatibility = JavaVersion.VERSION_11 } // Configure Gradle IntelliJ Plugin diff --git a/src/main/java/com/anas/intellij/plugins/ayah/AyahStartupActivity.java b/src/main/java/com/anas/intellij/plugins/ayah/AyahStartupActivity.java index 72db903..b1fa1db 100644 --- a/src/main/java/com/anas/intellij/plugins/ayah/AyahStartupActivity.java +++ b/src/main/java/com/anas/intellij/plugins/ayah/AyahStartupActivity.java @@ -23,7 +23,7 @@ public class AyahStartupActivity implements StartupActivity { if (basmalhOnStartSettingsState.isActive()) { try { final var bassmalh = Ayah.getAyah(1, - basmalhOnStartSettingsState.getPlayerId()); + basmalhOnStartSettingsState.getEditionId()); NotificationGroupManager.getInstance() .getNotificationGroup("Basmalh on Start") .createNotification(bassmalh.getText(), NotificationType.INFORMATION).notify(project); diff --git a/src/main/java/com/anas/intellij/plugins/ayah/NotificationTimerTask.java b/src/main/java/com/anas/intellij/plugins/ayah/NotificationTimerTask.java index 690ce61..7acd111 100644 --- a/src/main/java/com/anas/intellij/plugins/ayah/NotificationTimerTask.java +++ b/src/main/java/com/anas/intellij/plugins/ayah/NotificationTimerTask.java @@ -28,18 +28,24 @@ public class NotificationTimerTask extends TimerTask { public void run() { final var settings = AyahSettingsState.getInstance(); + LOGGER.info("Player id: " + settings.getEditionId()); try { - final var randomAyah = Ayah.getRandomAyah(); + final var randomAyah = Ayah.getRandomAyah(settings.getEditionId()); + + LOGGER.info("Random Ayah: " + randomAyah.getText()); + LOGGER.info("Rsndom ayah edition: " + randomAyah.getEdition()); + LOGGER.info("Random Ayah Url: " + randomAyah.getAudioUrl()); // Set up the notification. final var notification = new Notification("Random Ayah Notification", - randomAyah.getSurah().getName(), randomAyah.getText(), NotificationType.INFORMATION); + randomAyah.getSurah().getName(), randomAyah.getText(), NotificationType.INFORMATION); notification.addAction(new AnAction("Play") { @Override public void actionPerformed(@NotNull final AnActionEvent e) { LOGGER.info("Play action performed"); - new AudioPlayer(settings.getVolume(), randomAyah.getAudioUrl()).play(); + LOGGER.info("Audio url: " + randomAyah.getAudioUrl()); + play(settings.getVolume(), randomAyah.getAudioUrl()); } }); @@ -65,14 +71,17 @@ public class NotificationTimerTask extends TimerTask { // Play sound if enabled. if (settings.isAutoPlayAudio()) { LOGGER.info("Playing ayah"); - new AudioPlayer(settings.getVolume(), randomAyah.getAudioUrl()).play(); + play(settings.getVolume(), randomAyah.getAudioUrl()); } - } catch (final IOException e) { LOGGER.severe(e.getMessage()); } } + private void play(final int volume, final String audioUrl) { + new AudioPlayer(volume, audioUrl).play(); + } + public void setProject(final Project project) { this.project = project; } diff --git a/src/main/java/com/anas/intellij/plugins/ayah/audio/AudioPlayer.java b/src/main/java/com/anas/intellij/plugins/ayah/audio/AudioPlayer.java index 5af7680..81624a4 100644 --- a/src/main/java/com/anas/intellij/plugins/ayah/audio/AudioPlayer.java +++ b/src/main/java/com/anas/intellij/plugins/ayah/audio/AudioPlayer.java @@ -1,13 +1,61 @@ package com.anas.intellij.plugins.ayah.audio; +import com.goxr3plus.streamplayer.stream.StreamPlayer; +import com.goxr3plus.streamplayer.stream.StreamPlayerException; + +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.logging.Logger; + /** * @author: Anas Elgarhy * @date: 8/19/22 */ public class AudioPlayer { + private final StreamPlayer streamPlayer; + private final String audioUrl; + private static final Logger LOGGER = Logger.getLogger(AudioPlayer.class.getName()); + public AudioPlayer(final int volume, final String audioUrl) { + streamPlayer = new StreamPlayer(); + this.audioUrl = audioUrl; + streamPlayer.setGain(volume / 100.0); + } + + private void loadAndOpen() { + try { + streamPlayer.open(getInputStream(audioUrl)); + } catch (final MalformedURLException | StreamPlayerException e) { + LOGGER.severe("Error while opening stream player: " + e.getMessage()); + } catch (final IOException e) { + LOGGER.severe("Can't load audio file: " + audioUrl); + LOGGER.severe(e.getMessage()); + } } public void play() { + new Thread(() -> { + try { + loadAndOpen(); + streamPlayer.play(); + } catch (final StreamPlayerException e) { + LOGGER.severe(e.getMessage()); + } + }).start(); + } + + + private InputStream getInputStream(final String audioUrl) throws IOException { + final var url = new URL(audioUrl); + final var inputStream = url.openStream(); + return new BufferedInputStream(inputStream); + } + + public void run() { + loadAndOpen(); + play(); } } diff --git a/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsConfigurable.java b/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsConfigurable.java index 3a184d9..25224e4 100644 --- a/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsConfigurable.java +++ b/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsConfigurable.java @@ -38,7 +38,7 @@ public class AyahSettingsConfigurable implements Configurable { settingsState.setBasmalhOnStart(settingsComponent.getBasmalhOnStart()); settingsState.setIntervalTimeBetweenNotifications(settingsComponent.getIntervalTimeBetweenNotifications()); settingsState.setAutoPlayAudio(settingsComponent.isAutoPlayAudio()); - settingsState.setPlayerId(settingsComponent.getPlayerId()); + settingsState.setEditionId(settingsComponent.getEdition().getIdentifier()); settingsState.setVolume(settingsComponent.getVolume()); // Update the timer with the new interval time between notifications if interval time between notifications has changed diff --git a/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsState.java b/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsState.java index b93fa5e..a9d47ad 100644 --- a/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsState.java +++ b/src/main/java/com/anas/intellij/plugins/ayah/settings/AyahSettingsState.java @@ -24,7 +24,7 @@ public class AyahSettingsState implements PersistentStateComponentAnas Elgarhy + * @date: 8/20/22 + */ +public class ReadableEdition { + private final Edition edition; + + public ReadableEdition(final Edition edition) { + this.edition = edition; + } + + public ReadableEdition(final String identifier) { + this.edition = new Edition(identifier); + } + + public Edition getEdition() { + return edition; + } + + @Override + public String toString() { + return edition.getName() + " (" + edition.getLanguage() + ")"; + } +} diff --git a/src/main/java/com/anas/intellij/plugins/ayah/settings/SettingsComponent.java b/src/main/java/com/anas/intellij/plugins/ayah/settings/SettingsComponent.java index 7ea127a..21da1c7 100644 --- a/src/main/java/com/anas/intellij/plugins/ayah/settings/SettingsComponent.java +++ b/src/main/java/com/anas/intellij/plugins/ayah/settings/SettingsComponent.java @@ -12,6 +12,7 @@ import net.miginfocom.swing.MigLayout; import javax.swing.*; import java.io.IOException; import java.util.Objects; +import java.util.logging.Logger; /** * The settings UI. @@ -23,14 +24,17 @@ public class SettingsComponent { private final JPanel panel; private final JBCheckBox basmalhOnStartCheckBox; private final JBCheckBox autoPlayBasmalhCheckBox; - private final JComboBox basmalhPlayerIdComboBox; + private final JComboBox basmalhPlayerIdComboBox; private final JBSlider basmalhVolumeSlider; private final JSpinner notificationsIntervalSpinner; private SpinnerNumberModel notificationsIntervalSpinnerModel; private final JBCheckBox notificationsAudioCheckBox; - private final JComboBox ayahPlayerIdComboBox; + private final JComboBox ayahPlayerIdComboBox; private final JBSlider ayahVolumeSlider; + private final Logger LOGGER = Logger.getLogger(SettingsComponent.class.getName()); + + // Initialize block yoo. { basmalhOnStartCheckBox = new JBCheckBox("Basmalh on start"); autoPlayBasmalhCheckBox = new JBCheckBox("Auto play basmalh audio"); @@ -103,11 +107,11 @@ public class SettingsComponent { ayahVolumeSlider.setMajorTickSpacing(20); ayahVolumeSlider.setMinorTickSpacing(10); - if (settings.getBasmalhOnStart().getPlayerId() != null) { - basmalhPlayerIdComboBox.setSelectedItem(settings.getBasmalhOnStart().getPlayerId()); + if (settings.getBasmalhOnStart().getEditionId() != null) { + basmalhPlayerIdComboBox.setSelectedItem(new ReadableEdition(settings.getBasmalhOnStart().getEditionId())); } - if (settings.getPlayerId() != null) { - ayahPlayerIdComboBox.setSelectedItem(settings.getPlayerId()); + if (settings.getEditionId() != null) { + ayahPlayerIdComboBox.setSelectedItem(new ReadableEdition(settings.getEditionId())); } } @@ -126,22 +130,22 @@ public class SettingsComponent { try { final var editions = Edition.getEditions(EditionFormat.AUDIO); for (final var edition : editions) { - basmalhPlayerIdComboBox.addItem(edition.getEnglishName()); - ayahPlayerIdComboBox.addItem(edition.getEnglishName()); + basmalhPlayerIdComboBox.addItem(new ReadableEdition(edition)); + ayahPlayerIdComboBox.addItem(new ReadableEdition(edition)); } } catch (final IOException e) { - e.printStackTrace(); - basmalhPlayerIdComboBox.addItem("Error can't get editions, please check internet connection"); - ayahPlayerIdComboBox.addItem("Error can't get editions, please check internet connection"); + LOGGER.severe(e.getMessage()); } } public boolean isModified() { final var settings = AyahSettingsState.getInstance(); - return settings.getBasmalhOnStart().getPlayerId() != null && - !settings.getBasmalhOnStart().getPlayerId().equals(basmalhPlayerIdComboBox.getSelectedItem()) || - settings.getPlayerId() != null && - !settings.getPlayerId().equals(ayahPlayerIdComboBox.getSelectedItem()) || + return settings.getBasmalhOnStart().getEditionId() != null && + !settings.getBasmalhOnStart().getEditionId() + .equals(((ReadableEdition) basmalhPlayerIdComboBox.getSelectedItem()).getEdition()) || + settings.getEditionId() != null && + !settings.getEditionId() + .equals(((ReadableEdition) ayahPlayerIdComboBox.getSelectedItem()).getEdition()) || settings.getIntervalTimeBetweenNotifications() != notificationsIntervalSpinnerModel.getNumber().intValue() || settings.getBasmalhOnStart().isActive() != basmalhOnStartCheckBox.isSelected() || settings.getBasmalhOnStart().isSoundActive() != autoPlayBasmalhCheckBox.isSelected() || @@ -162,7 +166,7 @@ public class SettingsComponent { final var b = new BasmalhOnStart(); b.setActive(basmalhOnStartCheckBox.isSelected()); b.setSoundActive(autoPlayBasmalhCheckBox.isSelected()); - b.setPlayerId(Objects.requireNonNull(basmalhPlayerIdComboBox.getSelectedItem()).toString()); + b.setEditionId(((ReadableEdition) Objects.requireNonNull(basmalhPlayerIdComboBox.getSelectedItem())).getEdition().getIdentifier()); b.setVolume(basmalhVolumeSlider.getValue()); return b; } @@ -175,8 +179,8 @@ public class SettingsComponent { return notificationsAudioCheckBox.isSelected(); } - public String getPlayerId() { - return Objects.requireNonNull(ayahPlayerIdComboBox.getSelectedItem()).toString(); + public Edition getEdition() { + return ((ReadableEdition) ayahPlayerIdComboBox.getSelectedItem()).getEdition(); } public int getVolume() {