@christianriedl/media 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,355 @@
1
+ import { Rest } from '@christianriedl/rest';
2
+ import { Helper } from '@christianriedl/utils';
3
+ import { EState, EMediaType, EItemType } from "./iMedia";
4
+ export class MediaService {
5
+ rest;
6
+ mediaUrl;
7
+ log;
8
+ user = "";
9
+ roots = {};
10
+ folders = {};
11
+ realPictureAlbums = {};
12
+ medialists = {};
13
+ privateIdx = -100;
14
+ photoSelection = {
15
+ rating: 1,
16
+ criteria: 'ye',
17
+ root: 'Jahr',
18
+ selected: { Name: 'Root', ItemType: EItemType.Root }
19
+ };
20
+ constructor(rest, user, log) {
21
+ this.log = log;
22
+ this.user = user;
23
+ this.rest = rest;
24
+ this.mediaUrl = rest.serviceUrl;
25
+ }
26
+ updateFolders(folder) {
27
+ this.folders[folder.DLNAID] = folder;
28
+ folder.ChildCount = Number(folder.ChildCount);
29
+ folder.ItemType = Number(folder.ItemType);
30
+ folder.title = folder.Name;
31
+ folder.State = Number(folder.State);
32
+ folder.Year = Number(folder.Year);
33
+ folder.title = folder.Name;
34
+ folder.subTitle = '';
35
+ switch (folder.ItemType) {
36
+ case EItemType.AudioAlbum:
37
+ folder.subTitle = this.folders[folder.DLNAParentID].Name;
38
+ folder.ThumbnailUrl = this.getAlbumArtUrl(folder.ThumbnailUrl);
39
+ break;
40
+ case EItemType.VideoGenreType:
41
+ folder.Folders = [];
42
+ return false; // Remove it
43
+ }
44
+ if (folder.Folders) {
45
+ for (var i = 0; i < folder.Folders.length;)
46
+ if (this.updateFolders(folder.Folders[i]))
47
+ i++;
48
+ else
49
+ folder.Folders.splice(i, 1); // remove
50
+ }
51
+ return true;
52
+ }
53
+ async initializePhotos(stars, criteria) {
54
+ const key = `${stars}.${criteria}`;
55
+ this.log.trace("initializePhotos: " + key);
56
+ if (!this.roots[key]) {
57
+ var critName = '';
58
+ switch (criteria) {
59
+ case 'ye':
60
+ critName = 'Jahr';
61
+ break;
62
+ case 'lo':
63
+ critName = 'Orte';
64
+ break;
65
+ case 'ev':
66
+ critName = 'Ereignisse';
67
+ break;
68
+ case 'pe':
69
+ critName = 'Personen';
70
+ break;
71
+ }
72
+ const root = await this.browse("0", 6, true, false, `Root;Fotos;${stars};${critName}`);
73
+ this.updateFolders(root);
74
+ this.roots[key] = root;
75
+ }
76
+ if (criteria == 'ye') // ??
77
+ return this.folders[`ph.${stars}.${criteria}|`];
78
+ else
79
+ return this.folders[`ph.${stars}.${criteria}`];
80
+ }
81
+ async initializeAudios() {
82
+ this.log.trace("initializeAudios");
83
+ const root = await this.browse("0", 4, true, false, 'Root;Musik');
84
+ this.updateFolders(root);
85
+ this.roots['mu'] = root;
86
+ return this.folders['mu'];
87
+ }
88
+ async initializeVideos() {
89
+ this.log.trace("initializeVideos");
90
+ const root = await this.browse("0", 2, true, false, 'Root;Videos');
91
+ this.updateFolders(root);
92
+ this.roots['vi'] = root;
93
+ return this.folders['vi'];
94
+ }
95
+ async initializeRecordedTVs() {
96
+ this.log.trace("initializeOnline");
97
+ const root = await this.browse("0", 3, false, false, 'Root;Online;Rec TV');
98
+ this.updateFolders(root);
99
+ this.roots['online'] = root;
100
+ const videos = this.folders['online.rectv'];
101
+ this.log.trace(`getRecordedTVs ${videos.Files.length}`);
102
+ videos.ChildCount = Number(videos.ChildCount);
103
+ videos.ItemType = Number(videos.ItemType);
104
+ videos.State = Number(videos.State);
105
+ videos.title = videos.Name;
106
+ videos.subTitle = this.folders[videos.DLNAParentID].Name;
107
+ videos.ThumbnailUrl = "";
108
+ for (var i = 0; i < videos.Files.length; i++) {
109
+ const video = videos.Files[i];
110
+ video.ItemType = Number(video.ItemType);
111
+ video.State = Number(video.State);
112
+ video.Duration = Number(video.Duration);
113
+ video.title = video.Name;
114
+ video.info = this.durationString(video.Duration);
115
+ video.ThumbnailUrl = "";
116
+ video.Url = this.getVideoUrl(video.Url);
117
+ video.subTitle = video.Description;
118
+ }
119
+ return videos;
120
+ }
121
+ getListEntry(name, idx) {
122
+ var list = this.medialists[name];
123
+ if (list && idx < list.Values.length)
124
+ return list.Values[idx];
125
+ return `${name}.${idx}`;
126
+ }
127
+ async getPhotos(folder) {
128
+ var realPhotos;
129
+ if (folder.State & EState.FolderVirtual) {
130
+ const refs = await this.browseReferences(folder.DLNAID);
131
+ const dict = new Set();
132
+ ;
133
+ for (var i = 0; i < refs.Files.length; i++) {
134
+ dict.add(refs.Files[i].FileId);
135
+ }
136
+ var realFolderId = refs.Files[0].FolderId;
137
+ var idx = realFolderId.indexOf('|');
138
+ realFolderId = 'ph.all.ye' + realFolderId.substr(idx);
139
+ this.log.trace(`getPhotos virtual ${refs.Files.length} ${realFolderId}`);
140
+ realPhotos = this.realPictureAlbums[realFolderId];
141
+ if (!realPhotos) {
142
+ realPhotos = await this.browse(realFolderId, 1, false, false);
143
+ this.log.trace(`getPhotos virtual getReal ${realPhotos.Files.length}`);
144
+ this.processPhotos(realPhotos);
145
+ this.removePrivate(realPhotos);
146
+ this.realPictureAlbums[realFolderId] = realPhotos;
147
+ }
148
+ folder.Url = realPhotos.Url;
149
+ var virtualPhotos = {
150
+ ItemType: folder.ItemType,
151
+ State: folder.State,
152
+ Name: folder.Name,
153
+ Description: folder.Description,
154
+ ChildCount: 0,
155
+ DLNAID: folder.DLNAID,
156
+ DLNAParentID: folder.DLNAParentID,
157
+ Rating: folder.Rating,
158
+ Url: realPhotos.Url,
159
+ ThumbnailUrl: folder.ThumbnailUrl,
160
+ Year: folder.Year,
161
+ Folders: [],
162
+ Files: [],
163
+ GenreIdx: folder.GenreIdx,
164
+ CreatorIdx: folder.CreatorIdx,
165
+ Date: folder.Date,
166
+ };
167
+ for (var i = 0; i < realPhotos.Files.length; i++) {
168
+ if (dict.has(realPhotos.Files[i].DLNAID)) {
169
+ const photo = realPhotos.Files[i];
170
+ virtualPhotos.Files.push(photo);
171
+ virtualPhotos.ChildCount++;
172
+ }
173
+ }
174
+ this.log.trace(`getPhotos virtual get ${virtualPhotos.Files.length}`);
175
+ folder.ChildCount = virtualPhotos.ChildCount;
176
+ return virtualPhotos;
177
+ }
178
+ realPhotos = this.realPictureAlbums[folder.DLNAID];
179
+ if (!realPhotos) {
180
+ realPhotos = await this.browse(folder.DLNAID, 1, false, false);
181
+ this.processPhotos(realPhotos);
182
+ this.removePrivate(realPhotos);
183
+ this.log.trace(`getPhotos real get ${realPhotos.Files.length}`);
184
+ }
185
+ folder.ChildCount = realPhotos.ChildCount;
186
+ return realPhotos;
187
+ }
188
+ processPhotos(folder) {
189
+ if (folder.Files) {
190
+ for (var i = 0; i < folder.Files.length; i++) {
191
+ const photo = folder.Files[i];
192
+ if (photo.Orientation && typeof photo.Orientation === 'string')
193
+ photo.Orientation = Number(photo.Orientation);
194
+ if (photo.Date) {
195
+ if (typeof photo.Date === 'string')
196
+ photo.Date = new Date(photo.Date);
197
+ else if (typeof photo.Date === 'number')
198
+ photo.Date = Helper.fromMilliseconds1970(photo.Date * 1000);
199
+ }
200
+ }
201
+ }
202
+ }
203
+ removePrivate(folder) {
204
+ if (this.privateIdx >= 0 && folder.Files) {
205
+ for (var i = 0; i < folder.Files.length;) {
206
+ if (folder.Files[i].CreatorIdx == this.privateIdx)
207
+ folder.Files.splice(i, 1);
208
+ else
209
+ i++;
210
+ }
211
+ folder.ChildCount = folder.Files.length;
212
+ }
213
+ }
214
+ async getAudios(folder) {
215
+ const audios = await this.browse(folder.DLNAID, 1, false, false);
216
+ this.log.trace(`getAudios ${audios.Files.length}`);
217
+ audios.ChildCount = Number(audios.ChildCount);
218
+ audios.ItemType = Number(audios.ItemType);
219
+ audios.State = Number(audios.State);
220
+ audios.title = audios.Name;
221
+ audios.subTitle = this.folders[audios.DLNAParentID].Name;
222
+ audios.ThumbnailUrl = folder.ThumbnailUrl;
223
+ for (var i = 0; i < audios.Files.length; i++) {
224
+ const audio = audios.Files[i];
225
+ audio.ItemType = Number(audio.ItemType);
226
+ audio.State = Number(audio.State);
227
+ audio.Duration = Number(audio.Duration);
228
+ audio.title = `${audio.TrackNo} ${audio.Name}`;
229
+ audio.subTitle = this.durationString(audio.Duration);
230
+ audio.ThumbnailUrl = "";
231
+ }
232
+ return audios;
233
+ }
234
+ async getVideos(folder) {
235
+ const videos = await this.browse(folder.DLNAID, 1, false, false);
236
+ this.log.trace(`getVideos ${videos.Files.length}`);
237
+ videos.ChildCount = Number(videos.ChildCount);
238
+ videos.ItemType = Number(videos.ItemType);
239
+ videos.State = Number(videos.State);
240
+ videos.title = videos.Name;
241
+ videos.subTitle = this.folders[videos.DLNAParentID].Name;
242
+ videos.ThumbnailUrl = folder.ThumbnailUrl;
243
+ for (var i = 0; i < videos.Files.length; i++) {
244
+ const video = videos.Files[i];
245
+ video.ItemType = Number(video.ItemType);
246
+ video.State = Number(video.State);
247
+ video.Duration = Number(video.Duration);
248
+ if (typeof video.CountryIdx === 'string')
249
+ video.CountryIdx = Number(video.CountryIdx);
250
+ if (typeof video.CreatorIdx === 'string')
251
+ video.CreatorIdx = Number(video.CreatorIdx);
252
+ if (typeof video.GenreIdx === 'string')
253
+ video.GenreIdx = Number(video.GenreIdx);
254
+ video.title = video.Name;
255
+ video.info = this.durationString(video.Duration);
256
+ video.ThumbnailUrl = this.getAlbumArtUrl(video.ThumbnailUrl);
257
+ video.Url = this.getVideoUrl(video.Url);
258
+ video.subTitle = "";
259
+ if (video.Year)
260
+ video.subTitle = video.Year.toString();
261
+ if (video.CountryIdx && video.CountryIdx >= 0) {
262
+ const country = this.getListEntry('Video.Countries', video.CountryIdx);
263
+ if (country)
264
+ video.subTitle += ' - ' + country;
265
+ }
266
+ if (video.CreatorIdx && video.CreatorIdx >= 0) {
267
+ const reg = this.getListEntry('Video.Director', video.CreatorIdx);
268
+ if (reg)
269
+ video.subTitle += ' - ' + reg;
270
+ }
271
+ }
272
+ return videos;
273
+ }
274
+ getPhotoUrl(folderUrl, url, format) {
275
+ const picurl = `${this.mediaUrl}apiimage/Picture/${format}${folderUrl}${url}`;
276
+ return encodeURI(picurl);
277
+ }
278
+ getAudioUrl(item) {
279
+ const album = this.folders[item.DLNAParentID];
280
+ const audiourl = `${this.mediaUrl}apistream/Audio${album.Url}${item.Url}`;
281
+ return encodeURI(audiourl);
282
+ }
283
+ getVideoUrl(url) {
284
+ const videourl = `${this.mediaUrl}apistream/Video${url}`;
285
+ return encodeURI(videourl);
286
+ }
287
+ getAlbumArtUrl(folderUrl) {
288
+ const albumarturl = `${this.mediaUrl}apiimage/Picture/0x0${folderUrl}`;
289
+ return encodeURI(albumarturl);
290
+ }
291
+ getAlbumDownloadUrl(folderUrl, codec, param) {
292
+ var downloadurl = `${this.mediaUrl}apistream/AudioZipped?media=${folderUrl}`;
293
+ if (codec || param)
294
+ downloadurl += `&codec=${codec}& param=${param}`;
295
+ return encodeURI(downloadurl);
296
+ }
297
+ async browse(id, depth, onlyFolder, onlyReal, selectFolder) {
298
+ const folder = await this.rest.getData('apimedia/browse', { id: id, depth: depth, onlyFolder: onlyFolder, onlyReal: onlyReal, selectFolder: selectFolder });
299
+ return folder.result;
300
+ }
301
+ async browseReferences(id) {
302
+ const ref = await this.rest.getData('apimedia/browse', { id: id, depth: 1, onlyFolder: false, onlyReal: false });
303
+ return ref.result;
304
+ }
305
+ async getExifInfo(folderId, mediaId) {
306
+ const info = await this.rest.getData('apimedia/info/exif', { folderId: folderId, mediaId: mediaId });
307
+ return info.result;
308
+ }
309
+ async ping() {
310
+ try {
311
+ const result = await this.rest.getData('apistream/ping', { request: 'test' });
312
+ return result.ok && result.result.result === 'test';
313
+ }
314
+ catch (e) {
315
+ return false;
316
+ }
317
+ }
318
+ getImage(url) {
319
+ const promise = new Promise(function (resolve, reject) {
320
+ Rest.getBlob(url, "same-origin", "image/jpeg", "", resolve, reject);
321
+ });
322
+ return this.rest.toData(promise);
323
+ }
324
+ async getLists(mediaType) {
325
+ const res = await this.rest.getData('apimedia/medialist', { mediaType: mediaType });
326
+ const list = res.result;
327
+ for (var i = 0; i < list.Lists.length; i++) {
328
+ const li = list.Lists[i];
329
+ if (mediaType == EMediaType.Picture && li.Name == 'Picture.Creator') {
330
+ if (this.user != 'ric@rts.co.at' && this.user != 'rih@rts.co.at') {
331
+ for (var j = 0; j < li.Values.length; j++) {
332
+ if (li.Values[j] === "Christian Riedl Privat") {
333
+ this.privateIdx = j;
334
+ break;
335
+ }
336
+ }
337
+ }
338
+ }
339
+ this.medialists[li.Name] = li;
340
+ }
341
+ this.log.trace(`getLists get ${list.Lists.length}`);
342
+ return true;
343
+ }
344
+ durationString(duration) {
345
+ if (duration >= 3600) {
346
+ const hours = Math.floor(duration / 3600);
347
+ const minutes = duration - hours * 3600;
348
+ return `${hours}h ${Math.floor(minutes / 60)}:${minutes % 60}`;
349
+ }
350
+ else {
351
+ return `${Math.floor(duration / 60)}:${duration % 60}`;
352
+ }
353
+ }
354
+ }
355
+ //# sourceMappingURL=mediaService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaService.js","sourceRoot":"","sources":["../src/mediaService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { IRest } from '@christianriedl/rest';
2
+ import { ILogger, Dictionary } from '@christianriedl/utils';
3
+ export interface IPlayerState {
4
+ playerName: string;
5
+ albumId: string;
6
+ mediaId: string;
7
+ trackNo: number;
8
+ duration: number;
9
+ state: string;
10
+ volume: number;
11
+ mute: boolean;
12
+ }
13
+ export interface IPlayerRequest {
14
+ playerName: string;
15
+ folderId: string;
16
+ mediaId: string;
17
+ trackNo: number;
18
+ withStreamTitle: boolean;
19
+ }
20
+ export declare class PlayerService {
21
+ rest: IRest;
22
+ mediaUrl: string;
23
+ log: ILogger;
24
+ playerNames: string[];
25
+ playerStates: Dictionary<IPlayerState>;
26
+ constructor(rest: IRest, log: ILogger);
27
+ getPlayers(): Promise<string[]>;
28
+ getPlayerState(playerName: string): Promise<IPlayerState | null>;
29
+ play(playerRequest: IPlayerRequest): Promise<boolean>;
30
+ playStop(playerName: string): Promise<boolean>;
31
+ }
@@ -0,0 +1,35 @@
1
+ export class PlayerService {
2
+ rest;
3
+ mediaUrl;
4
+ log;
5
+ playerNames = [];
6
+ playerStates = {};
7
+ constructor(rest, log) {
8
+ this.log = log;
9
+ this.rest = rest;
10
+ this.mediaUrl = rest.serviceUrl;
11
+ }
12
+ async getPlayers() {
13
+ const players = await this.rest.getData('apiplayer/players');
14
+ this.playerNames = players.result;
15
+ return this.playerNames;
16
+ }
17
+ async getPlayerState(playerName) {
18
+ const result = await this.rest.getData('apiplayer/playstate', { playerName: playerName });
19
+ if (result.ok) {
20
+ const playerState = result.result;
21
+ this.playerStates[playerName] = playerState;
22
+ return playerState;
23
+ }
24
+ return null;
25
+ }
26
+ async play(playerRequest) {
27
+ const result = await this.rest.postData('apiplayer/play', playerRequest);
28
+ return result.ok;
29
+ }
30
+ async playStop(playerName) {
31
+ const result = await this.rest.postData('apiplayer/playstop', { playerName: playerName });
32
+ return result.ok;
33
+ }
34
+ }
35
+ //# sourceMappingURL=playerService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playerService.js","sourceRoot":"","sources":["../src/playerService.ts"],"names":[],"mappings":"AA0BA,MAAM,OAAO,aAAa;IACtB,IAAI,CAAQ;IACZ,QAAQ,CAAS;IACjB,GAAG,CAAU;IACb,WAAW,GAAa,EAAE,CAAC;IAC3B,YAAY,GAA6B,EAAE,CAAA;IAE3C,YAAY,IAAW,EAAE,GAAY;QACjC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC;IACpC,CAAC;IACD,KAAK,CAAC,UAAU;QACZ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAW,mBAAmB,CAAC,CAAC;QACvE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,MAAkB,CAAC;QAC9C,OAAO,IAAI,CAAC,WAAW,CAAC;IAC5B,CAAC;IACD,KAAK,CAAC,cAAc,CAAC,UAAkB;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAe,qBAAqB,EAAE,EAAE,UAAU,EAAE,UAAU,EAAC,CAAC,CAAC;QACvG,IAAI,MAAM,CAAC,EAAE,EAAE;YACX,MAAM,WAAW,GAAG,MAAM,CAAC,MAAsB,CAAC;YAClD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,GAAG,WAAW,CAAC;YAC5C,OAAO,WAAW,CAAC;SACtB;QACD,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,aAA6B;QACpC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAiB,gBAAgB,EAAE,aAAa,CAAC,CAAC;QACzF,OAAO,MAAM,CAAC,EAAE,CAAC;IACrB,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,UAAkB;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAM,oBAAoB,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;QAC/F,OAAO,MAAM,CAAC,EAAE,CAAC;IACrB,CAAC;CACJ"}
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@christianriedl/media",
3
+ "version": "1.0.1",
4
+ "description": "RIC media interfaces",
5
+
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+
9
+ "files": [
10
+ "/dist",
11
+ "src/**/*.vue",
12
+ "package.json"
13
+ ],
14
+ "scripts": {
15
+ "build": "tsc",
16
+ "clean": "tsc --build --clean"
17
+ },
18
+ "author": "Christian Riedl",
19
+ "license": "ISC",
20
+ "dependencies": {
21
+ "@christianriedl/utils": "^1.0.51",
22
+ "@christianriedl/rest": "^1.0.19"
23
+ },
24
+ "devDependencies": {
25
+ "typescript": "^4.6.3",
26
+ "@types/node": "^17.0.25",
27
+ "@babel/types": "^7.17.0"
28
+ }
29
+ }
@@ -0,0 +1,34 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue';
3
+ import { Helper } from '@christianriedl/utils';
4
+ import { IMediaRootInformation, EItemType } from '@christianriedl/media';
5
+
6
+ const props = defineProps<{ info: IMediaRootInformation }>();
7
+ const info = props.info;
8
+
9
+ const time = computed(() => unixTimeToString(info.modificationTime));
10
+ const itemTypes = computed(() => {
11
+ const types: string[] = [];
12
+ for (let i = 0x08; i < 0x100; i = i * 2) {
13
+ if (i & info.itemTypes)
14
+ types.push(EItemType[i]);
15
+ }
16
+ return types.join(' ');
17
+ });
18
+ function unixTimeToString(unixtime: number, withSeconds?: boolean) {
19
+ const dt = Helper.fromUnixTime(unixtime);
20
+ return Helper.formatDate(dt) + ' ' + Helper.formatTime(dt, withSeconds);
21
+ }
22
+ </script>
23
+
24
+ <template>
25
+ <v-row dense class="bg-light text-on-light">
26
+ <v-col cols="1">{{info.name}}</v-col>
27
+ <v-col cols="1">{{info.id}}</v-col>
28
+ <v-col cols="1">{{info.realFolderCount}}</v-col>
29
+ <v-col cols="1">{{info.virtualFolderCount}}</v-col>
30
+ <v-col cols="2">{{info.fileCount}}</v-col>
31
+ <v-col cols="2">{{time}}</v-col>
32
+ <v-col cols="4">{{itemTypes}}</v-col>
33
+ </v-row>
34
+ </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ import { computed } from 'vue';
3
+ import { Helper } from '@christianriedl/utils';
4
+ import { IRootDefinitionStatistics } from '@christianriedl/media';
5
+
6
+ const props = defineProps<{ stat: IRootDefinitionStatistics }>();
7
+ const stat = props.stat;
8
+ </script>
9
+
10
+ <template>
11
+ <v-row dense class="bg-light text-on-light">
12
+ <v-col cols="1">{{stat.rootName}}</v-col>
13
+ <v-col cols="5">{{stat.currentDirectory}}</v-col>
14
+ <v-col cols="1">{{stat.directoryCount}}</v-col>
15
+ <v-col cols="1">{{stat.realFolderCount}}</v-col>
16
+ <v-col cols="1">{{stat.virtualFolderCount}}</v-col>
17
+ <v-col cols="1">{{stat.fileCount}}</v-col>
18
+ <v-col cols="1">{{stat.mediaCount}}</v-col>
19
+ <v-col cols="1">{{stat.fileErrorCount}}</v-col>
20
+ </v-row>
21
+ </template>