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() {