ElectronJavaScriptNode.jsHTMLCSS

YT Download Update v1.4.0

Zu den großen Änderungen gehört unter anderem das fluent-ffmpeg mit einem eigenen System zur Kommunikation mit FFmpeg ersetzt wurde

Unter der Haube hat sich einiges geändert. Zu den großen Änderungen gehört unter anderem das fluent-ffmpeg mit einem eigenen System zur Kommunikation mit FFmpeg ersetzt wurde. Ich wollte auf unnötigen Ballast eines zusätzlichen Moduls schlicht verzichten und bin mir sicher das alles was ich vor hatte auch damit möglich gewesen wäre.

Alle Änderungen im Detail

Das Modul zur Speicherung der Einstellungen wurde komplett überarbeitet. Im Grunde tut es exakt das Gleiche, ist aber deutlich eleganter geschrieben.

Das UI kann nun kleiner skaliert werden als zuvor. Die Elemente, die die einzelnen Videos im Interface repräsentieren sind von der Höhe kleiner geworden. Die Optionen der Select Elemente haben dadurch eine fixe maximal Höhe. Die Fortschrittsanzeige habe ich auch überarbeitet. Beim Download wird nun die aktuelle Downloadgeschwindigkeit sowie beim Konvertieren der aktuelle Fortschritt angezeigt.

YT Download unterstützt nun grafikbeschleunigtes encoding. Es wird versucht automatisch den optimalen Modus zu nutzen.


Die init() Methode aus der class Config

Anstatt nur fs wird fs.promises eingebunden. Damit gibt jede Funktion von fs ein Promise zurück und Callbacks werden überflüssig. Im ersten try - catch Block wird der Ordner für die Config Datei erstellt, wenn dieser noch nicht existiert. Im Zweiten wird versucht die Config zuladen und wenn dieses scheitert werden die Standardeinstellungen gespeichert.

./src/utils.js
async init() {
    try {
      await fs.mkdir(this.DIRECTORY, { recursive: false });        
    }
    catch(error) {
      if(error.code !== 'EEXIST') {
        throw error;
      }
    }
    finally {
      try {
        const config = JSON.parse((await fs.readFile(this.CONFIG_FILE)));
        Object.assign(this, config);
      }
      catch(error) {
        await fs.writeFile(this.CONFIG_FILE, JSON.stringify(this.Obj, {flag: 'ax'}));
        return this;
      }
    }
  }

Der prozentuale Fortschritt beim Konvertieren

Das Objekt proc ist ein child process, der mittels spawn eine FFmpeg Instanz ausführt. Verwirrend ist das die Ausgabe über stderr gestreamt wird. Letztendlich macht es aber keinen Unterschied. Nach der Konvertierung in einem String wird der Index von time= gesucht und diesem 5 addiert. Damit müssten wir am Index vom Timecode sein. Die Laufzeit wurde vorab mit ffProbe ausgelesen.

./src/main/ffmpeg.js
proc.stderr.on('data', (data) => {        
        const str = data.toString();
        const i = str.indexOf('time=') + 5;
    
        if(i > 4) {
          let timecode = 0;
          let time = str.substr(i, 11);
    
          time = time.split(':');
    
          let h   = parseInt(time[0]);
          let m   = parseInt(time[1]);
          let s   = parseInt(time[2].split('.')[0]);
          let ms  = parseInt(time[2].split('.')[1]);

          if(h > 0) { timecode = h * 60 * 60 }
          if(m > 0) { timecode += m * 60 }
          if(s > 0) { timecode += s }
          if(ms > 0) { timecode = parseFloat(`${timecode}.${ms}`).toFixed(2) };
    
          const percent = parseFloat(timecode / proc.duration * 100).toFixed(2);
          
          _this.emit('progress', 
                      { 
                        job: 'Converting', 
                        progress: percent, 
                        duration: proc.duration,
                        elemId: task.elemId
                      }
                    );  
        }
      });

Der vollständige Source kann auf github eingesehen werden und bei Fragen oder Vorschlägen stehe ich sehr gerne zur Verfügung.