{"version":3,"file":"2009.3e6bfbc160797404.js","mappings":"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","names":["i0","_r1","ctx_r1","openProjectsPage","_c0","onlineTypesAsText","_c1","_c2","project_r5","title","CapturePage_ng_container_7_ion_item_15_ng_container_5_ion_select_option_4_Template","recentProjects","project_r6","$event","_r4","projectChanged","CapturePage_ng_container_7_ion_item_15_ng_container_5_Template","CapturePage_ng_container_7_ion_item_15_ion_select_option_6_Template","projectSelected","compareProjectsWith","_c3","length","myProjects","_r8","ytPlaylistInput","_r7","onlineIdInput","CapturePage_ng_container_7_div_28_ion_item_3_Template","uploadOnline","uploadOnlineType","showYoutubePlaylistInput","uploadOnlineMessage","CapturePage_ng_container_7_ng_container_8_Template","CapturePage_ng_container_7_ion_item_15_Template","_r3","onFileUploadFinished","onFileUploadFailed","captureOnline","onlineTypes","YOUTUBE","VIMEO","CapturePage_ng_container_7_div_28_Template","isCaptureEnabled","id","userId","isLoading","showHarvestUpload","PAGE","OnlineTypes","NONE","CapturePage","_CapturePage","captureToProjectId","this","constructor","toaster","alertCtrl","configService","projectService","userService","youtubeService","clipsCoreService","clipsService","mystackService","environService","sentryService","httpClient","navCtrl","route","environment","production","showBetaInvite","captureToProjectName","Object","values","filter","item","map","toString","reduce","a","b","i","array","onDestroy$","Subject","addIcons","logoYoutube","ionicons_icons__WEBPACK_IMPORTED_MODULE_20__","bY$","logoVimeo","ngOnInit","params","pipe","take","subscribe","segment","combineLatest","userId$","userHasUploadAccess$","takeUntil","hasAccess","isCaptureAllowed$","activeProjectId$","isAllowed","projects","activeProjectId","hasProjects","Array","isArray","sort","sortProjectTitleAlpha","find","p","getRecentProjects","project","canEdit","isProjectAdmin","ngOnDestroy","next","complete","p1","p2","event","target","value","setActiveProjectId","res","console","error","captureMessage","Error","info","showProjectAlert","createClipFromFilestack","then","navEditor","message","present","log","captureError","_this","_asyncToGenerator","create","header","subHeader","buttons","navigateForward","DISCOVER_PAGE","EDIT_ROUTE","continueCaptureMultiple","clips","clip","addCaptureOnlineClipToMyStack","resetOnlineInputs","_this2","msg","harvestYoutubeId","warn","ytIdInput","_this3","Promise","resolve","getYoutubeVideoIdFromUrl","DEBUG_LOGS","count","newVideos","video","newVideo","duration","getMetadataDuration","loading","lastModifiedDate","getMetadataPublishDate","youtube_id","youtube_data","getMetadataTitle","poster","getThumbnail","url","newClip","convertVideoFileToClip","projectId","createClipperUploadClipId","push","handleMetadata","getVideoMetadata","getYoutubePlaylistIdFromUrl","i1","i2","i3","i4","i5","i6","i7","i8","i9","i10","i11","i12","i13","selectors","standalone","features","decls","vars","consts","template","rf","ctx","CapturePage_div_3_Template","CapturePage_ng_template_4_Template","CapturePage_div_6_Template","CapturePage_ng_container_7_Template","joinACrew_r9","NgIf","NgFor","RouterLink","FormsModule","i14","AsyncPipe","TranslatePipe","ClipUploadDirective","TopNavbarComponent","TermsPolicyModalsComponent","IonHeader","IonContent","IonSpinner","IonButton","IonItem","IonLabel","IonSelect","IonSelectOption","IonGrid","IonRow","IonCol","IonIcon","IonTextarea","styles"],"ignoreList":[],"sourceRoot":"webpack:///","sources":["./src/app/pages/capture/capture.page.html","./src/app/pages/capture/capture.page.ts"],"sourcesContent":["<!-- @format -->\n\n<ion-header>\n <app-top-navbar [title]=\"title\"> </app-top-navbar>\n</ion-header>\n\n<ion-content>\n <div *ngIf=\"isLoading\" class=\"ion-padding ion-text-center\">\n <ion-spinner name=\"crescent\"></ion-spinner>\n </div>\n\n <ng-template #joinACrew>\n <div class=\"ion-padding ion-text-center skinny-limit-width\">\n <h1 class=\"ion-padding-top ion-text-center\">{{ 'CLIP.CAPTURE.JOIN_A_CREW' | translate }}</h1>\n\n <p class=\"ion-text-center\">\n {{ 'CLIP.CAPTURE.JOIN_A_CREW_BODY' | translate:{ onlineTypes: onlineTypesAsText } }}\n <!-- Once you're on a Project Crew or have your own Project, you can upload videos or capture from \n {{ onlineTypesAsText }}. -->\n </p>\n\n <div class=\"ion-padding ion-text-center action-buttons\">\n <ion-button size=\"large\" fill=\"outline\" shape=\"round\" color=\"primary\" (click)=\"openProjectsPage()\">\n {{ 'COMMON.DISCOVER' | translate }} {{ 'COMMON.PROJECTS' | translate }}\n </ion-button>\n </div>\n </div>\n </ng-template>\n\n <div *ngIf=\"showBetaInvite\" class=\"ion-padding ion-text-center\">\n <div class=\"announcement ion-padding\">\n <h1>\n {{ 'CLIP.CAPTURE.BETA_HEADING' | translate }}\n <!-- We're actively developing new features for Capture! -->\n <!-- Be part of our community -->\n </h1>\n <p class=\"ion-text-center\">\n {{ 'CLIP.CAPTURE.BETA_SUBHEAD' | translate }}\n <!-- Join us as we build a collaborative storytelling vision. -->\n <!-- Interested in helping us test new features? -->\n </p>\n <p class=\"ion-text-center\">\n <ion-button\n size=\"small\"\n class=\"ion-text-uppercase btn-link-inline\"\n fill=\"clear\"\n color=\"primary\"\n [routerLink]=\"['/contact']\"\n [queryParams]=\"{ topic: 'CLIP.CAPTURE.BETA_CONTACT_TOPIC' | translate }\"\n routerDirection=\"forward\"\n >{{ 'CLIP.CAPTURE.BETA_CONTACT_US_BUTTON' | translate }}</ion-button\n >\n {{ 'CLIP.CAPTURE.BETA_CONTACT_US_TEXT' | translate }}\n </p>\n </div>\n </div>\n\n <ng-container *ngIf=\"(isCaptureAllowed$ | async) === true || isLoading; else joinACrew\">\n <div class=\"content-view ion-text-center\">\n <div class=\"capture-device\">\n <div class=\"ion-padding main-content skinny-limit-width\">\n <div class=\"ion-padding-top\">\n <h1>{{ 'CLIP.CAPTURE.TITLE' | translate }}</h1>\n\n <ng-container *ngIf=\"!isCaptureEnabled\">\n <p class=\"capture-message\">\n {{ 'CLIP.CAPTURE.DISABLED_MESSAGE' | translate }}\n </p>\n </ng-container>\n \n <p>\n {{ 'CLIP.CAPTURE.SUBTITLE' | translate }}\n <br />\n {{ 'CLIP.CAPTURE.LIMITS' | translate }}\n </p>\n </div>\n <!-- \n Try using \n <app-form-select-myprojects\n (selected)=\"projectChanged($event)\"\n >\n </app-form-select-myprojects>\n ...and remove all the code for myProjects!\n -->\n <ion-item *ngIf=\"myProjects.length > 0 && projectSelected && isCaptureEnabled\" lines=\"none\">\n <ion-label position=\"stacked\">{{ 'CLIP.CAPTURE.SELECT_PROJECT_LABEL' | translate }}</ion-label>\n <ion-select \n interface=\"popover\" \n [value]=\"projectSelected\"\n [compareWith]=\"compareProjectsWith\" \n [interfaceOptions]=\"{ cssClass: 'wide select-with-headings' }\"\n (ionChange)=\"projectChanged($event)\"\n >\n <ng-container *ngIf=\"recentProjects && recentProjects.length > 0\">\n <ion-select-option [value]=\"-1\" [disabled]=\"true\" class=\"select-heading\">{{ 'PROJECT.RECENT_PROJECTS' | translate }}</ion-select-option>\n <ion-select-option *ngFor=\"let project of recentProjects\" [value]=\"project\">{{ project.title }}</ion-select-option>\n\n <ion-select-option [value]=\"-2\" [disabled]=\"true\" class=\"select-heading ion-padding-top\">{{ 'PROJECT.ALL' | translate }}</ion-select-option>\n </ng-container>\n <ion-select-option *ngFor=\"let project of myProjects\" [value]=\"project\">{{ project.title }}</ion-select-option>\n </ion-select>\n </ion-item>\n <div class=\"capture-icon-buttons ion-padding-top\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-button clipUpload shape=\"round\" size=\"large\" fill=\"outline\" color=\"light\" title=\"Upload\"\n [projectId]=\"(projectSelected)?.id\"\n [userId]=\"userId\"\n (fileUploadFinished)=\"onFileUploadFinished($event)\"\n (fileUploadFailed)=\"onFileUploadFailed($event)\"\n [disabled]=\"isLoading || !projectSelected?.id || !isCaptureEnabled\"\n >\n <ion-icon slot=\"icon-only\" name=\"cloud-upload-outline\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col>\n <ion-button\n shape=\"round\"\n size=\"large\"\n fill=\"outline\"\n [color]=\"(uploadOnlineType === onlineTypes.YOUTUBE) ? 'primary' : 'light'\"\n (click)=\"captureOnline(onlineTypes.YOUTUBE)\"\n [disabled]=\"isLoading || !projectSelected?.id || !isCaptureEnabled\"\n >\n <ion-icon slot=\"icon-only\" name=\"logo-youtube\"></ion-icon>\n </ion-button>\n </ion-col>\n <ion-col>\n <ion-button\n shape=\"round\"\n size=\"large\"\n fill=\"outline\"\n color=\"medium\"\n (click)=\"captureOnline(onlineTypes.VIMEO)\"\n [disabled]=\"isLoading || !projectSelected?.id || !isCaptureEnabled\"\n >\n <ion-icon slot=\"icon-only\" name=\"logo-vimeo\"></ion-icon>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n </div>\n </div>\n </div>\n\n <div *ngIf=\"showHarvestUpload\" class=\"harvest-uploads yt-inputs ion-padding ion-text-center\">\n <ion-item lines=\"none\">\n <ion-textarea\n type=\"text\"\n [(ngModel)]=\"onlineIdInput\"\n name=\"onlineIdInput\"\n placeholder=\"Paste the {{uploadOnlineType}} ID or link to the {{uploadOnlineType}} video (URL)\"\n ></ion-textarea>\n </ion-item>\n\n <ion-item *ngIf=\"showYoutubePlaylistInput\">\n <ion-label position=\"floating\">YouTube Playlist <br />ID or Link</ion-label>\n <ion-textarea\n type=\"text\"\n color=\"primary\"\n [(ngModel)]=\"ytPlaylistInput\"\n name=\"ytPlaylistInput\"\n placeholder=\"Already have a playlist created? paste the link to it here (or ID)\"\n ></ion-textarea>\n </ion-item>\n\n <div class=\"click-msg\">{{ uploadOnlineMessage }}</div>\n\n <div class=\"btn-wrapper\">\n <ion-button shape=\"round\" color=\"primary\" (click)=\"uploadOnline()\">\n Harvest {{uploadOnlineType}} video\n </ion-button>\n </div>\n </div>\n\n <div class=\"capture-helpful-tips ion-margin-vertical ion-padding-horizontal\">\n <h2>{{ 'CLIP.CAPTURE.TIPS.HEADING' | translate }}</h2>\n <ul>\n <li>\n {{ 'CLIP.CAPTURE.TIPS.TIP_1' | translate }}\n </li>\n <li>\n {{ 'CLIP.CAPTURE.TIPS.TIP_2' | translate }}\n </li>\n <li>\n {{ 'CLIP.CAPTURE.TIPS.TIP_3' | translate }}\n </li>\n <li>\n {{ 'CLIP.CAPTURE.TIPS.TIP_4' | translate }}\n </li>\n </ul>\n </div>\n\n <div class=\"ion-text-center ion-padding ion-margin-top\">\n <app-terms-policy-modals\n [agreeTo] = \"'POLICIES.AGREE_TO_TERMS_PREFIX' | translate\"\n ></app-terms-policy-modals>\n </div>\n\n </div>\n </ng-container>\n\n <div class=\"tab-bottom-spacer\"></div>\n</ion-content>\n","/** @format */\n\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, RouterLink } from '@angular/router';\nimport { NgIf, NgFor, AsyncPipe } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport { FormsModule } from '@angular/forms';\nimport {\n AlertController,\n NavController,\n IonHeader,\n IonContent,\n IonSpinner,\n IonButton,\n IonItem,\n IonLabel,\n IonSelect,\n IonSelectOption,\n IonGrid,\n IonRow,\n IonCol,\n IonIcon,\n IonTextarea,\n} from '@ionic/angular/standalone';\nimport { addIcons } from 'ionicons';\nimport { logoVimeo, logoYoutube } from 'ionicons/icons';\nimport { TranslatePipe } from '@ngx-translate/core';\nimport { combineLatest, lastValueFrom, Observable, Subject } from 'rxjs';\nimport { map, takeUntil, take } from 'rxjs/operators';\nimport { ConfigService } from '@app/core/config/config.service';\nimport { ClipsCoreService } from '@app/core/services/clips.service';\nimport { EnvironService } from '@app/core/services/environ.service';\nimport { MyStackService } from '@app/core/services/mystack.service';\nimport { SentryService } from '@app/core/services/sentry.service';\nimport { ToasterService } from '@app/core/services/toaster.service';\nimport { UserService } from '@app/core/services/user.service';\nimport { YoutubeService } from '@app/core/services/youtube.service';\nimport { PickerFileError, PickerFileMetadata } from '@app/core/filestack/filestack.service';\nimport { ClipUploadDirective } from '@app/core/filestack/directives/clip-upload.directive';\nimport { ClipVideoFile, Clip, convertVideoFileToClip } from '@app/shared/models/clip.model';\nimport { TopNavbarComponent } from '@app/shared/components/top-navbar/top-navbar.component';\nimport { TermsPolicyModalsComponent } from '@app/shared/components/terms-policy-modals/terms-policy-modals.component';\nimport { ClipsService } from '@app/clips/shared/services/clips.service';\nimport { Project, sortProjectTitleAlpha } from '@app/projects/shared/project.model';\nimport { ProjectService } from '@app/projects/shared/services/project.service';\nimport { DISCOVER_PAGE, EDIT_ROUTE } from '@app/app.routes';\nimport { environment } from 'src/environments/environment';\n\nconst DEBUG_LOGS = false;\nconst PAGE = '[CapturePage]';\n\n/** if not public, then restricted to Cognito User Groups */\nconst ENABLE_PUBLIC_CAPTURE = false;\nconst SHOW_BETA_INVITE = true; // show beta tester invitation in UI if they click an unused type\n\nenum OnlineTypes {\n NONE = '',\n YOUTUBE = 'YouTube',\n VIMEO = 'Vimeo (coming soon)',\n}\n\n/**\n * DEV MetaData (avoid youtube api calls during dev)\n */\nconst useDevYoutubeMetadata = false; // wzRHIcpTJ6Q\nconst youtubeMockPath = '/assets/youtube-mock.json'; // See assets config on angular.json\n\n@Component({\n selector: 'app-capture',\n templateUrl: './capture.page.html',\n styleUrls: ['./capture.page.scss'],\n standalone: true,\n imports: [\n NgIf,\n NgFor,\n RouterLink,\n FormsModule,\n AsyncPipe,\n TranslatePipe,\n ClipUploadDirective,\n TopNavbarComponent,\n TermsPolicyModalsComponent,\n IonHeader,\n IonContent,\n IonSpinner,\n IonButton,\n IonItem,\n IonLabel,\n IonSelect,\n IonSelectOption,\n IonGrid,\n IonRow,\n IonCol,\n IonIcon,\n IonTextarea,\n ],\n})\nexport class CapturePage implements OnInit, OnDestroy {\n /** @todo temp disable except for admins or dev'rs */\n isCaptureEnabled = !environment.production;\n\n isLoading = true; // shows loading spinner\n\n title: string = 'Capture';\n showHarvestUpload: boolean = false; // toggle the panel to allow upload from OnlineTypes\n showBetaInvite = false; // toggle the beta tester invitation panel\n\n captureToProjectName: string = '';\n public projectSelected: Project;\n public isCaptureAllowed$: Observable<boolean>;\n\n onlineTypes = OnlineTypes;\n uploadOnlineType: OnlineTypes; // renders in view & switches\n uploadOnlineMessage: string = '';\n onlineIdInput: string = ''; //'IEhUvtyt5rk';//'xQ_IQS3VKjA';//'w_Zf6n3TVzw';\n // get a comma delimited string of the enum types joined by \", \" and the last item with \"and\"\n onlineTypesAsText: string = Object.values(OnlineTypes)\n .filter((item) => item)\n .map((item) => item.toString())\n .reduce((a, b, i, array) => a + (i < array.length - 1 ? ', ' : ' and ') + b);\n\n /**\n * Feature: YoutTube Playlist Capture (very close, just needs finished!)\n */\n showYoutubePlaylistInput: boolean = false;\n ytPlaylistInput: string;\n\n myProjects: Project[] = [];\n recentProjects: Project[] = [];\n public userId: string;\n\n private get captureToProjectId(): string {\n return this.projectSelected && this.projectSelected.id ? this.projectSelected.id : '';\n }\n\n private onDestroy$ = new Subject<void>();\n\n constructor(\n private toaster: ToasterService,\n private alertCtrl: AlertController,\n private configService: ConfigService,\n private projectService: ProjectService,\n private userService: UserService,\n private youtubeService: YoutubeService,\n private clipsCoreService: ClipsCoreService,\n private clipsService: ClipsService,\n private mystackService: MyStackService,\n private environService: EnvironService,\n private sentryService: SentryService,\n private httpClient: HttpClient,\n private navCtrl: NavController,\n private route: ActivatedRoute\n ) {\n addIcons({\n logoYoutube,\n logoVimeo,\n });\n }\n\n ngOnInit() {\n this.route.params.pipe(take(1)).subscribe((params) => {\n const { segment = '' } = params;\n if (segment && segment === 'youtube') {\n this.captureOnline(OnlineTypes.YOUTUBE);\n }\n });\n\n /**\n * enable for public uploads, else:\n * secure capture so only specific groups or !production can capture\n * Kickstarter, WeddingPilot\n */\n if (ENABLE_PUBLIC_CAPTURE) {\n this.isCaptureEnabled = true;\n } else {\n combineLatest([this.userService.userId$, this.userService.userHasUploadAccess$])\n .pipe(takeUntil(this.onDestroy$))\n .subscribe(([userId, hasAccess]) => {\n this.userId = userId;\n this.isCaptureEnabled = hasAccess; //!!isAdmin || !!isDeveloper || !!isKickstarter || !!isWeddingPilot || !!isBeta;\n if (!this.isCaptureEnabled) {\n this.showBetaInvite = true;\n }\n });\n }\n\n /**\n * @note this gets called while browsing projects, should it pause while view not active?\n * done with takeUntil(onDestroy)? 2022-09-21\n *\n * isCaptureAllowed: appConfig.allowCapture && hasProjects\n * if isLoading then disable capture buttons\n * if !isCaptureAllowed then show tpl joinACrew\n */\n this.isCaptureAllowed$ = combineLatest([\n this.userService.isCaptureAllowed$,\n this.environService.activeProjectId$,\n ]).pipe(\n takeUntil(this.onDestroy$),\n map(([{ isAllowed, projects }, activeProjectId]) => {\n const hasProjects = Array.isArray(projects) && projects.length > 0;\n this.myProjects = hasProjects ? projects.sort(sortProjectTitleAlpha) : [];\n if (activeProjectId) {\n this.projectSelected = this.myProjects.find((p) => p.id === activeProjectId);\n }\n if (!this.projectSelected) {\n // if the activeProject is not mine, or no active, take first\n [this.projectSelected] = this.myProjects; // Using ES6 destructuring to get 1st element of array, returns undefined array.isEmpty\n }\n this.isLoading = false;\n return isAllowed;\n })\n );\n\n // instead of passing the async to the backend\n this.projectService\n .getRecentProjects()\n .pipe(\n takeUntil(this.onDestroy$),\n // distinctUntilChanged((a,b) => a && b && a.length === b.length), // this is missing the re-order event\n map((projects: Project[]) =>\n projects.map((project) => ({ ...project, canEdit: this.projectService.isProjectAdmin(project) }))\n )\n )\n .subscribe((projects) => {\n this.recentProjects = projects;\n });\n }\n\n ngOnDestroy() {\n this.onDestroy$.next();\n this.onDestroy$.complete();\n }\n\n compareProjectsWith(p1, p2) {\n return p1 && p2 ? p1.id === p2.id : p1 === p2;\n }\n\n /**\n * Project was selected, update with this value\n */\n projectChanged(event) {\n if (event && event.target && event.target.value && event.target.value.id) {\n this.projectSelected = event.target.value;\n // set the activeProject in EnvironStore to save it for next Capture\n this.environService.setActiveProjectId(event.target.value.id);\n }\n }\n\n /**\n * Filestack is done with one or more\n */\n onFileUploadFinished(res: PickerFileMetadata) {\n try {\n if (!res) {\n console.error(`onFileUploadFinished no filestackResult?!?`);\n this.sentryService.captureMessage(`onFileUploadFinished no filestackResult?`);\n throw new Error(`There was an error creating a Clip. Please try again.`);\n }\n\n if (!this.captureToProjectId) {\n console.info(`${PAGE} NO captureToProject ('${this.captureToProjectId}'), use personal studio?`);\n this.showProjectAlert();\n throw new Error(''); // don't show toaster here, alert instead\n }\n\n this.clipsService.createClipFromFilestack(res, this.captureToProjectId, this.userId).then(() => {\n this.navEditor();\n });\n } catch (error) {\n if (error && error.message) {\n this.toaster.present(error.message);\n }\n }\n }\n\n onFileUploadFailed(res: PickerFileError) {\n console.log('### fileUploadFailed', res);\n this.sentryService.captureError(`Filestack onFileUploadFailed`);\n }\n\n async showProjectAlert() {\n const alert = await this.alertCtrl.create({\n header: 'Filmstacker',\n subHeader: 'Please select a Project',\n message: `Clips must be uploaded to a Project, please select one and try again.`,\n buttons: ['Ok'],\n });\n return await alert.present();\n }\n\n openProjectsPage() {\n this.navCtrl.navigateForward(`/${DISCOVER_PAGE}`);\n }\n\n navEditor() {\n this.navCtrl.navigateForward(`/${EDIT_ROUTE}`);\n }\n\n captureOnline(id: OnlineTypes | string) {\n if (id === this.uploadOnlineType) {\n this.showHarvestUpload = false;\n this.uploadOnlineType = OnlineTypes.NONE; // reset it\n return;\n }\n switch (id) {\n case OnlineTypes.YOUTUBE: {\n this.uploadOnlineType = id;\n this.showHarvestUpload = true;\n break;\n }\n default: {\n if (SHOW_BETA_INVITE) {\n this.showBetaInvite = true;\n this.toaster.present(`Harvest from ${id} is in Development. Contact Us to be a BETA Tester!`);\n } else {\n this.toaster.present(`Harvest from ${id} is in Development.`);\n }\n }\n }\n }\n\n continueCaptureMultiple(clips: Clip[]) {\n DEBUG_LOGS && console.log(`${PAGE} continueCaptureMultiple clips:`, clips);\n if (Array.isArray(clips) && clips.length > 0) {\n clips.map((clip) => this.mystackService.addCaptureOnlineClipToMyStack(clip));\n this.navEditor();\n } else {\n this.toaster.present(`Oops! There was an issue captuing the Clips. Please Try Again.`);\n }\n }\n\n resetOnlineInputs() {\n this.onlineIdInput = '';\n this.uploadOnlineMessage = '';\n }\n\n /**\n * upload the Id based on uploadOnlineType\n */\n async uploadOnline() {\n switch (this.uploadOnlineType) {\n case OnlineTypes.YOUTUBE: {\n const { msg, clips } = await this.harvestYoutubeId(this.onlineIdInput);\n this.uploadOnlineMessage = msg;\n this.continueCaptureMultiple(clips);\n break;\n }\n default: {\n console.warn(`${PAGE} uploadOnline UNHANDLED`, {\n uploadOnlineType: this.uploadOnlineType,\n onlineIdInput: this.onlineIdInput,\n });\n }\n }\n }\n\n /**\n * get the input values and try to load a youtube ID\n */\n async harvestYoutubeId(ytIdInput: string): Promise<{ msg: string; clips?: Clip[] }> {\n DEBUG_LOGS && console.log(`${PAGE} harvestYoutubeId`, { ytIdInput, ytPlaylistInput: this.ytPlaylistInput });\n let msg = '';\n if (!ytIdInput && !this.ytPlaylistInput) {\n msg = `Please add an input to continue.`;\n return Promise.resolve({ msg });\n }\n\n if (ytIdInput) {\n const id = this.youtubeService.getYoutubeVideoIdFromUrl(ytIdInput);\n if (id) {\n this.uploadOnlineMessage = `Loading '${id}'...`;\n\n const handleMetadata = (res) => {\n try {\n if (!Array.isArray(res)) {\n console.error(`${PAGE} handleMetadata Error:`, res);\n return { msg: 'Oops, something went wrong getting the video metadata - Please Try Again.' };\n }\n /**\n * @todo: verify that this should be >= 1, or === 1 ?\n */\n if (res.length >= 1 && res[0].error) {\n return { msg: res[0].error };\n }\n // we have an array, make an item for each\n let count = 0;\n const newVideos: Clip[] = [];\n for (const video of res) {\n if (video.id) {\n const newVideo: ClipVideoFile = {\n duration: this.youtubeService.getMetadataDuration(video),\n loading: false,\n lastModifiedDate: this.youtubeService.getMetadataPublishDate(video),\n youtube_id: video.id,\n youtube_data: video,\n title: this.youtubeService.getMetadataTitle(video),\n poster: this.youtubeService.getThumbnail(video.id, 'low').url,\n };\n DEBUG_LOGS && console.log(`${PAGE} harvestYoutubeId newVideo:`, newVideo);\n const newClip = convertVideoFileToClip(newVideo);\n newClip.projectId = this.captureToProjectId;\n newClip.id = this.clipsCoreService.createClipperUploadClipId(this.userId, video.id);\n\n newVideos.push(newClip);\n count++;\n } else {\n console.warn(`${PAGE} harvestYoutubeId NO ID? video:`, video);\n }\n } // end for loop\n\n this.resetOnlineInputs();\n\n return {\n msg: `Found ${count} Video${count > 1 ? 's' : ''}`,\n clips: newVideos,\n };\n } catch (error) {\n console.error(`${PAGE} Caught:`, error);\n return { msg: `Oops we caught an error! Please reload the page and try again.` };\n }\n }; //end handleMetadata\n\n /**\n * DEV MetaData (avoid youtube api calls during dev)\n */\n if (useDevYoutubeMetadata) {\n console.log(`${PAGE} using DEV metadata`);\n const data = await lastValueFrom(this.httpClient.get(youtubeMockPath));\n return Promise.resolve(handleMetadata(data));\n }\n\n const metadata = await this.youtubeService.getVideoMetadata([id]); // getVideoMetadata takes an array of ids\n DEBUG_LOGS && console.log(`${PAGE} getVideoMetadata`, metadata);\n return handleMetadata(metadata);\n } else {\n return Promise.resolve({ msg: 'We were not able to find that Youtube ID - Please Try Again.' });\n }\n } // if ytIdInput\n\n // if enabling this feature - be sure to handle if both inputs are filled in...\n if (this.showYoutubePlaylistInput && this.ytPlaylistInput) {\n const id = this.youtubeService.getYoutubePlaylistIdFromUrl(this.ytPlaylistInput);\n if (id) {\n return Promise.resolve({ msg: `Feature Coming Soon! Playlist: ${id}. ` });\n } else {\n return Promise.resolve({ msg: 'We were not able to get the Playlist ID - Please Try Again.' });\n }\n }\n } // end harvest YT\n}\n"],"x_google_ignoreList":[]}