mirror of https://github.com/deniscerri/ytdlnis
finish po token generation
parent
90e16d203d
commit
1d560a98ca
@ -1,13 +1,12 @@
|
||||
package com.deniscerri.ytdl.util.extractors.potoken
|
||||
package com.deniscerri.ytdl.ui.more.settings.advanced.generateyoutubepotokens
|
||||
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.util.Log
|
||||
import android.webkit.CookieManager
|
||||
import androidx.preference.PreferenceManager
|
||||
import com.deniscerri.ytdl.App
|
||||
import com.deniscerri.ytdl.BuildConfig
|
||||
import com.deniscerri.ytdl.util.extractors.potoken.webview.PoTokenWebView
|
||||
import com.deniscerri.ytdl.ui.more.settings.advanced.generateyoutubepotokens.webview.PoTokenWebView
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import org.schabi.newpipe.extractor.NewPipe
|
||||
import org.schabi.newpipe.extractor.services.youtube.InnertubeClientRequestInfo
|
||||
@ -1,6 +1,5 @@
|
||||
package com.deniscerri.ytdl.util.extractors.potoken.webview
|
||||
package com.deniscerri.ytdl.ui.more.settings.advanced.generateyoutubepotokens.webview
|
||||
|
||||
import com.deniscerri.ytdl.util.extractors.potoken.PoTokenException
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.JsonNull
|
||||
import kotlinx.serialization.json.JsonObject
|
||||
@ -1,4 +1,4 @@
|
||||
package com.deniscerri.ytdl.util.extractors.potoken
|
||||
package com.deniscerri.ytdl.ui.more.settings.advanced.generateyoutubepotokens.webview
|
||||
|
||||
class PoTokenException(message: String) : Exception(message)
|
||||
|
||||
@ -0,0 +1,141 @@
|
||||
package com.deniscerri.ytdl.ui.more.settings.advanced.generateyoutubepotokens.webview
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.os.Bundle
|
||||
import android.webkit.CookieManager
|
||||
import android.webkit.WebView
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.material3.Scaffold
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.ComposeView
|
||||
import androidx.core.view.forEach
|
||||
import androidx.lifecycle.lifecycleScope
|
||||
import com.deniscerri.ytdl.R
|
||||
import com.deniscerri.ytdl.ui.BaseActivity
|
||||
import com.deniscerri.ytdl.ui.more.settings.advanced.generateyoutubepotokens.PoTokenGenerator
|
||||
import com.google.accompanist.web.AccompanistWebChromeClient
|
||||
import com.google.accompanist.web.AccompanistWebViewClient
|
||||
import com.google.accompanist.web.WebView
|
||||
import com.google.accompanist.web.rememberWebViewState
|
||||
import com.google.android.material.appbar.AppBarLayout
|
||||
import com.google.android.material.appbar.MaterialToolbar
|
||||
import com.google.android.material.button.MaterialButton
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
|
||||
|
||||
class PoTokenWebViewLoginActivity : BaseActivity() {
|
||||
private lateinit var webView: WebView
|
||||
private lateinit var webViewCompose: ComposeView
|
||||
private lateinit var toolbar: MaterialToolbar
|
||||
private lateinit var generateBtn: MaterialButton
|
||||
private lateinit var cookieManager: CookieManager
|
||||
private lateinit var webViewClient: AccompanistWebViewClient
|
||||
|
||||
private val sampleVideoID = "aqz-KE-bpKQ" //Big Buck Bunny
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
public override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
setContentView(R.layout.webview_activity)
|
||||
lifecycleScope.launch {
|
||||
val appbar = findViewById<AppBarLayout>(R.id.webview_appbarlayout)
|
||||
toolbar = appbar.findViewById(R.id.webviewToolbar)
|
||||
toolbar.menu.forEach { it.isVisible = false }
|
||||
|
||||
generateBtn = toolbar.findViewById(R.id.generate)
|
||||
webViewCompose = findViewById(R.id.webview_compose)
|
||||
cookieManager = CookieManager.getInstance()
|
||||
|
||||
webViewClient = object : AccompanistWebViewClient() {
|
||||
override fun onPageFinished(view: WebView?, url: String?) {
|
||||
super.onPageFinished(view, url)
|
||||
kotlin.runCatching {
|
||||
toolbar.title = view?.title ?: ""
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
toolbar.setNavigationOnClickListener {
|
||||
finishAndRemoveTask()
|
||||
}
|
||||
|
||||
generateBtn.setOnClickListener {
|
||||
generateBtn.isEnabled = false
|
||||
|
||||
lifecycleScope.launch {
|
||||
val generator = PoTokenGenerator()
|
||||
val res = withContext(Dispatchers.IO) {
|
||||
generator.getWebClientPoToken(sampleVideoID)
|
||||
}
|
||||
|
||||
if (res == null) {
|
||||
setResult(RESULT_CANCELED)
|
||||
}else {
|
||||
val intent = Intent()
|
||||
intent.putExtra("visitor_data", res.visitorData)
|
||||
intent.putExtra("player_potoken", res.playerRequestPoToken)
|
||||
intent.putExtra("streaming_potoken", res.streamingDataPoToken)
|
||||
setResult(RESULT_OK, intent)
|
||||
}
|
||||
|
||||
webView.clearCache(true)
|
||||
// ensures that the WebView isn't doing anything when destroying it
|
||||
webView.loadUrl("about:blank")
|
||||
webView.onPause()
|
||||
webView.removeAllViews()
|
||||
webView.destroy()
|
||||
finish()
|
||||
}
|
||||
}
|
||||
|
||||
webViewCompose.apply {
|
||||
setContent { WebViewView() }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled", "JavascriptInterface")
|
||||
@Composable
|
||||
fun WebViewView() {
|
||||
val webViewChromeClient = remember {
|
||||
object : AccompanistWebChromeClient() {
|
||||
}
|
||||
}
|
||||
|
||||
Scaffold(modifier = Modifier.fillMaxSize()) { paddingValues ->
|
||||
WebView(
|
||||
state = rememberWebViewState("https://youtube.com/account"), client = webViewClient, chromeClient = webViewChromeClient,
|
||||
modifier = Modifier
|
||||
.padding(paddingValues)
|
||||
.fillMaxSize(),
|
||||
captureBackPresses = false, factory = { context ->
|
||||
WebView(context).apply {
|
||||
webView = this
|
||||
settings.run {
|
||||
javaScriptEnabled = true
|
||||
domStorageEnabled = true
|
||||
javaScriptCanOpenWindowsAutomatically = true
|
||||
if (Build.VERSION.SDK_INT >= 26) {
|
||||
safeBrowsingEnabled = true
|
||||
}
|
||||
}
|
||||
cookieManager.setAcceptThirdPartyCookies(this, true)
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "PoTokenWebViewActivity"
|
||||
}
|
||||
|
||||
}
|
||||
@ -0,0 +1,37 @@
|
||||
package com.deniscerri.ytdl.work
|
||||
|
||||
import android.app.PendingIntent
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE
|
||||
import android.os.Build
|
||||
import android.os.Environment
|
||||
import android.os.Handler
|
||||
import android.os.Looper
|
||||
import android.widget.Toast
|
||||
import androidx.work.ForegroundInfo
|
||||
import androidx.work.Worker
|
||||
import androidx.work.WorkerParameters
|
||||
import com.deniscerri.ytdl.App
|
||||
import com.deniscerri.ytdl.MainActivity
|
||||
import com.deniscerri.ytdl.R
|
||||
import com.deniscerri.ytdl.util.FileUtil
|
||||
import com.deniscerri.ytdl.util.NotificationUtil
|
||||
import java.io.File
|
||||
import java.nio.file.Files
|
||||
import java.nio.file.StandardCopyOption
|
||||
|
||||
|
||||
class AutoGenerateWebPoTokenWorker(
|
||||
private val context: Context,
|
||||
workerParams: WorkerParameters
|
||||
) : Worker(context, workerParams) {
|
||||
override fun doWork(): Result {
|
||||
return Result.success()
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val TAG = "AutoGenerateWebPoTokenWorker"
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue