From 42b40636991b97fe818007fab19091764fc5db73 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Fri, 15 Jul 2022 15:30:14 +0200 Subject: Add ability for client to create server logs --- .../shared/manager-options/hls-options-builder.ts | 3 ++- .../player/shared/mobile/peertube-mobile-plugin.ts | 19 ++++++++-------- .../player/shared/p2p-media-loader/hls-plugin.ts | 25 +++++++++++----------- .../p2p-media-loader/p2p-media-loader-plugin.ts | 7 +++--- .../p2p-media-loader/redundancy-url-manager.ts | 3 ++- .../shared/p2p-media-loader/segment-validator.ts | 9 ++++---- .../player/shared/peertube/peertube-plugin.ts | 7 +++--- .../src/assets/player/shared/stats/stats-card.ts | 3 ++- .../shared/webtorrent/peertube-chunk-store.ts | 15 +++++++------ .../player/shared/webtorrent/video-renderer.ts | 5 +++-- .../player/shared/webtorrent/webtorrent-plugin.ts | 25 +++++++++++----------- 11 files changed, 66 insertions(+), 55 deletions(-) (limited to 'client/src/assets/player/shared') diff --git a/client/src/assets/player/shared/manager-options/hls-options-builder.ts b/client/src/assets/player/shared/manager-options/hls-options-builder.ts index cdfad0f4c..ed12f6e8b 100644 --- a/client/src/assets/player/shared/manager-options/hls-options-builder.ts +++ b/client/src/assets/player/shared/manager-options/hls-options-builder.ts @@ -1,5 +1,6 @@ import { HybridLoaderSettings } from '@peertube/p2p-media-loader-core' import { HlsJsEngineSettings } from '@peertube/p2p-media-loader-hlsjs' +import { logger } from '@root-helpers/logger' import { LiveVideoLatencyMode } from '@shared/models' import { getAverageBandwidthInStore } from '../../peertube-player-local-storage' import { P2PMediaLoader, P2PMediaLoaderPluginOptions } from '../../types' @@ -61,7 +62,7 @@ export class HLSOptionsBuilder { private getP2PMediaLoaderOptions (redundancyUrlManager: RedundancyUrlManager): HlsJsEngineSettings { let consumeOnly = false if ((navigator as any)?.connection?.type === 'cellular') { - console.log('We are on a cellular connection: disabling seeding.') + logger.info('We are on a cellular connection: disabling seeding.') consumeOnly = true } diff --git a/client/src/assets/player/shared/mobile/peertube-mobile-plugin.ts b/client/src/assets/player/shared/mobile/peertube-mobile-plugin.ts index 91dda7f94..646e9f8c6 100644 --- a/client/src/assets/player/shared/mobile/peertube-mobile-plugin.ts +++ b/client/src/assets/player/shared/mobile/peertube-mobile-plugin.ts @@ -1,8 +1,9 @@ -import { PeerTubeMobileButtons } from './peertube-mobile-buttons' -import videojs from 'video.js' import debug from 'debug' +import videojs from 'video.js' +import { logger } from '@root-helpers/logger' +import { PeerTubeMobileButtons } from './peertube-mobile-buttons' -const logger = debug('peertube:player:mobile') +const debugLogger = debug('peertube:player:mobile') const Plugin = videojs.getPlugin('plugin') @@ -45,7 +46,7 @@ class PeerTubeMobilePlugin extends Plugin { if (!this.player.isFullscreen() || this.isPortraitVideo()) return screen.orientation.lock('landscape') - .catch(err => console.error('Cannot lock screen to landscape.', err)) + .catch(err => logger.error('Cannot lock screen to landscape.', err)) }) } @@ -61,7 +62,7 @@ class PeerTubeMobilePlugin extends Plugin { } if (this.lastTapEvent && event.timeStamp - this.lastTapEvent.timeStamp < PeerTubeMobilePlugin.DOUBLE_TAP_DELAY_MS) { - logger('Detected double tap') + debugLogger('Detected double tap') this.lastTapEvent = undefined this.onDoubleTap(event) @@ -71,7 +72,7 @@ class PeerTubeMobilePlugin extends Plugin { this.newActiveState = !this.player.userActive() this.tapTimeout = setTimeout(() => { - logger('No double tap detected, set user active state to %s.', this.newActiveState) + debugLogger('No double tap detected, set user active state to %s.', this.newActiveState) this.player.userActive(this.newActiveState) }, PeerTubeMobilePlugin.DOUBLE_TAP_DELAY_MS) @@ -100,19 +101,19 @@ class PeerTubeMobilePlugin extends Plugin { const rect = this.findPlayerTarget((event.target as HTMLElement)).getBoundingClientRect() const offsetX = event.targetTouches[0].pageX - rect.left - logger('Calculating double tap zone (player width: %d, offset X: %d)', playerWidth, offsetX) + debugLogger('Calculating double tap zone (player width: %d, offset X: %d)', playerWidth, offsetX) if (offsetX > 0.66 * playerWidth) { if (this.seekAmount < 0) this.seekAmount = 0 this.seekAmount += 10 - logger('Will forward %d seconds', this.seekAmount) + debugLogger('Will forward %d seconds', this.seekAmount) } else if (offsetX < 0.33 * playerWidth) { if (this.seekAmount > 0) this.seekAmount = 0 this.seekAmount -= 10 - logger('Will rewind %d seconds', this.seekAmount) + debugLogger('Will rewind %d seconds', this.seekAmount) } this.peerTubeMobileButtons.displayFastSeek(this.seekAmount) diff --git a/client/src/assets/player/shared/p2p-media-loader/hls-plugin.ts b/client/src/assets/player/shared/p2p-media-loader/hls-plugin.ts index d0105fa36..e49e5c694 100644 --- a/client/src/assets/player/shared/p2p-media-loader/hls-plugin.ts +++ b/client/src/assets/player/shared/p2p-media-loader/hls-plugin.ts @@ -3,6 +3,7 @@ import Hlsjs, { ErrorData, HlsConfig, Level, LevelSwitchingData, ManifestParsedData } from 'hls.js' import videojs from 'video.js' +import { logger } from '@root-helpers/logger' import { HlsjsConfigHandlerOptions, PeerTubeResolution, VideoJSTechHLS } from '../../types' type ErrorCounts = { @@ -17,14 +18,14 @@ type HookFn = (player: videojs.Player, hljs: Hlsjs) => void const registerSourceHandler = function (vjs: typeof videojs) { if (!Hlsjs.isSupported()) { - console.warn('Hls.js is not supported in this browser!') + logger.warn('Hls.js is not supported in this browser!') return } const html5 = vjs.getTech('Html5') if (!html5) { - console.error('No Hml5 tech found in videojs') + logger.error('No Hml5 tech found in videojs') return } @@ -120,7 +121,7 @@ class Html5Hlsjs { if (!mediaError) return - console.log(mediaError) + logger.info(mediaError) switch (mediaError.code) { case mediaError.MEDIA_ERR_ABORTED: errorTxt = 'You aborted the video playback' @@ -141,7 +142,7 @@ class Html5Hlsjs { errorTxt = mediaError.message } - console.error('MEDIA_ERROR: ', errorTxt) + logger.error(`MEDIA_ERROR: ${errorTxt}`) }) this.initialize() @@ -212,20 +213,20 @@ class Html5Hlsjs { private _handleMediaError (error: any) { if (this.errorCounts[Hlsjs.ErrorTypes.MEDIA_ERROR] === 1) { - console.info('trying to recover media error') + logger.info('trying to recover media error') this.hls.recoverMediaError() return } if (this.errorCounts[Hlsjs.ErrorTypes.MEDIA_ERROR] === 2) { - console.info('2nd try to recover media error (by swapping audio codec') + logger.info('2nd try to recover media error (by swapping audio codec') this.hls.swapAudioCodec() this.hls.recoverMediaError() return } if (this.errorCounts[Hlsjs.ErrorTypes.MEDIA_ERROR] > 2) { - console.info('bubbling media error up to VIDEOJS') + logger.info('bubbling media error up to VIDEOJS') this.hls.destroy() this.tech.error = () => error this.tech.trigger('error') @@ -234,7 +235,7 @@ class Html5Hlsjs { private _handleNetworkError (error: any) { if (this.errorCounts[Hlsjs.ErrorTypes.NETWORK_ERROR] <= this.maxNetworkErrorRecovery) { - console.info('trying to recover network error') + logger.info('trying to recover network error') // Wait 1 second and retry setTimeout(() => this.hls.startLoad(), 1000) @@ -247,7 +248,7 @@ class Html5Hlsjs { return } - console.info('bubbling network error up to VIDEOJS') + logger.info('bubbling network error up to VIDEOJS') this.hls.destroy() this.tech.error = () => error this.tech.trigger('error') @@ -262,8 +263,8 @@ class Html5Hlsjs { if (this.errorCounts[data.type]) this.errorCounts[data.type] += 1 else this.errorCounts[data.type] = 1 - if (data.fatal) console.warn(error.message) - else console.error(error.message, data) + if (data.fatal) logger.warn(error.message) + else logger.error(error.message, { data }) if (data.type === Hlsjs.ErrorTypes.NETWORK_ERROR) { error.code = 2 @@ -273,7 +274,7 @@ class Html5Hlsjs { this._handleMediaError(error) } else if (data.fatal) { this.hls.destroy() - console.info('bubbling error up to VIDEOJS') + logger.info('bubbling error up to VIDEOJS') this.tech.error = () => error as any this.tech.trigger('error') } diff --git a/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts b/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts index 5c0f0021f..e5f099dea 100644 --- a/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts +++ b/client/src/assets/player/shared/p2p-media-loader/p2p-media-loader-plugin.ts @@ -5,6 +5,7 @@ import { Engine, initHlsJsPlayer, initVideoJsContribHlsJsPlayer } from '@peertub import { timeToInt } from '@shared/core-utils' import { P2PMediaLoaderPluginOptions, PlayerNetworkInfo } from '../../types' import { registerConfigPlugin, registerSourceHandler } from './hls-plugin' +import { logger } from '@root-helpers/logger' registerConfigPlugin(videojs) registerSourceHandler(videojs) @@ -43,11 +44,11 @@ class P2pMediaLoaderPlugin extends Plugin { // FIXME: typings https://github.com/Microsoft/TypeScript/issues/14080 if (!(videojs as any).Html5Hlsjs) { - console.warn('HLS.js does not seem to be supported. Try to fallback to built in HLS.') + logger.warn('HLS.js does not seem to be supported. Try to fallback to built in HLS.') if (!player.canPlayType('application/vnd.apple.mpegurl')) { const message = 'Cannot fallback to built-in HLS' - console.warn(message) + logger.warn(message) player.ready(() => player.trigger('error', new Error(message))) return @@ -114,7 +115,7 @@ class P2pMediaLoaderPlugin extends Plugin { this.p2pEngine = this.options.loader.getEngine() this.p2pEngine.on(Events.SegmentError, (segment: Segment, err) => { - console.error('Segment error.', segment, err) + logger.error(`Segment ${segment.id} error.`, err) this.options.redundancyUrlManager.removeBySegmentUrl(segment.requestUrl) }) diff --git a/client/src/assets/player/shared/p2p-media-loader/redundancy-url-manager.ts b/client/src/assets/player/shared/p2p-media-loader/redundancy-url-manager.ts index abab8aa99..376efb835 100644 --- a/client/src/assets/player/shared/p2p-media-loader/redundancy-url-manager.ts +++ b/client/src/assets/player/shared/p2p-media-loader/redundancy-url-manager.ts @@ -1,4 +1,5 @@ import { basename, dirname } from 'path' +import { logger } from '@root-helpers/logger' class RedundancyUrlManager { @@ -7,7 +8,7 @@ class RedundancyUrlManager { } removeBySegmentUrl (segmentUrl: string) { - console.log('Removing redundancy of segment URL %s.', segmentUrl) + logger.info(`Removing redundancy of segment URL ${segmentUrl}.`) const baseUrl = dirname(segmentUrl) diff --git a/client/src/assets/player/shared/p2p-media-loader/segment-validator.ts b/client/src/assets/player/shared/p2p-media-loader/segment-validator.ts index f7f83a8a4..18cb6750f 100644 --- a/client/src/assets/player/shared/p2p-media-loader/segment-validator.ts +++ b/client/src/assets/player/shared/p2p-media-loader/segment-validator.ts @@ -1,6 +1,7 @@ -import { wait } from '@root-helpers/utils' -import { Segment } from '@peertube/p2p-media-loader-core' import { basename } from 'path' +import { Segment } from '@peertube/p2p-media-loader-core' +import { logger } from '@root-helpers/logger' +import { wait } from '@root-helpers/utils' type SegmentsJSON = { [filename: string]: string | { [byterange: string]: string } } @@ -23,7 +24,7 @@ function segmentValidatorFactory (segmentsSha256Url: string, isLive: boolean) { } if (!segmentValue) { - console.log('Refetching sha segments for %s.', filename) + logger.info(`Refetching sha segments for ${filename}`) await wait(1000) @@ -71,7 +72,7 @@ function fetchSha256Segments (url: string) { return fetch(url) .then(res => res.json() as Promise) .catch(err => { - console.error('Cannot get sha256 segments', err) + logger.error('Cannot get sha256 segments', err) return {} }) } diff --git a/client/src/assets/player/shared/peertube/peertube-plugin.ts b/client/src/assets/player/shared/peertube/peertube-plugin.ts index a29a0921f..69a7b2d65 100644 --- a/client/src/assets/player/shared/peertube/peertube-plugin.ts +++ b/client/src/assets/player/shared/peertube/peertube-plugin.ts @@ -1,5 +1,6 @@ import debug from 'debug' import videojs from 'video.js' +import { logger } from '@root-helpers/logger' import { isMobile } from '@root-helpers/web-browser' import { timeToInt } from '@shared/core-utils' import { VideoView, VideoViewEvent } from '@shared/models/videos' @@ -15,7 +16,7 @@ import { import { PeerTubePluginOptions, VideoJSCaption } from '../../types' import { SettingsButton } from '../settings/settings-menu-button' -const logger = debug('peertube:player:peertube') +const debugLogger = debug('peertube:player:peertube') const Plugin = videojs.getPlugin('plugin') @@ -176,7 +177,7 @@ class PeerTubePlugin extends Plugin { lastCurrentTime = currentTime this.notifyUserIsWatching(currentTime, lastViewEvent) - .catch(err => console.error('Cannot notify user is watching.', err)) + .catch(err => logger.error('Cannot notify user is watching.', err)) lastViewEvent = undefined @@ -249,7 +250,7 @@ class PeerTubePlugin extends Plugin { (this.player as any).cache_.inactivityTimeout = timeout this.player.options_.inactivityTimeout = timeout - logger('Set player inactivity to ' + timeout) + debugLogger('Set player inactivity to ' + timeout) } private initCaptions () { diff --git a/client/src/assets/player/shared/stats/stats-card.ts b/client/src/assets/player/shared/stats/stats-card.ts index e9f9b6bd2..b65adcfca 100644 --- a/client/src/assets/player/shared/stats/stats-card.ts +++ b/client/src/assets/player/shared/stats/stats-card.ts @@ -1,4 +1,5 @@ import videojs from 'video.js' +import { logger } from '@root-helpers/logger' import { secondsToTime } from '@shared/core-utils' import { PlayerNetworkInfo as EventPlayerNetworkInfo } from '../../types' import { bytes } from '../common' @@ -125,7 +126,7 @@ class StatsCard extends Component { this.populateInfoValues(options) } catch (err) { - console.error('Cannot update stats.', err) + logger.error('Cannot update stats.', err) clearInterval(this.updateInterval) } }, this.intervalMs) diff --git a/client/src/assets/player/shared/webtorrent/peertube-chunk-store.ts b/client/src/assets/player/shared/webtorrent/peertube-chunk-store.ts index 81378c277..74ae17704 100644 --- a/client/src/assets/player/shared/webtorrent/peertube-chunk-store.ts +++ b/client/src/assets/player/shared/webtorrent/peertube-chunk-store.ts @@ -2,8 +2,9 @@ // We use temporary IndexDB (all data are removed on destroy) to avoid RAM issues // Thanks @santiagogil and @Feross -import { EventEmitter } from 'events' import Dexie from 'dexie' +import { EventEmitter } from 'events' +import { logger } from '@root-helpers/logger' class ChunkDatabase extends Dexie { chunks: Dexie.Table<{ id: number, buf: Buffer }, number> @@ -104,7 +105,7 @@ export class PeertubeChunkStore extends EventEmitter { return this.db.chunks.bulkPut(processing.map(p => ({ id: p.id, buf: p.buf }))) }) } catch (err) { - console.log('Cannot bulk insert chunks. Store them in memory.', { err }) + logger.info('Cannot bulk insert chunks. Store them in memory.', err) processing.forEach(p => { this.memoryChunks[p.id] = p.buf @@ -143,7 +144,7 @@ export class PeertubeChunkStore extends EventEmitter { return cb(null, buf.slice(offset, len + offset)) }) .catch(err => { - console.error(err) + logger.error(err) return cb(err) }) } @@ -176,7 +177,7 @@ export class PeertubeChunkStore extends EventEmitter { return cb() } catch (err) { - console.error('Cannot destroy peertube chunk store.', err) + logger.error('Cannot destroy peertube chunk store.', err) return cb(err) } } @@ -204,7 +205,7 @@ export class PeertubeChunkStore extends EventEmitter { databasesToDeleteInfo = await this.expirationDB.databases.where('expiration').below(now).toArray() }) } catch (err) { - console.error('Cannot update expiration of fetch expired databases.', err) + logger.error('Cannot update expiration of fetch expired databases.', err) } for (const databaseToDeleteInfo of databasesToDeleteInfo) { @@ -214,7 +215,7 @@ export class PeertubeChunkStore extends EventEmitter { private async dropDatabase (databaseName: string) { const dbToDelete = new ChunkDatabase(databaseName) - console.log('Destroying IndexDB database %s.', databaseName) + logger.info(`Destroying IndexDB database ${databaseName}`) try { await dbToDelete.delete() @@ -223,7 +224,7 @@ export class PeertubeChunkStore extends EventEmitter { return this.expirationDB.databases.where({ name: databaseName }).delete() }) } catch (err) { - console.error('Cannot delete %s.', databaseName, err) + logger.error(`Cannot delete ${databaseName}.`, err) } } diff --git a/client/src/assets/player/shared/webtorrent/video-renderer.ts b/client/src/assets/player/shared/webtorrent/video-renderer.ts index 9b80fea2c..a85d7a838 100644 --- a/client/src/assets/player/shared/webtorrent/video-renderer.ts +++ b/client/src/assets/player/shared/webtorrent/video-renderer.ts @@ -1,6 +1,7 @@ // Thanks: https://github.com/feross/render-media const MediaElementWrapper = require('mediasource') +import { logger } from '@root-helpers/logger' import { extname } from 'path' const Videostream = require('videostream') @@ -77,8 +78,8 @@ function renderMedia (file: any, elem: HTMLVideoElement, opts: RenderMediaOption } function fallbackToMediaSource (useVP9 = false) { - if (useVP9 === true) console.log('Falling back to media source with VP9 enabled.') - else console.log('Falling back to media source..') + if (useVP9 === true) logger.info('Falling back to media source with VP9 enabled.') + else logger.info('Falling back to media source..') useMediaSource(useVP9) } diff --git a/client/src/assets/player/shared/webtorrent/webtorrent-plugin.ts b/client/src/assets/player/shared/webtorrent/webtorrent-plugin.ts index 83b483d87..ab9ab56ac 100644 --- a/client/src/assets/player/shared/webtorrent/webtorrent-plugin.ts +++ b/client/src/assets/player/shared/webtorrent/webtorrent-plugin.ts @@ -1,5 +1,6 @@ import videojs from 'video.js' import * as WebTorrent from 'webtorrent' +import { logger } from '@root-helpers/logger' import { isIOS } from '@root-helpers/web-browser' import { timeToInt } from '@shared/core-utils' import { VideoFile } from '@shared/models' @@ -210,7 +211,7 @@ class WebTorrentPlugin extends Plugin { if (destroyRenderer === true && this.renderer && this.renderer.destroy) this.renderer.destroy() this.webtorrent.remove(videoFile.magnetUri) - console.log('Removed ' + videoFile.magnetUri) + logger.info(`Removed ${videoFile.magnetUri}`) } } @@ -256,7 +257,7 @@ class WebTorrentPlugin extends Plugin { ) { if (!magnetOrTorrentUrl) return this.fallbackToHttp(options, done) - console.log('Adding ' + magnetOrTorrentUrl + '.') + logger.info(`Adding ${magnetOrTorrentUrl}.`) const oldTorrent = this.torrent const torrentOptions = { @@ -269,7 +270,7 @@ class WebTorrentPlugin extends Plugin { } this.torrent = this.webtorrent.add(magnetOrTorrentUrl, torrentOptions, torrent => { - console.log('Added ' + magnetOrTorrentUrl + '.') + logger.info(`Added ${magnetOrTorrentUrl}.`) if (oldTorrent) { // Pause the old torrent @@ -309,7 +310,7 @@ class WebTorrentPlugin extends Plugin { }, options.delay || 0) }) - this.torrent.on('error', (err: any) => console.error(err)) + this.torrent.on('error', (err: any) => logger.error(err)) this.torrent.on('warning', (err: any) => { // We don't support HTTP tracker but we don't care -> we use the web socket tracker @@ -317,13 +318,13 @@ class WebTorrentPlugin extends Plugin { // Users don't care about issues with WebRTC, but developers do so log it in the console if (err.message.indexOf('Ice connection failed') !== -1) { - console.log(err) + logger.info(err) return } // Magnet hash is not up to date with the torrent file, add directly the torrent file if (err.message.indexOf('incorrect info hash') !== -1) { - console.error('Incorrect info hash detected, falling back to torrent file.') + logger.error('Incorrect info hash detected, falling back to torrent file.') const newOptions = { forcePlay: true, seek: options.seek } return this.addTorrent(this.torrent['xs'], previousVideoFile, newOptions, done) } @@ -333,7 +334,7 @@ class WebTorrentPlugin extends Plugin { this.handleError(err) } - console.warn(err) + logger.warn(err) }) } @@ -348,7 +349,7 @@ class WebTorrentPlugin extends Plugin { return } - console.error(err) + logger.error(err) this.player.pause() this.player.posterImage.show() this.player.removeClass('vjs-has-autoplay') @@ -465,10 +466,10 @@ class WebTorrentPlugin extends Plugin { // Lower resolution if (this.isPlayerWaiting() && file.resolution.id < this.currentVideoFile.resolution.id) { - console.log('Downgrading automatically the resolution to: %s', file.resolution.label) + logger.info(`Downgrading automatically the resolution to: ${file.resolution.label}`) changeResolution = true } else if (file.resolution.id > this.currentVideoFile.resolution.id) { // Higher resolution - console.log('Upgrading automatically the resolution to: %s', file.resolution.label) + logger.info(`Upgrading automatically the resolution to: ${file.resolution.label}`) changeResolution = true changeResolutionDelay = this.CONSTANTS.AUTO_QUALITY_HIGHER_RESOLUTION_DELAY } @@ -577,7 +578,7 @@ class WebTorrentPlugin extends Plugin { // The renderer returns an error when we destroy it, so skip them if (this.destroyingFakeRenderer === false && err) { - console.error('Cannot render new torrent in fake video element.', err) + logger.error('Cannot render new torrent in fake video element.', err) } // Load the future file at the correct time (in delay MS - 2 seconds) @@ -593,7 +594,7 @@ class WebTorrentPlugin extends Plugin { try { this.fakeRenderer.destroy() } catch (err) { - console.log('Cannot destroy correctly fake renderer.', err) + logger.info('Cannot destroy correctly fake renderer.', err) } } this.fakeRenderer = undefined -- cgit v1.2.3