1/*
2 * Copyright (c) Huawei Technologies Co., Ltd. 2024-2024. All rights reserved.
3 */
4import dataSharePredicates from '@ohos.data.dataSharePredicates';
5import userFileManager from '@ohos.filemanagement.userFileManager';
6import image from '@ohos.multimedia.image';
7
8import { Logger } from '../../common/util/HiLogger'
9import { LocalAudioFile } from './LocalAudioFile'
10
11const logger: Logger = new Logger('LocalAudioManager')
12
13/**
14 * 对接媒体库/文件系统,提供本地音频查询能力,本地音频分页查询能力
15 */
16export class LocalAudioManager {
17  private fileAssets: Array<userFileManager.FileAsset> = []
18
19  /**
20   * 获取FetchResult<FileAsset>
21   */
22  getLocalAudio(offset: number, limit: number, context: Context): Promise<Array<LocalAudioFile>> {
23    logger.info('getAudioAssets');
24    let mgr = userFileManager.getUserFileMgr(context);
25    let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
26    let fetchOptions: userFileManager.FetchOptions = {
27      fetchColumns: [
28        userFileManager.AudioKey.TITLE.toString(),
29        userFileManager.AudioKey.ARTIST.toString(),
30        userFileManager.AudioKey.AUDIOALBUM.toString()
31      ],
32      predicates: predicates.limit(limit, offset)
33    };
34
35    return new Promise(async (resolve) => {
36      try {
37        let fetchResult: userFileManager.FetchResult<userFileManager.FileAsset> = await mgr
38          .getAudioAssets(fetchOptions);
39        if (fetchResult) {
40          logger.info('fetchFileResult success' + JSON.stringify(fetchResult));
41          this.fileAssets = await fetchResult.getAllObject();
42          if (this.fileAssets && this.fileAssets.length > 0) {
43            let localAudioFile = await this.transferFileAssetsToLocalAudioFiles()
44            logger.info('localAudioFile length: ' + (await localAudioFile).length)
45            resolve(localAudioFile)
46          } else {
47            logger.error('fileAssets is null')
48            resolve([])
49          }
50        }
51      } catch (err) {
52        logger.error('getAudioAssets failed, message = ' + err);
53        resolve([])
54      }
55    })
56  }
57
58  /**
59   * 将FileAsset转换为LocalAudioFile
60   */
61  transferFileAssetsToLocalAudioFiles(): Promise<Array<LocalAudioFile>> {
62    let localAudioFile: LocalAudioFile[] = []
63    return new Promise(async (resolve) => {
64      if (this.fileAssets) {
65        logger.info('fileAsset.length :' + this.fileAssets.length);
66        for (let fileAsset of this.fileAssets) {
67          let uri = fileAsset.uri || ''
68          let name = fileAsset.get(userFileManager.AudioKey.TITLE.toString()).toString() || fileAsset.displayName
69          let artist = fileAsset.get(userFileManager.AudioKey.ARTIST.toString()).toString() || ''
70          let album = fileAsset.get(userFileManager.AudioKey.AUDIOALBUM.toString()).toString() || ''
71          let displayName = fileAsset.displayName
72          let getThumbnail: image.PixelMap | Resource
73          try {
74            getThumbnail = await fileAsset.getThumbnail()
75          } catch (err) {
76            getThumbnail = $r('app.media.default')
77            logger.error('transferGetThumbnail failed: ' + err)
78          }
79          if (uri) {
80            let localAudioFileItem: LocalAudioFile = new LocalAudioFile(uri, name, artist, album,
81              displayName, getThumbnail)
82            localAudioFile.push(localAudioFileItem)
83            logger.info(`localAudioFileItem: uri: ${uri}, name: ${name}, artist: ${artist}, album: ${album}, getThumbnail: ${JSON.stringify(getThumbnail)}}`)
84          } else {
85            logger.error('transferFileAssetsToLocalAudioFiles failed!')
86          }
87        }
88      }
89      resolve(localAudioFile)
90    })
91  }
92}