incyclist-services 1.7.53 → 1.7.54
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.
|
@@ -325,6 +325,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
325
325
|
return {
|
|
326
326
|
folderUri,
|
|
327
327
|
folderName,
|
|
328
|
+
files: folderFiles,
|
|
328
329
|
controlFileUri: controlFile.uri,
|
|
329
330
|
format: ext,
|
|
330
331
|
scanError: skipReason
|
|
@@ -365,7 +366,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
365
366
|
throw new Error(`Could not parse: [${err.message}]`);
|
|
366
367
|
}
|
|
367
368
|
if (result.data.hasVideo) {
|
|
368
|
-
this.validateVideoUrl(result.details, target.folderUri);
|
|
369
|
+
this.validateVideoUrl(result.details, target.folderUri, target.files);
|
|
369
370
|
}
|
|
370
371
|
observer.emit('parse-result', {
|
|
371
372
|
alreadyImported: false,
|
|
@@ -386,14 +387,14 @@ let RouteLibraryScannerService = (() => {
|
|
|
386
387
|
});
|
|
387
388
|
}
|
|
388
389
|
}
|
|
389
|
-
validateVideoUrl(routeDetail, folderUri) {
|
|
390
|
+
validateVideoUrl(routeDetail, folderUri, folderFiles) {
|
|
390
391
|
if (this.isMobile()) {
|
|
391
392
|
if (routeDetail.video.format === 'avi') {
|
|
392
393
|
throw new Error('AVI video not supported');
|
|
393
394
|
}
|
|
394
395
|
}
|
|
395
396
|
if (routeDetail.video.file) {
|
|
396
|
-
routeDetail.video.file = this.resolveVideoUri(routeDetail.video.file, folderUri);
|
|
397
|
+
routeDetail.video.file = this.resolveVideoUri(routeDetail.video.file, folderUri, folderFiles);
|
|
397
398
|
}
|
|
398
399
|
}
|
|
399
400
|
async _ingest(routes, observer) {
|
|
@@ -425,7 +426,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
425
426
|
const skipped = routes.length - target.length;
|
|
426
427
|
observer.emit('ingest-complete', { imported: importedRoutes.length, skipped, errors, failedRoutes, importedRoutes });
|
|
427
428
|
}
|
|
428
|
-
resolveVideoUri(videoRef, folderUri) {
|
|
429
|
+
resolveVideoUri(videoRef, folderUri, folderFiles) {
|
|
429
430
|
if (videoRef.startsWith('http://') || videoRef.startsWith('https://')) {
|
|
430
431
|
return videoRef;
|
|
431
432
|
}
|
|
@@ -434,10 +435,13 @@ let RouteLibraryScannerService = (() => {
|
|
|
434
435
|
}
|
|
435
436
|
if (videoRef.startsWith('/') || /^[A-Za-z]:[/\\]/.test(videoRef)) {
|
|
436
437
|
if (this.isMobile())
|
|
437
|
-
throw new Error('Absolute video path references are not supported
|
|
438
|
+
throw new Error('Absolute video path references are not supported');
|
|
438
439
|
return videoRef;
|
|
439
440
|
}
|
|
440
|
-
|
|
441
|
+
const match = folderFiles.find(f => f.name.toLowerCase() === videoRef.toLowerCase());
|
|
442
|
+
if (!match)
|
|
443
|
+
throw new Error(`Video file not found in folder: ${videoRef}`);
|
|
444
|
+
return match.uri;
|
|
441
445
|
}
|
|
442
446
|
async upsertImportHistory(folderInfo, routeCount) {
|
|
443
447
|
try {
|
|
@@ -489,7 +493,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
489
493
|
distance,
|
|
490
494
|
label: route.title,
|
|
491
495
|
alreadyImported,
|
|
492
|
-
importable: parseError
|
|
496
|
+
importable: parseError == null,
|
|
493
497
|
format,
|
|
494
498
|
errorReason: parseError
|
|
495
499
|
};
|
|
@@ -508,13 +512,6 @@ let RouteLibraryScannerService = (() => {
|
|
|
508
512
|
const dot = filename.lastIndexOf('.');
|
|
509
513
|
return dot >= 0 ? filename.slice(dot + 1).toLowerCase() : '';
|
|
510
514
|
}
|
|
511
|
-
containsAbsolutePath(content) {
|
|
512
|
-
if (/[>"']\//m.test(content))
|
|
513
|
-
return true;
|
|
514
|
-
if (/[A-Za-z]:[/\\]/m.test(content))
|
|
515
|
-
return true;
|
|
516
|
-
return false;
|
|
517
|
-
}
|
|
518
515
|
isMobile() {
|
|
519
516
|
return this.getBindings()?.appInfo?.getChannel() === 'mobile';
|
|
520
517
|
}
|
|
@@ -322,6 +322,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
322
322
|
return {
|
|
323
323
|
folderUri,
|
|
324
324
|
folderName,
|
|
325
|
+
files: folderFiles,
|
|
325
326
|
controlFileUri: controlFile.uri,
|
|
326
327
|
format: ext,
|
|
327
328
|
scanError: skipReason
|
|
@@ -362,7 +363,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
362
363
|
throw new Error(`Could not parse: [${err.message}]`);
|
|
363
364
|
}
|
|
364
365
|
if (result.data.hasVideo) {
|
|
365
|
-
this.validateVideoUrl(result.details, target.folderUri);
|
|
366
|
+
this.validateVideoUrl(result.details, target.folderUri, target.files);
|
|
366
367
|
}
|
|
367
368
|
observer.emit('parse-result', {
|
|
368
369
|
alreadyImported: false,
|
|
@@ -383,14 +384,14 @@ let RouteLibraryScannerService = (() => {
|
|
|
383
384
|
});
|
|
384
385
|
}
|
|
385
386
|
}
|
|
386
|
-
validateVideoUrl(routeDetail, folderUri) {
|
|
387
|
+
validateVideoUrl(routeDetail, folderUri, folderFiles) {
|
|
387
388
|
if (this.isMobile()) {
|
|
388
389
|
if (routeDetail.video.format === 'avi') {
|
|
389
390
|
throw new Error('AVI video not supported');
|
|
390
391
|
}
|
|
391
392
|
}
|
|
392
393
|
if (routeDetail.video.file) {
|
|
393
|
-
routeDetail.video.file = this.resolveVideoUri(routeDetail.video.file, folderUri);
|
|
394
|
+
routeDetail.video.file = this.resolveVideoUri(routeDetail.video.file, folderUri, folderFiles);
|
|
394
395
|
}
|
|
395
396
|
}
|
|
396
397
|
async _ingest(routes, observer) {
|
|
@@ -422,7 +423,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
422
423
|
const skipped = routes.length - target.length;
|
|
423
424
|
observer.emit('ingest-complete', { imported: importedRoutes.length, skipped, errors, failedRoutes, importedRoutes });
|
|
424
425
|
}
|
|
425
|
-
resolveVideoUri(videoRef, folderUri) {
|
|
426
|
+
resolveVideoUri(videoRef, folderUri, folderFiles) {
|
|
426
427
|
if (videoRef.startsWith('http://') || videoRef.startsWith('https://')) {
|
|
427
428
|
return videoRef;
|
|
428
429
|
}
|
|
@@ -431,10 +432,13 @@ let RouteLibraryScannerService = (() => {
|
|
|
431
432
|
}
|
|
432
433
|
if (videoRef.startsWith('/') || /^[A-Za-z]:[/\\]/.test(videoRef)) {
|
|
433
434
|
if (this.isMobile())
|
|
434
|
-
throw new Error('Absolute video path references are not supported
|
|
435
|
+
throw new Error('Absolute video path references are not supported');
|
|
435
436
|
return videoRef;
|
|
436
437
|
}
|
|
437
|
-
|
|
438
|
+
const match = folderFiles.find(f => f.name.toLowerCase() === videoRef.toLowerCase());
|
|
439
|
+
if (!match)
|
|
440
|
+
throw new Error(`Video file not found in folder: ${videoRef}`);
|
|
441
|
+
return match.uri;
|
|
438
442
|
}
|
|
439
443
|
async upsertImportHistory(folderInfo, routeCount) {
|
|
440
444
|
try {
|
|
@@ -486,7 +490,7 @@ let RouteLibraryScannerService = (() => {
|
|
|
486
490
|
distance,
|
|
487
491
|
label: route.title,
|
|
488
492
|
alreadyImported,
|
|
489
|
-
importable: parseError
|
|
493
|
+
importable: parseError == null,
|
|
490
494
|
format,
|
|
491
495
|
errorReason: parseError
|
|
492
496
|
};
|
|
@@ -505,13 +509,6 @@ let RouteLibraryScannerService = (() => {
|
|
|
505
509
|
const dot = filename.lastIndexOf('.');
|
|
506
510
|
return dot >= 0 ? filename.slice(dot + 1).toLowerCase() : '';
|
|
507
511
|
}
|
|
508
|
-
containsAbsolutePath(content) {
|
|
509
|
-
if (/[>"']\//m.test(content))
|
|
510
|
-
return true;
|
|
511
|
-
if (/[A-Za-z]:[/\\]/m.test(content))
|
|
512
|
-
return true;
|
|
513
|
-
return false;
|
|
514
|
-
}
|
|
515
512
|
isMobile() {
|
|
516
513
|
return this.getBindings()?.appInfo?.getChannel() === 'mobile';
|
|
517
514
|
}
|
|
@@ -32,7 +32,6 @@ export declare class RouteLibraryScannerService extends IncyclistService {
|
|
|
32
32
|
private buildRouteDisplayItem;
|
|
33
33
|
private getCompanionExts;
|
|
34
34
|
private getExtension;
|
|
35
|
-
private containsAbsolutePath;
|
|
36
35
|
private isMobile;
|
|
37
36
|
protected getRouteList(): import("../list/service").RouteListService;
|
|
38
37
|
protected getBindings(): import("../../api").IncyclistBindings;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ReadDirResult } from "../../api";
|
|
1
2
|
import { FormattedNumber } from "../../i18n";
|
|
2
3
|
import { Route } from "../base/model/route";
|
|
3
4
|
export interface FolderInfo {
|
|
@@ -10,6 +11,7 @@ export interface ScannedRoute {
|
|
|
10
11
|
folderName: string;
|
|
11
12
|
format: RouteFormat;
|
|
12
13
|
scanError?: string;
|
|
14
|
+
files: ReadDirResult[];
|
|
13
15
|
}
|
|
14
16
|
export type RouteFormat = string;
|
|
15
17
|
export interface ParsedRoute {
|