Skip to content

Commit

Permalink
[代码重构]: 调整资源下载相关网络请求实现方式
Browse files Browse the repository at this point in the history
  • Loading branch information
xyoye committed Jan 8, 2024
1 parent 5ae7986 commit 6d63929
Show file tree
Hide file tree
Showing 10 changed files with 115 additions and 123 deletions.
87 changes: 31 additions & 56 deletions app/src/main/java/com/xyoye/dandanplay/ui/main/MainViewModel.kt
Original file line number Diff line number Diff line change
@@ -1,24 +1,20 @@
package com.xyoye.dandanplay.ui.main

import android.net.Uri
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.xyoye.common_component.base.BaseViewModel
import com.xyoye.common_component.config.AppConfig
import com.xyoye.common_component.config.UserConfig
import com.xyoye.common_component.database.DatabaseManager
import com.xyoye.common_component.database.migration.ManualMigration
import com.xyoye.common_component.network.Retrofit
import com.xyoye.common_component.network.config.Api
import com.xyoye.common_component.network.repository.OtherRepository
import com.xyoye.common_component.network.repository.UserRepository
import com.xyoye.common_component.network.request.Response
import com.xyoye.common_component.network.request.httpRequest
import com.xyoye.common_component.network.request.dataOrNull
import com.xyoye.common_component.utils.UserInfoHelper
import com.xyoye.data_component.data.LoginData
import com.xyoye.data_component.entity.DanmuBlockEntity
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import org.w3c.dom.Element
import java.io.InputStream
import java.util.Date
Expand Down Expand Up @@ -54,44 +50,26 @@ class MainViewModel : BaseViewModel() {
fun initCloudBlockData() {
val lastUpdateTime = AppConfig.getCloudBlockUpdateTime()
val currentTime = System.currentTimeMillis()
//7天更新一次
if (currentTime - lastUpdateTime > 7 * 24 * 60 * 60 * 1000) {

httpRequest<MutableList<String>>(viewModelScope) {

api {
val baseUrl = if (AppConfig.isBackupDomainEnable()) {
AppConfig.getBackupDomain()
} else {
Api.DAN_DAN_PLAY
}
val filterUrl = Uri.parse(baseUrl)
.buildUpon()
.appendPath("config")
.appendPath("filter.xml")
.build()
.toString()
val responseBody = Retrofit.extService.downloadResource(filterUrl)

parseFilterData(responseBody.byteStream())
}

onSuccess {
AppConfig.putCloudBlockUpdateTime(currentTime)
saveFilterData(it)
}
//7天更新一次
if (currentTime - lastUpdateTime < 7 * 24 * 60 * 60 * 1000) {
return
}

onError {
it.printStackTrace()
}
viewModelScope.launch {
val result = OtherRepository.getCloudFilters()

result.dataOrNull?.byteStream()?.use {
val filterData = parseFilterData(it)
saveFilterData(filterData)
AppConfig.putCloudBlockUpdateTime(currentTime)
}

}
}

private fun parseFilterData(inputStream: InputStream): MutableList<String> {
return runBlocking(Dispatchers.IO) {

private fun parseFilterData(inputStream: InputStream): List<String> {
return try {
val factory = DocumentBuilderFactory.newInstance()
val builder = factory.newDocumentBuilder()
val document = builder.parse(inputStream)
Expand All @@ -115,29 +93,26 @@ class MainViewModel : BaseViewModel() {
}
}
}

mutableListOf(
simplified.toString(),
traditional.toString()
)
listOf(simplified.toString(), traditional.toString())
} catch (e: Exception) {
e.printStackTrace()
emptyList()
}
}

private fun saveFilterData(filterData: MutableList<String>) {
viewModelScope.launch {
val blockEntities = filterData.map { keyword ->
DanmuBlockEntity(
0,
keyword,
true,
Date(),
true
)
}
DatabaseManager.instance.getDanmuBlockDao().deleteByType(true)
DatabaseManager.instance.getDanmuBlockDao().insert(
*blockEntities.toTypedArray()
private suspend fun saveFilterData(filterData: List<String>) {
val blockEntities = filterData.map {
DanmuBlockEntity(
0,
it,
true,
Date(),
true
)
}
DatabaseManager.instance.getDanmuBlockDao().deleteByType(true)
DatabaseManager.instance.getDanmuBlockDao().insert(
*blockEntities.toTypedArray()
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,4 +15,12 @@ object OtherRepository : BaseRepository() {
.doGet {
Retrofit.danDanPlayService.getHomeBanner()
}

/**
* 获取云屏蔽数据
*/
suspend fun getCloudFilters() = request()
.doGet {
Retrofit.danDanPlayService.getCloudFilters()
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,20 @@ object SourceRepository : BaseRepository() {
.doGet {
Retrofit.extService.searchSubtitleDetail(it)
}

/**
* 获取资源响应
*/
suspend fun getResourceResponse(url: String, headers: Map<String, String> = emptyMap()) = request()
.doGet {
Retrofit.extService.getResourceResponse(url, headers)
}

/**
* 获取资源响应正文
*/
suspend fun getResourceResponseBody(url: String, headers: Map<String, String> = emptyMap()) = request()
.doGet {
Retrofit.extService.getResourceResponseBody(url, headers)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import com.xyoye.data_component.data.LoginData
import com.xyoye.data_component.data.SearchAnimeData
import com.xyoye.data_component.data.SendDanmuData
import okhttp3.RequestBody
import okhttp3.ResponseBody
import retrofit2.http.Body
import retrofit2.http.DELETE
import retrofit2.http.GET
Expand Down Expand Up @@ -106,4 +107,7 @@ interface DanDanPlayService {

@POST("/api/v2/user/password")
suspend fun updatePassword(@Body body: RequestBody): CommonJsonData

@GET("/config/filter.xml")
suspend fun getCloudFilters(): ResponseBody
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,17 +31,17 @@ interface ExtRetrofitService {

@GET
@Streaming
suspend fun downloadResource(
suspend fun getResourceResponse(
@Url url: String,
@HeaderMap header: Map<String, String> = mapOf()
): ResponseBody
@HeaderMap headers: Map<String, String>
): retrofit2.Response<ResponseBody>

@GET
@Streaming
suspend fun downloadResourceWithHeader(
suspend fun getResourceResponseBody(
@Url url: String,
@HeaderMap header: Map<String, String> = mapOf()
): retrofit2.Response<ResponseBody>
@HeaderMap headers: Map<String, String>
): ResponseBody

@GET
@Streaming
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ package com.xyoye.common_component.storage.impl

import android.net.Uri
import com.xyoye.common_component.network.Retrofit
import com.xyoye.common_component.network.repository.SourceRepository
import com.xyoye.common_component.network.request.RequestError
import com.xyoye.common_component.network.request.dataOrNull
import com.xyoye.common_component.storage.AbstractStorage
import com.xyoye.common_component.storage.file.StorageFile
import com.xyoye.common_component.storage.file.impl.ScreencastStorageFile
Expand Down Expand Up @@ -89,7 +91,8 @@ class ScreencastStorage(library: MediaLibraryEntity) : AbstractStorage(library)
?: return null

try {
val response = Retrofit.extService.downloadResourceWithHeader(subtitleUrl)
val result = SourceRepository.getResourceResponse(subtitleUrl)
val response = result.dataOrNull ?: return null
if (response.code() != NanoHTTPD.Response.Status.OK.requestStatus) return null
val responseBody = response.body() ?: return null

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.xyoye.common_component.base.BaseViewModel
import com.xyoye.common_component.network.Retrofit
import com.xyoye.common_component.network.repository.SourceRepository
import com.xyoye.common_component.network.request.dataOrNull
import com.xyoye.common_component.utils.DanmuUtils
import com.xyoye.common_component.utils.IOUtils
import com.xyoye.common_component.utils.JsonHelper
Expand Down Expand Up @@ -207,7 +209,8 @@ class BilibiliDanmuViewModel : BaseViewModel() {

var xmlContent: String? = null
try {
val responseBody = Retrofit.extService.downloadResource(url, header)
val result = SourceRepository.getResourceResponseBody(url, header)
val responseBody = result.dataOrNull ?: return@async null

inputStream = responseBody.byteStream()
inflaterInputStream = InflaterInputStream(inputStream, Inflater(true))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,14 @@ import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import com.xyoye.common_component.base.BaseViewModel
import com.xyoye.common_component.config.SubtitleConfig
import com.xyoye.common_component.network.Retrofit
import com.xyoye.common_component.network.repository.SourceRepository
import com.xyoye.common_component.network.request.Response
import com.xyoye.common_component.network.request.dataOrNull
import com.xyoye.common_component.network.request.httpRequest
import com.xyoye.common_component.utils.subtitle.SubtitleSearchHelper
import com.xyoye.common_component.utils.subtitle.SubtitleUtils
import com.xyoye.common_component.weight.ToastCenter
import com.xyoye.data_component.data.SubDetailData
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

class ShooterSubtitleViewModel : BaseViewModel() {
Expand Down Expand Up @@ -58,48 +57,41 @@ class ShooterSubtitleViewModel : BaseViewModel() {
}

fun downloadSubtitle(fileName: String, downloadUrl: String) {
httpRequest<String?>(viewModelScope) {
onStart { showLoading() }

api {
val responseBody = Retrofit.extService.downloadResource(downloadUrl)
SubtitleUtils.saveSubtitle(fileName, responseBody.byteStream())
viewModelScope.launch(Dispatchers.IO) {
showLoading()
val result = SourceRepository.getResourceResponseBody(downloadUrl)
val subtitlePath = result.dataOrNull?.byteStream()?.let {
SubtitleUtils.saveSubtitle(fileName, it)
}
hideLoading()

onSuccess {
if (it != null) {
ToastCenter.showSuccess("字幕下载成功:$it", Toast.LENGTH_LONG)
} else {
ToastCenter.showError("保存字幕失败")
}
if (subtitlePath.isNullOrEmpty()) {
ToastCenter.showError("保存字幕失败")
return@launch
}

onError { showNetworkError(it) }

onComplete { hideLoading() }
ToastCenter.showSuccess("字幕下载成功:$subtitlePath", Toast.LENGTH_LONG)
}
}

/**
* 下载压缩文件,并解压
*/
fun downloadAndUnzipFile(fileName: String, url: String) {
httpRequest<Any>(viewModelScope) {
onStart { showLoading() }

api {
val responseBody = Retrofit.extService.downloadResource(url)
val unzipDirPath = SubtitleUtils.saveAndUnzipFile(fileName, responseBody.byteStream())
if (unzipDirPath.isNullOrEmpty()) {
ToastCenter.showError("解压字幕文件失败,请尝试手动解压")
} else {
ToastCenter.showSuccess("字幕下载成功:$unzipDirPath", Toast.LENGTH_LONG)
}
viewModelScope.launch(Dispatchers.IO) {
showLoading()
val result = SourceRepository.getResourceResponseBody(url)
val unzipDirPath = result.dataOrNull?.byteStream()?.let {
SubtitleUtils.saveAndUnzipFile(fileName, it)
}
hideLoading()

onError { showNetworkError(it) }
if (unzipDirPath.isNullOrEmpty()) {
ToastCenter.showError("解压字幕文件失败,请尝试手动解压")
return@launch
}

onComplete { hideLoading() }
ToastCenter.showSuccess("字幕下载成功:$unzipDirPath", Toast.LENGTH_LONG)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,9 @@ import androidx.paging.PagingData
import com.xyoye.common_component.base.BaseViewModel
import com.xyoye.common_component.config.SubtitleConfig
import com.xyoye.common_component.database.DatabaseManager
import com.xyoye.common_component.network.Retrofit
import com.xyoye.common_component.network.repository.SourceRepository
import com.xyoye.common_component.network.request.Response
import com.xyoye.common_component.network.request.dataOrNull
import com.xyoye.common_component.network.request.httpRequest
import com.xyoye.common_component.storage.file.StorageFile
import com.xyoye.common_component.utils.getFileNameNoExtension
import com.xyoye.common_component.utils.subtitle.SubtitleMatchHelper
Expand Down Expand Up @@ -84,31 +82,29 @@ class BindSubtitleSourceFragmentViewModel : BaseViewModel() {
}

fun downloadSearchSubtitle(fileName: String?, sourceUrl: String, unzip: Boolean = false) {
httpRequest(viewModelScope) {
onStart { showLoading() }
viewModelScope.launch(Dispatchers.IO) {
showLoading()
val name = if (TextUtils.isEmpty(fileName)) {
"${getFileNameNoExtension(storageFile.filePath())}.ass"
} else {
fileName!!
}

api {
val name = if (TextUtils.isEmpty(fileName)) {
"${getFileNameNoExtension(storageFile.filePath())}.ass"
} else {
fileName!!
}
val result = SourceRepository.getResourceResponseBody(sourceUrl)
if (result is Response.Error) {
hideLoading()
ToastCenter.showError(result.error.toastMsg)
return@launch
}

val responseBody = Retrofit.extService.downloadResource(sourceUrl)
if (result is Response.Success) {
if (unzip) {
unzipSaveSubtitle(name, responseBody)
unzipSaveSubtitle(name, result.data)
} else {
saveSubtitle(name, responseBody)
saveSubtitle(name, result.data)
}
hideLoading()
}

onSuccess {

}

onError { showNetworkError(it) }

onComplete { hideLoading() }
}
}

Expand Down
Loading

0 comments on commit 6d63929

Please sign in to comment.