use gist api to push backup informations

This commit is contained in:
Antony 2022-10-11 18:16:48 +02:00
parent 5dc3807c96
commit 5be6422ced
3 changed files with 53 additions and 33 deletions

View file

@ -200,8 +200,6 @@ dependencies {
// Library/extensions searching with Levenshtein distance // Library/extensions searching with Levenshtein distance
implementation 'me.xdrop:fuzzywuzzy:1.4.0' implementation 'me.xdrop:fuzzywuzzy:1.4.0'
// Git
implementation 'org.openl.jgit:org.eclipse.jgit:6.2.0.202206071550-openl'
} }
task androidSourcesJar(type: Jar) { task androidSourcesJar(type: Jar) {

View file

@ -1,6 +1,5 @@
package com.lagradost.cloudstream3.syncproviders.providers package com.lagradost.cloudstream3.syncproviders.providers
import androidx.fragment.app.FragmentActivity
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.AcraApplication.Companion.context import com.lagradost.cloudstream3.AcraApplication.Companion.context
@ -11,21 +10,14 @@ import com.lagradost.cloudstream3.mvvm.logError
import com.lagradost.cloudstream3.syncproviders.AuthAPI import com.lagradost.cloudstream3.syncproviders.AuthAPI
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPI import com.lagradost.cloudstream3.syncproviders.InAppAuthAPI
import com.lagradost.cloudstream3.syncproviders.InAppAuthAPIManager import com.lagradost.cloudstream3.syncproviders.InAppAuthAPIManager
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.BackupUtils.getBackup
import com.lagradost.cloudstream3.utils.BackupUtils.restorePromptGithub import com.lagradost.cloudstream3.utils.BackupUtils.restorePromptGithub
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Coroutines.runOnMainThread
import com.lagradost.nicehttp.RequestBodyTypes import com.lagradost.nicehttp.RequestBodyTypes
import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.RequestBody.Companion.toRequestBody
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.transport.URIish
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider
import java.nio.file.Files
import java.nio.file.Path
import java.nio.file.attribute.FileAttribute
class GithubApi(index: Int) : InAppAuthAPIManager(index){ class GithubApi(index: Int) : InAppAuthAPIManager(index){
@ -36,11 +28,10 @@ class GithubApi(index: Int) : InAppAuthAPIManager(index){
override val createAccountUrl = "https://github.com/settings/tokens/new?description=Cloudstream+Backup&scopes=gist" override val createAccountUrl = "https://github.com/settings/tokens/new?description=Cloudstream+Backup&scopes=gist"
data class GithubOAuthEntity( data class GithubOAuthEntity(
var repoUrl: String, var gistId: String,
var token: String, var token: String,
var userName: String, var userName: String,
var userAvatar: String, var userAvatar: String,
var gistUrl: String
) )
companion object { companion object {
const val GITHUB_USER_KEY: String = "github_user" // user data like profile const val GITHUB_USER_KEY: String = "github_user" // user data like profile
@ -52,8 +43,7 @@ class GithubApi(index: Int) : InAppAuthAPIManager(index){
data class gistsElements ( data class gistsElements (
@JsonProperty("git_pull_url") val gitUrl: String, @JsonProperty("id") val gistId:String,
@JsonProperty("url") val gistUrl:String,
@JsonProperty("files") val files: Map<String, File>, @JsonProperty("files") val files: Map<String, File>,
@JsonProperty("owner") val owner: OwnerData @JsonProperty("owner") val owner: OwnerData
) )
@ -64,6 +54,17 @@ class GithubApi(index: Int) : InAppAuthAPIManager(index){
data class File ( data class File (
@JsonProperty("content") val dataRaw: String? @JsonProperty("content") val dataRaw: String?
) )
data class GistRequestBody(
@JsonProperty("description") val description: String,
@JsonProperty("public") val public : Boolean,
@JsonProperty("files") val files: FilesGist?
)
data class FilesGist(
@JsonProperty("Cloudstream_Backup_data.txt") val description: ContentFilesGist?,
)
data class ContentFilesGist(
@JsonProperty("content") val description: String?,
)
private suspend fun initLogin(githubToken: String): Boolean{ private suspend fun initLogin(githubToken: String): Boolean{
val response = app.get("https://api.github.com/gists", val response = app.get("https://api.github.com/gists",
@ -80,23 +81,28 @@ class GithubApi(index: Int) : InAppAuthAPIManager(index){
} }
if (repo?.isEmpty() == true){ if (repo?.isEmpty() == true){
val backupData = context?.getBackup()
val gitresponse = app.post("https://api.github.com/gists", val gitresponse = app.post("https://api.github.com/gists",
headers= mapOf( headers= mapOf(
Pair("Accept" , "application/vnd.github+json"), Pair("Accept" , "application/vnd.github+json"),
Pair("Authorization", "token $githubToken"), Pair("Authorization", "token $githubToken"),
), ),
requestBody = """{"description":"Cloudstream private backup gist","public":false,"files":{"Cloudstream_Backup_data.txt":{"content":"initialization"}}}""".toRequestBody( requestBody = GistRequestBody("Cloudstream private backup gist", false, FilesGist(ContentFilesGist(backupData?.toJson()))).toJson().toRequestBody(
RequestBodyTypes.JSON.toMediaTypeOrNull())) RequestBodyTypes.JSON.toMediaTypeOrNull()))
/*
"""{"description":"Cloudstream private backup gist","public":false,"files":{"Cloudstream_Backup_data.txt":{"content":"initialization"}}}""".toRequestBody(
RequestBodyTypes.JSON.toMediaTypeOrNull()))
*/
if (!gitresponse.isSuccessful) {return false} if (!gitresponse.isSuccessful) {return false}
tryParseJson<gistsElements>(gitresponse.text).let { tryParseJson<gistsElements>(gitresponse.text).let {
setKey(accountId, GITHUB_USER_KEY, GithubOAuthEntity( setKey(accountId, GITHUB_USER_KEY, GithubOAuthEntity(
token = githubToken, token = githubToken,
repoUrl = it?.gitUrl?: run { gistId = it?.gistId?: run {
return false return false
}, },
userName = it.owner.userName, userName = it.owner.userName,
userAvatar = it.owner.userAvatar, userAvatar = it.owner.userAvatar
gistUrl = it.gistUrl
)) ))
} }
return true return true
@ -105,18 +111,15 @@ class GithubApi(index: Int) : InAppAuthAPIManager(index){
repo?.first().let { repo?.first().let {
setKey(accountId, GITHUB_USER_KEY, GithubOAuthEntity( setKey(accountId, GITHUB_USER_KEY, GithubOAuthEntity(
token = githubToken, token = githubToken,
repoUrl = it?.gitUrl?: run { gistId = it?.gistId?: run {
return false return false
}, },
userName = it.owner.userName, userName = it.owner.userName,
userAvatar = it.owner.userAvatar, userAvatar = it.owner.userAvatar
gistUrl = it.gistUrl
)) ))
ioSafe { ioSafe {
context?.restorePromptGithub() context?.restorePromptGithub()
} }
return true return true
} }
} }
@ -139,13 +142,13 @@ class GithubApi(index: Int) : InAppAuthAPIManager(index){
override fun getLatestLoginData(): InAppAuthAPI.LoginData? { override fun getLatestLoginData(): InAppAuthAPI.LoginData? {
val current = getAuthKey() ?: return null val current = getAuthKey() ?: return null
return InAppAuthAPI.LoginData(email = current.repoUrl, password = current.token, username = current.userName, server = current.gistUrl) return InAppAuthAPI.LoginData(server = current.gistId, password = current.token, username = current.userName)
} }
override suspend fun initialize() { override suspend fun initialize() {
currentSession = getAuthKey() currentSession = getAuthKey()
val repoUrl = currentSession?.repoUrl ?: return val gistId = currentSession?.gistId ?: return
val token = currentSession?.token ?: return val token = currentSession?.token ?: return
setKey(repoUrl, token) setKey(gistId, token)
} }
override fun logOut() { override fun logOut() {
removeKey(accountId, GITHUB_USER_KEY) removeKey(accountId, GITHUB_USER_KEY)

View file

@ -34,6 +34,7 @@ import com.lagradost.cloudstream3.syncproviders.providers.MALApi.Companion.MAL_U
import com.lagradost.cloudstream3.syncproviders.providers.OpenSubtitlesApi.Companion.OPEN_SUBTITLES_USER_KEY import com.lagradost.cloudstream3.syncproviders.providers.OpenSubtitlesApi.Companion.OPEN_SUBTITLES_USER_KEY
import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.parseJson
import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.AppUtils.toJson
import com.lagradost.cloudstream3.utils.BackupUtils.getBackup
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.DataStore.getDefaultSharedPrefs import com.lagradost.cloudstream3.utils.DataStore.getDefaultSharedPrefs
@ -44,9 +45,9 @@ import com.lagradost.cloudstream3.utils.UIHelper.checkWrite
import com.lagradost.cloudstream3.utils.UIHelper.requestRW import com.lagradost.cloudstream3.utils.UIHelper.requestRW
import com.lagradost.cloudstream3.utils.VideoDownloadManager.getBasePath import com.lagradost.cloudstream3.utils.VideoDownloadManager.getBasePath
import com.lagradost.cloudstream3.utils.VideoDownloadManager.isDownloadDir import com.lagradost.cloudstream3.utils.VideoDownloadManager.isDownloadDir
import org.eclipse.jgit.api.Git import com.lagradost.nicehttp.RequestBodyTypes
import org.eclipse.jgit.transport.URIish import okhttp3.MediaType.Companion.toMediaTypeOrNull
import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider import okhttp3.RequestBody.Companion.toRequestBody
import java.io.IOException import java.io.IOException
import java.io.PrintWriter import java.io.PrintWriter
import java.lang.System.currentTimeMillis import java.lang.System.currentTimeMillis
@ -296,7 +297,10 @@ object BackupUtils {
fun FragmentActivity.backupGithub(){ fun FragmentActivity.backupGithub(){
val backup = this.getBackup() val backup = this.getBackup()
ioSafe {
val gistId = githubApi.getLatestLoginData()?.server ?: throw IllegalArgumentException ("Requires Username")
val token = githubApi.getLatestLoginData()?.password ?: throw IllegalArgumentException ("Requires Username")
/* ioSafe {
val tmpDir = createTempDir() val tmpDir = createTempDir()
val gitUrl = githubApi.getLatestLoginData()?.email ?: throw IllegalArgumentException ("Requires Username") val gitUrl = githubApi.getLatestLoginData()?.email ?: throw IllegalArgumentException ("Requires Username")
val token = githubApi.getLatestLoginData()?.password ?: throw IllegalArgumentException ("Requires Username") val token = githubApi.getLatestLoginData()?.password ?: throw IllegalArgumentException ("Requires Username")
@ -328,6 +332,21 @@ object BackupUtils {
) )
.call(); .call();
tmpDir.deleteRecursively() tmpDir.deleteRecursively()
}
*/
ioSafe {
app.patch("https://api.github.com/gists/$gistId",
headers= mapOf(
Pair("Accept" , "application/vnd.github+json"),
Pair("Authorization", "token $token"),
),
requestBody = GithubApi.GistRequestBody(
"Cloudstream private backup gist",
false,
GithubApi.FilesGist(GithubApi.ContentFilesGist(backup.toJson())))
.toJson()
.toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull())
)
} }
showToast( showToast(
this, this,
@ -336,8 +355,8 @@ object BackupUtils {
) )
} }
suspend fun Context.restorePromptGithub() { suspend fun Context.restorePromptGithub() {
val gistUrl = githubApi.getLatestLoginData()?.server ?: throw IllegalAccessException() val gistId = githubApi.getLatestLoginData()?.server ?: throw IllegalAccessException()
val jsondata = app.get(gistUrl).text val jsondata = app.get(" https://api.github.com/gists/$gistId").text
val dataraw = val dataraw =
parseJson<GithubApi.gistsElements>(jsondata ?: "").files.values.first().dataRaw parseJson<GithubApi.gistsElements>(jsondata ?: "").files.values.first().dataRaw
?: throw IllegalAccessException() ?: throw IllegalAccessException()