Code Monkey home page Code Monkey logo

Comments (5)

xibr avatar xibr commented on May 31, 2024

check this example DownloadingExampleActivity.java

from youtubedl-android.

FunProgramer avatar FunProgramer commented on May 31, 2024

I changed my class as you can see.

DownloadAUDIO.java

package philippsapps.yt2netradio;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import com.yausername.youtubedl_android.DownloadProgressCallback;
import com.yausername.youtubedl_android.YoutubeDL;
import com.yausername.youtubedl_android.YoutubeDLRequest;

import java.util.concurrent.Callable;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.functions.Consumer;
import io.reactivex.rxjava3.schedulers.Schedulers;

public class DownloadAUDIO extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download_audio);

        TextView tvURL = findViewById(R.id.tvURL);
        final TextView tvETA = findViewById(R.id.tvETA);
        final TextView tvProgress = findViewById(R.id.tvProgress);
        final ProgressBar progressBar = findViewById(R.id.progressBar);


        Intent receivedIntent = getIntent();
        String VideoURL = receivedIntent.getStringExtra(Intent.EXTRA_TEXT);
        //String VideoID = VideoURL.substring(17);

        tvURL.setText(VideoURL);

        final YoutubeDL youtubeDL = YoutubeDL.getInstance();

        final YoutubeDLRequest youtubeDLRequest = new YoutubeDLRequest(VideoURL);
        final DownloadProgressCallback downloadProgressCallback = new DownloadProgressCallback() {
            @Override
            public void onProgressUpdate(float progress, long etaInSeconds) {
                progressBar.setProgress(Math.round(progress),true);
                tvProgress.setText((etaInSeconds) + "%");
                tvETA.setText(String.valueOf(etaInSeconds) + R.string.secs_left );
            }
        };

        if(!isStoragePermissionGranted()) {
            Toast.makeText(this, "Please give Storage Permission and then try again", Toast.LENGTH_LONG);
            finish();
        }

        Disposable disposable = Observable.fromCallable(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                return youtubeDL.execute(youtubeDLRequest, downloadProgressCallback);
            }
        }).subscribeOn(Schedulers.newThread())
          .observeOn(AndroidSchedulers.mainThread())
          .subscribe(new Consumer<Object>() {
              @Override
              public void accept(Object YoutubeDLResponse) {
                  progressBar.setProgress(100, true);
                  tvProgress.setText("100%");
                  tvETA.setText("Download finished successful.");
              }}, new Consumer<Throwable>() {
              @Override
              public void accept(Throwable e) {
                  progressBar.setProgress(0);
                  tvProgress.setText("0%");
                  tvETA.setError("Error download failed!");
              }
          });

        CompositeDisposable compositeDisposable = new CompositeDisposable();
        compositeDisposable.add(disposable);

    }

    public boolean isStoragePermissionGranted() {
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
}

But now there is an another problem.
Stacktrace

2020-04-25 17:09:52.109 5256-5256/philippsapps.yt2netradio E/AndroidRuntime: FATAL EXCEPTION: main
    Process: philippsapps.yt2netradio, PID: 5256
    java.lang.BootstrapMethodError: Exception from call site #1 bootstrap method
        at io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.<clinit>(AndroidSchedulers.java:33)
        at io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread(AndroidSchedulers.java:44)
        at philippsapps.yt2netradio.DownloadAUDIO.onCreate(DownloadAUDIO.java:71)
        at android.app.Activity.performCreate(Activity.java:7009)
        at android.app.Activity.performCreate(Activity.java:7000)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6494)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
     Caused by: java.lang.NoClassDefFoundError: Invalid descriptor: rootValueSeparator.
        at io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.<clinit>(AndroidSchedulers.java:33) 
        at io.reactivex.rxjava3.android.schedulers.AndroidSchedulers.mainThread(AndroidSchedulers.java:44) 
        at philippsapps.yt2netradio.DownloadAUDIO.onCreate(DownloadAUDIO.java:71) 
        at android.app.Activity.performCreate(Activity.java:7009) 
        at android.app.Activity.performCreate(Activity.java:7000) 
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) 
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) 
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6494) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

FunProgramer

from youtubedl-android.

FunProgramer avatar FunProgramer commented on May 31, 2024

I copied the Example Activity and changed it for my uses. Now the activity not crashes, but Logcat shows the same Problem as bevore.

DownloadAUDIO.java

package philippsapps.yt2netradio;

import android.Manifest;
import android.app.Activity;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Environment;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;

import com.yausername.youtubedl_android.DownloadProgressCallback;
import com.yausername.youtubedl_android.YoutubeDL;
import com.yausername.youtubedl_android.YoutubeDLRequest;

import org.apache.commons.lang3.StringUtils;

import java.io.File;

import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.disposables.CompositeDisposable;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;


public class DownloadAUDIO extends Activity {

    private TextView tvURL;
    private TextView tvProgress;
    private ProgressBar progressBar;
    private TextView tvETA;

    private boolean downloading = false;
    private CompositeDisposable compositeDisposable = new CompositeDisposable();

    private DownloadProgressCallback callback = new DownloadProgressCallback() {
        @Override
        public void onProgressUpdate(float progress, long etaInSeconds) {
            runOnUiThread(() -> {
                        progressBar.setProgress((int) progress);

                        tvETA.setText(String.valueOf(etaInSeconds) + R.string.secs_left);
                    }
            );
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_download_audio);



        Intent intent = getIntent();
        String URL = intent.getStringExtra(Intent.EXTRA_TEXT);
        TextView tvURL2 = findViewById(R.id.tvURL);
        tvURL2.setText(URL);

        initViews();
        startDownload();
    }

    private void initViews() {
        tvURL = findViewById(R.id.tvURL);
        tvProgress = findViewById(R.id.tvProgress);
        progressBar = findViewById(R.id.progressBar);
        tvETA = findViewById(R.id.tvETA);
    }


    private void startDownload() {
        if (downloading) {
            Toast.makeText(this, "cannot start download. a download is already in progress", Toast.LENGTH_LONG).show();
            return;
        }

        if (!isStoragePermissionGranted()) {
            Toast.makeText(this, "grant storage permission and retry", Toast.LENGTH_LONG).show();
            return;
        }

        String url = tvURL.getText().toString();
        if (StringUtils.isBlank(url)) {
            Toast.makeText(this, "URL is blank", Toast.LENGTH_LONG).show();
            return;
        }

        YoutubeDLRequest request = new YoutubeDLRequest(url);
        File youtubeDLDir = getDownloadLocation();
        request.setOption("-o", youtubeDLDir.getAbsolutePath() + "/%(title)s.%(ext)s");

        showStart();

        downloading = true;
        Disposable disposable = Observable.fromCallable(() -> YoutubeDL.getInstance().execute(request, callback))
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(youtubeDLResponse -> {
                    progressBar.setProgress(100);
                    tvProgress.setText("100 %");
                    Toast.makeText(this, "download successful", Toast.LENGTH_LONG).show();
                    downloading = false;
                }, e -> {
                    tvProgress.setText("0 %");
                    Toast.makeText(this, "download failed", Toast.LENGTH_LONG).show();
                    downloading = false;
                    e.printStackTrace();
                });
        compositeDisposable.add(disposable);

    }

    @Override
    protected void onDestroy() {
        compositeDisposable.dispose();
        super.onDestroy();
    }

    @NonNull
    private File getDownloadLocation() {
        File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
        File youtubeDLDir = new File(downloadsDir, "youtubedl-android");
        if (!youtubeDLDir.exists()) youtubeDLDir.mkdir();
        return youtubeDLDir;
    }

    private void showStart() {
        progressBar.setProgress(0);
    }

    public boolean isStoragePermissionGranted() {
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
            return false;
        }
    }
}

Logcat Output

2020-05-02 22:06:42.293 16350-16350/philippsapps.yt2netradio W/System.err: java.lang.IllegalStateException: instance not initialized
2020-05-02 22:06:42.294 16350-16361/philippsapps.yt2netradio I/zygote: Background concurrent copying GC freed 1488(232KB) AllocSpace objects, 0(0B) LOS objects, 51% free, 1454KB/2MB, paused 790us total 106.617ms
2020-05-02 22:06:42.353 16350-16350/philippsapps.yt2netradio W/System.err:     at com.yausername.youtubedl_android.YoutubeDL.assertInit(YoutubeDL.java:110)
2020-05-02 22:06:42.353 16350-16350/philippsapps.yt2netradio W/System.err:     at com.yausername.youtubedl_android.YoutubeDL.execute(YoutubeDL.java:134)
2020-05-02 22:06:42.354 16350-16350/philippsapps.yt2netradio W/System.err:     at philippsapps.yt2netradio.DownloadAUDIO.lambda$startDownload$0$DownloadAUDIO(DownloadAUDIO.java:101)
2020-05-02 22:06:42.354 16350-16350/philippsapps.yt2netradio W/System.err:     at philippsapps.yt2netradio.-$$Lambda$DownloadAUDIO$VZxqHoRgs_wZZFBuJSYfl0_-j58.call(Unknown Source:4)
2020-05-02 22:06:42.355 16350-16350/philippsapps.yt2netradio W/System.err:     at io.reactivex.rxjava3.internal.operators.observable.ObservableFromCallable.subscribeActual(ObservableFromCallable.java:46)
2020-05-02 22:06:42.355 16350-16350/philippsapps.yt2netradio W/System.err:     at io.reactivex.rxjava3.core.Observable.subscribe(Observable.java:13095)
2020-05-02 22:06:42.355 16350-16350/philippsapps.yt2netradio W/System.err:     at io.reactivex.rxjava3.internal.operators.observable.ObservableSubscribeOn$SubscribeTask.run(ObservableSubscribeOn.java:96)
2020-05-02 22:06:42.355 16350-16350/philippsapps.yt2netradio W/System.err:     at io.reactivex.rxjava3.core.Scheduler$DisposeTask.run(Scheduler.java:589)
2020-05-02 22:06:42.355 16350-16350/philippsapps.yt2netradio W/System.err:     at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:65)
2020-05-02 22:06:42.355 16350-16350/philippsapps.yt2netradio W/System.err:     at io.reactivex.rxjava3.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:56)
2020-05-02 22:06:42.356 16350-16350/philippsapps.yt2netradio W/System.err:     at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2020-05-02 22:06:42.356 16350-16350/philippsapps.yt2netradio W/System.err:     at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
2020-05-02 22:06:42.357 16350-16350/philippsapps.yt2netradio W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
2020-05-02 22:06:42.357 16350-16350/philippsapps.yt2netradio W/System.err:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
2020-05-02 22:06:42.357 16350-16350/philippsapps.yt2netradio W/System.err:     at java.lang.Thread.run(Thread.java:764)

from youtubedl-android.

yausername avatar yausername commented on May 31, 2024

You need to initialized instance before using.
Put these two lines in onCreate before startDownload download. Second line is needed because the binary shipped within is outdated and does not work. Should be fixed in next release.

YoutubeDL.getInstance().init(getApplication());
YoutubeDL.getInstance().updateYoutubeDL(getApplication());

from youtubedl-android.

yausername avatar yausername commented on May 31, 2024

Please try with release 0.9.0 or later.

from youtubedl-android.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.