Skip to content

Commit 3dcfdaf

Browse files
authored
Merge pull request #12065 from tfga/YouTubeTemporaryPlaylist
Share as YouTube temporary playlist
2 parents ea20ca9 + 2ceb702 commit 3dcfdaf

56 files changed

Lines changed: 228 additions & 81 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.schabi.newpipe.local.playlist
2+
3+
import android.content.Context
4+
import org.schabi.newpipe.R
5+
import org.schabi.newpipe.database.playlist.PlaylistStreamEntry
6+
import org.schabi.newpipe.extractor.exceptions.ParsingException
7+
import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeStreamLinkHandlerFactory
8+
import org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS
9+
import org.schabi.newpipe.local.playlist.PlayListShareMode.WITH_TITLES
10+
import org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST
11+
12+
fun export(
13+
shareMode: PlayListShareMode,
14+
playlist: List<PlaylistStreamEntry>,
15+
context: Context
16+
): String {
17+
return when (shareMode) {
18+
WITH_TITLES -> exportWithTitles(playlist, context)
19+
JUST_URLS -> exportJustUrls(playlist)
20+
YOUTUBE_TEMP_PLAYLIST -> exportAsYoutubeTempPlaylist(playlist)
21+
}
22+
}
23+
24+
fun exportWithTitles(
25+
playlist: List<PlaylistStreamEntry>,
26+
context: Context
27+
): String {
28+
29+
return playlist.asSequence()
30+
.map { it.streamEntity }
31+
.map { entity ->
32+
context.getString(
33+
R.string.video_details_list_item,
34+
entity.title,
35+
entity.url
36+
)
37+
}
38+
.joinToString(separator = "\n")
39+
}
40+
41+
fun exportJustUrls(playlist: List<PlaylistStreamEntry>): String {
42+
43+
return playlist.asSequence()
44+
.map { it.streamEntity.url }
45+
.joinToString(separator = "\n")
46+
}
47+
48+
fun exportAsYoutubeTempPlaylist(playlist: List<PlaylistStreamEntry>): String {
49+
50+
val videoIDs = playlist.asReversed().asSequence()
51+
.map { it.streamEntity.url }
52+
.mapNotNull(::getYouTubeId)
53+
.take(50) // YouTube limitation: temp playlists can't have more than 50 items
54+
.toList()
55+
.asReversed()
56+
.joinToString(separator = ",")
57+
58+
return "https://www.youtube.com/watch_videos?video_ids=$videoIDs"
59+
}
60+
61+
val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHandlerFactory.getInstance()
62+
63+
/**
64+
* Gets the video id from a YouTube URL.
65+
*
66+
* @param url YouTube URL
67+
* @return the video id
68+
*/
69+
fun getYouTubeId(url: String): String? {
70+
71+
return try { linkHandler.getId(url) } catch (e: ParsingException) { null }
72+
}

app/src/main/java/org/schabi/newpipe/local/playlist/LocalPlaylistFragment.java

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
import static org.schabi.newpipe.error.ErrorUtil.showUiErrorSnackbar;
44
import static org.schabi.newpipe.ktx.ViewUtils.animate;
5+
import static org.schabi.newpipe.local.playlist.ExportPlaylistKt.export;
6+
import static org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS;
7+
import static org.schabi.newpipe.local.playlist.PlayListShareMode.WITH_TITLES;
8+
import static org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST;
59
import static org.schabi.newpipe.util.ThemeHelper.shouldUseGridLayout;
610

11+
712
import android.content.Context;
813
import android.os.Bundle;
914
import android.os.Parcelable;
@@ -27,7 +32,6 @@
2732
import androidx.viewbinding.ViewBinding;
2833

2934
import com.evernote.android.state.State;
30-
3135
import org.reactivestreams.Subscriber;
3236
import org.reactivestreams.Subscription;
3337
import org.schabi.newpipe.NewPipeDatabase;
@@ -385,34 +389,41 @@ public boolean onOptionsItemSelected(final MenuItem item) {
385389
}
386390

387391
/**
388-
* Shares the playlist as a list of stream URLs if {@code shouldSharePlaylistDetails} is
389-
* set to {@code false}. Shares the playlist name along with a list of video titles and URLs
390-
* if {@code shouldSharePlaylistDetails} is set to {@code true}.
392+
* Shares the playlist in one of 3 ways, depending on the value of {@code shareMode}:
393+
* <ul>
394+
* <li>{@code JUST_URLS}: shares the URLs only.</li>
395+
* <li>{@code WITH_TITLES}: each entry in the list is accompanied by its title.</li>
396+
* <li>{@code YOUTUBE_TEMP_PLAYLIST}: shares as a YouTube temporary playlist.</li>
397+
* </ul>
391398
*
392-
* @param shouldSharePlaylistDetails Whether the playlist details should be included in the
393-
* shared content.
399+
* @param shareMode The way the playlist should be shared.
394400
*/
395-
private void sharePlaylist(final boolean shouldSharePlaylistDetails) {
401+
private void sharePlaylist(final PlayListShareMode shareMode) {
396402
final Context context = requireContext();
397403

398404
disposables.add(playlistManager.getPlaylistStreams(playlistId)
399-
.flatMapSingle(playlist -> Single.just(playlist.stream()
400-
.map(PlaylistStreamEntry::getStreamEntity)
401-
.map(streamEntity -> {
402-
if (shouldSharePlaylistDetails) {
403-
return context.getString(R.string.video_details_list_item,
404-
streamEntity.getTitle(), streamEntity.getUrl());
405-
} else {
406-
return streamEntity.getUrl();
407-
}
408-
})
409-
.collect(Collectors.joining("\n"))))
410-
.observeOn(AndroidSchedulers.mainThread())
411-
.subscribe(urlsText -> ShareUtils.shareText(
412-
context, name, shouldSharePlaylistDetails
413-
? context.getString(R.string.share_playlist_content_details,
414-
name, urlsText) : urlsText),
415-
throwable -> showUiErrorSnackbar(this, "Sharing playlist", throwable)));
405+
.flatMapSingle(playlist -> Single.just(export(
406+
407+
shareMode,
408+
playlist,
409+
context
410+
)))
411+
.observeOn(AndroidSchedulers.mainThread())
412+
.subscribe(
413+
urlsText -> {
414+
415+
final String content = shareMode == WITH_TITLES
416+
? context.getString(R.string.share_playlist_content_details,
417+
name,
418+
urlsText
419+
)
420+
: urlsText;
421+
422+
ShareUtils.shareText(context, name, content);
423+
},
424+
throwable -> showUiErrorSnackbar(this, "Sharing playlist", throwable)
425+
)
426+
);
416427
}
417428

418429
public void removeWatchedStreams(final boolean removePartiallyWatched) {
@@ -872,13 +883,15 @@ private PlayQueue getPlayQueue(final int index) {
872883
private void createShareConfirmationDialog() {
873884
new AlertDialog.Builder(requireContext())
874885
.setTitle(R.string.share_playlist)
875-
.setMessage(R.string.share_playlist_with_titles_message)
876886
.setCancelable(true)
877887
.setPositiveButton(R.string.share_playlist_with_titles, (dialog, which) ->
878-
sharePlaylist(/* shouldSharePlaylistDetails= */ true)
888+
sharePlaylist(WITH_TITLES)
889+
)
890+
.setNeutralButton(R.string.share_playlist_as_youtube_temporary_playlist,
891+
(dialog, which) -> sharePlaylist(YOUTUBE_TEMP_PLAYLIST)
879892
)
880893
.setNegativeButton(R.string.share_playlist_with_list, (dialog, which) ->
881-
sharePlaylist(/* shouldSharePlaylistDetails= */ false)
894+
sharePlaylist(JUST_URLS)
882895
)
883896
.show();
884897
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package org.schabi.newpipe.local.playlist;
2+
3+
public enum PlayListShareMode {
4+
5+
JUST_URLS,
6+
WITH_TITLES,
7+
YOUTUBE_TEMP_PLAYLIST
8+
}

app/src/main/res/values-ar-rLY/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,6 +856,5 @@
856856
<string name="share_playlist_content_details">%1$s
857857
\n%2$s</string>
858858
<string name="share_playlist">شارِك قائمة التشغيل</string>
859-
<string name="share_playlist_with_titles_message">شارِك قائمة التشغيل بتفاصيليها مثل اسم قائمة التشغيل وعناوين الفيديو أو كقائمة بسيطة من عناوين تشعّبيّة للفيديوهات</string>
860859
<string name="video_details_list_item">- %1$s: %2$s</string>
861860
</resources>

app/src/main/res/values-ar/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,6 @@
856856
<string name="share_playlist_content_details">%1$s
857857
\n%2$s</string>
858858
<string name="share_playlist">مشاركة قائمة التشغيل</string>
859-
<string name="share_playlist_with_titles_message">شارك تفاصيل قائمة التشغيل مثل اسم قائمة التشغيل وعناوين الفيديو أو كقائمة بسيطة من عناوين URL للفيديو</string>
860859
<string name="video_details_list_item">- %1$s: %2$s</string>
861860
<plurals name="replies">
862861
<item quantity="zero">رد %s</item>

app/src/main/res/values-az/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -787,7 +787,6 @@
787787
<string name="image_quality_high">Yüksək keyfiyyət</string>
788788
<string name="question_mark">\?</string>
789789
<string name="share_playlist">Oynatma siyahısın paylaş</string>
790-
<string name="share_playlist_with_titles_message">Pleylist adı və video başlıqları kimi təfsilatlar və ya video URL-lərin sadə siyahısı olaraq pleylist paylaş</string>
791790
<string name="share_playlist_with_titles">Başlıqlarla paylaşın</string>
792791
<string name="video_details_list_item">- %1$s: %2$s</string>
793792
<string name="share_playlist_content_details">%1$s

app/src/main/res/values-be/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,6 @@
781781
<string name="rewind">Пераматаць назад</string>
782782
<string name="replay">Паўтарыць</string>
783783
<string name="feed_fetch_channel_tabs_summary">Атрыманыя ўкладкі пры абнаўленні стужкі. Гэты параметр не прымяняецца, калі канал абнаўляецца ў хуткім рэжыме.</string>
784-
<string name="share_playlist_with_titles_message">Абагуліць плэйліст, перадаецца назва плэйліста і назвы відэа або просты спіс URL-адрасоў відэа</string>
785784
<string name="image_quality_medium">Сярэдняя якасць</string>
786785
<string name="metadata_uploader_avatars">Загрузнік аватараў</string>
787786
<string name="metadata_banners">Банеры</string>

app/src/main/res/values-bg/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,6 @@
714714
<string name="replay">Повторение</string>
715715
<string name="rewind">Превъртане назад</string>
716716
<string name="forward">Напред</string>
717-
<string name="share_playlist_with_titles_message">Споделете плейлист с подробности, като име на плейлист и заглавия на видеоклипове или като обикновен списък с URL адреси на видеоклипове</string>
718717
<string name="share_playlist_with_list">Споделяне на списък с URL</string>
719718
<string name="delete_playback_states_alert">Изтрии всички позиции на възпроизвеждане?</string>
720719
<string name="watch_history_states_deleted">Позициите за възпроизвеждане са изтрити</string>

app/src/main/res/values-cs/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -806,7 +806,6 @@
806806
<string name="channel_tab_albums">Alba</string>
807807
<string name="rewind">Přetočení zpět</string>
808808
<string name="replay">Znovu přehrát</string>
809-
<string name="share_playlist_with_titles_message">Sdílejte playlist s podrobnostmi jako je jeho název a názvy videí, nebo jako jednoduchý seznam adres videí</string>
810809
<string name="image_quality_medium">Střední kvalita</string>
811810
<string name="metadata_banners">Bannery</string>
812811
<string name="channel_tab_playlists">Playlisty</string>

app/src/main/res/values-da/strings.xml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -772,7 +772,6 @@
772772
<string name="image_quality_none">Indlæs ikke billeder</string>
773773
<string name="image_quality_low">Lav kvalitet</string>
774774
<string name="share_playlist">Del Playliste</string>
775-
<string name="share_playlist_with_titles_message">Del playliste med detajler såsom playlistenavn og videotitler eller som en simpel liste over video-URL\'er</string>
776775
<string name="share_playlist_with_titles">Del med Titler</string>
777776
<string name="share_playlist_with_list">Del URL-liste</string>
778777
<plurals name="replies">

0 commit comments

Comments
 (0)