增加注解

This commit is contained in:
JinJiangHuang
2026-03-01 22:23:38 +08:00
parent 99a8cc799b
commit ee8c71dcd4
23 changed files with 374 additions and 24 deletions
+22 -2
View File
@@ -4,10 +4,15 @@ import Foundation
///
struct LiveChannelGroup: Codable, Identifiable, Hashable {
/// 便 SwiftUI diff
var id: String { groupName }
///
var groupName: String = ""
///
var groupIndex: Int = 0
///
var channels: [LiveChannelItem] = []
///
var isPassword: Bool = false
init(groupName: String = "", groupIndex: Int = 0) {
@@ -18,12 +23,19 @@ struct LiveChannelGroup: Codable, Identifiable, Hashable {
///
struct LiveChannelItem: Codable, Identifiable, Hashable {
/// +
var id: String { "\(channelName)_\(channelIndex)" }
///
var channelName: String = ""
///
var channelIndex: Int = 0
/// 线
var channelUrls: [String] = []
/// 线
var sourceIndex: Int = 0
/// 线
var sourceNum: Int { channelUrls.count }
///
var logo: String = ""
init(channelName: String = "", channelIndex: Int = 0) {
@@ -31,11 +43,14 @@ struct LiveChannelItem: Codable, Identifiable, Hashable {
self.channelIndex = channelIndex
}
/// 线
/// 线
var currentUrl: String? {
guard sourceIndex >= 0, sourceIndex < channelUrls.count else { return channelUrls.first }
return channelUrls[sourceIndex]
}
/// 线
mutating func nextSource() {
if channelUrls.count > 0 {
sourceIndex = (sourceIndex + 1) % channelUrls.count
@@ -51,6 +66,7 @@ struct Epginfo: Codable, Identifiable, Hashable {
var endTime: String = ""
var index: Int = 0
/// `HH:mm`
var isLive: Bool {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm"
@@ -65,8 +81,12 @@ struct Epginfo: Codable, Identifiable, Hashable {
/// EPG
struct LiveEpgDate: Codable, Identifiable, Hashable {
var id: String { datePresent }
var datePresent: String = "" //
var date: String = "" //
/// UI
var datePresent: String = ""
///
var date: String = ""
///
var index: Int = 0
/// UI
var isSelected: Bool = false
}
+27 -7
View File
@@ -2,28 +2,47 @@ import Foundation
/// / - Android Movie.java
struct Movie: Codable {
///
var videoList: [Video] = []
///
var pagecount: Int = 0
///
var page: Int = 0
///
var total: Int = 0
///
var limit: Int = 0
///
struct Video: Codable, Identifiable, Hashable {
/// ID Int String
var id: String
///
var name: String = ""
///
var pic: String = ""
var note: String = "" // "20"
/// 20
var note: String = ""
///
var year: String = ""
///
var area: String = ""
var type: String = "" // /
/// /
var type: String = ""
///
var director: String = ""
///
var actor: String = ""
var des: String = "" //
var sourceKey: String = "" // key
var tid: String = "" // ID
var last: String = "" //
var dt: String = "" //
///
var des: String = ""
/// key
var sourceKey: String = ""
/// ID
var tid: String = ""
///
var last: String = ""
///
var dt: String = ""
init(id: String = UUID().uuidString, name: String = "", pic: String = "",
note: String = "", sourceKey: String = "") {
@@ -51,6 +70,7 @@ struct Movie: Codable {
case sourceKey
}
/// `vod_id` / `type_id` Int String
init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)
// String Int id
+14 -2
View File
@@ -2,13 +2,18 @@ import Foundation
/// - Android MovieSort.java
struct MovieSort: Codable {
///
var sortList: [SortData] = []
///
struct SortData: Codable, Identifiable, Hashable {
/// type_id
var id: String
///
var name: String = ""
/// /
var flag: String = ""
///
var filters: [SortFilter] = []
init(id: String = "", name: String = "", flag: String = "") {
@@ -17,6 +22,8 @@ struct MovieSort: Codable {
self.flag = flag
}
///
///
static func home() -> SortData {
SortData(id: "home", name: "推荐", flag: "1")
}
@@ -24,13 +31,18 @@ struct MovieSort: Codable {
///
struct SortFilter: Codable, Hashable {
/// `year``area`
var key: String = ""
/// UI
var name: String = ""
///
var values: [SortFilterValue] = []
struct SortFilterValue: Codable, Hashable {
var n: String = "" //
var v: String = "" //
///
var n: String = ""
///
var v: String = ""
}
}
}
+18
View File
@@ -2,11 +2,14 @@ import Foundation
///
enum PlayerEngine: Int, CaseIterable, Identifiable {
/// AVPlayer
case system = 0
/// VLC VLCKitSPM
case vlc = 10
var id: Int { rawValue }
/// UI
var title: String {
switch self {
case .system:
@@ -16,6 +19,7 @@ enum PlayerEngine: Int, CaseIterable, Identifiable {
}
}
/// VLC
static var isVLCAvailable: Bool {
#if canImport(VLCKitSPM)
return true
@@ -24,6 +28,8 @@ enum PlayerEngine: Int, CaseIterable, Identifiable {
#endif
}
///
/// VLC
static var availableEngines: [PlayerEngine] {
var engines: [PlayerEngine] = [.system]
if isVLCAvailable {
@@ -32,6 +38,7 @@ enum PlayerEngine: Int, CaseIterable, Identifiable {
return engines
}
///
static func fromStoredValue(_ rawValue: Int) -> PlayerEngine {
guard let engine = PlayerEngine(rawValue: rawValue) else {
return .system
@@ -47,8 +54,11 @@ enum PlayerEngine: Int, CaseIterable, Identifiable {
///
enum VideoDecodeMode: Int, CaseIterable, Identifiable {
///
case auto = 0
///
case hardware = 1
///
case software = 2
var id: Int { rawValue }
@@ -69,6 +79,7 @@ enum VideoDecodeMode: Int, CaseIterable, Identifiable {
}
/// VLC
/// `avcodec-hw`
var vlcHardwareDecodeOption: String? {
switch self {
case .auto:
@@ -84,8 +95,11 @@ enum VideoDecodeMode: Int, CaseIterable, Identifiable {
/// VLC
enum VLCBufferMode: Int, CaseIterable, Identifiable {
///
case lowLatency = 0
///
case balanced = 1
///
case smooth = 2
var id: Int { rawValue }
@@ -111,6 +125,10 @@ enum VLCBufferMode: Int, CaseIterable, Identifiable {
self == .lowLatency
}
/// /
/// - Parameters:
/// - isLive:
/// - Returns: network/live/file
func cacheConfig(isLive: Bool) -> (network: Int, live: Int, file: Int) {
switch self {
case .lowLatency:
+13 -4
View File
@@ -2,15 +2,24 @@ import Foundation
/// - Android SourceBean.java
struct SourceBean: Codable, Identifiable, Hashable {
/// key
var id: String { key }
///
let key: String
///
let name: String
///
let api: String
let searchable: Int // 0: 1:
let filterable: Int // 0: 1:
let playerType: Int // 0: 1:IJK 2:EXO
let type: Int // 0:xml 1:json 3:jar 4:remote
/// 0 1
let searchable: Int
/// 0 1
let filterable: Int
/// Swift
let playerType: Int
/// 0 XML1 JSON3 JAR4 Remote
let type: Int
/// remote
let ext: String?
init(key: String = "", name: String = "", api: String = "",
+20 -3
View File
@@ -2,16 +2,27 @@ import Foundation
/// - Android VodInfo.java
struct VodInfo: Codable, Identifiable {
/// ID
var id: String
///
var name: String = ""
///
var pic: String = ""
///
var note: String = ""
///
var year: String = ""
///
var area: String = ""
///
var typeName: String = ""
///
var director: String = ""
///
var actor: String = ""
///
var des: String = ""
/// key
var sourceKey: String = ""
/// 线
@@ -19,13 +30,17 @@ struct VodInfo: Codable, Identifiable {
/// key: flag, value:
var playUrlMap: [String: [Episode]] = [:]
var playFlag: String = "" // 线
var playIndex: Int = 0 //
/// 线
var playFlag: String = ""
///
var playIndex: Int = 0
///
struct Episode: Codable, Identifiable, Hashable {
var id: String { name }
///
let name: String
///
let url: String
init(name: String, url: String) {
@@ -48,7 +63,7 @@ struct VodInfo: Codable, Identifiable {
info.des = video.des.replacingOccurrences(of: "<[^>]+>", with: "", options: .regularExpression)
info.sourceKey = video.sourceKey
//
//
// playFrom : "线1$$$线2$$$线3"
// playUrl : "1$url1#2$url2$$$1$url3#2$url4"
let flags = playFrom.components(separatedBy: "$$$").filter { !$0.isEmpty }
@@ -73,10 +88,12 @@ struct VodInfo: Codable, Identifiable {
return info
}
/// 线
var currentEpisodes: [Episode] {
playUrlMap[playFlag] ?? []
}
/// 线 +
var currentEpisode: Episode? {
let eps = currentEpisodes
guard playIndex >= 0, playIndex < eps.count else { return nil }