1
0
mirror of https://github.com/TeamNewPipe/NewPipe.git synced 2024-11-21 18:42:35 +01:00

Merge pull request #6045 from bg172/showOverallDurationInPlaylist

show overall duration of videos in playlist
This commit is contained in:
Stypox 2024-03-29 14:32:29 +01:00 committed by GitHub
commit 3c0a200f7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 64 additions and 10 deletions

View File

@ -89,6 +89,9 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
private MenuItem playlistBookmarkButton; private MenuItem playlistBookmarkButton;
private long streamCount;
private long playlistOverallDurationSeconds;
public static PlaylistFragment getInstance(final int serviceId, final String url, public static PlaylistFragment getInstance(final int serviceId, final String url,
final String name) { final String name) {
final PlaylistFragment instance = new PlaylistFragment(); final PlaylistFragment instance = new PlaylistFragment();
@ -277,6 +280,12 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
animate(headerBinding.uploaderLayout, false, 200); animate(headerBinding.uploaderLayout, false, 200);
} }
@Override
public void handleNextItems(final ListExtractor.InfoItemsPage result) {
super.handleNextItems(result);
setStreamCountAndOverallDuration(result.getItems(), !result.hasNextPage());
}
@Override @Override
public void handleResult(@NonNull final PlaylistInfo result) { public void handleResult(@NonNull final PlaylistInfo result) {
super.handleResult(result); super.handleResult(result);
@ -322,8 +331,8 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
.into(headerBinding.uploaderAvatarView); .into(headerBinding.uploaderAvatarView);
} }
headerBinding.playlistStreamCount.setText(Localization streamCount = result.getStreamCount();
.localizeStreamCount(getContext(), result.getStreamCount())); setStreamCountAndOverallDuration(result.getRelatedItems(), !result.hasNextPage());
final Description description = result.getDescription(); final Description description = result.getDescription();
if (description != null && description != Description.EMPTY_DESCRIPTION if (description != null && description != Description.EMPTY_DESCRIPTION
@ -486,4 +495,20 @@ public class PlaylistFragment extends BaseListInfoFragment<StreamInfoItem, Playl
playlistBookmarkButton.setIcon(drawable); playlistBookmarkButton.setIcon(drawable);
playlistBookmarkButton.setTitle(titleRes); playlistBookmarkButton.setTitle(titleRes);
} }
private void setStreamCountAndOverallDuration(final List<StreamInfoItem> list,
final boolean isDurationComplete) {
if (activity != null && headerBinding != null) {
playlistOverallDurationSeconds += list.stream()
.mapToLong(x -> x.getDuration())
.sum();
headerBinding.playlistStreamCount.setText(
Localization.concatenateStrings(
Localization.localizeStreamCount(activity, streamCount),
Localization.getDurationString(playlistOverallDurationSeconds,
isDurationComplete))
);
}
}
} }

View File

@ -502,7 +502,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
} }
final long videoCount = itemListAdapter.getItemsList().size(); final long videoCount = itemListAdapter.getItemsList().size();
setVideoCount(videoCount); setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
if (videoCount == 0) { if (videoCount == 0) {
showEmptyState(); showEmptyState();
} }
@ -532,7 +532,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
itemsList.getLayoutManager().onRestoreInstanceState(itemsListState); itemsList.getLayoutManager().onRestoreInstanceState(itemsListState);
itemsListState = null; itemsListState = null;
} }
setVideoCount(itemListAdapter.getItemsList().size()); setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this); PlayButtonHelper.initPlaylistControlClickListener(activity, playlistControlBinding, this);
@ -665,7 +665,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
.subscribe(itemsToKeep -> { .subscribe(itemsToKeep -> {
itemListAdapter.clearStreamItemList(); itemListAdapter.clearStreamItemList();
itemListAdapter.addItems(itemsToKeep); itemListAdapter.addItems(itemsToKeep);
setVideoCount(itemListAdapter.getItemsList().size()); setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
saveChanges(); saveChanges();
hideLoading(); hideLoading();
@ -684,7 +684,7 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
updateThumbnailUrl(); updateThumbnailUrl();
} }
setVideoCount(itemListAdapter.getItemsList().size()); setStreamCountAndOverallDuration(itemListAdapter.getItemsList());
saveChanges(); saveChanges();
} }
@ -855,10 +855,20 @@ public class LocalPlaylistFragment extends BaseLocalListFragment<List<PlaylistSt
this.name = !TextUtils.isEmpty(title) ? title : ""; this.name = !TextUtils.isEmpty(title) ? title : "";
} }
private void setVideoCount(final long count) { private void setStreamCountAndOverallDuration(final ArrayList<LocalItem> itemsList) {
if (activity != null && headerBinding != null) { if (activity != null && headerBinding != null) {
headerBinding.playlistStreamCount.setText(Localization final long streamCount = itemsList.size();
.localizeStreamCount(activity, count)); final long playlistOverallDurationSeconds = itemsList.stream()
.filter(PlaylistStreamEntry.class::isInstance)
.map(PlaylistStreamEntry.class::cast)
.map(PlaylistStreamEntry::getStreamEntity)
.mapToLong(StreamEntity::getDuration)
.sum();
headerBinding.playlistStreamCount.setText(
Localization.concatenateStrings(
Localization.localizeStreamCount(activity, streamCount),
Localization.getDurationString(playlistOverallDurationSeconds))
);
} }
} }

View File

@ -238,7 +238,25 @@ public final class Localization {
} }
} }
/**
* Get a readable text for a duration in the format {@code days:hours:minutes:seconds}.
* Prepended zeros are removed.
* @param duration the duration in seconds
* @return a formatted duration String or {@code 0:00} if the duration is zero.
*/
public static String getDurationString(final long duration) { public static String getDurationString(final long duration) {
return getDurationString(duration, true);
}
/**
* Get a readable text for a duration in the format {@code days:hours:minutes:seconds+}.
* Prepended zeros are removed. If the given duration is incomplete, a plus is appended to the
* duration string.
* @param duration the duration in seconds
* @param isDurationComplete whether the given duration is complete or whether info is missing
* @return a formatted duration String or {@code 0:00} if the duration is zero.
*/
public static String getDurationString(final long duration, final boolean isDurationComplete) {
final String output; final String output;
final long days = duration / (24 * 60 * 60L); /* greater than a day */ final long days = duration / (24 * 60 * 60L); /* greater than a day */
@ -256,7 +274,8 @@ public final class Localization {
} else { } else {
output = String.format(Locale.US, "%d:%02d", minutes, seconds); output = String.format(Locale.US, "%d:%02d", minutes, seconds);
} }
return output; final String durationPostfix = isDurationComplete ? "" : "+";
return output + durationPostfix;
} }
/** /**