@@ -4,9 +4,14 @@ import (
44 "MediaWarp/internal/config"
55 "MediaWarp/internal/logging"
66 "MediaWarp/internal/service"
7+ "MediaWarp/internal/service/alist"
78 "context"
89 "fmt"
910 "net/http"
11+ "net/url"
12+ "path"
13+ "strconv"
14+ "strings"
1015 "time"
1116
1217 "github.com/allegro/bigcache/v3"
@@ -63,22 +68,96 @@ func getHTTPStrmHandler() (StrmHandlerFunc, error) {
6368 }, nil
6469}
6570
66- func alistStrmHandler (content string , alistAddr string ) string {
71+ type resolutionInfo struct {
72+ width uint
73+ height uint
74+ name string
75+ }
76+ type TranscodeResourceInfo struct {
77+ url string
78+ isM3U8 bool
79+ expireAt time.Time
80+ resolution resolutionInfo
81+ }
82+
83+ type alistStrmResult struct {
84+ url string // 重定向 URL
85+ fileSize int64 // 文件大小(字节)
86+ transcodeResources []TranscodeResourceInfo // 转码资源列表
87+ }
88+
89+ func alistStrmHandler (content string , alistAddr string , needTranscodeResourceInfo bool ) (* alistStrmResult , error ) {
6790 startTime := time .Now ()
6891 defer func () {
6992 logging .Debugf ("获取 AlistStrm 重定向 URL 耗时:%s" , time .Since (startTime ))
7093 }()
7194
72- alistClient , err := service .GetAlistClient (alistAddr )
95+ client , err := service .GetAlistClient (alistAddr )
7396 if err != nil {
74- logging .Warning ("获取 AlistClient 失败:" , err )
75- return ""
97+ return nil , fmt .Errorf ("获取 AlistClient 失败:%w" , err )
7698 }
77- url , err := alistClient .GetFileURL (content , config .AlistStrm .RawURL )
99+
100+ fileData , err := client .FsGet (& alist.FsGetRequest {Path : content , Page : 1 })
78101 if err != nil {
79- logging .Warning ("获取文件 URL 失败:" , err )
80- return ""
102+ return nil , fmt .Errorf ("获取文件信息失败:%w" , err )
81103 }
82- logging .Infof ("AlistStrm 重定向至:%s" , url )
83- return url
104+
105+ res := alistStrmResult {
106+ transcodeResources : make ([]TranscodeResourceInfo , 0 ),
107+ }
108+
109+ if config .AlistStrm .RawURL {
110+ res .url = fileData .RawURL
111+ } else {
112+ var u strings.Builder
113+ u .WriteString (client .GetEndpoint ())
114+ if fileData .Sign != "" {
115+ u .WriteString ("?sign=" + fileData .Sign )
116+ }
117+ u .WriteString (path .Join ("/d" , client .GetUserInfo ().BasePath , content ))
118+ res .url = u .String ()
119+ }
120+ logging .Infof ("AlistStrm 重定向至:%s" , res .url )
121+
122+ res .fileSize = fileData .Size
123+
124+ if needTranscodeResourceInfo {
125+ previewData , err := client .GetVideoPreviewData (content , "" )
126+ if err != nil {
127+ logging .Warningf ("%#v 获取视频预览信息失败:%w" , fileData , err )
128+ return & res , nil // 即使获取预览信息失败,也返回基本的重定向 URL 和文件大小
129+ }
130+ for _ , task := range previewData .VideoPreviewPlayInfo .LiveTranscodingTaskList {
131+ if task .Url != "" {
132+ u , err := url .Parse (task .Url )
133+ if err != nil {
134+ logging .Warningf ("解析转码资源 URL 失败: %s, URL: %s" , err , task .Url )
135+ continue
136+ }
137+ expireStr := u .Query ().Get ("x-oss-expires" )
138+ if expireStr == "" {
139+ logging .Warningf ("转码资源 URL 中未找到 x-oss-expires 参数,URL: %s" , task .Url )
140+ continue
141+ }
142+ tsInt , err := strconv .ParseInt (expireStr , 10 , 64 )
143+ if err != nil {
144+ logging .Warningf ("解析转码资源 URL 中的 x-oss-expires 参数失败: %w, URL: %s" , err , task .Url )
145+ continue
146+ }
147+ info := TranscodeResourceInfo {
148+ url : task .Url ,
149+ isM3U8 : strings .HasSuffix (u .Path , ".m3u8" ),
150+ expireAt : time .Unix (tsInt , 0 ),
151+ resolution : resolutionInfo {
152+ width : uint (task .TemplateHeight ),
153+ height : uint (task .TemplateHeight ),
154+ name : task .TemplateName ,
155+ },
156+ }
157+ res .transcodeResources = append (res .transcodeResources , info )
158+ }
159+ }
160+ }
161+
162+ return & res , nil
84163}
0 commit comments