diff --git a/.idea/assetWizardSettings.xml b/.idea/assetWizardSettings.xml index 3375e8a9..041600c8 100644 --- a/.idea/assetWizardSettings.xml +++ b/.idea/assetWizardSettings.xml @@ -23,7 +23,7 @@ @@ -34,7 +34,7 @@ diff --git a/.idea/misc.xml b/.idea/misc.xml index 1ebb0846..34e91fab 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,18 +37,21 @@ + + + - + @@ -59,7 +62,7 @@ - + diff --git a/README.md b/README.md index d5a62ecd..f85ed78e 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,8 @@ Features: - [x] share videos / playlists from the Youtube App using the share menu - [x] heads-up download notifications -| | | -|:-------------------------:|:-------------------------:| |![image](https://user-images.githubusercontent.com/64997243/185808455-0b04f573-afe5-43d8-b6c8-6481b799e474.png)|![image](https://user-images.githubusercontent.com/64997243/185808467-7fcc9938-f124-45c1-8b29-3384269fb693.png)| +|:-------------------------:|:-------------------------:| ![image](https://user-images.githubusercontent.com/64997243/185808474-5df57756-6e27-4c03-9870-3c47f782bfb9.png)|![image](https://user-images.githubusercontent.com/64997243/185808477-073a8ea8-70ae-4702-9865-317149f2bb25.png)| ![image](https://user-images.githubusercontent.com/64997243/185808483-9b5e62c3-f28b-4bfb-9caf-adbb899ce702.png)|![image](https://user-images.githubusercontent.com/64997243/185808495-9930312c-34df-43f1-b7f3-e519d1231c09.png)| diff --git a/app/src/main/java/com/deniscerri/ytdl/HomeFragment.java b/app/src/main/java/com/deniscerri/ytdl/HomeFragment.java index a431fd9a..b3b2162d 100644 --- a/app/src/main/java/com/deniscerri/ytdl/HomeFragment.java +++ b/app/src/main/java/com/deniscerri/ytdl/HomeFragment.java @@ -38,6 +38,7 @@ import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.core.content.ContextCompat; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; import com.deniscerri.ytdl.api.YoutubeAPIManager; import com.deniscerri.ytdl.database.DBManager; @@ -99,21 +100,14 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ public void onProgressUpdate(float progress, long etaInSeconds, String line) { activity.runOnUiThread(() -> { progressBar.setProgress((int) progress); - String contentText = ""; - if(progressBar.getProgress() > 0){ - contentText += progressBar.getProgress() + "%"; - } - - String eta = convertETASecondsToTime(etaInSeconds); - if(!eta.equals("0sec")){ - contentText = contentText+ " Estimated Time: " + eta; - } if(downloadQueue.size() > 0){ - contentText = contentText + "\n" + downloadQueue.size() + " items left"; + contentText += " " + downloadQueue.size() + " items left\n"; } + contentText += line.replaceAll("\\[.*?\\]", ""); + download_notification.setProgress(100,(int) progress,false) .setContentText(contentText); @@ -172,6 +166,8 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ shimmerCards = fragmentView.findViewById(R.id.shimmer_results_framelayout); topAppBar = fragmentView.findViewById(R.id.home_toolbar); + downloadQueue = new LinkedList<>(); + SwipeRefreshLayout swipeRefreshLayout = fragmentView.findViewById(R.id.swiperefreshhome); swipeRefreshLayout.setOnRefreshListener(() -> { initCards(); @@ -182,7 +178,7 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ fab.setOnClickListener(this); scrollView.setOnScrollChangeListener((view, x, y, oldX, oldY) -> { - if( y > 500){ + if(y > 500){ fab.show(); }else{ fab.hide(); @@ -246,9 +242,11 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ } uiHandler.post(() -> { - addEndofResultsText(); shimmerCards.stopShimmer(); shimmerCards.setVisibility(View.GONE); + if(resultObjects.size() > 1){ + addEndofResultsText(); + } }); }); thread.start(); @@ -327,7 +325,7 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ if(m.find()){ type = "Video"; - if (inputQuery.contains("list=")) { + if (inputQuery.contains("playlist?list=")) { type = "Playlist"; } } @@ -372,6 +370,11 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ inputQuery = inputQuery.substring(8); } + if(inputQuery.contains("&list=")){ + el = inputQuery.split("&list="); + inputQuery = el[0]; + } + Thread thread = new Thread(new Runnable(){ private final String query; { @@ -385,8 +388,8 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ Log.e(TAG, e.toString()); } - dbManager.addToResults(resultObjects); createCard(resultObjects.get(0)); + dbManager.addToResults(resultObjects); new Handler(Looper.getMainLooper()).post(() -> { shimmerCards.stopShimmer(); @@ -540,7 +543,6 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ if(viewIdName.contains("mp3") || viewIdName.contains("mp4")){ Log.e(TAG, viewIdName); String[] buttonData = viewIdName.split("##"); - downloadQueue = new LinkedList<>(); if(buttonData[0].equals("ALL")){ for (int i = 0; i < resultObjects.size(); i++){ Video vid = findVideo(resultObjects.get(i).getVideoId()); @@ -554,6 +556,11 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ downloadQueue.add(vid); } + if (downloading) { + Toast.makeText(context, R.string.added_to_queue, Toast.LENGTH_LONG).show(); + return; + } + startDownload(downloadQueue); } @@ -587,11 +594,6 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ return; } - if (downloading) { - Toast.makeText(context, R.string.download_already_started, Toast.LENGTH_LONG).show(); - return; - } - if (!isStoragePermissionGranted()) { Toast.makeText(context, R.string.try_again_after_permission, Toast.LENGTH_LONG).show(); return; @@ -608,6 +610,7 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ if(type.equals("mp3")){ request.addOption("--embed-thumbnail"); + request.addOption("--sponsorblock-remove", "all"); request.addOption("--postprocessor-args", "-write_id3v1 1 -id3v2_version 3"); request.addOption("--add-metadata"); request.addOption("--no-mtime"); @@ -616,6 +619,9 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ clickedButton = linearLayout.findViewWithTag(id+"##mp3"); }else if(type.equals("mp4")){ + request.addOption("--embed-thumbnail"); + request.addOption("--sponsorblock-mark", "all"); + request.addOption("--embed-subs", ""); request.addOption("-f", "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best"); clickedButton = linearLayout.findViewWithTag(id+"##mp4"); @@ -641,6 +647,7 @@ public class HomeFragment extends Fragment implements View.OnClickListener{ progressBar.setProgress(0); progressBar.setVisibility(View.GONE); + notificationManager.cancel(Integer.parseInt(App.DOWNLOAD_CHANNEL_ID)); download_notification.setContentText(getString(R.string.download_success)) .setSmallIcon(android.R.drawable.stat_sys_download_done) .setLargeIcon(BitmapFactory.decodeResource(this.getResources(), android.R.drawable.stat_sys_download_done)) diff --git a/app/src/main/java/com/deniscerri/ytdl/SettingsFragment.java b/app/src/main/java/com/deniscerri/ytdl/SettingsFragment.java index 60adae22..a12d0c73 100644 --- a/app/src/main/java/com/deniscerri/ytdl/SettingsFragment.java +++ b/app/src/main/java/com/deniscerri/ytdl/SettingsFragment.java @@ -118,27 +118,27 @@ public class SettingsFragment extends PreferenceFragmentCompat { String[] pieces = dataValue.split("/"); int index = 1; - String path = "/storage/"; + StringBuilder path = new StringBuilder("/storage/"); if(pieces[0].equals("primary")){ - path+="emulated/0/"; + path.append("emulated/0/"); }else{ - path+=pieces[0]+"/"; + path.append(pieces[0]).append("/"); } for(int i = index; i < pieces.length; i++){ - path = path + pieces[i] + "/"; + path.append(pieces[i]).append("/"); } - Log.e("TEST", path); - p.setSummary(path); + Log.e("TEST", path.toString()); + p.setSummary(path.toString()); SharedPreferences sharedPreferences = requireContext().getSharedPreferences("root_preferences", Activity.MODE_PRIVATE); SharedPreferences.Editor editor = sharedPreferences.edit(); switch (requestCode){ case MUSIC_PATH_CODE: - editor.putString("music_path", path); + editor.putString("music_path", path.toString()); break; case VIDEO_PATH_CODE: - editor.putString("video_path", path); + editor.putString("video_path", path.toString()); break; } editor.apply(); @@ -146,11 +146,11 @@ public class SettingsFragment extends PreferenceFragmentCompat { private void updateYoutubeDL() { if (updating) { - Toast.makeText(getContext(), "Perditesimi eshte kerkuar nje here!", Toast.LENGTH_LONG).show(); + Toast.makeText(getContext(), getString(R.string.ytdl_already_updating), Toast.LENGTH_LONG).show(); return; } - Toast.makeText(getContext(), "Filloi Perditesimi", Toast.LENGTH_SHORT).show(); + Toast.makeText(getContext(), getString(R.string.ytdl_updating_started), Toast.LENGTH_SHORT).show(); updating = true; Disposable disposable = Observable.fromCallable(() -> YoutubeDL.getInstance().updateYoutubeDL(getContext())) @@ -159,10 +159,10 @@ public class SettingsFragment extends PreferenceFragmentCompat { .subscribe(status -> { switch (status) { case DONE: - Toast.makeText(getContext(), "Perditesimi u krye me sukses!", Toast.LENGTH_LONG).show(); + Toast.makeText(getContext(), getString(R.string.ytld_update_success), Toast.LENGTH_LONG).show(); break; case ALREADY_UP_TO_DATE: - Toast.makeText(getContext(), "Je ne versionin e fundit", Toast.LENGTH_LONG).show(); + Toast.makeText(getContext(), getString(R.string.you_are_in_latest_version), Toast.LENGTH_LONG).show(); break; default: Toast.makeText(getContext(), status.toString(), Toast.LENGTH_LONG).show(); @@ -170,8 +170,8 @@ public class SettingsFragment extends PreferenceFragmentCompat { } updating = false; }, e -> { - if(BuildConfig.DEBUG) Log.e(TAG, "Deshtim ne perditesim", e); - Toast.makeText(getContext(), "Deshtim ne perditesim", Toast.LENGTH_LONG).show(); + if(BuildConfig.DEBUG) Log.e(TAG, getString(R.string.ytdl_update_failed), e); + Toast.makeText(getContext(), getString(R.string.ytdl_update_failed), Toast.LENGTH_LONG).show(); updating = false; }); compositeDisposable.add(disposable); diff --git a/app/src/main/java/com/deniscerri/ytdl/api/YoutubeAPIManager.java b/app/src/main/java/com/deniscerri/ytdl/api/YoutubeAPIManager.java index 968fd9c9..dcd195aa 100644 --- a/app/src/main/java/com/deniscerri/ytdl/api/YoutubeAPIManager.java +++ b/app/src/main/java/com/deniscerri/ytdl/api/YoutubeAPIManager.java @@ -203,12 +203,14 @@ public class YoutubeAPIManager { while((line = reader.readLine()) != null){ responseContent.append(line); } + reader.close(); json = new JSONObject(responseContent.toString()); if(json.has("error")){ throw new Exception(); } } + conn.disconnect(); }catch(Exception e){ Log.e(TAG, e.toString()); } @@ -312,13 +314,12 @@ public class YoutubeAPIManager { if(minutes.isEmpty()){ if(hours.isEmpty()){ minutes = "0"; - }else{ - minutes = "00"; } } duration = minutes + ":" + seconds; if(!hours.isEmpty()){ + if(Integer.parseInt(minutes) < 10) minutes = "0" + minutes; duration = hours + ":" + minutes + ":" + seconds; } diff --git a/app/src/main/res/drawable/ic_code.xml b/app/src/main/res/drawable/ic_code.xml new file mode 100644 index 00000000..75f73d09 --- /dev/null +++ b/app/src/main/res/drawable/ic_code.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_music_downloaded.xml b/app/src/main/res/drawable/ic_music_downloaded.xml index 1aef77e7..e5be7772 100644 --- a/app/src/main/res/drawable/ic_music_downloaded.xml +++ b/app/src/main/res/drawable/ic_music_downloaded.xml @@ -1,5 +1,5 @@ - - + diff --git a/app/src/main/res/drawable/ic_update.xml b/app/src/main/res/drawable/ic_update.xml new file mode 100644 index 00000000..1eb1d39a --- /dev/null +++ b/app/src/main/res/drawable/ic_update.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_video_downloaded.xml b/app/src/main/res/drawable/ic_video_downloaded.xml index ccdd69bf..2e0356bb 100644 --- a/app/src/main/res/drawable/ic_video_downloaded.xml +++ b/app/src/main/res/drawable/ic_video_downloaded.xml @@ -1,5 +1,5 @@ - - + diff --git a/app/src/main/res/layout/fragment_history.xml b/app/src/main/res/layout/fragment_history.xml index e1f6d822..acadcae8 100644 --- a/app/src/main/res/layout/fragment_history.xml +++ b/app/src/main/res/layout/fragment_history.xml @@ -10,26 +10,10 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:id="@+id/history_big_linearlayout"> + android:id="@+id/history_big_linearlayout" + android:layout_marginTop="?attr/actionBarSize"> - - - - - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index ac536c13..52d76850 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -11,27 +11,9 @@ android:layout_height="match_parent" android:id="@+id/home_big_linearlayout" android:orientation="vertical" + android:layout_marginTop="?attr/actionBarSize" > - - - - - - - - + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-sq-rAL/strings.xml b/app/src/main/res/values-sq-rAL/strings.xml index 4bcffd16..c26154e2 100644 --- a/app/src/main/res/values-sq-rAL/strings.xml +++ b/app/src/main/res/values-sq-rAL/strings.xml @@ -26,4 +26,10 @@ Shkarkimet e Skedarëve Njoftimi i cili tregon progresin e shkarkimeve te skedarëve audio dhe video Dështim në krijimin e Direktorisë së re! :( + Je ne versionin e fundit + Perditesimi u krye me sukses! + Deshtim ne perditesim + U vendos në rradhë! + Duke u përditësuar. Prisni! + Filloi Perditesimi \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5bbabf94..7f1934a7 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -26,4 +26,10 @@ File Downloads Notification that shows the download progress of audio and video files Failed to create the new Directory! :( + Item added to the Queue! + You are at the latest version + Updated Succesfully + Failed Updating + Updating in Progress! Please Wait! + Updating Started diff --git a/app/src/main/res/xml/root_preferences.xml b/app/src/main/res/xml/root_preferences.xml index 22999d16..8e922eef 100644 --- a/app/src/main/res/xml/root_preferences.xml +++ b/app/src/main/res/xml/root_preferences.xml @@ -9,15 +9,18 @@ @@ -27,6 +30,7 @@