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 during ingest');
438
+ throw new Error('Absolute video path references are not supported');
438
439
  return videoRef;
439
440
  }
440
- return `${folderUri}/${videoRef}`;
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 != null,
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 during ingest');
435
+ throw new Error('Absolute video path references are not supported');
435
436
  return videoRef;
436
437
  }
437
- return `${folderUri}/${videoRef}`;
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 != null,
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 {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "incyclist-services",
3
- "version": "1.7.53",
3
+ "version": "1.7.54",
4
4
  "peerDependencies": {
5
5
  "gd-eventlog": "^0.1.27"
6
6
  },