mirror of
				https://github.com/TeamNewPipe/NewPipe
				synced 2025-10-30 23:03:00 +00:00 
			
		
		
		
	getYouTubeId(): Changing implementation to use YoutubeStreamLinkHandler
(PR review from @Stypox)
This commit is contained in:
		| @@ -1,13 +1,13 @@ | |||||||
| package org.schabi.newpipe.local.playlist | package org.schabi.newpipe.local.playlist | ||||||
|  |  | ||||||
| import android.content.Context | import android.content.Context | ||||||
| import okhttp3.HttpUrl.Companion.toHttpUrlOrNull |  | ||||||
| import org.schabi.newpipe.R | import org.schabi.newpipe.R | ||||||
| import org.schabi.newpipe.database.playlist.PlaylistStreamEntry | import org.schabi.newpipe.database.playlist.PlaylistStreamEntry | ||||||
|  | import org.schabi.newpipe.extractor.exceptions.ParsingException | ||||||
|  | import org.schabi.newpipe.extractor.services.youtube.linkHandler.YoutubeStreamLinkHandlerFactory | ||||||
| import org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS | import org.schabi.newpipe.local.playlist.PlayListShareMode.JUST_URLS | ||||||
| import org.schabi.newpipe.local.playlist.PlayListShareMode.WITH_TITLES | import org.schabi.newpipe.local.playlist.PlayListShareMode.WITH_TITLES | ||||||
| import org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST | import org.schabi.newpipe.local.playlist.PlayListShareMode.YOUTUBE_TEMP_PLAYLIST | ||||||
| import java.util.Objects.nonNull |  | ||||||
|  |  | ||||||
| fun export( | fun export( | ||||||
|     shareMode: PlayListShareMode, |     shareMode: PlayListShareMode, | ||||||
| @@ -48,9 +48,8 @@ fun exportJustUrls(playlist: List<PlaylistStreamEntry>): String { | |||||||
| fun exportAsYoutubeTempPlaylist(playlist: List<PlaylistStreamEntry>): String { | fun exportAsYoutubeTempPlaylist(playlist: List<PlaylistStreamEntry>): String { | ||||||
|  |  | ||||||
|     val videoIDs = playlist.asReversed().asSequence() |     val videoIDs = playlist.asReversed().asSequence() | ||||||
|         .map { it.streamEntity } |         .map { it.streamEntity.url } | ||||||
|         .map { getYouTubeId(it.url) } |         .mapNotNull(::getYouTubeId) | ||||||
|         .filter(::nonNull) |  | ||||||
|         .take(50) |         .take(50) | ||||||
|         .toList() |         .toList() | ||||||
|         .asReversed() |         .asReversed() | ||||||
| @@ -59,6 +58,8 @@ fun exportAsYoutubeTempPlaylist(playlist: List<PlaylistStreamEntry>): String { | |||||||
|     return "https://www.youtube.com/watch_videos?video_ids=$videoIDs" |     return "https://www.youtube.com/watch_videos?video_ids=$videoIDs" | ||||||
| } | } | ||||||
|  |  | ||||||
|  | val linkHandler: YoutubeStreamLinkHandlerFactory = YoutubeStreamLinkHandlerFactory.getInstance() | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * Gets the video id from a YouTube URL. |  * Gets the video id from a YouTube URL. | ||||||
|  * |  * | ||||||
| @@ -66,7 +67,6 @@ fun exportAsYoutubeTempPlaylist(playlist: List<PlaylistStreamEntry>): String { | |||||||
|  * @return the video id |  * @return the video id | ||||||
|  */ |  */ | ||||||
| fun getYouTubeId(url: String): String? { | fun getYouTubeId(url: String): String? { | ||||||
|     val httpUrl = url.toHttpUrlOrNull() |  | ||||||
|  |  | ||||||
|     return httpUrl?.queryParameter("v") |     return try { linkHandler.getId(url) } catch (e: ParsingException) { null } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -16,15 +16,21 @@ class ExportPlaylistTest { | |||||||
|     @Test |     @Test | ||||||
|     fun exportAsYouTubeTempPlaylist() { |     fun exportAsYouTubeTempPlaylist() { | ||||||
|         val playlist = asPlaylist( |         val playlist = asPlaylist( | ||||||
|             "https://www.youtube.com/watch?v=1", |             "https://www.youtube.com/watch?v=10000000000", | ||||||
|             "https://soundcloud.com/cautious-clayofficial/cold-war-2", // non-Youtube URLs should be ignored |             "https://soundcloud.com/cautious-clayofficial/cold-war-2", // non-Youtube URLs should be ignored | ||||||
|             "https://www.youtube.com/watch?v=2", |             "https://www.youtube.com/watch?v=20000000000", | ||||||
|             "https://www.youtube.com/watch?v=3" |             "https://www.youtube.com/watch?v=30000000000" | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         val url = export(YOUTUBE_TEMP_PLAYLIST, playlist, mock(Context::class.java)) |         val url = export(YOUTUBE_TEMP_PLAYLIST, playlist, mock(Context::class.java)) | ||||||
|  |  | ||||||
|         assertEquals("http://www.youtube.com/watch_videos?video_ids=1,2,3", url) |         assertEquals( | ||||||
|  |             "https://www.youtube.com/watch_videos?video_ids=" + | ||||||
|  |                 "10000000000," + | ||||||
|  |                 "20000000000," + | ||||||
|  |                 "30000000000", | ||||||
|  |             url | ||||||
|  |         ) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     @Test |     @Test | ||||||
| @@ -34,30 +40,18 @@ class ExportPlaylistTest { | |||||||
|          * (YouTube limitation) |          * (YouTube limitation) | ||||||
|          */ |          */ | ||||||
|  |  | ||||||
|         val ids = listOf( |  | ||||||
|             -1, 0, |  | ||||||
|             1, 2, 3, 4, 5, 6, 7, 8, 9, 10, |  | ||||||
|             11, 12, 13, 14, 15, 16, 17, 18, 19, 20, |  | ||||||
|             21, 22, 23, 24, 25, 26, 27, 28, 29, 30, |  | ||||||
|             31, 32, 33, 34, 35, 36, 37, 38, 39, 40, |  | ||||||
|             41, 42, 43, 44, 45, 46, 47, 48, 49, 50 |  | ||||||
|         ) |  | ||||||
|  |  | ||||||
|         val playlist = asPlaylist( |         val playlist = asPlaylist( | ||||||
|             ids.stream() |             (10..70) | ||||||
|                 .map { id: Int -> "https://www.youtube.com/watch?v=$id" } |                 .map { id -> "https://www.youtube.com/watch?v=aaaaaaaaa$id" } // YouTube video IDs are 11 characters long | ||||||
|  |                 .stream() | ||||||
|         ) |         ) | ||||||
|  |  | ||||||
|         val url = export(YOUTUBE_TEMP_PLAYLIST, playlist, mock(Context::class.java)) |         val url = export(YOUTUBE_TEMP_PLAYLIST, playlist, mock(Context::class.java)) | ||||||
|  |  | ||||||
|         assertEquals( |         val videoIDs = (21..70).map { id -> "aaaaaaaaa$id" }.joinToString(",") | ||||||
|             "http://www.youtube.com/watch_videos?video_ids=" + |  | ||||||
|                 "1,2,3,4,5,6,7,8,9,10," + |  | ||||||
|                 "11,12,13,14,15,16,17,18,19,20," + |  | ||||||
|                 "21,22,23,24,25,26,27,28,29,30," + |  | ||||||
|                 "31,32,33,34,35,36,37,38,39,40," + |  | ||||||
|                 "41,42,43,44,45,46,47,48,49,50", |  | ||||||
|  |  | ||||||
|  |         assertEquals( | ||||||
|  |             "https://www.youtube.com/watch_videos?video_ids=$videoIDs", | ||||||
|             url |             url | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Thiago F. G. Albuquerque
					Thiago F. G. Albuquerque