Skip to content

Commit

Permalink
🎨 日志
Browse files Browse the repository at this point in the history
  • Loading branch information
yaoxieyoulei committed Apr 21, 2024
1 parent 437a2ae commit 2e42886
Show file tree
Hide file tree
Showing 9 changed files with 107 additions and 84 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package top.yogiczy.mytv.data.repositories

import android.util.Log
import android.util.Xml
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
Expand All @@ -14,16 +13,18 @@ import top.yogiczy.mytv.data.entities.Epg
import top.yogiczy.mytv.data.entities.EpgList
import top.yogiczy.mytv.data.entities.EpgProgramme
import top.yogiczy.mytv.data.entities.EpgProgrammeList
import top.yogiczy.mytv.ui.utils.Loggable
import top.yogiczy.mytv.ui.utils.SP
import java.io.File
import java.io.StringReader
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Locale

class EpgRepository {
class EpgRepository : Loggable() {
suspend fun getEpgs(filteredChannels: List<String>): EpgList {
if (!SP.epgEnable) {
log.d("epg功能未开启,跳过")
return EpgList()
}

Expand All @@ -33,7 +34,7 @@ class EpgRepository {
if (SP.epgCachedHash == hashCode) {
val cache = getCache()
if (cache != null) {
Log.d(TAG, "使用缓存epg")
log.d("使用缓存epg")
return cache
}
}
Expand All @@ -46,7 +47,7 @@ class EpgRepository {
}

private suspend fun fetchXml(): String = withContext(Dispatchers.IO) {
Log.d(TAG, "获取远程xml: ${SP.epgXmlUrl}")
log.d("获取远程xml: ${SP.epgXmlUrl}")

val client = OkHttpClient()
val request = Request.Builder().url(SP.epgXmlUrl).build()
Expand All @@ -60,7 +61,7 @@ class EpgRepository {
return@with body!!.string()
}
} catch (e: Exception) {
Log.e(TAG, "获取远程xml失败", e)
log.e("获取远程xml失败", e.cause)
throw Exception("获取远程EPG失败,请检查网络连接", e.cause)
}
}
Expand All @@ -84,12 +85,12 @@ class EpgRepository {
if (dateFormat.format(System.currentTimeMillis()) == dateFormat.format(SP.epgXmlCachedAt)) {
val cache = getCacheXml()
if (cache.isNotBlank()) {
Log.d(TAG, "使用缓存xml")
log.d("使用缓存xml")
return cache
}
} else {
if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) < SP.epgRefreshTimeThreshold) {
Log.d(TAG, "未到时间点,不刷新epg")
log.d("未到时间点,不刷新epg")
return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
}
}
Expand Down Expand Up @@ -159,7 +160,7 @@ class EpgRepository {
eventType = parser.next()
}

Log.d(TAG, "解析epg完成,共${epgMap.size}个频道")
log.i("解析epg完成,共${epgMap.size}个频道")
return@withContext EpgList(epgMap.values.toList())
}

Expand All @@ -179,8 +180,4 @@ class EpgRepository {
private suspend fun setCache(epgList: EpgList) = withContext(Dispatchers.IO) {
getCacheFile().writeText(Json.encodeToString(epgList.value))
}

companion object {
const val TAG = "EpgRepository"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package top.yogiczy.mytv.data.repositories

import android.util.Log
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
Expand All @@ -9,10 +8,11 @@ import org.json.JSONArray
import org.json.JSONObject
import top.yogiczy.mytv.data.entities.GithubRelease
import top.yogiczy.mytv.data.utils.Constants
import top.yogiczy.mytv.ui.utils.Loggable

class GithubRepository {
class GithubRepository : Loggable() {
suspend fun latestRelease() = withContext(Dispatchers.IO) {
Log.d(TAG, "获取最新release: ${Constants.GITHUB_RELEASE_LATEST_URL}")
log.d("获取最新release: ${Constants.GITHUB_RELEASE_LATEST_URL}")

val client = OkHttpClient()
val request = Request.Builder().url(Constants.GITHUB_RELEASE_LATEST_URL).build()
Expand All @@ -30,17 +30,13 @@ class GithubRepository {
downloadUrl = (json["assets"] as JSONArray).getJSONObject(0)["browser_download_url"] as String,
description = json["body"] as String
)
Log.d(TAG, "获取最新release: $release")
log.i("最新release: $release")

return@with release
}
} catch (e: Exception) {
Log.e(TAG, "获取最新release失败", e)
log.e("获取最新release失败", e)
throw Exception("获取最新release失败,请检查网络连接", e.cause)
}
}

companion object {
const val TAG = "GithubRepository"
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package top.yogiczy.mytv.data.repositories

import android.util.Log
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
Expand All @@ -11,17 +10,18 @@ import top.yogiczy.mytv.data.entities.IptvGroup
import top.yogiczy.mytv.data.entities.IptvGroupList
import top.yogiczy.mytv.data.entities.IptvList
import top.yogiczy.mytv.data.models.IptvResponseItem
import top.yogiczy.mytv.ui.utils.Loggable
import top.yogiczy.mytv.ui.utils.SP
import java.io.File

class IptvRepository {
class IptvRepository : Loggable() {
suspend fun getIptvGroups(): IptvGroupList {
val now = System.currentTimeMillis()

if (now - SP.iptvSourceCachedAt < SP.iptvSourceCacheTime) {
val cache = getCache()
if (cache.isNotBlank()) {
Log.d(TAG, "使用缓存直播源")
log.d("使用缓存直播源")
return parseSource(cache)
}
}
Expand All @@ -34,7 +34,7 @@ class IptvRepository {
}

private suspend fun fetchSource(): String = withContext(Dispatchers.IO) {
Log.d(TAG, "获取远程直播源: ${SP.iptvSourceUrl}")
log.d("获取远程直播源: ${SP.iptvSourceUrl}")

val client = OkHttpClient()
val request = Request.Builder().url(SP.iptvSourceUrl).build()
Expand All @@ -48,7 +48,7 @@ class IptvRepository {
return@with body!!.string()
}
} catch (e: Exception) {
Log.e(TAG, "获取远程直播源失败", e)
log.e("获取远程直播源失败", e)
throw Exception("获取远程直播源失败,请检查网络连接", e.cause)
}
}
Expand Down Expand Up @@ -104,8 +104,7 @@ class IptvRepository {
}),
)
}).also {
Log.d(
TAG,
log.i(
"解析m3u完成: ${it.size}个分组, ${it.flatMap { group -> group.iptvs }.size}个频道"
)
}
Expand Down Expand Up @@ -148,8 +147,7 @@ class IptvRepository {
}),
)
}).also {
Log.d(
TAG,
log.i(
"解析tvbox完成: ${it.size}个分组, ${it.flatMap { group -> group.iptvs }.size}个频道"
)
}
Expand All @@ -163,12 +161,8 @@ class IptvRepository {
parseSourceTvbox(data)
}
} catch (e: Exception) {
Log.e(TAG, "解析直播源失败,请检查直播源格式", e)
log.e("解析直播源失败,请检查直播源格式", e)
throw Exception("解析直播源失败,请检查直播源格式", e.cause)
}
}

companion object {
const val TAG = "IptvRepositoryImpl"
}
}
5 changes: 5 additions & 0 deletions app/src/main/java/top/yogiczy/mytv/data/utils/Constants.kt
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ object Constants {
*/
const val HTTP_RETRY_INTERVAL = 3000L

/**
* 播放器http userAgent
*/
const val VIDEO_PLAYER_HTTP_USER_AGENT = "ExoPlayer"

/**
* 界面 超时未操作自动关闭选台界面
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@ package top.yogiczy.mytv.ui.screens.home

import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.catch
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.retry
Expand All @@ -22,7 +20,6 @@ import top.yogiczy.mytv.data.repositories.EpgRepository
import top.yogiczy.mytv.data.repositories.IptvRepository
import top.yogiczy.mytv.data.utils.Constants

@OptIn(ExperimentalCoroutinesApi::class)
class HomeScreeViewModel : ViewModel() {
private val iptvRepository = IptvRepository()
private val epgRepository = EpgRepository()
Expand All @@ -32,7 +29,7 @@ class HomeScreeViewModel : ViewModel() {

init {
viewModelScope.launch {
/* @formatter:off */
// 获取直播源
flow { emit(iptvRepository.getIptvGroups()) }
.retryWhen { _, attempt ->
if (attempt >= Constants.HTTP_RETRY_COUNT) return@retryWhen false
Expand All @@ -42,35 +39,40 @@ class HomeScreeViewModel : ViewModel() {
delay(Constants.HTTP_RETRY_INTERVAL)
true
}
.catch { _uiState.value = HomeScreenUiState.Error(it.message) }.map {
.catch { _uiState.value = HomeScreenUiState.Error(it.message) }
.map {
_uiState.value = HomeScreenUiState.Ready(iptvGroupList = it)
it
}
// 开始获取epg
.flatMapLatest { iptvGroupList ->
val channels =
iptvGroupList.flatMap { it.iptvs }.map { iptv -> iptv.channelName }
flow { emit(epgRepository.getEpgs(channels)) }
}
.retry(Constants.HTTP_RETRY_COUNT) { delay(Constants.HTTP_RETRY_INTERVAL); true }
.catch { emit(EpgList()) }
.map { epgList ->
// 移除过期节目
epgList.copy(value = epgList.map { epg ->
epg.copy(
programmes = EpgProgrammeList(
epg.programmes.filter { programme ->
System.currentTimeMillis() < programme.endAt
},
)
)
})
}
.map { epgList ->
_uiState.value =
(_uiState.value as HomeScreenUiState.Ready).copy(epgList = epgList)
}
.collect()

// 开始获取epg
if (_uiState.value is HomeScreenUiState.Ready) {
val channels = (_uiState.value as HomeScreenUiState.Ready)
.iptvGroupList.flatMap { it.iptvs }
.map { iptv -> iptv.channelName }

flow { emit(epgRepository.getEpgs(channels)) }
.retry(Constants.HTTP_RETRY_COUNT) { delay(Constants.HTTP_RETRY_INTERVAL); true }
.catch { emit(EpgList()) }
.map { epgList ->
// 移除过期节目
epgList.copy(value = epgList.map { epg ->
epg.copy(
programmes = EpgProgrammeList(
epg.programmes.filter { programme ->
System.currentTimeMillis() < programme.endAt
},
)
)
})
}
.map { epgList ->
_uiState.value =
(_uiState.value as HomeScreenUiState.Ready).copy(epgList = epgList)
}
.collect()
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package top.yogiczy.mytv.ui.screens.home.components

import android.content.Context
import android.net.Uri
import android.util.Log
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
Expand Down Expand Up @@ -68,6 +67,7 @@ import top.yogiczy.mytv.ui.screens.settings.SettingsScreen
import top.yogiczy.mytv.ui.screens.settings.components.rememberUpdateState
import top.yogiczy.mytv.ui.screens.video.VideoScreen
import top.yogiczy.mytv.ui.screens.video.rememberExoPlayerState
import top.yogiczy.mytv.ui.utils.Loggable
import top.yogiczy.mytv.ui.utils.SP
import top.yogiczy.mytv.ui.utils.handleDPadKeyEvents
import top.yogiczy.mytv.ui.utils.handleVerticalDragGestures
Expand Down Expand Up @@ -232,7 +232,7 @@ class HomeContentState(
context: Context,
coroutineScope: CoroutineScope,
private val iptvGroupList: IptvGroupList,
) {
) : Loggable() {
private var _currentIptv by mutableStateOf(Iptv.EMPTY)
val currentIptv get() = _currentIptv

Expand All @@ -254,7 +254,7 @@ class HomeContentState(

private val dataSourceFactory: DataSource.Factory =
DefaultDataSource.Factory(context, DefaultHttpDataSource.Factory().apply {
setUserAgent("ExoPlayer")
setUserAgent(Constants.VIDEO_PLAYER_HTTP_USER_AGENT)
setConnectTimeoutMs(5_000)
setKeepPostFor302Redirects(true)
setAllowCrossProtocolRedirects(true)
Expand Down Expand Up @@ -327,7 +327,7 @@ class HomeContentState(
_isTempPanelVisible = true

if (iptv.urlList.isNotEmpty()) {
Log.d(TAG, "播放: ${iptv.urlList.first()}")
log.d("播放: ${iptv.urlList.first()}")
val uri = Uri.parse(iptv.urlList.first())
val contentType = if (uri.path?.endsWith(".php") == true) C.CONTENT_TYPE_HLS else null

Expand All @@ -345,10 +345,6 @@ class HomeContentState(
fun changeCurrentIptvToNext() {
changeCurrentIptv(getNextIptv())
}

companion object {
const val TAG = "HomeContentState"
}
}

@OptIn(FlowPreview::class)
Expand Down
Loading

0 comments on commit 2e42886

Please sign in to comment.