Comments (5)
check this example DownloadingExampleActivity.java
from youtubedl-android.
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.
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.
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.
Please try with release 0.9.0
or later.
from youtubedl-android.
Related Issues (20)
- How to build the libpython.so file HOT 1
- Download Errors: File "<frozen importlib._bootstrap>" HOT 4
- Youtube Video has no sound HOT 1
- insatgram "Thrades" not working
- 403 HTTP error HOT 9
- Resolve Duplicate FFmpeg Code between arthenica/ffmpeg-kit and youtubedl-android HOT 2
- Python & FFmpeg as downloadable plugins HOT 12
- instance not initialized HOT 1
- Processing logs causes OutOfMemoryError when downloading long streams
- How get Youtube VideoFormat list
- Error To Get VideoInfo HOT 1
- Download Not Work in Live App. HOT 7
- I can't get the format list for some videos in YouTube. HOT 1
- Update FFmpeg to the lastet version HOT 5
- Showing Downloaded Bytes for RTMP Videos
- ( lib/x86_64/libpython.zip.so) Malware Detected HOT 13
- destroyProcessByID not working with external executables running in child processes HOT 11
- [Errno 2] No usable temporary directory found in ['/data/data/com.termux/files/usr/tmp', '/'] HOT 5
- Resolution Setting
- Improvement Request update to python 3.12 for better performance ( libpython.zip.so)
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
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.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from youtubedl-android.