Load uploaderUrl when showing Channel Details from Play Queue
This checks if the uploaderUrl is in the database, if not it gets the uploaderUrl and puts it in the database. This is similar to the fetching of uploaderUrl when it doesn't exist done in #6919. Also use createNotification when error occurs in getStreamInfo.
This commit is contained in:
parent
8802582997
commit
1e652b159e
3 changed files with 104 additions and 31 deletions
|
@ -14,6 +14,7 @@ import org.schabi.newpipe.local.dialog.PlaylistDialog;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
import org.schabi.newpipe.player.playqueue.PlayQueue;
|
||||||
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
||||||
import org.schabi.newpipe.util.NavigationHelper;
|
import org.schabi.newpipe.util.NavigationHelper;
|
||||||
|
import org.schabi.newpipe.util.SaveUploaderUrlHelper;
|
||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
@ -61,11 +62,13 @@ public final class QueueItemMenuUtil {
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
case R.id.menu_item_channel_details:
|
case R.id.menu_item_channel_details:
|
||||||
// An intent must be used here.
|
SaveUploaderUrlHelper.saveUploaderUrlIfNeeded(context, item,
|
||||||
// Opening with FragmentManager transactions is not working,
|
// An intent must be used here.
|
||||||
// as PlayQueueActivity doesn't use fragments.
|
// Opening with FragmentManager transactions is not working,
|
||||||
NavigationHelper.openChannelFragmentUsingIntent(context, item.getServiceId(),
|
// as PlayQueueActivity doesn't use fragments.
|
||||||
item.getUploaderUrl(), item.getUploader());
|
uploaderUrl -> NavigationHelper.openChannelFragmentUsingIntent(
|
||||||
|
context, item.getServiceId(), uploaderUrl, item.getUploader()
|
||||||
|
));
|
||||||
return true;
|
return true;
|
||||||
case R.id.menu_item_share:
|
case R.id.menu_item_share:
|
||||||
shareText(context, item.getTitle(), item.getUrl(),
|
shareText(context, item.getTitle(), item.getUrl(),
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
package org.schabi.newpipe.util;
|
||||||
|
|
||||||
|
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
||||||
|
|
||||||
|
import android.content.Context;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.Nullable;
|
||||||
|
import androidx.fragment.app.Fragment;
|
||||||
|
|
||||||
|
import org.schabi.newpipe.NewPipeDatabase;
|
||||||
|
import org.schabi.newpipe.R;
|
||||||
|
import org.schabi.newpipe.error.ErrorInfo;
|
||||||
|
import org.schabi.newpipe.error.ErrorUtil;
|
||||||
|
import org.schabi.newpipe.error.UserAction;
|
||||||
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
||||||
|
import org.schabi.newpipe.player.playqueue.PlayQueueItem;
|
||||||
|
|
||||||
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||||
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class for putting the uploader url into the database - when required.
|
||||||
|
*/
|
||||||
|
public final class SaveUploaderUrlHelper {
|
||||||
|
private SaveUploaderUrlHelper() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// Public functions which call the function that does
|
||||||
|
// the actual work with the correct parameters
|
||||||
|
public static void saveUploaderUrlIfNeeded(@NonNull final Fragment fragment,
|
||||||
|
@NonNull final StreamInfoItem infoItem,
|
||||||
|
@NonNull final SaveUploaderUrlCallback callback) {
|
||||||
|
saveUploaderUrlIfNeeded(fragment.requireContext(),
|
||||||
|
infoItem.getServiceId(),
|
||||||
|
infoItem.getUrl(),
|
||||||
|
infoItem.getUploaderUrl(),
|
||||||
|
callback);
|
||||||
|
}
|
||||||
|
public static void saveUploaderUrlIfNeeded(@NonNull final Context context,
|
||||||
|
@NonNull final PlayQueueItem queueItem,
|
||||||
|
@NonNull final SaveUploaderUrlCallback callback) {
|
||||||
|
saveUploaderUrlIfNeeded(context,
|
||||||
|
queueItem.getServiceId(),
|
||||||
|
queueItem.getUrl(),
|
||||||
|
queueItem.getUploaderUrl(),
|
||||||
|
callback);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches and saves the uploaderUrl if it is empty (meaning that it does
|
||||||
|
* not exist in the video item). The callback is called with either the
|
||||||
|
* fetched uploaderUrl, or the already saved uploaderUrl, but it is always
|
||||||
|
* called with a valid uploaderUrl that can be used to show channel details.
|
||||||
|
*
|
||||||
|
* @param context Context
|
||||||
|
* @param serviceId The serviceId of the item
|
||||||
|
* @param url The item url
|
||||||
|
* @param uploaderUrl The uploaderUrl of the item, if null or empty, it
|
||||||
|
* will be fetched using the item url.
|
||||||
|
* @param callback The callback that returns the fetched or existing
|
||||||
|
* uploaderUrl
|
||||||
|
*/
|
||||||
|
private static void saveUploaderUrlIfNeeded(@NonNull final Context context,
|
||||||
|
final int serviceId,
|
||||||
|
@NonNull final String url,
|
||||||
|
// Only used if not null or empty
|
||||||
|
@Nullable final String uploaderUrl,
|
||||||
|
@NonNull final SaveUploaderUrlCallback callback) {
|
||||||
|
if (isNullOrEmpty(uploaderUrl)) {
|
||||||
|
Toast.makeText(context, R.string.loading_channel_details,
|
||||||
|
Toast.LENGTH_SHORT).show();
|
||||||
|
ExtractorHelper.getStreamInfo(serviceId, url, false)
|
||||||
|
.subscribeOn(Schedulers.io())
|
||||||
|
.observeOn(AndroidSchedulers.mainThread())
|
||||||
|
.subscribe(result -> {
|
||||||
|
NewPipeDatabase.getInstance(context).streamDAO()
|
||||||
|
.setUploaderUrl(serviceId, url, result.getUploaderUrl())
|
||||||
|
.subscribeOn(Schedulers.io()).subscribe();
|
||||||
|
callback.onCallback(result.getUploaderUrl());
|
||||||
|
}, throwable -> ErrorUtil.createNotification(context,
|
||||||
|
new ErrorInfo(throwable, UserAction.REQUESTED_CHANNEL,
|
||||||
|
"Could not load channel details")
|
||||||
|
));
|
||||||
|
} else {
|
||||||
|
callback.onCallback(uploaderUrl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface SaveUploaderUrlCallback {
|
||||||
|
void onCallback(@NonNull String uploaderUrl);
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,12 +3,10 @@ package org.schabi.newpipe.util;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.preference.PreferenceManager;
|
import androidx.preference.PreferenceManager;
|
||||||
|
|
||||||
import org.schabi.newpipe.NewPipeDatabase;
|
|
||||||
import org.schabi.newpipe.R;
|
import org.schabi.newpipe.R;
|
||||||
import org.schabi.newpipe.database.stream.model.StreamEntity;
|
import org.schabi.newpipe.database.stream.model.StreamEntity;
|
||||||
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
import org.schabi.newpipe.extractor.stream.StreamInfoItem;
|
||||||
|
@ -27,36 +25,14 @@ import java.util.function.Consumer;
|
||||||
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
|
||||||
import io.reactivex.rxjava3.schedulers.Schedulers;
|
import io.reactivex.rxjava3.schedulers.Schedulers;
|
||||||
|
|
||||||
import static org.schabi.newpipe.extractor.utils.Utils.isNullOrEmpty;
|
|
||||||
|
|
||||||
public enum StreamDialogEntry {
|
public enum StreamDialogEntry {
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
// enum values with DEFAULT actions //
|
// enum values with DEFAULT actions //
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
|
||||||
show_channel_details(R.string.show_channel_details, (fragment, item) -> {
|
show_channel_details(R.string.show_channel_details, (fragment, item) -> {
|
||||||
if (isNullOrEmpty(item.getUploaderUrl())) {
|
SaveUploaderUrlHelper.saveUploaderUrlIfNeeded(fragment, item,
|
||||||
final int serviceId = item.getServiceId();
|
uploaderUrl -> openChannelFragment(fragment, item, uploaderUrl));
|
||||||
final String url = item.getUrl();
|
|
||||||
Toast.makeText(fragment.getContext(), R.string.loading_channel_details,
|
|
||||||
Toast.LENGTH_SHORT).show();
|
|
||||||
ExtractorHelper.getStreamInfo(serviceId, url, false)
|
|
||||||
.subscribeOn(Schedulers.io())
|
|
||||||
.observeOn(AndroidSchedulers.mainThread())
|
|
||||||
.subscribe(result -> {
|
|
||||||
NewPipeDatabase.getInstance(fragment.requireContext()).streamDAO()
|
|
||||||
.setUploaderUrl(serviceId, url, result.getUploaderUrl())
|
|
||||||
.subscribeOn(Schedulers.io()).subscribe();
|
|
||||||
openChannelFragment(fragment, item, result.getUploaderUrl());
|
|
||||||
}, throwable -> Toast.makeText(
|
|
||||||
// TODO: Open the Error Activity
|
|
||||||
fragment.getContext(),
|
|
||||||
R.string.error_show_channel_details,
|
|
||||||
Toast.LENGTH_SHORT
|
|
||||||
).show());
|
|
||||||
} else {
|
|
||||||
openChannelFragment(fragment, item, item.getUploaderUrl());
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue