jdaviderb/JFrogfy

View on GitHub
src/services/youtube.ts

Summary

Maintainability
A
1 hr
Test Coverage
import Service from '@ember/service';
import { inject as service } from '@ember-decorators/service';
import Audio from 'client/src/services/audio';
import ENV from 'client/config/environment';
import { task } from 'ember-concurrency-decorators';
import Track from 'client/src/pojo/track';
export default class YoutubeService extends Service {
  @service
  audio: Audio;

  host: string = ENV.apiServer;
  endpoint: string = '/api/youtube/v1/get_video';
  controller: AbortController;
  signal: AbortSignal;
  task: any;

  constructor() {
    super(...arguments);

    this.controller = new AbortController();
    this.controller.signal
    this.signal = this.controller.signal;
  }

  play(track: Track): any {
    if (this.controller && this.task) {
      this.controller.abort();
      this.controller = new AbortController();
      this.signal = this.controller.signal;
      this.task.cancel();
    }
    // @ts-ignore
    this.task = this._load.perform(track);
    return this.task;
  }

  // @ts-ignore
  @task({ maxConcurrency: 2, drop: true })
  *_load(track: Track): any {
    let audio;
    const options = { method: 'get', signal: this.signal };

    try {
      this.audio.pause();
      const queryParams = encodeURI(`?artist=${track.artist}&song=${track.name}`);
      const response = yield fetch(this.host + this.endpoint + queryParams, options);
      const data = yield response.json();
      audio = decodeURIComponent(data.video);
      this.audio.play(audio);
    } catch(error) {
      this.audio.tracksManager.nextPlay();
    }

    return audio;
  }
}