added playlist support for invidious & removed recyclerview flashes

pull/15/head
Denis Çerri 4 years ago
parent 14033e38e2
commit dc75436bdc
No known key found for this signature in database
GPG Key ID: 96B3554AF5B193EE

@ -318,7 +318,6 @@ public class DownloaderService extends Service {
video.setAuthor(video.getAuthor().replaceAll(":|'|\"|[.]|,", "")); video.setAuthor(video.getAuthor().replaceAll(":|'|\"|[.]|,", ""));
String sponsorBlockFilters = sharedPreferences.getString("sponsorblock_filter", ""); String sponsorBlockFilters = sharedPreferences.getString("sponsorblock_filter", "");
Toast.makeText(context, sponsorBlockFilters, Toast.LENGTH_LONG).show();
if (!sponsorBlockFilters.isEmpty()){ if (!sponsorBlockFilters.isEmpty()){
request.addOption("--sponsorblock-remove", sponsorBlockFilters); request.addOption("--sponsorblock-remove", sponsorBlockFilters);
} }

@ -197,17 +197,11 @@ public class DownloadsRecyclerViewAdapter extends RecyclerView.Adapter<Downloads
void onButtonClick(int position); void onButtonClick(int position);
} }
public void setVideoList(ArrayList<Video> videoList){
this.videoList = videoList;
setWebsiteList();
notifyDataSetChanged();
}
public ArrayList<String> getWebsites(){ public ArrayList<String> getWebsites(){
return websites; return websites;
} }
public void setWebsiteList(){ public void updateWebsiteList(){
websites = new ArrayList<>(); websites = new ArrayList<>();
for (Video video : videoList){ for (Video video : videoList){
if (!websites.contains(video.getWebsite())) websites.add(video.getWebsite()); if (!websites.contains(video.getWebsite())) websites.add(video.getWebsite());
@ -230,4 +224,17 @@ public class DownloadsRecyclerViewAdapter extends RecyclerView.Adapter<Downloads
checkedVideos.clear(); 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.ImageView;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
@ -190,13 +192,6 @@ public class HomeRecyclerViewAdapter extends RecyclerView.Adapter<HomeRecyclerVi
void onCardClick(int position, boolean add); 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){ public void updateVideoListItem(Video v, int position){
videoList.set(position, v); videoList.set(position, v);
notifyItemChanged(position); notifyItemChanged(position);
@ -217,4 +212,9 @@ public class HomeRecyclerViewAdapter extends RecyclerView.Adapter<HomeRecyclerVi
notifyItemRangeRemoved(0, size); 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 = new DBManager(context);
dbManager.clearHistoryItem(v,false); dbManager.clearHistoryItem(v,false);
dbManager.close(); dbManager.close();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.notifyItemRemoved(downloadsObjects.indexOf(v));
if (downloadsObjects.isEmpty()) initCards(); if (downloadsObjects.isEmpty()) initCards();
downloading = false; downloading = false;
@ -283,14 +283,13 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
no_results.setVisibility(View.GONE); no_results.setVisibility(View.GONE);
selectionChips.setVisibility(View.VISIBLE); selectionChips.setVisibility(View.VISIBLE);
dbManager = new DBManager(context); dbManager = new DBManager(context);
try{ try{
Thread thread = new Thread(() -> { Thread thread = new Thread(() -> {
if (!downloading) dbManager.clearDownloadingHistory(); if (!downloading) dbManager.clearDownloadingHistory();
downloadsObjects = dbManager.getHistory("", format,website,sort); downloadsObjects = dbManager.getHistory("", format,website,sort);
uiHandler.post(() -> { uiHandler.post(() -> {
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
shimmerCards.stopShimmer(); shimmerCards.stopShimmer();
shimmerCards.setVisibility(View.GONE); shimmerCards.setVisibility(View.GONE);
updateWebsiteChips(); updateWebsiteChips();
@ -346,7 +345,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
topAppBar.getMenu().findItem(R.id.search_downloads).collapseActionView(); topAppBar.getMenu().findItem(R.id.search_downloads).collapseActionView();
downloadsObjects = dbManager.getHistory(query, format,website,sort); downloadsObjects = dbManager.getHistory(query, format,website,sort);
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
if(downloadsObjects.size() == 0) { if(downloadsObjects.size() == 0) {
no_results.setVisibility(View.VISIBLE); no_results.setVisibility(View.VISIBLE);
@ -361,7 +360,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
searchQuery = newText; searchQuery = newText;
downloadsObjects = dbManager.getHistory(newText, format,website,sort); downloadsObjects = dbManager.getHistory(newText, format,website,sort);
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
if (downloadsObjects.size() == 0) { if (downloadsObjects.size() == 0) {
no_results.setVisibility(View.VISIBLE); no_results.setVisibility(View.VISIBLE);
@ -395,7 +394,6 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
dbManager.clearHistory(); dbManager.clearHistory();
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsObjects.clear(); downloadsObjects.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
no_results.setVisibility(View.VISIBLE); no_results.setVisibility(View.VISIBLE);
selectionChips.setVisibility(View.GONE); selectionChips.setVisibility(View.GONE);
websiteGroup.removeAllViews(); websiteGroup.removeAllViews();
@ -474,7 +472,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
sort = "DESC"; sort = "DESC";
downloadsObjects = dbManager.getHistory(searchQuery, format,website,sort); downloadsObjects = dbManager.getHistory(searchQuery, format,website,sort);
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
sortSheet.cancel(); sortSheet.cancel();
}); });
@ -482,7 +480,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
sort = "ASC"; sort = "ASC";
downloadsObjects = dbManager.getHistory(searchQuery, format,website,sort); downloadsObjects = dbManager.getHistory(searchQuery, format,website,sort);
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
sortSheet.cancel(); sortSheet.cancel();
}); });
@ -512,7 +510,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
} }
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
}); });
Chip video = fragmentView.findViewById(R.id.video_chip); Chip video = fragmentView.findViewById(R.id.video_chip);
@ -528,7 +526,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
} }
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
}); });
} }
@ -555,7 +553,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
websiteGroup.clearCheck(); websiteGroup.clearCheck();
} }
downloadsRecyclerViewAdapter.clear(); downloadsRecyclerViewAdapter.clear();
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects); downloadsRecyclerViewAdapter.add(downloadsObjects);
}); });
websiteGroup.addView(tmp); websiteGroup.addView(tmp);
} }
@ -601,8 +599,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
Video v = selectedObjects.get(j); Video v = selectedObjects.get(j);
int position = downloadsObjects.indexOf(v); int position = downloadsObjects.indexOf(v);
downloadsObjects.remove(v); downloadsObjects.remove(v);
downloadsRecyclerViewAdapter.notifyItemRemoved(position); downloadsRecyclerViewAdapter.remove(position);
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
dbManager.clearHistoryItem(v, delete_file[0]); dbManager.clearHistoryItem(v, delete_file[0]);
} }
updateWebsiteChips(); updateWebsiteChips();
@ -636,8 +633,7 @@ public class DownloadsFragment extends Fragment implements DownloadsRecyclerView
}); });
delete_dialog.setPositiveButton(getString(R.string.ok), (dialogInterface, i) -> { delete_dialog.setPositiveButton(getString(R.string.ok), (dialogInterface, i) -> {
downloadsObjects.remove(position); downloadsObjects.remove(position);
downloadsRecyclerViewAdapter.notifyItemRemoved(position); downloadsRecyclerViewAdapter.remove(position);
downloadsRecyclerViewAdapter.setVideoList(downloadsObjects);
updateWebsiteChips(); updateWebsiteChips();
dbManager.clearHistoryItem(v, delete_file[0]); dbManager.clearHistoryItem(v, delete_file[0]);
dbManager.close(); dbManager.close();

@ -260,6 +260,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
dbManager.clearResults(); dbManager.clearResults();
dbManager.close(); dbManager.close();
inputQueriesLength = inputQueries.size(); inputQueriesLength = inputQueries.size();
homeRecyclerViewAdapter.clear();
shimmerCards.startShimmer(); shimmerCards.startShimmer();
shimmerCards.setVisibility(View.VISIBLE); shimmerCards.setVisibility(View.VISIBLE);
@ -318,7 +319,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
} }
}else { }else {
if (!downloading){ if (!downloading){
homeRecyclerViewAdapter.setVideoList(resultObjects, true); homeRecyclerViewAdapter.add(resultObjects);
for (int i = 0; i < resultObjects.size(); i++){ for (int i = 0; i < resultObjects.size(); i++){
Video tmp = resultObjects.get(i); Video tmp = resultObjects.get(i);
if(tmp.isDownloading()){ if(tmp.isDownloading()){
@ -330,7 +331,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
} }
uiHandler.post(() -> { uiHandler.post(() -> {
homeRecyclerViewAdapter.setVideoList(resultObjects, true); homeRecyclerViewAdapter.add(resultObjects);
shimmerCards.stopShimmer(); shimmerCards.stopShimmer();
shimmerCards.setVisibility(View.GONE); shimmerCards.setVisibility(View.GONE);
}); });
@ -499,17 +500,22 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
case "Search": { case "Search": {
try { try {
if (resetResults) resultObjects.clear(); 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) { } catch (Exception e) {
Log.e(TAG, e.toString()); 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; break;
} }
case "Video": { case "Video": {
@ -527,18 +533,24 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
try { try {
if (resetResults) resultObjects.clear(); 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) { } catch (Exception e) {
Log.e(TAG, e.toString()); 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; break;
} }
case "Playlist": { case "Playlist": {
@ -547,7 +559,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
if (resetResults) dbManager.clearResults(); if (resetResults) dbManager.clearResults();
if (resetResults){ if (resetResults){
resultObjects.clear(); resultObjects.clear();
homeRecyclerViewAdapter.setVideoList(new ArrayList<>(), true); homeRecyclerViewAdapter.clear();
} }
do { do {
InfoUtil.PlaylistTuple tmp = infoUtil.getPlaylist(inputQuery, nextPageToken); InfoUtil.PlaylistTuple tmp = infoUtil.getPlaylist(inputQuery, nextPageToken);
@ -556,7 +568,7 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
resultObjects.addAll(tmp_vids); resultObjects.addAll(tmp_vids);
new Handler(Looper.getMainLooper()).post(() -> { new Handler(Looper.getMainLooper()).post(() -> {
dbManager.addToResults(tmp_vids); dbManager.addToResults(tmp_vids);
homeRecyclerViewAdapter.setVideoList(resultObjects, true); homeRecyclerViewAdapter.add(tmp_vids);
shimmerCards.stopShimmer(); shimmerCards.stopShimmer();
shimmerCards.setVisibility(View.GONE); shimmerCards.setVisibility(View.GONE);
}); });
@ -574,12 +586,12 @@ public class HomeFragment extends Fragment implements HomeRecyclerViewAdapter.On
resultObjects.addAll(video); resultObjects.addAll(video);
new Handler(Looper.getMainLooper()).post(() -> { new Handler(Looper.getMainLooper()).post(() -> {
if (resetResults) dbManager.clearResults(); if (resetResults) dbManager.clearResults();
homeRecyclerViewAdapter.add(video);
dbManager.addToResults(resultObjects); dbManager.addToResults(resultObjects);
}); });
} }
new Handler(Looper.getMainLooper()).post(() -> { new Handler(Looper.getMainLooper()).post(() -> {
homeRecyclerViewAdapter.setVideoList(resultObjects, true);
shimmerCards.stopShimmer(); shimmerCards.stopShimmer();
shimmerCards.setVisibility(View.GONE); shimmerCards.setVisibility(View.GONE);
}); });

@ -145,9 +145,12 @@ public class InfoUtil {
} }
public PlaylistTuple getPlaylist(String id, String nextPageToken) throws JSONException{ 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<>(); 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&regionCode="+countryCODE+"&playlistId="+id+"&key="+key; String url = "https://youtube.googleapis.com/youtube/v3/playlistItems?part=snippet&pageToken="+nextPageToken+"&maxResults=50&regionCode="+countryCODE+"&playlistId="+id+"&key="+key;
//short data //short data
JSONObject res = genericRequest(url); JSONObject res = genericRequest(url);
@ -191,6 +194,25 @@ public class InfoUtil {
return new PlaylistTuple(next, videos); 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 { public Video getVideo(String id) throws JSONException {
if (key.isEmpty()) { if (key.isEmpty()) {
if (useInvidous){ if (useInvidous){

Loading…
Cancel
Save