Better webtorrent error handling
authorChocobozzz <florian.bigard@gmail.com>
Sun, 23 Jul 2017 09:07:30 +0000 (11:07 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Sun, 23 Jul 2017 09:07:30 +0000 (11:07 +0200)
client/src/app/videos/video-watch/video-watch.component.ts

index 05a2c296cb002ace648d00269823f8da9669aa6e..cd11aa33c508f0fb4e198509fc5ab1c8aff09173 100644 (file)
@@ -81,10 +81,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
       self.player = this
     })
 
-    this.errorsSub = this.webTorrentService.errors.subscribe(err => {
-      const message = typeof err === 'string' ? err : err.message
-      this.notificationsService.error('Error', message)
-    })
+    this.errorsSub = this.webTorrentService.errors.subscribe(err => this.handleError(err))
   }
 
   ngOnDestroy () {
@@ -117,7 +114,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
     // So we create a timer to inform the user the load is abnormally long
     this.errorTimer = window.setTimeout(() => this.loadTooLong(), VideoWatchComponent.LOADTIME_TOO_LONG)
 
-    this.webTorrentService.add(this.video.magnetUri, torrent => {
+    const torrent = this.webTorrentService.add(this.video.magnetUri, torrent => {
       // Clear the error timer
       window.clearTimeout(this.errorTimer)
       // Maybe the error was fired by the timer, so reset it
@@ -143,6 +140,9 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
 
       this.runInProgress(torrent)
     })
+
+    torrent.on('error', err => this.handleError(err))
+    torrent.on('warning', err => this.handleError(err))
   }
 
   setLike () {
@@ -250,6 +250,19 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
     return this.video.isBlackistableBy(this.authService.getUser())
   }
 
+  private handleError (err: any) {
+    const errorMessage: string = typeof err === 'string' ? err : err.message
+    let message = ''
+
+    if (errorMessage.indexOf('http error') !== -1) {
+      message = 'Cannot fetch video from server, maybe down.'
+    } else {
+      message = errorMessage
+    }
+
+    this.notificationsService.error('Error', message)
+  }
+
   private checkUserRating () {
     // Unlogged users do not have ratings
     if (this.isUserLoggedIn() === false) return