Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
8d15c41
修复 request was banned 请求错误 (#276)
fantasytyx Nov 28, 2025
d38f263
Merge pull request #3 from Colorful-glassblock/backport-276-to-lastAn…
Colorful-glassblock Jan 25, 2026
c9bfd02
添加lastAndroid5 build workflow
web-flow Jan 25, 2026
ee2d7d7
Merge pull request #4 from Colorful-glassblock/add-workflow-to-lastAn…
Colorful-glassblock Jan 25, 2026
7ebc8e5
在lastAndroid5 release标题中添加Legacy Support标记
web-flow Jan 25, 2026
8d33c87
Merge pull request #5 from Colorful-glassblock/update-lastAndroid5-wo…
Colorful-glassblock Jan 25, 2026
b4fe889
添加BiliUserAgent相关的混淆规则
web-flow Jan 25, 2026
fba3e04
Merge pull request #6 from Colorful-glassblock/fix-lastAndroid5-build
Colorful-glassblock Jan 25, 2026
19f3489
移除lastAndroid5分支的中国大陆检测
web-flow Jan 25, 2026
624911b
移除lastAndroid5分支的中国大陆检测
web-flow Jan 25, 2026
e7c1282
Merge pull request #7 from Colorful-glassblock/fix-lastAndroid5-build
Colorful-glassblock Jan 25, 2026
b009c5d
Update release name for Android 5 legacy support
Colorful-glassblock Feb 23, 2026
2c5aa62
Merge pull request #21 from Colorful-glassblock/Colorful-glassblock-p…
Colorful-glassblock Feb 23, 2026
b22b02a
fix: prevent ANR during playback
Apr 24, 2026
c94da76
feat: add software video renderer option (lastAndroid5)
May 3, 2026
1cd7ac7
fix: detect TV device and redirect to TV launcher (lastAndroid5)
May 3, 2026
40961cb
opt: optimize danmaku loading with segment-based approach (lastAndroid5)
May 4, 2026
0a09885
fix: update github api endpoint to use forked repo\n\n- Change OWNER …
May 5, 2026
7a42add
fix: update github api endpoint to use main repo\n\n- Change OWNER fr…
May 5, 2026
5f20f82
fix: update github api endpoint to use main repo for lastAndroid5\n\n…
May 5, 2026
67cbe0c
fix: filter releases by current branch\n\n- Add CURRENT_BRANCH consta…
May 5, 2026
15ad5bb
fix: filter releases by current branch for lastAndroid5
May 5, 2026
11b3005
fix: TV device can access all releases\n\n- Add isTvDevice check\n- T…
May 5, 2026
7b010bb
fix: resolve merge conflicts
May 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion .github/workflows/lastAndroid5.yml
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,14 @@ jobs:
app/build/outputs/apk/default/alpha/BV_${{ env.alpha_info_version_code }}_${{ env.alpha_info_version_name }}_default_universal.apk
mapping.zip
tag_name: ${{ env.tag_name }}
<<<<<<< HEAD
name: ${{ env.alpha_info_version_name }} (Legacy Support For Android 5)
prerelease: true
body: ${{ env.changelog }}
target_commitish: ${{ github.sha }}
=======
name: ${{ env.alpha_info_version_name }}
prerelease: true
body: ${{ env.changelog }}
target_commitish: ${{ github.sha }}
target_commitish: ${{ github.sha }}
>>>>>>> develop
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,19 @@
[![Android Sdk Require](https://img.shields.io/badge/Android-6.0%2B-informational?logo=android)](https://developer.android.com/jetpack/androidx/versions#version-table)
[![GitHub](https://img.shields.io/github/license/Colorful-glassblock/bvcn)](https://github.com/Colorful-glassblock/bvcn)

<<<<<<< HEAD
**BV ~~无法~~可以在中国大陆地区内的智能电视上使用,如有相关使用需求请使用 [云视听小电视](https://app.bilibili.com)**

**~~禁止~~允许在中国境内传播、宣传、分发 BV**
=======
**BVCN ~~无法~~可以在中国大陆地区内的智能电视上使用,如有相关使用需求请使用 [云视听小电视(不是哥们你真用啊)](https://app.bilibili.com)**

**~~禁止~~允许在中国境内传播、宣传、分发 BVCN**

**由于fucking又stupid的bilibili官方对BAC大打出手 本项目以后可能不再可用 目前评论区功能已经不正常**
**R.I.P. Bilibili-API-collect 感谢此项目对bilibili接口的收集 否则非官方bilibili client开发将十分艰难**
**愿bilibili不会变质 可惜已经变了**
>>>>>>> develop

</div>

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,20 @@ import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
<<<<<<< HEAD
import de.schnettler.datastore.manager.DataStoreManager
import dev.aaa1115910.bv.dataStore
import dev.aaa1115910.bv.mobile.component.preferences.RadioPreferenceItem
import dev.aaa1115910.bv.mobile.component.preferences.SwitchPreferenceItem
import dev.aaa1115910.bv.mobile.component.preferences.getOrDefault
=======
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import dev.aaa1115910.bv.mobile.component.preferences.items.radioPreference
import dev.aaa1115910.bv.mobile.component.preferences.items.switchPreference
import dev.aaa1115910.bv.mobile.component.preferences.preferenceGroups
import dev.aaa1115910.bv.mobile.theme.BVMobileTheme
>>>>>>> develop
import dev.aaa1115910.bv.player.entity.Audio
import dev.aaa1115910.bv.player.entity.Resolution
import dev.aaa1115910.bv.player.entity.VideoCodec
Expand Down Expand Up @@ -62,6 +70,11 @@ fun PlayContent(
)
}
)
SwitchPreferenceItem(
title = "启用视频软解",
summary = "使用软件解码器播放视频,可能解决硬解兼容性问题",
prefReq = PrefKeys.prefEnableSoftwareVideoRendererRequest
)
}
}

Expand Down
2 changes: 2 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@

# ktor 混淆后,请求参数会莫名其妙消失
-keep class io.ktor.**
-keep class dev.aaa1115910.biliapi.http.plugins.** { *; }
-keep class dev.aaa1115910.biliapi.http.util.** { *; }
# 这部分是加上不混淆 ktor 后冒出来的 missing rules
-dontwarn java.lang.management.ManagementFactory
-dontwarn java.lang.management.RuntimeMXBean
Expand Down
36 changes: 29 additions & 7 deletions app/shared/src/main/kotlin/dev/aaa1115910/bv/network/GithubApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,20 @@ import java.io.File

object GithubApi {
private var endPoint = "api.github.com"
private const val OWNER = "aaa1115910"
private const val REPO = "bv"
private const val OWNER = "Colorful-glassblock"
private const val REPO = "bvcn"
// 当前分支名称,用于过滤对应分支的 release
private const val CURRENT_BRANCH = "lastAndroid5"
// 电视端特殊处理:如果在 TV 上运行,允许获取所有 release(因为 TV 可能需要更多版本)
private val isTvDevice: Boolean
get() {
return try {
val uiModeManager = LocalContext.current.getSystemService(Context.UI_MODE_SERVICE) as UiModeManager
uiModeManager.currentModeType == Configuration.UI_MODE_TYPE_TELEVISION
} catch (e: Exception) {
false
}

private lateinit var client: HttpClient
private val json = Json {
coerceInputValues = true
Expand Down Expand Up @@ -74,16 +86,26 @@ object GithubApi {
parameter("page", page)
}.bodyAsText()
checkErrorMessage(response)
return json.decodeFromString<List<Release>>(response)
val allReleases = json.decodeFromString<List<Release>>(response)
<<<<<<< HEAD
// 电视端特殊处理:如果在 TV 上运行,允许获取所有 release
if (isTvDevice) {
return allReleases
}
// 其他设备:过滤只匹配当前分支的 release
=======
// 过滤只匹配当前分支的 release
>>>>>>> develop
return allReleases.filter { it.targetCommitish == CURRENT_BRANCH }
}

private suspend fun getLatestRelease(
owner: String = OWNER,
repo: String = REPO
): Release {
val response = client.get("repos/$owner/$repo/releases/latest").bodyAsText()
checkErrorMessage(response)
return json.decodeFromString<Release>(response)
val releases = getReleases(owner = owner, repo = repo, pageSize = 1)
return releases.firstOrNull { !it.isPreRelease }
?: throw IllegalStateException("No release found for branch $CURRENT_BRANCH")
}

suspend fun getLatestPreReleaseBuild(): Release {
Expand All @@ -95,7 +117,7 @@ object GithubApi {
release = releases.firstOrNull { it.isPreRelease }
page++
}
return release ?: throw IllegalStateException("No pre-release found")
return release ?: throw IllegalStateException("No pre-release found for branch $CURRENT_BRANCH")
}

suspend fun getLatestReleaseBuild(): Release = getLatestRelease()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -403,7 +403,11 @@ class VideoPlayerV3ViewModel(
currentVideoWidth = videoItem?.width ?: 0
logger.info { "Video url: $videoUrl" }
logger.info { "Audio url: $audioUrl" }
<<<<<<< HEAD
// 将 playUrl 移到 IO 线程,避免主线程卡顿
=======
// 将 playUrl 移到 IO 线程,避免主线程阻塞
>>>>>>> develop
withContext(Dispatchers.IO) {
videoPlayer!!.playUrl(videoUrl, audioUrl)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,10 +191,13 @@ fun VideoPlayerV3Screen(
Prefs.defaultSubtitleBottomPadding = padding
playerViewModel.currentSubtitleBottomPadding = padding
},
<<<<<<< HEAD
=======
onPlayModeChange = { playMode ->
Prefs.defaultPlayMode = playMode
playerViewModel.currentPlayMode = playMode
},
>>>>>>> develop
onUpdateDanmakuForPosition = playerViewModel::updateDanmakuForPosition
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,10 @@ fun BvPlayer(
onSubtitleSizeChange: (TextUnit) -> Unit,
onSubtitleBackgroundOpacityChange: (Float) -> Unit,
onSubtitleBottomPadding: (Dp) -> Unit,
<<<<<<< HEAD
=======
onPlayModeChange: (PlayMode) -> Unit,
>>>>>>> develop
onUpdateDanmakuForPosition: (suspend (Long) -> Unit)? = null
) {
val scope = rememberCoroutineScope()
Expand Down