Refined scrobbling and history saving logic

This commit is contained in:
antonio 2023-03-19 21:15:38 +01:00
parent 0512cf036e
commit 063d293897
3 changed files with 29 additions and 33 deletions

View file

@ -233,28 +233,6 @@ public class QueueRepository {
return timestamp;
}
public boolean isMediaPlayingPlausible(MediaItem mediaItem) {
boolean isPlausible = true;
GetLastPlayedMediaThreadSafe getLastPlayedMediaThreadSafe = new GetLastPlayedMediaThreadSafe(queueDao);
Thread thread = new Thread(getLastPlayedMediaThreadSafe);
thread.start();
try {
thread.join();
Queue lastMediaPlayed = getLastPlayedMediaThreadSafe.getQueueItem();
if (mediaItem.mediaId.equals(lastMediaPlayed.getId())) {
isPlausible = System.currentTimeMillis() > lastMediaPlayed.getLastPlay() + lastMediaPlayed.getDuration() * 1000;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return isPlausible;
}
private static class GetMediaThreadSafe implements Runnable {
private final QueueDao queueDao;
private List<Queue> media;

View file

@ -17,6 +17,8 @@ import java.util.List;
import java.util.concurrent.ExecutionException;
public class MediaManager {
private static final String TAG = "MediaManager";
public static void reset(ListenableFuture<MediaBrowser> mediaBrowserListenableFuture) {
if (mediaBrowserListenableFuture != null) {
mediaBrowserListenableFuture.addListener(() -> {
@ -225,19 +227,15 @@ public class MediaManager {
public static void scrobble(MediaItem mediaItem) {
if (mediaItem != null) {
if (getQueueRepository().isMediaPlayingPlausible(mediaItem)) {
getSongRepository().scrobble(mediaItem.mediaMetadata.extras.getString("id"));
}
}
}
public static void saveChronology(MediaItem mediaItem) {
if (mediaItem != null) {
if (getQueueRepository().isMediaPlayingPlausible(mediaItem)) {
getChronologyRepository().insert(new Chronology(mediaItem));
}
}
}
private static QueueRepository getQueueRepository() {
return new QueueRepository();

View file

@ -6,6 +6,8 @@ import android.app.PendingIntent.FLAG_UPDATE_CURRENT
import android.app.TaskStackBuilder
import android.content.Intent
import android.os.Bundle
import android.os.Looper
import android.util.Log
import androidx.media3.cast.CastPlayer
import androidx.media3.cast.SessionAvailabilityListener
import androidx.media3.common.*
@ -27,6 +29,8 @@ import com.google.common.util.concurrent.ListenableFuture
@UnstableApi
class MediaService : MediaLibraryService(), SessionAvailabilityListener {
private val TAG = "MediaService"
private val librarySessionCallback = CustomMediaLibrarySessionCallback()
private lateinit var player: ExoPlayer
@ -234,13 +238,10 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
if (mediaItem == null) return
if (mediaItem.mediaMetadata.extras?.getString("type") == Constants.MEDIA_TYPE_MUSIC) {
MediaManager.scrobble(mediaItem)
MediaManager.saveChronology(mediaItem)
}
if(reason == Player.MEDIA_ITEM_TRANSITION_REASON_SEEK || reason == Player.MEDIA_ITEM_TRANSITION_REASON_AUTO) {
MediaManager.setLastPlayedTimestamp(mediaItem)
}
}
override fun onIsPlayingChanged(isPlaying: Boolean) {
if (!isPlaying) {
@ -250,6 +251,25 @@ class MediaService : MediaLibraryService(), SessionAvailabilityListener {
)
}
}
override fun onPositionDiscontinuity(
oldPosition: Player.PositionInfo,
newPosition: Player.PositionInfo,
reason: Int
) {
super.onPositionDiscontinuity(oldPosition, newPosition, reason)
if(reason == Player.DISCONTINUITY_REASON_AUTO_TRANSITION) {
if (oldPosition.mediaItem?.mediaMetadata?.extras?.getString("type") == Constants.MEDIA_TYPE_MUSIC) {
MediaManager.scrobble(oldPosition.mediaItem)
MediaManager.saveChronology(oldPosition.mediaItem)
}
if (newPosition.mediaItem?.mediaMetadata?.extras?.getString("type") == Constants.MEDIA_TYPE_MUSIC) {
MediaManager.setLastPlayedTimestamp(newPosition.mediaItem)
}
}
}
})
}