added playlist support for invidious & removed recyclerview flashes
This commit is contained in:
parent
14033e38e2
commit
dc75436bdc
6 changed files with 89 additions and 53 deletions
|
|
@ -318,7 +318,6 @@ public class DownloaderService extends Service {
|
|||
video.setAuthor(video.getAuthor().replaceAll(":|'|\"|[.]|,", ""));
|
||||
|
||||
String sponsorBlockFilters = sharedPreferences.getString("sponsorblock_filter", "");
|
||||
Toast.makeText(context, sponsorBlockFilters, Toast.LENGTH_LONG).show();
|
||||
if (!sponsorBlockFilters.isEmpty()){
|
||||
request.addOption("--sponsorblock-remove", sponsorBlockFilters);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -197,17 +197,11 @@ public class DownloadsRecyclerViewAdapter extends RecyclerView.Adapter<Downloads
|
|||
void onButtonClick(int position);
|
||||
}
|
||||
|
||||
public void setVideoList(ArrayList<Video> videoList){
|
||||
this.videoList = videoList;
|
||||
setWebsiteList();
|
||||
notifyDataSetChanged();
|
||||
}
|
||||
|
||||
public ArrayList<String> getWebsites(){
|
||||
return websites;
|
||||
}
|
||||
|
||||
public void setWebsiteList(){
|
||||
public void updateWebsiteList(){
|
||||
websites = new ArrayList<>();
|
||||
for (Video video : videoList){
|
||||
if (!websites.contains(video.getWebsite())) websites.add(video.getWebsite());
|
||||
|
|
@ -230,4 +224,17 @@ public class DownloadsRecyclerViewAdapter extends RecyclerView.Adapter<Downloads
|
|||
checkedVideos.clear();
|
||||
}
|
||||
|
||||
public void add(ArrayList<Video> vids){
|
||||
int position = videoList.size() + 1;
|
||||
videoList.addAll(vids);
|
||||
notifyItemRangeInserted(position, vids.size());
|
||||
updateWebsiteList();
|
||||
}
|
||||
|
||||
public void remove(int index){
|
||||
videoList.remove(index);
|
||||
notifyItemRemoved(index);
|
||||
updateWebsiteList();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,8 @@ import android.view.ViewGroup;
|
|||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.recyclerview.widget.RecyclerView;
|
||||
|
|
@ -190,13 +192,6 @@ public class HomeRecyclerViewAdapter extends RecyclerView.Adapter<HomeRecyclerVi
|
|||
void onCardClick(int position, boolean add);
|
||||
}
|
||||
|
||||
public void setVideoList(ArrayList<Video> list, boolean reset){
|
||||
int size = videoList.size();
|
||||
if(reset || size == 0) clear();
|
||||
videoList.addAll(list);
|
||||
notifyItemRangeInserted(size, videoList.size());
|
||||
}
|
||||
|
||||
public void updateVideoListItem(Video v, int position){
|
||||
videoList.set(position, v);
|
||||
notifyItemChanged(position);
|
||||
|
|
@ -217,4 +212,9 @@ public class HomeRecyclerViewAdapter extends RecyclerView.Adapter<HomeRecyclerVi
|
|||
notifyItemRangeRemoved(0, size);
|
||||
}
|
||||
|
||||
public void add(ArrayList<Video> vids){
|
||||
int position = videoList.size() + 1;
|
||||
videoList.addAll(vids);
|
||||
notifyItemRangeInserted(position, vids.size());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -196,7 +196,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
dbManager = new DBManager(context);
|
||||
dbManager.clearHistoryItem(v,false);
|
||||
dbManager.close();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.notifyItemRemoved(downloadsObjects.indexOf(v));
|
||||
|
||||
if (downloadsObjects.isEmpty()) initCards();
|
||||
downloading = false;
|
||||
|
|
@ -283,14 +283,13 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
downloadsRecyclerViewAdapter.clear();
|
||||
no_results.setVisibility(View.GONE);
|
||||
selectionChips.setVisibility(View.VISIBLE);
|
||||
|
||||
dbManager = new DBManager(context);
|
||||
try{
|
||||
Thread thread = new Thread(() -> {
|
||||
if (!downloading) dbManager.clearDownloadingHistory();
|
||||
downloadsObjects = dbManager.getHistory("", format,website,sort);
|
||||
uiHandler.post(() -> {
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
updateWebsiteChips();
|
||||
|
|
@ -346,7 +345,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
topAppBar.getMenu().findItem(R.id.search_downloads).collapseActionView();
|
||||
downloadsObjects = dbManager.getHistory(query, format,website,sort);
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
|
||||
if(downloadsObjects.size() == 0) {
|
||||
no_results.setVisibility(View.VISIBLE);
|
||||
|
|
@ -361,7 +360,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
searchQuery = newText;
|
||||
downloadsObjects = dbManager.getHistory(newText, format,website,sort);
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
|
||||
if (downloadsObjects.size() == 0) {
|
||||
no_results.setVisibility(View.VISIBLE);
|
||||
|
|
@ -395,7 +394,6 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
dbManager.clearHistory();
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsObjects.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
no_results.setVisibility(View.VISIBLE);
|
||||
selectionChips.setVisibility(View.GONE);
|
||||
websiteGroup.removeAllViews();
|
||||
|
|
@ -474,7 +472,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
sort = "DESC";
|
||||
downloadsObjects = dbManager.getHistory(searchQuery, format,website,sort);
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
sortSheet.cancel();
|
||||
});
|
||||
|
||||
|
|
@ -482,7 +480,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
sort = "ASC";
|
||||
downloadsObjects = dbManager.getHistory(searchQuery, format,website,sort);
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
sortSheet.cancel();
|
||||
});
|
||||
|
||||
|
|
@ -512,7 +510,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
}
|
||||
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
});
|
||||
|
||||
Chip video = fragmentView.findViewById(R.id.video_chip);
|
||||
|
|
@ -528,7 +526,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
}
|
||||
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
});
|
||||
|
||||
}
|
||||
|
|
@ -555,7 +553,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
websiteGroup.clearCheck();
|
||||
}
|
||||
downloadsRecyclerViewAdapter.clear();
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.add(downloadsObjects);
|
||||
});
|
||||
websiteGroup.addView(tmp);
|
||||
}
|
||||
|
|
@ -601,8 +599,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
Video v = selectedObjects.get(j);
|
||||
int position = downloadsObjects.indexOf(v);
|
||||
downloadsObjects.remove(v);
|
||||
downloadsRecyclerViewAdapter.notifyItemRemoved(position);
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.remove(position);
|
||||
dbManager.clearHistoryItem(v, delete_file[0]);
|
||||
}
|
||||
updateWebsiteChips();
|
||||
|
|
@ -636,8 +633,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
|
|||
});
|
||||
delete_dialog.setPositiveButton(getString(R.string.ok), (dialogInterface, i) -> {
|
||||
downloadsObjects.remove(position);
|
||||
downloadsRecyclerViewAdapter.notifyItemRemoved(position);
|
||||
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
|
||||
downloadsRecyclerViewAdapter.remove(position);
|
||||
updateWebsiteChips();
|
||||
dbManager.clearHistoryItem(v, delete_file[0]);
|
||||
dbManager.close();
|
||||
|
|
|
|||
|
|
@ -260,6 +260,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
dbManager.clearResults();
|
||||
dbManager.close();
|
||||
inputQueriesLength = inputQueries.size();
|
||||
homeRecyclerViewAdapter.clear();
|
||||
|
||||
shimmerCards.startShimmer();
|
||||
shimmerCards.setVisibility(View.VISIBLE);
|
||||
|
|
@ -318,7 +319,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
}
|
||||
}else {
|
||||
if (!downloading){
|
||||
homeRecyclerViewAdapter.setVideoList(resultObjects, true);
|
||||
homeRecyclerViewAdapter.add(resultObjects);
|
||||
for (int i = 0; i < resultObjects.size(); i++){
|
||||
Video tmp = resultObjects.get(i);
|
||||
if(tmp.isDownloading()){
|
||||
|
|
@ -330,7 +331,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
}
|
||||
|
||||
uiHandler.post(() -> {
|
||||
homeRecyclerViewAdapter.setVideoList(resultObjects, true);
|
||||
homeRecyclerViewAdapter.add(resultObjects);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
|
|
@ -499,17 +500,22 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
case "Search": {
|
||||
try {
|
||||
if (resetResults) resultObjects.clear();
|
||||
resultObjects.addAll(infoUtil.search(inputQuery));
|
||||
ArrayList<Video> res = infoUtil.search(inputQuery);
|
||||
resultObjects.addAll(res);
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
if (resetResults) dbManager.clearResults();
|
||||
dbManager.addToResults(resultObjects);
|
||||
homeRecyclerViewAdapter.add(res);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, e.toString());
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
}
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
if (resetResults) dbManager.clearResults();
|
||||
dbManager.addToResults(resultObjects);
|
||||
homeRecyclerViewAdapter.setVideoList(resultObjects, true);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
break;
|
||||
}
|
||||
case "Video": {
|
||||
|
|
@ -527,18 +533,24 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
|
||||
try {
|
||||
if (resetResults) resultObjects.clear();
|
||||
resultObjects.add(infoUtil.getVideo(inputQuery));
|
||||
Video v = infoUtil.getVideo(inputQuery);
|
||||
ArrayList<Video> res = new ArrayList<>();
|
||||
res.add(v);
|
||||
resultObjects.add(v);
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
if (resetResults) dbManager.clearResults();
|
||||
dbManager.addToResults(resultObjects);
|
||||
homeRecyclerViewAdapter.add(res);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
} catch (Exception e) {
|
||||
Log.e(TAG, e.toString());
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
}
|
||||
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
if (resetResults) dbManager.clearResults();
|
||||
dbManager.addToResults(resultObjects);
|
||||
homeRecyclerViewAdapter.setVideoList(resultObjects, true);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
break;
|
||||
}
|
||||
case "Playlist": {
|
||||
|
|
@ -547,7 +559,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
if (resetResults) dbManager.clearResults();
|
||||
if (resetResults){
|
||||
resultObjects.clear();
|
||||
homeRecyclerViewAdapter.setVideoList(new ArrayList<>(), true);
|
||||
homeRecyclerViewAdapter.clear();
|
||||
}
|
||||
do {
|
||||
InfoUtil.PlaylistTuple tmp = infoUtil.getPlaylist(inputQuery, nextPageToken);
|
||||
|
|
@ -556,7 +568,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
resultObjects.addAll(tmp_vids);
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
dbManager.addToResults(tmp_vids);
|
||||
homeRecyclerViewAdapter.setVideoList(resultObjects, true);
|
||||
homeRecyclerViewAdapter.add(tmp_vids);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
|
|
@ -574,12 +586,12 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
|
|||
resultObjects.addAll(video);
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
if (resetResults) dbManager.clearResults();
|
||||
homeRecyclerViewAdapter.add(video);
|
||||
dbManager.addToResults(resultObjects);
|
||||
});
|
||||
}
|
||||
|
||||
new Handler(Looper.getMainLooper()).post(() -> {
|
||||
homeRecyclerViewAdapter.setVideoList(resultObjects, true);
|
||||
shimmerCards.stopShimmer();
|
||||
shimmerCards.setVisibility(View.GONE);
|
||||
});
|
||||
|
|
|
|||
|
|
@ -145,9 +145,12 @@ public class InfoUtil {
|
|||
}
|
||||
|
||||
public PlaylistTuple getPlaylist(String id, String nextPageToken) throws JSONException{
|
||||
if (key.isEmpty()) return new PlaylistTuple("", getFromYTDL("https://www.youtube.com/playlist?list="+id));
|
||||
videos = new ArrayList<>();
|
||||
|
||||
if (key.isEmpty()) {
|
||||
if (useInvidous) return getPlaylistFromInvidous(id);
|
||||
else return new PlaylistTuple("", getFromYTDL("https://www.youtube.com/playlist?list="+id));
|
||||
}
|
||||
String url = "https://youtube.googleapis.com/youtube/v3/playlistItems?part=snippet&pageToken="+nextPageToken+"&maxResults=50®ionCode="+countryCODE+"&playlistId="+id+"&key="+key;
|
||||
//short data
|
||||
JSONObject res = genericRequest(url);
|
||||
|
|
@ -191,6 +194,25 @@ public class InfoUtil {
|
|||
return new PlaylistTuple(next, videos);
|
||||
}
|
||||
|
||||
public PlaylistTuple getPlaylistFromInvidous(String id){
|
||||
String url = invidousURL + "playlists/"+id;
|
||||
JSONObject res = genericRequest(url);
|
||||
if (res.length() == 0) return new PlaylistTuple("", getFromYTDL("https://www.youtube.com/playlist?list="+id));
|
||||
try{
|
||||
JSONArray vids = res.getJSONArray("videos");
|
||||
for(int i = 0; i < vids.length(); i++){
|
||||
JSONObject element = vids.getJSONObject(i);
|
||||
Video v = createVideofromInvidiousJSON(element);
|
||||
if(v == null || v.getThumb().isEmpty()) continue;
|
||||
v.setPlaylistTitle(res.getString("title"));
|
||||
videos.add(v);
|
||||
}
|
||||
}catch(Exception e){
|
||||
e.printStackTrace();
|
||||
}
|
||||
return new PlaylistTuple("", videos);
|
||||
}
|
||||
|
||||
public Video getVideo(String id) throws JSONException {
|
||||
if (key.isEmpty()) {
|
||||
if (useInvidous){
|
||||
|
|
|
|||
Loading…
Reference in a new issue