yausername/youtubedl-android


youtube-dl for android

Download


Step 1. Add the JitPack repository to your build file

Add it in your root settings.gradle at the end of repositories:

	dependencyResolutionManagement {
		repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
		repositories {
			mavenCentral()
			maven { url 'https://jitpack.io' }
		}
	}

Add it in your settings.gradle.kts at the end of repositories:

	dependencyResolutionManagement {
		repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
		repositories {
			mavenCentral()
			maven { url = uri("https://jitpack.io") }
		}
	}

Add to pom.xml

	<repositories>
		<repository>
		    <id>jitpack.io</id>
		    <url>https://jitpack.io</url>
		</repository>
	</repositories>

Add it in your build.sbt at the end of resolvers:

 
    resolvers += "jitpack" at "https://jitpack.io"
        
    

Add it in your project.clj at the end of repositories:

 
    :repositories [["jitpack" "https://jitpack.io"]]
        
    

Step 2. Add the dependency

	dependencies {
		implementation 'com.github.yausername:youtubedl-android:0.15.0'
	}
	dependencies {
		implementation("com.github.yausername:youtubedl-android:0.15.0")
	}
	<dependency>
	    <groupId>com.github.yausername</groupId>
	    <artifactId>youtubedl-android</artifactId>
	    <version>0.15.0</version>
	</dependency>

                            
    libraryDependencies += "com.github.yausername" % "youtubedl-android" % "0.15.0"
        
        

                            
    :dependencies [[com.github.yausername/youtubedl-android "0.15.0"]]
        
        

Readme


youtubedl-android

Android library wrapper for yt-dlp (formerly youtube-dl) executable

Maven Central Version

Credits

<br/>

Sample app

Debug apk for testing can be downloaded from the releases page <br/> <br/> Download Example Streaming Example

If you wish to use config file in the download option by using this command --config-location you must create a file named config.txt inside youtubedl-android directory and add the commands for example.

--no-mtime

-o /sdcard/Download/youtubedl-android/%(title)s.%(ext)s

-f "bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best"
<br/>

Checkout dvd, a video downloader app based on this library.

Also take a look at Seal, another video/audio downloader app which demonstrates a more advanced and customized use of this library.

Installation

Gradle

val youtubedlAndroid = "0.17.4"

repositories {
    mavenCentral()
}

dependencies {
    implementation("io.github.junkfood02.youtubedl-android:library:$youtubedlAndroid")
    implementation("io.github.junkfood02.youtubedl-android:ffmpeg:$youtubedlAndroid")
    implementation("io.github.junkfood02.youtubedl-android:aria2c:$youtubedlAndroid") // optional
}
  • Set android:extractNativeLibs="true" in your app's manifest.
  • Use abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' in app/build.gradle, see sample app.
  • Use abi splits to reduce apk size, see sample app.
  • On Android 10 (API 29), set android:requestLegacyExternalStorage="true".
  • On Android 10+ (API 30 or higher), due to Android's Scoped Storage changes, apps only have the direct access to Download/ and Documents/ . And you can only download the videos into these two directories, see related issue.

Usage

  • yt-dlp executable and python 3.8 are bundled in the library.
  • Initialize library, preferably in onCreate.
try {
    YoutubeDL.getInstance().init(this);
} catch (YoutubeDLException e) {
    Log.e(TAG, "failed to initialize youtubedl-android", e);
}
  • Downloading / custom command (A detailed example can be found in the sample app)
    File youtubeDLDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "youtubedl-android");
    YoutubeDLRequest request = new YoutubeDLRequest("https://vimeo.com/22439234");
    request.addOption("-o", youtubeDLDir.getAbsolutePath() + "/%(title)s.%(ext)s");
    YoutubeDL.getInstance().execute(request, (progress, etaInSeconds) -> {
    System.out.println(String.valueOf(progress) + "% (ETA " + String.valueOf(etaInSeconds) + " seconds)");
    });
  • Stopping a previously started download process
    YoutubeDLRequest request = new YoutubeDLRequest("https://vimeo.com/22439234");
    final String processId = "MyProcessDownloadId";
    YoutubeDL.getInstance().execute(request, (progress, etaInSeconds) -> {
    System.out.println(String.valueOf(progress) + "% (ETA " + String.valueOf(etaInSeconds) + " seconds)");
    }, processId);
    ...
    YoutubeDL.getInstance().destroyProcessById(processId);
  • Get stream info (equivalent to --dump-json of yt-dlp)
    VideoInfo streamInfo = YoutubeDL.getInstance().getInfo("https://vimeo.com/22439234");
    System.out.println(streamInfo.getTitle());
  • Get a single playable link containing video+audio
    YoutubeDLRequest request = new YoutubeDLRequest("https://youtu.be/Pv61yEcOqpw");
    request.addOption("-f", "best");
    VideoInfo streamInfo = YoutubeDL.getInstance().getInfo(request);
    System.out.println(streamInfo.getUrl());
  • yt-dlp supports myriad different options which be seen here

  • yt-dlp binary can be updated from within the library (A example can be found in the sample app)

    YoutubeDL.getInstance().updateYoutubeDL(this, updateChannel); // UpdateChannel.NIGHTLY or UpdateChannel.STABLE

FFmpeg

If you wish to use ffmpeg features of yt-dlp (e.g. --extract-audio), include and initialize the ffmpeg library.

try {
    YoutubeDL.getInstance().init(this);
    FFmpeg.getInstance().init(this);
} catch (YoutubeDLException e) {
    Log.e(TAG, "failed to initialize youtubedl-android", e);
}

Aria2c

This library can make use of aria2c as the external downloader. include and initialize the aria2c library.

try {
    YoutubeDL.getInstance().init(this);
    FFmpeg.getInstance().init(this);
    Aria2c.getInstance().init(this);
} catch (YoutubeDLException e) {
    Log.e(TAG, "failed to initialize youtubedl-android", e);
}

and options for the request as below:

request.addOption("--downloader", "libaria2c.so");

Docs

Donate

You can support the project by donating to below addresses. | Type | Address | | ------------- | ------------- | | <img src="https://en.bitcoin.it/w/images/en/2/29/BC_Logo_.png" alt="Bitcoin" width="50"/> | bc1qw3g7grh6dxk69mzwjmewanj9gj2ycc5mju5dc4 | | <img src="https://www.getmonero.org/press-kit/symbols/monero-symbol-480.png" alt="Monero" width="50"/> | 49SQgJTxoifhRB1vZGzKwUXUUNPMsrsxEacZ8bRs5tqeFgxFUHyDFBiUYh3UBRLAq355tc2694gbX9LNT7Ho7Vch2XEP4n4 |