Преглед изворни кода

播放跳转到首页 播放状态bug的修复

onecold пре 9 месеци
родитељ
комит
fcbbeb3fc5

+ 110 - 0
entry/src/main/ets/common/util/WebdavManager.ets

@@ -13,6 +13,7 @@ import { Constants } from '../../Constants';
 import Logger from './Logger';
 import { buffer } from '@kit.ArkTS';
 import { CommonConstants } from '../constants/CommonConstants';
+import { GlobalContext } from '@pura/harmony-utils';
 
 const TAG = 'heanup WebdavManager';
 
@@ -768,3 +769,112 @@ export class WebdavManager {
     return null;
   }
 }
+
+
+
+/**
+ * 构建HTTP请求头,特别处理WebDAV认证
+ * @param currentSong - 当前播放的歌曲信息
+ * @param videoUrl - 当前歌曲的URL
+ * @param webDavAuthItem - 当前WebDAV认证信息(实例变量)
+ * @returns Map<string, string> HTTP请求头
+ */
+export function buildHttpHeadersWithWebDav(
+  currentSong: VideoItem | undefined,
+  videoUrl: string,
+  webDavAuthItem: WebDavAuthItem
+): Map<string, string> {
+  const headers = new Map<string, string>();
+
+  let isWebDavSong = false;
+
+  if (currentSong) {
+    Logger.info(`heanup 当前歌曲信息 - name: ${currentSong.name}, type: ${currentSong.type}, filePath: ${currentSong.filePath}`);
+
+    // 检查是否为WebDAV歌曲
+    if (currentSong.type === CommonConstants.TYPE_WEBDAV) {
+      isWebDavSong = true;
+
+      // 优先从实例变量获取认证信息
+      if (webDavAuthItem) {
+        Logger.info(`heanup 从实例变量获取到WebDAV认证信息,账户ID: ${webDavAuthItem.accountId}`);
+      } else {
+        // 回退到全局上下文
+        try {
+          const globalContext = GlobalContext.getContext();
+          webDavAuthItem = globalContext.getObject('webDavAuthInfo') as WebDavAuthItem;
+          if (webDavAuthItem) {
+            Logger.info(`heanup 从全局上下文获取到WebDAV认证信息,账户ID: ${webDavAuthItem.accountId}`);
+          } else {
+            Logger.warn(`heanup 全局上下文中没有WebDAV认证信息`);
+          }
+        } catch (error) {
+          Logger.error(`heanup 获取全局上下文失败:`, error.toString());
+        }
+      }
+
+      // 如果识别为WebDAV但没有认证信息,记录警告
+      if (!webDavAuthItem) {
+        Logger.warn(`heanup 识别为WebDAV播放但缺少认证信息,可能需要手动配置WebDAV账户`);
+      }
+    }
+
+    if (isWebDavSong && webDavAuthItem) {
+      Logger.info(`heanup 检测到WebDAV播放,添加安全认证头`);
+      Logger.info(`heanup 歌曲URL: ${videoUrl}`);
+
+      try {
+        if (webDavAuthItem && webDavAuthItem.accountId) {
+          Logger.info(`heanup 找到WebDAV认证信息,账户ID: ${webDavAuthItem.accountId}`);
+          // 使用WebdavManager获取认证头
+          const webdavManager = WebdavManager.getInstance();
+          const authHeaders = webdavManager.getWebDavAuthHeaders(webDavAuthItem.accountId);
+
+          if (authHeaders) {
+            // 添加Basic认证头
+            headers.set("authorization", authHeaders.headers.Authorization);
+          } else {
+            Logger.error(`heanup 无法获取WebDAV认证头`);
+          }
+        } else {
+          Logger.error(`heanup WebDAV认证信息无效或缺少accountId`);
+        }
+      } catch (error) {
+        Logger.error(`heanup 获取WebDAV认证信息失败:`, error.toString());
+      }
+
+      // 添加标准的WebDAV请求头
+      headers.set("user_agent", "TTMusic-WebDAV/1.0");
+      headers.set("accept", "*/*");
+      headers.set("accept-range", "bytes");
+
+      Logger.info(`heanup WebDAV安全认证头设置完成`);
+    }
+  }
+
+  // 输出所有设置的头部信息用于调试
+  console.log(`heanup 设置的HTTP头部信息:`);
+  const headerIterator = headers.entries();
+  let headerEntry = headerIterator.next();
+  while (!headerEntry.done) {
+    const key = headerEntry.value[0];
+    const value = headerEntry.value[1];
+    console.log(`heanup ${key}: ${value}`);
+    headerEntry = headerIterator.next();
+  }
+  
+  return headers;
+}
+
+/**
+ * WebDAV认证信息(LocalMusic专用)
+ */
+export interface WebDavAuthItem {
+  accountId: number;
+  host: string;
+  port: number;
+  account: string;
+  password: string;
+  enableHttps: boolean;
+}
+

+ 9 - 23
entry/src/main/ets/pages/NewIndex.ets

@@ -98,7 +98,6 @@ struct NewIndex {
   @StorageProp('isHiCarStatus') isHiCarStatus: boolean = false;
   @StorageProp('curDisplayIsHiCar') curDisplayIsHiCar: boolean = false;
   @State idDefaultMediaKu: boolean = false
-
   /**
    * 是否显示更新日志开关
    */
@@ -1212,33 +1211,21 @@ struct NewIndex {
           Row() {
             // 账户封面或默认图标
             Stack() {
-              if (account.coverPath) {
-                Image(account.coverPath)
-                  .width(32)
-                  .height(32)
-                  .borderRadius(16)
-                  .objectFit(ImageFit.Cover)
-                  .border({ width: 1.5, color: this.themeColor })
-              } else {
-                // 默认账户图标
-                Circle({ width: 32, height: 32 })
-                  .fill(this.isDarkMode ? '#2C2C2E' : $r('app.color.input_background'))
-                  .border({ width: 1.5, color: this.themeColor })
-
-                Image($r('app.media.cloudDisk'))
-                  .width(16)
-                  .height(16)
+              Image(account.coverPath?account.coverPath:$r('app.media.cloudDisk'))
+                  .width(20)
+                  .height(20)
+                  .borderRadius(4)
                   .fillColor(this.themeColor)
-              }
+                  .objectFit(ImageFit.Cover)
             }
             .margin({ left: 20 })
 
             Column() {
               // 账户名称
               Text(account.name)
-                .margin({ left: 12, right: 20 })
+                .margin({ left: 8, right: 20 })
                 .fontSize(15)
-                .fontColor($r('app.color.text_color'))
+                .fontColor(this.selectedAccount==account?this.themeColor:$r('app.color.text_color'))
                 .fontWeight(480)
                 .maxLines(1)
                 .textOverflow({ overflow: TextOverflow.Ellipsis })
@@ -1247,7 +1234,7 @@ struct NewIndex {
                 // 账户类型标签
                 Text('WebDAV')
                   .fontSize(10)
-                  .fontColor($r('app.color.index_tab_font_color'))
+                  .fontColor(this.selectedAccount==account?this.themeColor:$r('app.color.index_tab_font_color'))
                   .opacity(0.8)
                   .padding({ left: 8, top: 2, bottom: 2 })
                   .borderRadius(3)
@@ -1255,7 +1242,7 @@ struct NewIndex {
                 // 服务器地址
                 Text(`@${account.isUseLocalHost ? account.localHost : account.host}:${account.port}`)
                   .fontSize(12)
-                  .fontColor($r('app.color.index_tab_font_color'))
+                  .fontColor(this.selectedAccount==account?this.themeColor:$r('app.color.index_tab_font_color'))
                   .opacity(0.7)
                   .maxLines(1)
                   .padding({ right: 8, top: 2, bottom: 2 })
@@ -1565,7 +1552,6 @@ struct NewIndex {
   selectWebDavAccount(account: WebDavAccount) {
     try {
       LogUtil.info('heanup NewIndex', '选择WebDAV账户:', account.name)
-
       // 如果账户未激活,先激活它
       if (!account.isActivate) {
         // 先将所有账户设为未激活

+ 58 - 89
entry/src/main/ets/pages/WebDavMainPage.ets

@@ -272,8 +272,6 @@ export struct WebDavMainPage {
     this.updateListData(this.songs)
   }
 
-
-
   // 播放WebDAV歌曲
   private playSong(song: VideoItem, index: number): void {
     try {
@@ -283,8 +281,10 @@ export struct WebDavMainPage {
 
       // 保存WebDAV认证信息到全局上下文(用于播放器认证)
       const globalContext = GlobalContext.getContext();
+      let webDavAuthInfo: WebDavAuthInfo | undefined = undefined;
+
       if (this.selectedAccount && this.selectedAccount.account && this.selectedAccount.password) {
-        const webDavAuthInfo: WebDavAuthInfo = {
+        webDavAuthInfo = {
           accountId: this.selectedAccount.id,
           host: this.selectedAccount.host,
           port: this.selectedAccount.port,
@@ -313,27 +313,13 @@ export struct WebDavMainPage {
       // 发送播放事件,类似歌单播放的方式
       const eventPlaylistPlay: emitter.InnerEvent = { eventId: EventConstants.EVENT_PLAYLIST_PLAY };
 
-      // 准备WebDAV认证信息用于传递
-      let authInfoForEvent: WebDavAuthInfo | undefined = undefined;
-      if (this.selectedAccount && this.selectedAccount.account && this.selectedAccount.password) {
-        authInfoForEvent = {
-          accountId: this.selectedAccount.id,
-          host: this.selectedAccount.host,
-          port: this.selectedAccount.port,
-          account: this.selectedAccount.account,
-          password: this.selectedAccount.password,
-          enableHttps: this.selectedAccount.enableHttps
-        };
-        Logger.info(TAG, 'heanup 将WebDAV认证信息包含在播放事件中');
-      }
-
       const playlistData: PlaylistEventData = {
         playlistId: 'webdav-playlist', // 使用特殊的ID标识WebDAV播放列表
         playlistName: 'WebDAV - ' + (this.selectedAccount?.name || '未知账户'),
         songCount: this.songs.length,
         startIndex: index,
         songFilePaths: songFilePaths,
-        webDavAuthInfo: authInfoForEvent // 直接传递认证信息
+        webDavAuthInfo: webDavAuthInfo // 直接传递认证信息
       };
 
       Logger.info(TAG, 'heanup 准备发送WebDAV播放事件,eventId: ' + eventPlaylistPlay.eventId);
@@ -346,15 +332,9 @@ export struct WebDavMainPage {
       emitter.emit(eventPlaylistPlay, eventData);
 
       // 跳转到首页播放器
-      this.getUIContext().getRouter().pushUrl({
-        url: 'pages/NewIndex',
-        params: {
-          fromWebDAV: true
-        }
-      }).catch((error: Error) => {
-        Logger.error(TAG, '跳转首页失败: ' + error.message);
-        this.getUIContext().getPromptAction().showToast({ message: '跳转失败' });
-      });
+      this.getUIContext()?.animateTo({ duration: 555 }, () => {
+        this.mType =0
+      })
     } catch (error) {
       const err = error as Error;
       Logger.error(TAG, '播放歌曲失败: ' + err.message);
@@ -362,6 +342,7 @@ export struct WebDavMainPage {
     }
   }
 
+
   // 导航到指定层级的面包屑路径
   private navigateToBreadcrumb(breadcrumbIndex: number): void {
     try {
@@ -397,18 +378,16 @@ export struct WebDavMainPage {
             .margin({ left: 12, right: 8 })
             .onClick(() => {
               this.getUIContext()?.animateTo({ duration: 555 }, () => {
-                // this.mType =0
                 this.isShowDrawer = !this.isShowDrawer
                 this.offsetX = 0
               })
-              });
+            });
 
 
-          Text('WebDAV网盘')
+          Text(this.selectedAccount.name || 'WebDav')
             .fontSize(18)
             .fontColor(Color.White)
             .fontWeight(FontWeight.Medium)
-            .layoutWeight(1)
             .textAlign(TextAlign.Center)
 
         }
@@ -460,64 +439,53 @@ export struct WebDavMainPage {
       Column({ space: 8 }) {
 
         // 账户信息显示
-        if (this.selectedAccount) {
-          Row({ space: 12 }) {
-            // 账户封面
-            Stack() {
-              if (this.selectedAccount.coverPath) {
-                Image(this.selectedAccount.coverPath)
-                  .width(40)
-                  .height(40)
-                  .borderRadius(20)
-                  .objectFit(ImageFit.Cover)
-                  .border({ width: 2, color: this.themeColor })
-              } else {
-                // 默认账户图标
-                Circle({ width: 40, height: 40 })
-                  .fill(this.isDarkMode ? '#2C2C2E' : $r('app.color.input_background'))
-                  .border({ width: 2, color: this.themeColor })
-
-                Image($r('app.media.cloudDisk'))
-                  .width(20)
-                  .height(20)
-                  .fillColor(this.themeColor)
-              }
-            }
-            .onClick(() => {
-              // 点击账户封面可以查看账户详情或编辑账户
-              Logger.info(TAG, '点击账户封面');
-            })
-
-            // 账户信息
-            Column({ space: 4 }) {
-              Text(this.selectedAccount.name || '未知账户')
-                .fontSize(16)
-                .fontWeight(FontWeight.Medium)
-                .fontColor(this.isDarkMode ? '#FFFFFF' : $r('app.color.text_color'))
-                .maxLines(1)
-                .textOverflow({ overflow: TextOverflow.Ellipsis })
-
-              Text(`${this.selectedAccount.host}:${this.selectedAccount.port}`)
-                .fontSize(12)
-                .fontColor(this.isDarkMode ? '#8E8E93' : $r('app.color.index_tab_font_color'))
-                .opacity(0.7)
-                .maxLines(1)
-                .textOverflow({ overflow: TextOverflow.Ellipsis })
-            }
-            .alignItems(HorizontalAlign.Start)
-            .layoutWeight(1)
-
-            // 在线状态指示器
-            Circle({ width: 8, height: 8 })
-              .fill(Color.Green)
-              .border({ width: 1, color: Color.White })
-          }
-          .width('100%')
-          .padding({ left: 4, right: 4, top: 8, bottom: 8 })
-          .backgroundColor(this.isDarkMode ? 'rgba(44,44,46,0.8)' : 'rgba(248,248,248,0.8)')
-          .borderRadius(8)
-          .margin({ bottom: 8 })
-        }
+        // if (this.selectedAccount) {
+        //   Row({ space: 12 }) {
+        //     // 账户封面
+        //     Stack() {
+        //       if (this.selectedAccount.coverPath) {
+        //         Image(this.selectedAccount.coverPath)
+        //           .width(20)
+        //           .height(20)
+        //           .borderRadius(10)
+        //           .objectFit(ImageFit.Cover)
+        //           .border({ width: 2, color: this.themeColor })
+        //       } else {
+        //
+        //         Image($r('app.media.cloudDisk'))
+        //           .width(20)
+        //           .height(20)
+        //           .fillColor(this.themeColor)
+        //       }
+        //     }
+        //
+        //     // 账户信息
+        //     Column({ space: 4 }) {
+        //       Text(this.selectedAccount.name || '未知账户')
+        //         .fontSize(16)
+        //         .fontWeight(FontWeight.Medium)
+        //         .fontColor(this.isDarkMode ? '#FFFFFF' : $r('app.color.text_color'))
+        //         .maxLines(1)
+        //         .textOverflow({ overflow: TextOverflow.Ellipsis })
+        //
+        //       Text(`${this.selectedAccount.host}:${this.selectedAccount.port}`)
+        //         .fontSize(12)
+        //         .fontColor(this.isDarkMode ? '#8E8E93' : $r('app.color.index_tab_font_color'))
+        //         .opacity(0.7)
+        //         .maxLines(1)
+        //         .textOverflow({ overflow: TextOverflow.Ellipsis })
+        //     }
+        //     .alignItems(HorizontalAlign.Start)
+        //     .layoutWeight(1)
+        //
+        //   }
+        //   .width('100%')
+        //   .padding({ left: 4, right: 4, top: 8, bottom: 8 })
+        //   .backgroundColor(this.isDarkMode ? 'rgba(44,44,46,0.8)' : 'rgba(248,248,248,0.8)')
+        //   .borderRadius(8)
+        //   .margin({ bottom: 8 })
+        // }
+        //
 
         // 面包屑导航
         if (this.webdavManager.currentPath !== '') {
@@ -697,6 +665,7 @@ export struct WebDavMainPage {
           .width(48)
           .height(48)
           .borderRadius(4)
+          .alt($r('app.media.music_red'))
           .fillColor(this.themeColor)
           .objectFit(ImageFit.Cover)
           .margin({ left: 8 })

+ 12 - 108
entry/src/main/ets/view/LocalMusic.ets

@@ -96,7 +96,9 @@ import { convertPlaylistSongsToVideoItems, emptyView } from '../pages/PlaylistDe
 import { Playlist, PlaylistSong } from '../viewmodel/Playlist';
 import { Song } from '../viewmodel/Song';
 import { SongType } from '../common/enums/SongType';
-import { WebdavManager, WebDavAuthInfo as WebDavManagerAuthInfo } from '../common/util/WebdavManager';
+import { WebdavManager, WebDavAuthInfo as WebDavManagerAuthInfo,
+  buildHttpHeadersWithWebDav,
+  WebDavAuthItem} from '../common/util/WebdavManager';
 const TAG = 'LocalMusic';
 
 /**
@@ -108,20 +110,9 @@ interface PlaylistEventData {
   songCount: number;
   startIndex: number;
   songFilePaths: string[];
-  webDavAuthInfo?: WebDavAuthInfo; // 新增WebDAV认证信息
+  webDavAuthInfo?: WebDavAuthItem; // 新增WebDAV认证信息
 }
 
-/**
- * WebDAV认证信息(LocalMusic专用)
- */
-interface WebDavAuthInfo {
-  accountId: number;
-  host: string;
-  port: number;
-  account: string;
-  password: string;
-  enableHttps: boolean;
-}
 
 const DEFAULT_INDEX =
   ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
@@ -285,7 +276,7 @@ export struct LocalMusic {
     ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET;
 
   // WebDAV认证信息缓存(作为实例变量,比全局上下文更可靠)
-  private currentWebDavAuthInfo: WebDavAuthInfo | null = null;
+  private currentWebDavAuthInfo: WebDavAuthItem | null = null;
 
   //瀑布流的列数横竖屏动态切换
   onIsLandscapeChange() {
@@ -684,7 +675,7 @@ export struct LocalMusic {
         Logger.info('heanup eventPlaylistPlay: 接收到歌单播放数据')
 
         // 提取WebDAV认证信息(如果存在)
-        let webDavAuthInfo: WebDavAuthInfo | undefined = undefined;
+        let webDavAuthInfo: WebDavAuthItem | undefined = undefined;
         if (data.webDavAuthInfo) {
           // 将webDavAuthInfo转换为正确的类型
           const authData = data.webDavAuthInfo as Record<string, Object>;
@@ -11798,100 +11789,12 @@ export struct LocalMusic {
     ]);
 
     // 如果是WebDAV网络音频,添加安全的HTTP头认证
-    Logger.info(`heanup 开始检查WebDAV认证需求 - currentSong存在: ${!!this.currentSong}`);
-    let isWebDavSong = false;
-    let webDavAuthInfo: WebDavAuthInfo | null = null;
-    if (this.currentSong) {
-      const currentSong = this.currentSong;
-      Logger.info(`heanup 当前歌曲信息 - name: ${currentSong.name}, type: ${currentSong.type}, filePath: ${currentSong.filePath}`);
-      // 检查是否为WebDAV歌曲(优先通过URL特征判断,因为全局上下文可能失效)
-      if (currentSong.type === CommonConstants.TYPE_WEBDAV) {
-        isWebDavSong=true;
-        
-        // 优先从实例变量获取认证信息(更可靠)
-        if (this.currentWebDavAuthInfo) {
-          webDavAuthInfo = this.currentWebDavAuthInfo;
-          Logger.info(`heanup 从实例变量获取到WebDAV认证信息,账户ID: ${webDavAuthInfo.accountId}`);
-        } else {
-          // 回退到全局上下文
-          try {
-            const globalContext = GlobalContext.getContext();
-            webDavAuthInfo = globalContext.getObject('webDavAuthInfo') as WebDavAuthInfo;
-            if (webDavAuthInfo) {
-              Logger.info(`heanup 从全局上下文获取到WebDAV认证信息,账户ID: ${webDavAuthInfo.accountId}`);
-              // 保存到实例变量中作为备份
-              this.currentWebDavAuthInfo = webDavAuthInfo;
-            } else {
-              Logger.warn(`heanup 全局上下文中没有WebDAV认证信息`);
-            }
-          } catch (error) {
-            Logger.error(`heanup 获取全局上下文失败:`, error.toString());
-          }
-        }
-        
-        // 如果识别为WebDAV但没有认证信息,尝试使用默认配置或提示用户
-        if (!webDavAuthInfo) {
-          Logger.warn(`heanup 识别为WebDAV播放但缺少认证信息,可能需要手动配置WebDAV账户`);
-          // TODO: 可以在这里添加默认认证逻辑或用户提示
-        }
-      }
-
-      if (isWebDavSong&&webDavAuthInfo) {
-        // URL已在doPlay中编码过,这里无需再编码
-        // 但确保当前使用的this.videoUrl是已编码的版本
-        Logger.info(`heanup 检测到WebDAV播放,添加安全认证头`);
-        Logger.info(`heanup 歌曲URL: ${this.videoUrl}`);
-        try {
-          if (webDavAuthInfo && webDavAuthInfo.accountId) {
-            Logger.info(`heanup 找到WebDAV认证信息,账户ID: ${webDavAuthInfo.accountId}`);
-            // 使用WebdavManager获取认证头
-            const webdavManager = WebdavManager.getInstance();
-            const authHeaders = webdavManager.getWebDavAuthHeaders(webDavAuthInfo.accountId);
-
-            if (authHeaders) {
-              // 添加Basic认证头
-              headers.set("authorization", authHeaders.headers.Authorization);
-            } else {
-              Logger.error(`heanup 无法获取WebDAV认证头`);
-            }
-          } else {
-            Logger.error(`heanup WebDAV认证信息无效或缺少accountId`);
-          }
-        } catch (error) {
-          Logger.error(`heanup 获取WebDAV认证信息失败:`, error.toString());
-        }
-
-        // 添加标准的WebDAV请求头
-        headers.set("user_agent", "TTMusic-WebDAV/1.0");
-        headers.set("accept", "*/*");
-        headers.set("accept-range", "bytes");
-
-        Logger.info(`heanup WebDAV安全认证头设置完成`);
-      }
-    }
-
-    // 输出所有设置的头部信息用于调试
-    console.log(`heanup 设置的HTTP头部信息:`);
-    const headerIterator = headers.entries();
-    let headerEntry = headerIterator.next();
-    while (!headerEntry.done) {
-      const key = headerEntry.value[0];
-      const value = headerEntry.value[1];
-      console.log(`heanup ${key}: ${value}`);
-      // if (key.toLowerCase().includes('auth')) {
-      //   Logger.info(`heanup ${key}: [认证信息已隐藏]`);
-      // } else {
-      //   Logger.info(`heanup ${key}: ${value}`);
-      // }
-      headerEntry = headerIterator.next();
+    if (this.currentSong&&this.currentSong.type === CommonConstants.TYPE_WEBDAV&&this.currentWebDavAuthInfo) {
+      headers = buildHttpHeadersWithWebDav(this.currentSong,this.videoUrl,this.currentWebDavAuthInfo)
     }
-
     this.mIjkMediaPlayer.setDataSourceHeader(headers);
-
-
-    if (isWebDavSong) {
+    if (this.currentSong&&this.currentSong.type === CommonConstants.TYPE_WEBDAV) {
       console.log(`heanup 为WebDAV播放设置IjkPlayer选项`);
-
       // 网络超时设置(单位:微秒,文档显示应该是字符串格式)
       this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "timeout", "30000000"); // 30秒
       this.mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_FORMAT, "connect_timeout", "30000000"); // 连接超时30秒
@@ -12220,7 +12123,7 @@ export struct LocalMusic {
         if (this.currentSong && this.currentSong.type === CommonConstants.TYPE_WEBDAV && this.currentSong.filePath) {
           try {
             const globalContext = GlobalContext.getContext();
-            const webDavAuthInfo = globalContext.getObject('webDavAuthInfo') as WebDavAuthInfo;
+            const webDavAuthInfo = globalContext.getObject('webDavAuthInfo') as WebDavAuthItem;
             if (webDavAuthInfo) {
               isWebDavError = true;
             }
@@ -13482,7 +13385,8 @@ export struct LocalMusic {
   /**
    * 处理歌单播放请求
    */
-  private handlePlaylistPlayRequest(playlistId: string, playlistName: string, songFilePaths: string[], startIndex: number, webDavAuthInfo?: WebDavAuthInfo) {
+  private handlePlaylistPlayRequest(playlistId: string, playlistName:
+    string, songFilePaths: string[], startIndex: number, webDavAuthInfo?: WebDavAuthItem) {
     try {
       Logger.info(`heanup 处理歌单播放请求: ${playlistName}, 歌曲数量: ${songFilePaths.length}, 开始索引: ${startIndex}`)