{"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 }}&nbsp;{{ '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":[]}