• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (c) 2023 Hunan OpenValley Digital Industry Development Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 *     http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16import mediaLibrary from '@ohos.multimedia.mediaLibrary';
17import DateTimeUtil from '../utlis/DateTimeUtil';
18import Logger from '../utlis/Logger';
19
20const TAG = '[MediaModel]';
21
22type FileInfo = {
23  prefix: string;
24  suffix: string;
25  directory: number;
26};
27
28export default class MediaModel {
29  private mediaLibraryTest: mediaLibrary.MediaLibrary = undefined;
30  private static mediaInstance: MediaModel = undefined;
31
32  constructor() {
33    this.mediaLibraryTest = mediaLibrary.getMediaLibrary(globalThis.cameraContext);
34  }
35
36  public static getMediaInstance(): MediaModel {
37    if (this.mediaInstance === undefined) {
38      this.mediaInstance = new MediaModel();
39    }
40    return this.mediaInstance;
41  }
42
43  async createAndGetUri(mediaType: mediaLibrary.MediaType): Promise<mediaLibrary.FileAsset> {
44    let dateTimeUtil: DateTimeUtil = new DateTimeUtil();
45    let info: FileInfo = this.getInfoFromMediaType(mediaType);
46    let name: string = `${dateTimeUtil.getDate()}_${dateTimeUtil.getTime()}`;
47    let displayName: string = `${info.prefix}${name}${info.suffix}`;
48    Logger.info(TAG, `displayName = ${displayName},mediaType = ${mediaType}`);
49    let publicPath: string = await this.mediaLibraryTest.getPublicDirectory(
50      info.directory
51    );
52    Logger.info(TAG, `publicPath = ${publicPath}`);
53    let fileAsset: mediaLibrary.FileAsset = await this.mediaLibraryTest.createAsset(
54      mediaType,
55      displayName,
56      publicPath
57    );
58    return fileAsset;
59  }
60
61  async getFile(dataUri: mediaLibrary.FileAsset): Promise<mediaLibrary.FileAsset> {
62    let fileKeyObj = mediaLibrary.FileKey;
63    if (dataUri !== undefined) {
64      let args = dataUri.id.toString();
65      let fetchOp = {
66        selections: `${fileKeyObj.ID}=?`,
67        selectionArgs: [args],
68      };
69      const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets(
70        fetchOp
71      );
72      Logger.info(
73        TAG,
74        `fetchFileResult.getCount() = ${fetchFileResult.getCount()}`
75      );
76      const fileAssets = await fetchFileResult.getAllObject();
77      let fileAsset: mediaLibrary.FileAsset = fileAssets[0];
78      return fileAsset;
79    }
80    return null;
81  }
82
83  async getFdPath(fileAsset: mediaLibrary.FileAsset): Promise<number> {
84    let fd: number = await fileAsset.open('Rw');
85    Logger.info(TAG, `fd = ${fd}`);
86    return fd;
87  }
88
89  async getFileAssetsFromMediaType(mediaType: number): Promise<Array<mediaLibrary.FileAsset>> {
90    Logger.info(TAG, `getFileAssetsFromType,mediaType = ${mediaType}`);
91    let fileKeyObj = mediaLibrary.FileKey;
92    let fileAssets: Array<mediaLibrary.FileAsset> = [];
93
94    try {
95      let fetchOp = {
96        selections: `${fileKeyObj.MEDIA_TYPE}=?`,
97        selectionArgs: [`${mediaType}`],
98      };
99      const fetchFileResult: mediaLibrary.FetchFileResult = await this.mediaLibraryTest.getFileAssets(
100        fetchOp
101      );
102      Logger.info(TAG, `getFileAssetsFromType,fetchFileResult.count = ${fetchFileResult.getCount()}`);
103      if (fetchFileResult.getCount() > 0) {
104        fileAssets = await fetchFileResult.getAllObject();
105      }
106    } catch (err) {
107      console.info(`LSQ: err ${JSON.stringify(err)}`);
108    }
109    return fileAssets;
110  }
111
112  onDateChange(callback: () => void): void {
113    this.mediaLibraryTest.on('albumChange', () => {
114      Logger.info(TAG, 'albumChange called');
115      callback();
116    });
117    this.mediaLibraryTest.on('imageChange', () => {
118      Logger.info(TAG, 'imageChange called');
119      callback();
120    });
121    this.mediaLibraryTest.on('audioChange', () => {
122      Logger.info(TAG, 'audioChange called');
123      callback();
124    });
125    this.mediaLibraryTest.on('videoChange', () => {
126      Logger.info(TAG, 'videoChange called');
127      callback();
128    });
129    this.mediaLibraryTest.on('fileChange', () => {
130      Logger.info(TAG, 'fileChange called');
131      callback();
132    });
133  }
134
135  offDateChange(): void {
136    this.mediaLibraryTest.off('albumChange');
137    this.mediaLibraryTest.off('imageChange');
138    this.mediaLibraryTest.off('audioChange');
139    this.mediaLibraryTest.off('videoChange');
140    this.mediaLibraryTest.off('fileChange');
141  }
142
143  getInfoFromMediaType(mediaType: mediaLibrary.MediaType): FileInfo {
144    let fileInfo: FileInfo = {
145      prefix: '',
146      suffix: '',
147      directory: 0
148    };
149    switch (mediaType) {
150      case mediaLibrary.MediaType.FILE:
151        fileInfo.prefix = 'FILE_';
152        fileInfo.suffix = '.txt';
153        fileInfo.directory = mediaLibrary.DirectoryType.DIR_DOCUMENTS;
154        break;
155      case mediaLibrary.MediaType.IMAGE:
156        fileInfo.prefix = 'IMG_';
157        fileInfo.suffix = '.jpg';
158        fileInfo.directory = mediaLibrary.DirectoryType.DIR_IMAGE;
159        break;
160      case mediaLibrary.MediaType.VIDEO:
161        fileInfo.prefix = 'VID_';
162        fileInfo.suffix = '.mp4';
163        fileInfo.directory = mediaLibrary.DirectoryType.DIR_VIDEO;
164        break;
165      case mediaLibrary.MediaType.AUDIO:
166        fileInfo.prefix = 'AUD_';
167        fileInfo.suffix = '.wav';
168        fileInfo.directory = mediaLibrary.DirectoryType.DIR_AUDIO;
169        break;
170    }
171    return fileInfo;
172  }
173}
174