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
-| | |
-|:-------------------------:|:-------------------------:|
|||
+|:-------------------------:|:-------------------------:|
||
||
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 @@