How to the library in your app
This commit is contained in:
parent
b2a76985cd
commit
ea20ca0b00
|
@ -0,0 +1,251 @@
|
||||||
|
= Using Newpipe Extractor
|
||||||
|
|
||||||
|
|
||||||
|
== Add dependencies to gradle:
|
||||||
|
|
||||||
|
- *project* build.gradle:
|
||||||
|
|
||||||
|
[,gradle]
|
||||||
|
----
|
||||||
|
repositories {
|
||||||
|
...
|
||||||
|
maven { url 'https://jitpack.io' }
|
||||||
|
}
|
||||||
|
----
|
||||||
|
|
||||||
|
.or in settings.build
|
||||||
|
[%collapsible]
|
||||||
|
======
|
||||||
|
this is properly for android ;)
|
||||||
|
[,gradle]
|
||||||
|
----
|
||||||
|
repositories {
|
||||||
|
...
|
||||||
|
maven { url 'https://jitpack.io' }
|
||||||
|
}
|
||||||
|
----
|
||||||
|
======
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
- *module*/app build.gradle:
|
||||||
|
|
||||||
|
image:https://img.shields.io/github/v/release/TeamNewPipe/NewPipeExtractor.svg[]
|
||||||
|
|
||||||
|
[,gradle]
|
||||||
|
----
|
||||||
|
// NewPipe Libraries
|
||||||
|
implementation 'com.github.TeamNewPipe:NewPipeExtractor:0.21.12'
|
||||||
|
implementation 'com.github.TeamNewPipe:nanojson:1d9e1aea9049fc9f85e68b43ba39fe7be1c1f751'
|
||||||
|
|
||||||
|
|
||||||
|
// HTTP client
|
||||||
|
//noinspection GradleDependency --> do not update okhttp to keep supporting Android 4.4 users
|
||||||
|
implementation "com.squareup.okhttp3:okhttp:3.12.13"
|
||||||
|
|
||||||
|
----
|
||||||
|
|
||||||
|
NOTE: You could really use any http client other than okhttp.
|
||||||
|
|
||||||
|
|
||||||
|
== Configure for android projects:
|
||||||
|
|
||||||
|
Make sure you are using Java 11.
|
||||||
|
[,gradle]
|
||||||
|
```
|
||||||
|
android {
|
||||||
|
...
|
||||||
|
compileOptions {
|
||||||
|
coreLibraryDesugaringEnabled true
|
||||||
|
|
||||||
|
sourceCompatibility JavaVersion.VERSION_11
|
||||||
|
targetCompatibility JavaVersion.VERSION_11
|
||||||
|
}
|
||||||
|
|
||||||
|
// if you are using kotlin:
|
||||||
|
kotlinOptions {
|
||||||
|
jvmTarget = JavaVersion.VERSION_11
|
||||||
|
useIR = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
...
|
||||||
|
|
||||||
|
// desugar
|
||||||
|
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
=== Proguard rules if you've [minify] enable:
|
||||||
|
|
||||||
|
the `proguard-rules.pro` file:
|
||||||
|
|
||||||
|
```
|
||||||
|
...
|
||||||
|
|
||||||
|
# For NewPipeExtractor
|
||||||
|
-dontobfuscate
|
||||||
|
-keep class org.schabi.newpipe.extractor.timeago.patterns.** { *; }
|
||||||
|
-keep class org.ocpsoft.prettytime.i18n.** { *; }
|
||||||
|
|
||||||
|
-keep class org.mozilla.javascript.** { *; }
|
||||||
|
|
||||||
|
-keep class org.mozilla.classfile.ClassFileWriter
|
||||||
|
-keep class com.google.android.exoplayer2.** { *; }
|
||||||
|
|
||||||
|
-dontwarn org.mozilla.javascript.tools.**
|
||||||
|
-dontwarn android.arch.util.paging.CountedDataSource
|
||||||
|
-dontwarn android.arch.persistence.room.paging.LimitOffsetDataSource
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Rules for OkHttp. Copy paste from https://github.com/square/okhttp
|
||||||
|
-dontwarn okhttp3.**
|
||||||
|
-dontwarn okio.**
|
||||||
|
-dontwarn javax.annotation.**
|
||||||
|
# A resource is loaded with a relative path so the package of this class must be preserved.
|
||||||
|
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
|
||||||
|
-keepclassmembers class * implements java.io.Serializable {
|
||||||
|
static final long serialVersionUID;
|
||||||
|
!static !transient <fields>;
|
||||||
|
private void writeObject(java.io.ObjectOutputStream);
|
||||||
|
private void readObject(java.io.ObjectInputStream);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
=== Implementing [Downloader] (okhttp)
|
||||||
|
|
||||||
|
Copy paste from Newpipe ;)
|
||||||
|
|
||||||
|
```
|
||||||
|
package com.mycompany.hello
|
||||||
|
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Downloader
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Request
|
||||||
|
import org.schabi.newpipe.extractor.downloader.Response
|
||||||
|
import org.schabi.newpipe.extractor.exceptions.ReCaptchaException
|
||||||
|
|
||||||
|
import okhttp3.RequestBody
|
||||||
|
|
||||||
|
class DownloaderImpl(
|
||||||
|
private val okhttp : OkHttpClient
|
||||||
|
) : Downloader() {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun execute(request: Request): Response {
|
||||||
|
val httpMethod = request.httpMethod()
|
||||||
|
val url = request.url()
|
||||||
|
val headers = request.headers()
|
||||||
|
val dataToSend = request.dataToSend()
|
||||||
|
|
||||||
|
var requestBody: RequestBody? = null
|
||||||
|
if (dataToSend != null) {
|
||||||
|
requestBody = RequestBody.create(null, dataToSend)
|
||||||
|
}
|
||||||
|
|
||||||
|
val requestBuilder = okhttp3.Request.Builder()
|
||||||
|
.method(httpMethod, requestBody).url(url)
|
||||||
|
.addHeader("User-Agent", USER_AGENT)
|
||||||
|
|
||||||
|
for ((headerName, headerValueList) in headers) {
|
||||||
|
if (headerValueList.size > 1) {
|
||||||
|
requestBuilder.removeHeader(headerName)
|
||||||
|
for (headerValue in headerValueList) {
|
||||||
|
requestBuilder.addHeader(headerName, headerValue)
|
||||||
|
}
|
||||||
|
} else if (headerValueList.size == 1) {
|
||||||
|
requestBuilder.header(headerName, headerValueList[0])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
val response: okhttp3.Response = okhttp.newCall(requestBuilder.build()).execute()
|
||||||
|
|
||||||
|
if (response.code() == 429) {
|
||||||
|
response.close()
|
||||||
|
throw ReCaptchaException("reCaptcha Challenge requested", url)
|
||||||
|
}
|
||||||
|
|
||||||
|
val body = response.body()
|
||||||
|
var responseBodyToReturn: String? = null
|
||||||
|
|
||||||
|
if (body != null) {
|
||||||
|
responseBodyToReturn = body.string()
|
||||||
|
}
|
||||||
|
|
||||||
|
val latestUrl = response.request().url().toString()
|
||||||
|
return Response(
|
||||||
|
response.code(), response.message(), response.headers().toMultimap(),
|
||||||
|
responseBodyToReturn, latestUrl
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
== Using the library!
|
||||||
|
|
||||||
|
[,kotlin]
|
||||||
|
```
|
||||||
|
// init Okhttp client
|
||||||
|
val okhttp = OkHttpClient.Builder()
|
||||||
|
.readTimeout(30, TimeUnit.SECONDS)
|
||||||
|
.build()
|
||||||
|
|
||||||
|
// setting the downloader.
|
||||||
|
NewPipe.init(DownloaderImpl(okhttp))
|
||||||
|
|
||||||
|
// getting youtube service
|
||||||
|
val extractor = ServiceList.Youtube
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
=== Getting suggestions:
|
||||||
|
|
||||||
|
[,kotlin]
|
||||||
|
```
|
||||||
|
extractor.suggestionExtractor.suggestionList("Hello")
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
=== Search for videos:
|
||||||
|
|
||||||
|
[,kotlin]
|
||||||
|
```
|
||||||
|
val search = extractor.getSearchExtractor("Hello")
|
||||||
|
search.fetchPage()
|
||||||
|
|
||||||
|
// result list. Contains videos/channels etc..
|
||||||
|
// InfoItem include type, name, thumbnail...
|
||||||
|
print(search.initialPage.items)
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
=== Get video:
|
||||||
|
|
||||||
|
[,kotlin]
|
||||||
|
```
|
||||||
|
val page = extractor.getStreamExtractor("https://www.youtube.com/watch?v=mIuYmbO9uBM")
|
||||||
|
page.fetchPage()
|
||||||
|
|
||||||
|
// list of video streams (urls)
|
||||||
|
page.videoStreams
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
== Final note:
|
||||||
|
This is very humble guide on how to use newpipe to scrap youtube *specificly*
|
||||||
|
|
||||||
|
You can explore the library by your own
|
||||||
|
|
||||||
|
image::https://imgur.com/2ciR9kq.png[width=400]
|
||||||
|
|
||||||
|
I write this for me first to not forget and also in the hope that it will help some one :)
|
Loading…
Reference in New Issue