package it.vfsfitvnm.vimusic.utils import androidx.media3.common.C import androidx.media3.common.MediaItem import androidx.media3.common.Player import androidx.media3.common.Timeline val Timeline.mediaItems: List get() = List(windowCount) { getWindow(it, Timeline.Window()).mediaItem } inline val Timeline.windows: List get() = List(windowCount) { getWindow(it, Timeline.Window()) } val Player.shouldBePlaying: Boolean get() = !(playbackState == Player.STATE_ENDED || !playWhenReady) fun Player.seamlessPlay(mediaItem: MediaItem) { if (mediaItem.mediaId == currentMediaItem?.mediaId) { if (currentMediaItemIndex > 0) removeMediaItems(0, currentMediaItemIndex) if (currentMediaItemIndex < mediaItemCount - 1) removeMediaItems(currentMediaItemIndex + 1, mediaItemCount) } else { forcePlay(mediaItem) } } fun Player.shuffleQueue() { val mediaItems = currentTimeline.mediaItems.toMutableList().apply { removeAt(currentMediaItemIndex) } if (currentMediaItemIndex > 0) removeMediaItems(0, currentMediaItemIndex) if (currentMediaItemIndex < mediaItemCount - 1) removeMediaItems(currentMediaItemIndex + 1, mediaItemCount) addMediaItems(mediaItems.shuffled()) } fun Player.forcePlay(mediaItem: MediaItem) { setMediaItem(mediaItem, true) playWhenReady = true prepare() } fun Player.forcePlayAtIndex(mediaItems: List, mediaItemIndex: Int) { if (mediaItems.isEmpty()) return setMediaItems(mediaItems, mediaItemIndex, C.TIME_UNSET) playWhenReady = true prepare() } fun Player.forcePlayFromBeginning(mediaItems: List) = forcePlayAtIndex(mediaItems, 0) fun Player.forceSeekToPrevious() { if (hasPreviousMediaItem() || currentPosition > maxSeekToPreviousPosition) { seekToPrevious() } else if (mediaItemCount > 0) { seekTo(mediaItemCount - 1, C.TIME_UNSET) } } fun Player.forceSeekToNext() = if (hasNextMediaItem()) seekToNext() else seekTo(0, C.TIME_UNSET) fun Player.addNext(mediaItem: MediaItem) { if (playbackState == Player.STATE_IDLE || playbackState == Player.STATE_ENDED) { forcePlay(mediaItem) } else { addMediaItem(currentMediaItemIndex + 1, mediaItem) } } fun Player.enqueue(mediaItem: MediaItem) { if (playbackState == Player.STATE_IDLE || playbackState == Player.STATE_ENDED) { forcePlay(mediaItem) } else { addMediaItem(mediaItemCount, mediaItem) } } fun Player.enqueue(mediaItems: List) { if (playbackState == Player.STATE_IDLE || playbackState == Player.STATE_ENDED) { forcePlayFromBeginning(mediaItems) } else { addMediaItems(mediaItemCount, mediaItems) } } fun Player.findNextMediaItemById(mediaId: String): MediaItem? { for (i in currentMediaItemIndex until mediaItemCount) { if (getMediaItemAt(i).mediaId == mediaId) { return getMediaItemAt(i) } } return null }