Merge pull request #3240 from wb9688/yt-music-search
YouTube Music search stuff
This commit is contained in:
commit
bd9b2d54aa
|
@ -136,7 +136,7 @@ dependencies {
|
||||||
exclude module: 'support-annotations'
|
exclude module: 'support-annotations'
|
||||||
})
|
})
|
||||||
|
|
||||||
implementation 'com.github.TeamNewPipe:NewPipeExtractor:a5155fb'
|
implementation 'com.github.TeamNewPipe:NewPipeExtractor:a5155fb562ca99ca4a9c8caa2fd60f2f0a305eb0'
|
||||||
testImplementation 'junit:junit:4.12'
|
testImplementation 'junit:junit:4.12'
|
||||||
testImplementation 'org.mockito:mockito-core:2.23.0'
|
testImplementation 'org.mockito:mockito-core:2.23.0'
|
||||||
|
|
||||||
|
|
|
@ -39,6 +39,7 @@ import org.schabi.newpipe.report.ErrorActivity;
|
||||||
import org.schabi.newpipe.report.UserAction;
|
import org.schabi.newpipe.report.UserAction;
|
||||||
import org.schabi.newpipe.util.ExtractorHelper;
|
import org.schabi.newpipe.util.ExtractorHelper;
|
||||||
import org.schabi.newpipe.util.ImageDisplayConstants;
|
import org.schabi.newpipe.util.ImageDisplayConstants;
|
||||||
|
import org.schabi.newpipe.util.Localization;
|
||||||
import org.schabi.newpipe.util.NavigationHelper;
|
import org.schabi.newpipe.util.NavigationHelper;
|
||||||
import org.schabi.newpipe.util.ShareUtils;
|
import org.schabi.newpipe.util.ShareUtils;
|
||||||
import org.schabi.newpipe.util.StreamDialogEntry;
|
import org.schabi.newpipe.util.StreamDialogEntry;
|
||||||
|
@ -302,8 +303,8 @@ public class PlaylistFragment extends BaseListInfoFragment<PlaylistInfo> {
|
||||||
|
|
||||||
IMAGE_LOADER.displayImage(result.getUploaderAvatarUrl(), headerUploaderAvatar,
|
IMAGE_LOADER.displayImage(result.getUploaderAvatarUrl(), headerUploaderAvatar,
|
||||||
ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS);
|
ImageDisplayConstants.DISPLAY_AVATAR_OPTIONS);
|
||||||
headerStreamCount.setText(getResources().getQuantityString(R.plurals.videos,
|
headerStreamCount.setText(Localization
|
||||||
(int) result.getStreamCount(), (int) result.getStreamCount()));
|
.localizeStreamCount(getContext(), result.getStreamCount()));
|
||||||
|
|
||||||
if (!result.getErrors().isEmpty()) {
|
if (!result.getErrors().isEmpty()) {
|
||||||
showSnackBarError(result.getErrors(), UserAction.REQUESTED_PLAYLIST,
|
showSnackBarError(result.getErrors(), UserAction.REQUESTED_PLAYLIST,
|
||||||
|
|
|
@ -416,6 +416,13 @@ public class SearchFragment extends BaseListFragment<SearchInfo, ListExtractor.I
|
||||||
boolean isFirstItem = true;
|
boolean isFirstItem = true;
|
||||||
final Context c = getContext();
|
final Context c = getContext();
|
||||||
for (String filter : service.getSearchQHFactory().getAvailableContentFilter()) {
|
for (String filter : service.getSearchQHFactory().getAvailableContentFilter()) {
|
||||||
|
if (filter.equals("music_songs")) {
|
||||||
|
MenuItem musicItem = menu.add(2,
|
||||||
|
itemId++,
|
||||||
|
0,
|
||||||
|
"YouTube Music");
|
||||||
|
musicItem.setEnabled(false);
|
||||||
|
}
|
||||||
menuItemToFilterName.put(itemId, filter);
|
menuItemToFilterName.put(itemId, filter);
|
||||||
MenuItem item = menu.add(1,
|
MenuItem item = menu.add(1,
|
||||||
itemId++,
|
itemId++,
|
||||||
|
|
|
@ -10,6 +10,7 @@ import org.schabi.newpipe.extractor.playlist.PlaylistInfoItem;
|
||||||
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
import org.schabi.newpipe.info_list.InfoItemBuilder;
|
||||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||||
import org.schabi.newpipe.util.ImageDisplayConstants;
|
import org.schabi.newpipe.util.ImageDisplayConstants;
|
||||||
|
import org.schabi.newpipe.util.Localization;
|
||||||
|
|
||||||
public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
|
public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
|
||||||
public final ImageView itemThumbnailView;
|
public final ImageView itemThumbnailView;
|
||||||
|
@ -41,7 +42,8 @@ public class PlaylistMiniInfoItemHolder extends InfoItemHolder {
|
||||||
final PlaylistInfoItem item = (PlaylistInfoItem) infoItem;
|
final PlaylistInfoItem item = (PlaylistInfoItem) infoItem;
|
||||||
|
|
||||||
itemTitleView.setText(item.getName());
|
itemTitleView.setText(item.getName());
|
||||||
itemStreamCountView.setText(String.valueOf(item.getStreamCount()));
|
itemStreamCountView.setText(Localization
|
||||||
|
.localizeStreamCountMini(itemStreamCountView.getContext(), item.getStreamCount()));
|
||||||
itemUploaderView.setText(item.getUploaderName());
|
itemUploaderView.setText(item.getUploaderName());
|
||||||
|
|
||||||
itemBuilder.getImageLoader()
|
itemBuilder.getImageLoader()
|
||||||
|
|
|
@ -8,6 +8,7 @@ import org.schabi.newpipe.database.playlist.PlaylistMetadataEntry;
|
||||||
import org.schabi.newpipe.local.LocalItemBuilder;
|
import org.schabi.newpipe.local.LocalItemBuilder;
|
||||||
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
import org.schabi.newpipe.local.history.HistoryRecordManager;
|
||||||
import org.schabi.newpipe.util.ImageDisplayConstants;
|
import org.schabi.newpipe.util.ImageDisplayConstants;
|
||||||
|
import org.schabi.newpipe.util.Localization;
|
||||||
|
|
||||||
import java.text.DateFormat;
|
import java.text.DateFormat;
|
||||||
|
|
||||||
|
@ -31,7 +32,8 @@ public class LocalPlaylistItemHolder extends PlaylistItemHolder {
|
||||||
final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem;
|
final PlaylistMetadataEntry item = (PlaylistMetadataEntry) localItem;
|
||||||
|
|
||||||
itemTitleView.setText(item.name);
|
itemTitleView.setText(item.name);
|
||||||
itemStreamCountView.setText(String.valueOf(item.streamCount));
|
itemStreamCountView.setText(Localization.localizeStreamCountMini(
|
||||||
|
itemStreamCountView.getContext(), item.streamCount));
|
||||||
itemUploaderView.setVisibility(View.INVISIBLE);
|
itemUploaderView.setVisibility(View.INVISIBLE);
|
||||||
|
|
||||||
itemBuilder.displayImage(item.thumbnailUrl, itemThumbnailView,
|
itemBuilder.displayImage(item.thumbnailUrl, itemThumbnailView,
|
||||||
|
|
|
@ -34,7 +34,8 @@ public class RemotePlaylistItemHolder extends PlaylistItemHolder {
|
||||||
final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem;
|
final PlaylistRemoteEntity item = (PlaylistRemoteEntity) localItem;
|
||||||
|
|
||||||
itemTitleView.setText(item.getName());
|
itemTitleView.setText(item.getName());
|
||||||
itemStreamCountView.setText(String.valueOf(item.getStreamCount()));
|
itemStreamCountView.setText(Localization.localizeStreamCountMini(
|
||||||
|
itemStreamCountView.getContext(), item.getStreamCount()));
|
||||||
// Here is where the uploader name is set in the bookmarked playlists library
|
// Here is where the uploader name is set in the bookmarked playlists library
|
||||||
if (!TextUtils.isEmpty(item.getUploader())) {
|
if (!TextUtils.isEmpty(item.getUploader())) {
|
||||||
itemUploaderView.setText(Localization.concatenateStrings(item.getUploader(),
|
itemUploaderView.setText(Localization.concatenateStrings(item.getUploader(),
|
||||||
|
|
|
@ -16,6 +16,7 @@ import androidx.annotation.StringRes;
|
||||||
import org.ocpsoft.prettytime.PrettyTime;
|
import org.ocpsoft.prettytime.PrettyTime;
|
||||||
import org.ocpsoft.prettytime.units.Decade;
|
import org.ocpsoft.prettytime.units.Decade;
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
|
import org.schabi.newpipe.extractor.ListExtractor;
|
||||||
import org.schabi.newpipe.extractor.localization.ContentCountry;
|
import org.schabi.newpipe.extractor.localization.ContentCountry;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
@ -151,8 +152,30 @@ public final class Localization {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String localizeStreamCount(final Context context, final long streamCount) {
|
public static String localizeStreamCount(final Context context, final long streamCount) {
|
||||||
return getQuantity(context, R.plurals.videos, R.string.no_videos, streamCount,
|
switch ((int) streamCount) {
|
||||||
localizeNumber(context, streamCount));
|
case (int) ListExtractor.ITEM_COUNT_UNKNOWN:
|
||||||
|
return "";
|
||||||
|
case (int) ListExtractor.ITEM_COUNT_INFINITE:
|
||||||
|
return context.getResources().getString(R.string.infinite_videos);
|
||||||
|
case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100:
|
||||||
|
return context.getResources().getString(R.string.more_than_100_videos);
|
||||||
|
default:
|
||||||
|
return getQuantity(context, R.plurals.videos, R.string.no_videos, streamCount,
|
||||||
|
localizeNumber(context, streamCount));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String localizeStreamCountMini(final Context context, final long streamCount) {
|
||||||
|
switch ((int) streamCount) {
|
||||||
|
case (int) ListExtractor.ITEM_COUNT_UNKNOWN:
|
||||||
|
return "";
|
||||||
|
case (int) ListExtractor.ITEM_COUNT_INFINITE:
|
||||||
|
return context.getResources().getString(R.string.infinite_videos_mini);
|
||||||
|
case (int) ListExtractor.ITEM_COUNT_MORE_THAN_100:
|
||||||
|
return context.getResources().getString(R.string.more_than_100_videos_mini);
|
||||||
|
default:
|
||||||
|
return String.valueOf(streamCount);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String localizeWatchingCount(final Context context, final long watchingCount) {
|
public static String localizeWatchingCount(final Context context, final long watchingCount) {
|
||||||
|
|
|
@ -48,10 +48,12 @@ public final class ServiceHelper {
|
||||||
case "all":
|
case "all":
|
||||||
return c.getString(R.string.all);
|
return c.getString(R.string.all);
|
||||||
case "videos":
|
case "videos":
|
||||||
|
case "music_videos":
|
||||||
return c.getString(R.string.videos_string);
|
return c.getString(R.string.videos_string);
|
||||||
case "channels":
|
case "channels":
|
||||||
return c.getString(R.string.channels);
|
return c.getString(R.string.channels);
|
||||||
case "playlists":
|
case "playlists":
|
||||||
|
case "music_playlists":
|
||||||
return c.getString(R.string.playlists);
|
return c.getString(R.string.playlists);
|
||||||
case "tracks":
|
case "tracks":
|
||||||
return c.getString(R.string.tracks);
|
return c.getString(R.string.tracks);
|
||||||
|
@ -61,6 +63,12 @@ public final class ServiceHelper {
|
||||||
return c.getString(R.string.conferences);
|
return c.getString(R.string.conferences);
|
||||||
case "events":
|
case "events":
|
||||||
return c.getString(R.string.events);
|
return c.getString(R.string.events);
|
||||||
|
case "music_songs":
|
||||||
|
return c.getString(R.string.songs);
|
||||||
|
case "music_albums":
|
||||||
|
return c.getString(R.string.albums);
|
||||||
|
case "music_artists":
|
||||||
|
return c.getString(R.string.artists);
|
||||||
default:
|
default:
|
||||||
return filter;
|
return filter;
|
||||||
}
|
}
|
||||||
|
|
|
@ -596,4 +596,7 @@
|
||||||
<string name="drawer_header_description">Toggle service, momenteel geselecteerd:</string>
|
<string name="drawer_header_description">Toggle service, momenteel geselecteerd:</string>
|
||||||
<string name="most_liked">Meest geliked</string>
|
<string name="most_liked">Meest geliked</string>
|
||||||
<string name="error_postprocessing_stopped">NewPipe werd gesloten terwijl het bezig was met het bestand</string>
|
<string name="error_postprocessing_stopped">NewPipe werd gesloten terwijl het bezig was met het bestand</string>
|
||||||
</resources>
|
<string name="songs">Nummers</string>
|
||||||
|
<string name="albums">Albums</string>
|
||||||
|
<string name="artists">Artiesten</string>
|
||||||
|
</resources>
|
||||||
|
|
|
@ -150,6 +150,9 @@
|
||||||
<string name="tracks">Tracks</string>
|
<string name="tracks">Tracks</string>
|
||||||
<string name="users">Users</string>
|
<string name="users">Users</string>
|
||||||
<string name="events">Events</string>
|
<string name="events">Events</string>
|
||||||
|
<string name="songs">Songs</string>
|
||||||
|
<string name="albums">Albums</string>
|
||||||
|
<string name="artists">Artists</string>
|
||||||
<string name="yes">Yes</string>
|
<string name="yes">Yes</string>
|
||||||
<string name="later">Later</string>
|
<string name="later">Later</string>
|
||||||
<string name="disabled">Disabled</string>
|
<string name="disabled">Disabled</string>
|
||||||
|
@ -284,6 +287,10 @@
|
||||||
<item quantity="other">%s listeners</item>
|
<item quantity="other">%s listeners</item>
|
||||||
</plurals>
|
</plurals>
|
||||||
<string name="no_videos">No videos</string>
|
<string name="no_videos">No videos</string>
|
||||||
|
<string name="more_than_100_videos">100+ videos</string>
|
||||||
|
<string name="infinite_videos">∞ videos</string>
|
||||||
|
<string name="more_than_100_videos_mini" translatable="false">100+</string>
|
||||||
|
<string name="infinite_videos_mini" translatable="false">∞</string>
|
||||||
<plurals name="videos">
|
<plurals name="videos">
|
||||||
<item quantity="one">%s video</item>
|
<item quantity="one">%s video</item>
|
||||||
<item quantity="other">%s videos</item>
|
<item quantity="other">%s videos</item>
|
||||||
|
|
Loading…
Reference in New Issue