Skip to content

Commit c74e3c7

Browse files
committed
Queue home videos from the same folder
When playing a standalone home video item, load sibling videos from the same parent folder and start playback at the selected item. Skip Next Up and controls overlays during automatic transitions between queued home videos so they play consecutively without interruption.
1 parent 41ce398 commit c74e3c7

3 files changed

Lines changed: 68 additions & 3 deletions

File tree

app/src/main/java/org/jellyfin/androidtv/ui/itemhandling/ItemLauncher.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,11 +156,15 @@ public void launch(final BaseRowItem rowItem, MutableObjectAdapter<Object> adapt
156156
break;
157157
case Play:
158158
//Just play it directly
159-
playbackHelper.getValue().getItemsToPlay(context, baseItem, baseItem.getType() == BaseItemKind.MOVIE, false, new Response<List<BaseItemDto>>() {
159+
final BaseItemDto itemToPlay = baseItem;
160+
playbackHelper.getValue().getItemsToPlay(context, itemToPlay, itemToPlay.getType() == BaseItemKind.MOVIE, false, new Response<List<BaseItemDto>>() {
160161
@Override
161162
public void onResponse(List<BaseItemDto> response) {
162163
if (!isActive()) return;
163-
playbackLauncher.getValue().launch(context, response);
164+
int itemPosition = itemToPlay.getType() == BaseItemKind.VIDEO
165+
? findItemPosition(response, itemToPlay)
166+
: 0;
167+
playbackLauncher.getValue().launch(context, response, null, false, itemPosition);
164168
}
165169
});
166170
break;
@@ -274,4 +278,14 @@ public void onResponse(BaseItemDto response) {
274278
break;
275279
}
276280
}
281+
282+
private int findItemPosition(List<BaseItemDto> items, BaseItemDto selectedItem) {
283+
for (int index = 0; index < items.size(); index++) {
284+
if (items.get(index).getId().equals(selectedItem.getId())) {
285+
return index;
286+
}
287+
}
288+
289+
return 0;
290+
}
277291
}

app/src/main/java/org/jellyfin/androidtv/ui/playback/PlaybackController.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ public class PlaybackController implements PlaybackControllerNotifiable {
8585
protected VideoOptions mCurrentOptions;
8686
private int mDefaultAudioIndex = -1;
8787
protected boolean burningSubs = false;
88+
private boolean suppressOverlayOnNextPlayback = false;
8889

8990
// The server does not update the subtitle delivery method when alwaysBurnInSubtitleWhenTranscoding
9091
// is set, so we need to assume subs are burned in when transcoding with the option enabled.
@@ -454,6 +455,11 @@ protected void play(long position, @Nullable Integer forcedSubtitleIndex) {
454455
return;
455456
}
456457

458+
if (suppressOverlayOnNextPlayback) {
459+
mFragment.leanbackOverlayFragment.setShouldShowOverlay(false);
460+
mFragment.leanbackOverlayFragment.hideOverlay();
461+
}
462+
457463
// make sure item isn't missing
458464
if (item.getLocationType() == LocationType.VIRTUAL) {
459465
if (hasNextItem()) {
@@ -1195,7 +1201,8 @@ private void itemComplete() {
11951201
Timber.i("Moving to next queue item. Index: %s", (mCurrentIndex + 1));
11961202
boolean stillWatchingEnabled = userPreferences.getValue().get(UserPreferences.Companion.getStillWatchingBehavior()) != StillWatchingBehavior.DISABLED;
11971203
boolean nextUpEnabled = userPreferences.getValue().get(UserPreferences.Companion.getNextUpBehavior()) != NextUpBehavior.DISABLED;
1198-
if ((stillWatchingEnabled || nextUpEnabled) && curItem.getType() != BaseItemKind.TRAILER) {
1204+
boolean showPlaybackPrompt = curItem.getType() != BaseItemKind.TRAILER && curItem.getType() != BaseItemKind.VIDEO;
1205+
if ((stillWatchingEnabled || nextUpEnabled) && showPlaybackPrompt) {
11991206
mCurrentIndex++;
12001207
videoQueueManager.getValue().setCurrentMediaPosition(mCurrentIndex);
12011208
spinnerOff = false;
@@ -1211,6 +1218,9 @@ private void itemComplete() {
12111218
}
12121219
endPlayback();
12131220
} else {
1221+
if (curItem.getType() == BaseItemKind.VIDEO) {
1222+
suppressOverlayOnNextPlayback = true;
1223+
}
12141224
next();
12151225
}
12161226
}
@@ -1226,6 +1236,10 @@ public void onPrepared() {
12261236
if (mFragment != null) {
12271237
mFragment.setFadingEnabled(true);
12281238
mFragment.leanbackOverlayFragment.setShouldShowOverlay(false);
1239+
if (suppressOverlayOnNextPlayback) {
1240+
mFragment.leanbackOverlayFragment.hideOverlay();
1241+
suppressOverlayOnNextPlayback = false;
1242+
}
12291243
}
12301244

12311245
mPlaybackState = PlaybackState.PLAYING;

app/src/main/java/org/jellyfin/androidtv/util/sdk/SdkPlaybackHelper.kt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,20 @@ class SdkPlaybackHelper(
230230
}
231231
}
232232

233+
BaseItemKind.VIDEO -> {
234+
val parentId = mainItem.parentId
235+
if (parentId == null) {
236+
getParts(mainItem)
237+
} else {
238+
val siblingVideos = getVideosInFolder(parentId)
239+
if (siblingVideos.any { it.id == mainItem.id } && siblingVideos.size > 1) {
240+
siblingVideos
241+
} else {
242+
getParts(mainItem)
243+
}
244+
}
245+
}
246+
233247
else -> {
234248
val parts = getParts(mainItem)
235249
val addIntros = allowIntros && userPreferences[UserPreferences.cinemaModeEnabled]
@@ -248,6 +262,29 @@ class SdkPlaybackHelper(
248262
}
249263
}
250264

265+
private suspend fun getVideosInFolder(parentId: UUID): List<BaseItemDto> {
266+
val videos = mutableListOf<BaseItemDto>()
267+
var totalRecordCount: Int
268+
269+
do {
270+
val response by api.itemsApi.getItems(
271+
parentId = parentId,
272+
isMissing = false,
273+
includeItemTypes = listOf(BaseItemKind.VIDEO),
274+
sortBy = listOf(ItemSortBy.SORT_NAME),
275+
startIndex = videos.size,
276+
limit = ITEM_QUERY_LIMIT,
277+
fields = ItemRepository.itemFields,
278+
)
279+
280+
totalRecordCount = response.totalRecordCount
281+
if (response.items.isEmpty()) break
282+
videos += response.items
283+
} while (videos.size < totalRecordCount)
284+
285+
return videos
286+
}
287+
251288
private suspend fun getParts(item: BaseItemDto): List<BaseItemDto> = buildList {
252289
add(item)
253290

0 commit comments

Comments
 (0)