Update AbsLogger to have a tag with logs

This commit is contained in:
advplyr 2025-04-20 12:36:27 -05:00
parent 88e1877742
commit fe921fd5b1
11 changed files with 69 additions and 63 deletions

View file

@ -317,7 +317,7 @@ class DbManager {
} }
} }
if (logsRemoved > 0) { if (logsRemoved > 0) {
AbsLogger.info("[DbManager] cleanLogs: Removed $logsRemoved logs older than $numberOfHoursToKeep hours") AbsLogger.info("DbManager", "cleanLogs: Removed $logsRemoved logs older than $numberOfHoursToKeep hours")
} }
} }
} }

View file

@ -262,7 +262,7 @@ class MediaProgressSyncer(
tag, tag,
"Sync local device current serverConnectionConfigId=${DeviceManager.serverConnectionConfig?.id}" "Sync local device current serverConnectionConfigId=${DeviceManager.serverConnectionConfig?.id}"
) )
AbsLogger.info("[MediaProgressSyncer] sync: Saved local progress (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id})") AbsLogger.info("MediaProgressSyncer", "sync: Saved local progress (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id})")
// Local library item is linked to a server library item // Local library item is linked to a server library item
// Send sync to server also if connected to this server and local item belongs to this // Send sync to server also if connected to this server and local item belongs to this
@ -278,29 +278,29 @@ class MediaProgressSyncer(
failedSyncs = 0 failedSyncs = 0
playerNotificationService.alertSyncSuccess() playerNotificationService.alertSyncSuccess()
DeviceManager.dbManager.removePlaybackSession(it.id) // Remove session from db DeviceManager.dbManager.removePlaybackSession(it.id) // Remove session from db
AbsLogger.info("[MediaProgressSyncer] sync: Successfully synced local progress (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id})") AbsLogger.info("MediaProgressSyncer", "sync: Successfully synced local progress (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id})")
} else { } else {
failedSyncs++ failedSyncs++
if (failedSyncs == 2) { if (failedSyncs == 2) {
playerNotificationService.alertSyncFailing() // Show alert in client playerNotificationService.alertSyncFailing() // Show alert in client
failedSyncs = 0 failedSyncs = 0
} }
AbsLogger.error("[MediaProgressSyncer] sync: Local progress sync failed (count: $failedSyncs) (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id}) (${DeviceManager.serverConnectionConfigName})") AbsLogger.error("MediaProgressSyncer", "sync: Local progress sync failed (count: $failedSyncs) (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id}) (${DeviceManager.serverConnectionConfigName})")
} }
cb(SyncResult(true, syncSuccess, errorMsg)) cb(SyncResult(true, syncSuccess, errorMsg))
} }
} else { } else {
AbsLogger.info("[MediaProgressSyncer] sync: Not sending local progress to server (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id}) (hasNetworkConnection: $hasNetworkConnection) (isConnectedToSameServer: $isConnectedToSameServer)") AbsLogger.info("MediaProgressSyncer", "sync: Not sending local progress to server (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${it.id}) (hasNetworkConnection: $hasNetworkConnection) (isConnectedToSameServer: $isConnectedToSameServer)")
cb(SyncResult(false, null, null)) cb(SyncResult(false, null, null))
} }
} }
} else if (hasNetworkConnection && shouldSyncServer) { } else if (hasNetworkConnection && shouldSyncServer) {
AbsLogger.info("[MediaProgressSyncer] sync: Sending progress sync to server (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${currentSessionId}) (${DeviceManager.serverConnectionConfigName})") AbsLogger.info("MediaProgressSyncer", "sync: Sending progress sync to server (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${currentSessionId}) (${DeviceManager.serverConnectionConfigName})")
apiHandler.sendProgressSync(currentSessionId, syncData) { syncSuccess, errorMsg -> apiHandler.sendProgressSync(currentSessionId, syncData) { syncSuccess, errorMsg ->
if (syncSuccess) { if (syncSuccess) {
AbsLogger.info("[MediaProgressSyncer] sync: Successfully synced progress (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${currentSessionId}) (${DeviceManager.serverConnectionConfigName})") AbsLogger.info("MediaProgressSyncer", "sync: Successfully synced progress (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: ${currentSessionId}) (${DeviceManager.serverConnectionConfigName})")
failedSyncs = 0 failedSyncs = 0
playerNotificationService.alertSyncSuccess() playerNotificationService.alertSyncSuccess()
@ -312,12 +312,12 @@ class MediaProgressSyncer(
playerNotificationService.alertSyncFailing() // Show alert in client playerNotificationService.alertSyncFailing() // Show alert in client
failedSyncs = 0 failedSyncs = 0
} }
AbsLogger.error("[MediaProgressSyncer] sync: Progress sync failed (count: $failedSyncs) (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: $currentSessionId) (${DeviceManager.serverConnectionConfigName})") AbsLogger.error("MediaProgressSyncer", "sync: Progress sync failed (count: $failedSyncs) (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: $currentSessionId) (${DeviceManager.serverConnectionConfigName})")
} }
cb(SyncResult(true, syncSuccess, errorMsg)) cb(SyncResult(true, syncSuccess, errorMsg))
} }
} else { } else {
AbsLogger.info("[MediaProgressSyncer] sync: Not sending progress to server (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: $currentSessionId) (${DeviceManager.serverConnectionConfigName}) (hasNetworkConnection: $hasNetworkConnection)") AbsLogger.info("MediaProgressSyncer", "sync: Not sending progress to server (title: \"$currentDisplayTitle\") (currentTime: $currentTime) (session id: $currentSessionId) (${DeviceManager.serverConnectionConfigName}) (hasNetworkConnection: $hasNetworkConnection)")
cb(SyncResult(false, null, null)) cb(SyncResult(false, null, null))
} }
} }

View file

@ -453,7 +453,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
playbackSession playbackSession
) // Save playback session to use when app is closed ) // Save playback session to use when app is closed
AbsLogger.info("[PlayerNotificationService] preparePlayer: Started playback session for item ${currentPlaybackSession?.mediaItemId}. MediaPlayer ${currentPlaybackSession?.mediaPlayer}") AbsLogger.info("PlayerNotificationService", "preparePlayer: Started playback session for item ${currentPlaybackSession?.mediaItemId}. MediaPlayer ${currentPlaybackSession?.mediaPlayer}")
// Notify client // Notify client
clientEventEmitter?.onPlaybackSession(playbackSession) clientEventEmitter?.onPlaybackSession(playbackSession)
@ -470,7 +470,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
val mediaSource: MediaSource val mediaSource: MediaSource
if (playbackSession.isLocal) { if (playbackSession.isLocal) {
AbsLogger.info("[PlayerNotificationService] preparePlayer: Playing local item ${currentPlaybackSession?.mediaItemId}.") AbsLogger.info("PlayerNotificationService", "preparePlayer: Playing local item ${currentPlaybackSession?.mediaItemId}.")
val dataSourceFactory = DefaultDataSource.Factory(ctx) val dataSourceFactory = DefaultDataSource.Factory(ctx)
val extractorsFactory = DefaultExtractorsFactory() val extractorsFactory = DefaultExtractorsFactory()
@ -484,7 +484,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory) ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)
.createMediaSource(mediaItems[0]) .createMediaSource(mediaItems[0])
} else if (!playbackSession.isHLS) { } else if (!playbackSession.isHLS) {
AbsLogger.info("[PlayerNotificationService] preparePlayer: Direct playing item ${currentPlaybackSession?.mediaItemId}.") AbsLogger.info("PlayerNotificationService", "preparePlayer: Direct playing item ${currentPlaybackSession?.mediaItemId}.")
val dataSourceFactory = DefaultHttpDataSource.Factory() val dataSourceFactory = DefaultHttpDataSource.Factory()
val extractorsFactory = DefaultExtractorsFactory() val extractorsFactory = DefaultExtractorsFactory()
@ -499,7 +499,7 @@ class PlayerNotificationService : MediaBrowserServiceCompat() {
ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory) ProgressiveMediaSource.Factory(dataSourceFactory, extractorsFactory)
.createMediaSource(mediaItems[0]) .createMediaSource(mediaItems[0])
} else { } else {
AbsLogger.info("[PlayerNotificationService] preparePlayer: Playing HLS stream of item ${currentPlaybackSession?.mediaItemId}.") AbsLogger.info("PlayerNotificationService", "preparePlayer: Playing HLS stream of item ${currentPlaybackSession?.mediaItemId}.")
val dataSourceFactory = DefaultHttpDataSource.Factory() val dataSourceFactory = DefaultHttpDataSource.Factory()
dataSourceFactory.setUserAgent(channelId) dataSourceFactory.setUserAgent(channelId)
dataSourceFactory.setDefaultRequestProperties( dataSourceFactory.setDefaultRequestProperties(

View file

@ -181,7 +181,7 @@ class AbsAudioPlayer : Plugin() {
val playbackRate = call.getFloat("playbackRate",1f) ?: 1f val playbackRate = call.getFloat("playbackRate",1f) ?: 1f
val startTimeOverride = call.getDouble("startTime") val startTimeOverride = call.getDouble("startTime")
AbsLogger.info("[AbsAudioPlayer] prepareLibraryItem: lid=$libraryItemId, startTimeOverride=$startTimeOverride, playbackRate=$playbackRate") AbsLogger.info("AbsAudioPlayer", "prepareLibraryItem: lid=$libraryItemId, startTimeOverride=$startTimeOverride, playbackRate=$playbackRate")
if (libraryItemId.isEmpty()) { if (libraryItemId.isEmpty()) {
Log.e(tag, "Invalid call to play library item no library item id") Log.e(tag, "Invalid call to play library item no library item id")

View file

@ -221,7 +221,7 @@ class AbsDatabase : Plugin() {
@PluginMethod @PluginMethod
fun syncLocalSessionsWithServer(call:PluginCall) { fun syncLocalSessionsWithServer(call:PluginCall) {
if (DeviceManager.serverConnectionConfig == null) { if (DeviceManager.serverConnectionConfig == null) {
AbsLogger.error("[AbsDatabase] syncLocalSessionsWithServer: not connected to server") AbsLogger.error("AbsDatabase", "syncLocalSessionsWithServer: not connected to server")
return call.resolve() return call.resolve()
} }
@ -233,7 +233,7 @@ class AbsDatabase : Plugin() {
if (!success) { if (!success) {
call.resolve(JSObject("{\"error\":\"$errorMsg\"}")) call.resolve(JSObject("{\"error\":\"$errorMsg\"}"))
} else { } else {
AbsLogger.info("[AbsDatabase] syncLocalSessionsWithServer: Finished sending local playback sessions to server. Removing ${savedSessions.size} saved sessions.") AbsLogger.info("AbsDatabase", "syncLocalSessionsWithServer: Finished sending local playback sessions to server. Removing ${savedSessions.size} saved sessions.")
// Remove all local sessions // Remove all local sessions
savedSessions.forEach { savedSessions.forEach {
DeviceManager.dbManager.removePlaybackSession(it.id) DeviceManager.dbManager.removePlaybackSession(it.id)
@ -242,7 +242,7 @@ class AbsDatabase : Plugin() {
} }
} }
} else { } else {
AbsLogger.info("[AbsDatabase] syncLocalSessionsWithServer: No saved local playback sessions to send to server.") AbsLogger.info("AbsDatabase", "syncLocalSessionsWithServer: No saved local playback sessions to send to server.")
call.resolve() call.resolve()
} }
} }

View file

@ -13,6 +13,7 @@ import java.util.UUID
data class AbsLog( data class AbsLog(
var id:String, var id:String,
var tag:String,
var level:String, var level:String,
var message:String, var message:String,
var timestamp:Long var timestamp:Long
@ -29,27 +30,29 @@ class AbsLogger : Plugin() {
} }
companion object { companion object {
fun info(message:String) { fun info(tag:String, message:String) {
Log.i("AbsLogger", message) Log.i("AbsLogger", message)
DeviceManager.dbManager.saveLog(AbsLog(id = UUID.randomUUID().toString(), level = "info", message, timestamp = System.currentTimeMillis())) DeviceManager.dbManager.saveLog(AbsLog(id = UUID.randomUUID().toString(), tag, level = "info", message, timestamp = System.currentTimeMillis()))
} }
fun error(message:String) { fun error(tag:String, message:String) {
Log.e("AbsLogger", message) Log.e("AbsLogger", message)
DeviceManager.dbManager.saveLog(AbsLog(id = UUID.randomUUID().toString(), level = "error", message, timestamp = System.currentTimeMillis())) DeviceManager.dbManager.saveLog(AbsLog(id = UUID.randomUUID().toString(), tag, level = "error", message, timestamp = System.currentTimeMillis()))
} }
} }
@PluginMethod @PluginMethod
fun info(call: PluginCall) { fun info(call: PluginCall) {
val msg = call.getString("message") ?: return call.reject("No message") val msg = call.getString("message") ?: return call.reject("No message")
info(msg) val tag = call.getString("tag") ?: ""
info(tag, msg)
call.resolve() call.resolve()
} }
@PluginMethod @PluginMethod
fun error(call: PluginCall) { fun error(call: PluginCall) {
val msg = call.getString("message") ?: return call.reject("No message") val msg = call.getString("message") ?: return call.reject("No message")
error(msg) val tag = call.getString("tag") ?: ""
error(tag, msg)
call.resolve() call.resolve()
} }

View file

@ -469,11 +469,11 @@ class ApiHandler(var ctx:Context) {
val deviceInfo = DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.VERSION.SDK_INT, BuildConfig.VERSION_NAME) val deviceInfo = DeviceInfo(deviceId, Build.MANUFACTURER, Build.MODEL, Build.VERSION.SDK_INT, BuildConfig.VERSION_NAME)
val payload = JSObject(jacksonMapper.writeValueAsString(LocalSessionsSyncRequestPayload(playbackSessions, deviceInfo))) val payload = JSObject(jacksonMapper.writeValueAsString(LocalSessionsSyncRequestPayload(playbackSessions, deviceInfo)))
AbsLogger.info("[ApiHandler] sendSyncLocalSessions: Sending ${playbackSessions.size} saved local playback sessions to server (${DeviceManager.serverConnectionConfigName})") AbsLogger.info("ApiHandler", "sendSyncLocalSessions: Sending ${playbackSessions.size} saved local playback sessions to server (${DeviceManager.serverConnectionConfigName})")
postRequest("/api/session/local-all", payload, null) { postRequest("/api/session/local-all", payload, null) {
if (!it.getString("error").isNullOrEmpty()) { if (!it.getString("error").isNullOrEmpty()) {
AbsLogger.error("[ApiHandler] sendSyncLocalSessions: Failed to sync local sessions. (${it.getString("error")})") AbsLogger.error("ApiHandler", "sendSyncLocalSessions: Failed to sync local sessions. (${it.getString("error")})")
cb(false, it.getString("error")) cb(false, it.getString("error"))
} else { } else {
val response = jacksonMapper.readValue<LocalSessionsSyncResponsePayload>(it.toString()) val response = jacksonMapper.readValue<LocalSessionsSyncResponsePayload>(it.toString())
@ -485,11 +485,11 @@ class ApiHandler(var ctx:Context) {
val syncResult = SyncResult(true, true, "Progress synced on server") val syncResult = SyncResult(true, true, "Progress synced on server")
MediaEventManager.saveEvent(session, syncResult) MediaEventManager.saveEvent(session, syncResult)
AbsLogger.info("[ApiHandler] sendSyncLocalSessions: Synced session \"${session.displayTitle}\" with server, server progress was updated for item ${session.mediaItemId}") AbsLogger.info("ApiHandler", "sendSyncLocalSessions: Synced session \"${session.displayTitle}\" with server, server progress was updated for item ${session.mediaItemId}")
} else if (!localSessionSyncResult.success) { } else if (!localSessionSyncResult.success) {
AbsLogger.error("[ApiHandler] sendSyncLocalSessions: Failed to sync session \"${session.displayTitle}\" with server. Error: ${localSessionSyncResult.error}") AbsLogger.error("ApiHandler", "sendSyncLocalSessions: Failed to sync session \"${session.displayTitle}\" with server. Error: ${localSessionSyncResult.error}")
} else { } else {
AbsLogger.info("[ApiHandler] sendSyncLocalSessions: Synced session \"${session.displayTitle}\" with server. Server progress was up-to-date for item ${session.mediaItemId}") AbsLogger.info("ApiHandler", "sendSyncLocalSessions: Synced session \"${session.displayTitle}\" with server. Server progress was up-to-date for item ${session.mediaItemId}")
} }
} }
} }
@ -499,20 +499,20 @@ class ApiHandler(var ctx:Context) {
} }
fun syncLocalMediaProgressForUser(cb: () -> Unit) { fun syncLocalMediaProgressForUser(cb: () -> Unit) {
AbsLogger.info("[ApiHandler] syncLocalMediaProgressForUser: Server connection ${DeviceManager.serverConnectionConfigName}") AbsLogger.info("ApiHandler", "[ApiHandler] syncLocalMediaProgressForUser: Server connection ${DeviceManager.serverConnectionConfigName}")
// Get all local media progress for this server // Get all local media progress for this server
val allLocalMediaProgress = DeviceManager.dbManager.getAllLocalMediaProgress().filter { it.serverConnectionConfigId == DeviceManager.serverConnectionConfigId } val allLocalMediaProgress = DeviceManager.dbManager.getAllLocalMediaProgress().filter { it.serverConnectionConfigId == DeviceManager.serverConnectionConfigId }
if (allLocalMediaProgress.isEmpty()) { if (allLocalMediaProgress.isEmpty()) {
AbsLogger.info("[ApiHandler] syncLocalMediaProgressForUser: No local media progress to sync") AbsLogger.info("ApiHandler", "[ApiHandler] syncLocalMediaProgressForUser: No local media progress to sync")
return cb() return cb()
} }
AbsLogger.info("[ApiHandler] syncLocalMediaProgressForUser: Found ${allLocalMediaProgress.size} local media progress") AbsLogger.info("ApiHandler", "syncLocalMediaProgressForUser: Found ${allLocalMediaProgress.size} local media progress")
getCurrentUser { user -> getCurrentUser { user ->
if (user == null) { if (user == null) {
AbsLogger.error("[ApiHandler] syncLocalMediaProgressForUser: Failed to load user from server (${DeviceManager.serverConnectionConfigName})") AbsLogger.error("ApiHandler", "syncLocalMediaProgressForUser: Failed to load user from server (${DeviceManager.serverConnectionConfigName})")
} else { } else {
var numLocalMediaProgressUptToDate = 0 var numLocalMediaProgressUptToDate = 0
var numLocalMediaProgressUpdated = 0 var numLocalMediaProgressUpdated = 0
@ -522,21 +522,21 @@ class ApiHandler(var ctx:Context) {
// Get matching local media progress // Get matching local media progress
allLocalMediaProgress.find { it.isMatch(mediaProgress) }?.let { localMediaProgress -> allLocalMediaProgress.find { it.isMatch(mediaProgress) }?.let { localMediaProgress ->
if (mediaProgress.lastUpdate > localMediaProgress.lastUpdate) { if (mediaProgress.lastUpdate > localMediaProgress.lastUpdate) {
AbsLogger.info("[ApiHandler] syncLocalMediaProgressForUser: Server progress for item \"${mediaProgress.mediaItemId}\" is more recent than local. Local progress last updated ${localMediaProgress.lastUpdate}, server progress last updated ${mediaProgress.lastUpdate}. Updating local current time ${localMediaProgress.currentTime} to ${mediaProgress.currentTime}") AbsLogger.info("ApiHandler", "[ApiHandler] syncLocalMediaProgressForUser: Server progress for item \"${mediaProgress.mediaItemId}\" is more recent than local. Local progress last updated ${localMediaProgress.lastUpdate}, server progress last updated ${mediaProgress.lastUpdate}. Updating local current time ${localMediaProgress.currentTime} to ${mediaProgress.currentTime}")
localMediaProgress.updateFromServerMediaProgress(mediaProgress) localMediaProgress.updateFromServerMediaProgress(mediaProgress)
MediaEventManager.syncEvent(mediaProgress, "Sync on server connection") MediaEventManager.syncEvent(mediaProgress, "Sync on server connection")
DeviceManager.dbManager.saveLocalMediaProgress(localMediaProgress) DeviceManager.dbManager.saveLocalMediaProgress(localMediaProgress)
numLocalMediaProgressUpdated++ numLocalMediaProgressUpdated++
} else if (localMediaProgress.lastUpdate > mediaProgress.lastUpdate && localMediaProgress.ebookLocation != null && localMediaProgress.ebookLocation != mediaProgress.ebookLocation) { } else if (localMediaProgress.lastUpdate > mediaProgress.lastUpdate && localMediaProgress.ebookLocation != null && localMediaProgress.ebookLocation != mediaProgress.ebookLocation) {
// Patch ebook progress to server // Patch ebook progress to server
AbsLogger.info("[ApiHandler] syncLocalMediaProgressForUser: Local progress for ebook item \"${mediaProgress.mediaItemId}\" is more recent than server progress. Local progress last updated ${localMediaProgress.lastUpdate}, server progress last updated ${mediaProgress.lastUpdate}. Sending server request to update ebook progress from ${mediaProgress.ebookProgress} to ${localMediaProgress.ebookProgress}") AbsLogger.info("ApiHandler", "syncLocalMediaProgressForUser: Local progress for ebook item \"${mediaProgress.mediaItemId}\" is more recent than server progress. Local progress last updated ${localMediaProgress.lastUpdate}, server progress last updated ${mediaProgress.lastUpdate}. Sending server request to update ebook progress from ${mediaProgress.ebookProgress} to ${localMediaProgress.ebookProgress}")
val endpoint = "/api/me/progress/${localMediaProgress.libraryItemId}" val endpoint = "/api/me/progress/${localMediaProgress.libraryItemId}"
val updatePayload = JSObject() val updatePayload = JSObject()
updatePayload.put("ebookLocation", localMediaProgress.ebookLocation) updatePayload.put("ebookLocation", localMediaProgress.ebookLocation)
updatePayload.put("ebookProgress", localMediaProgress.ebookProgress) updatePayload.put("ebookProgress", localMediaProgress.ebookProgress)
updatePayload.put("lastUpdate", localMediaProgress.lastUpdate) updatePayload.put("lastUpdate", localMediaProgress.lastUpdate)
patchRequest(endpoint,updatePayload) { patchRequest(endpoint,updatePayload) {
AbsLogger.info("[ApiHandler] syncLocalMediaProgressForUser: Successfully updated server ebook progress for item item \"${mediaProgress.mediaItemId}\"") AbsLogger.info("ApiHandler", "syncLocalMediaProgressForUser: Successfully updated server ebook progress for item item \"${mediaProgress.mediaItemId}\"")
} }
} else { } else {
numLocalMediaProgressUptToDate++ numLocalMediaProgressUptToDate++
@ -544,7 +544,7 @@ class ApiHandler(var ctx:Context) {
} }
} }
AbsLogger.info("[ApiHandler] syncLocalMediaProgressForUser: Finishing syncing local media progress with server. $numLocalMediaProgressUptToDate up-to-date, $numLocalMediaProgressUpdated updated") AbsLogger.info("ApiHandler", "syncLocalMediaProgressForUser: Finishing syncing local media progress with server. $numLocalMediaProgressUptToDate up-to-date, $numLocalMediaProgressUpdated updated")
} }
cb() cb()
} }

View file

@ -190,7 +190,7 @@ export default {
}) })
}, },
async playLibraryItem(payload) { async playLibraryItem(payload) {
await AbsLogger.info({ message: `[AudioPlayerContainer] playLibraryItem: Received play request for library item ${payload.libraryItemId} ${payload.episodeId ? `episode ${payload.episodeId}` : ''}` }) await AbsLogger.info({ tag: 'AudioPlayerContainer', message: `playLibraryItem: Received play request for library item ${payload.libraryItemId} ${payload.episodeId ? `episode ${payload.episodeId}` : ''}` })
const libraryItemId = payload.libraryItemId const libraryItemId = payload.libraryItemId
const episodeId = payload.episodeId const episodeId = payload.episodeId
const startTime = payload.startTime const startTime = payload.startTime

View file

@ -118,7 +118,7 @@ export default {
console.warn('[default] attemptConnection') console.warn('[default] attemptConnection')
if (!this.networkConnected) { if (!this.networkConnected) {
console.warn('[default] No network connection') console.warn('[default] No network connection')
AbsLogger.info({ message: '[default] attemptConnection: No network connection' }) AbsLogger.info({ tag: 'default', message: 'attemptConnection: No network connection' })
return return
} }
if (this.attemptingConnection) { if (this.attemptingConnection) {
@ -139,14 +139,14 @@ export default {
if (!serverConfig) { if (!serverConfig) {
// No last server config set // No last server config set
this.attemptingConnection = false this.attemptingConnection = false
AbsLogger.info({ message: `[default] attemptConnection: No last server config set` }) AbsLogger.info({ tag: 'default', message: 'attemptConnection: No last server config set' })
return return
} }
AbsLogger.info({ message: `[default] attemptConnection: Got server config, attempt authorize (${serverConfig.name})` }) AbsLogger.info({ tag: 'default', message: `attemptConnection: Got server config, attempt authorize (${serverConfig.name})` })
const authRes = await this.postRequest(`${serverConfig.address}/api/authorize`, null, { Authorization: `Bearer ${serverConfig.token}` }, 6000).catch((error) => { const authRes = await this.postRequest(`${serverConfig.address}/api/authorize`, null, { Authorization: `Bearer ${serverConfig.token}` }, 6000).catch((error) => {
AbsLogger.error({ message: `[default] attemptConnection: Server auth failed (${serverConfig.name})` }) AbsLogger.error({ tag: 'default', message: `attemptConnection: Server auth failed (${serverConfig.name})` })
return false return false
}) })
if (!authRes) { if (!authRes) {
@ -172,7 +172,7 @@ export default {
this.$socket.connect(serverConnectionConfig.address, serverConnectionConfig.token) this.$socket.connect(serverConnectionConfig.address, serverConnectionConfig.token)
AbsLogger.info({ message: `[default] attemptConnection: Successful connection to last saved server config (${serverConnectionConfig.name})` }) AbsLogger.info({ tag: 'default', message: `attemptConnection: Successful connection to last saved server config (${serverConnectionConfig.name})` })
await this.initLibraries() await this.initLibraries()
this.attemptingConnection = false this.attemptingConnection = false
}, },
@ -193,7 +193,7 @@ export default {
this.inittingLibraries = true this.inittingLibraries = true
await this.$store.dispatch('libraries/load') await this.$store.dispatch('libraries/load')
AbsLogger.info({ message: `[default] initLibraries loading library ${this.currentLibraryName}` }) AbsLogger.info({ tag: 'default', message: `initLibraries loading library ${this.currentLibraryName}` })
await this.$store.dispatch('libraries/fetch', this.currentLibraryId) await this.$store.dispatch('libraries/fetch', this.currentLibraryId)
this.$eventBus.$emit('library-changed') this.$eventBus.$emit('library-changed')
this.inittingLibraries = false this.inittingLibraries = false
@ -204,7 +204,7 @@ export default {
return return
} }
AbsLogger.info({ message: '[default] Calling syncLocalSessions' }) AbsLogger.info({ tag: 'default', message: 'Calling syncLocalSessions' })
const response = await this.$db.syncLocalSessionsWithServer(isFirstSync) const response = await this.$db.syncLocalSessionsWithServer(isFirstSync)
if (response?.error) { if (response?.error) {
console.error('[default] Failed to sync local sessions', response.error) console.error('[default] Failed to sync local sessions', response.error)
@ -221,12 +221,12 @@ export default {
}, },
async userMediaProgressUpdated(payload) { async userMediaProgressUpdated(payload) {
const prog = payload.data // MediaProgress const prog = payload.data // MediaProgress
await AbsLogger.info({ message: `[default] userMediaProgressUpdate: Received updated media progress for current user from socket event. Media item id ${payload.id}` }) await AbsLogger.info({ tag: 'default', message: `userMediaProgressUpdate: Received updated media progress for current user from socket event. Media item id ${payload.id}` })
// Check if this media item is currently open in the player, paused, and this progress update is coming from a different session // Check if this media item is currently open in the player, paused, and this progress update is coming from a different session
const isMediaOpenInPlayer = this.$store.getters['getIsMediaStreaming'](prog.libraryItemId, prog.episodeId) const isMediaOpenInPlayer = this.$store.getters['getIsMediaStreaming'](prog.libraryItemId, prog.episodeId)
if (isMediaOpenInPlayer && this.$store.getters['getCurrentPlaybackSessionId'] !== payload.sessionId && !this.$store.state.playerIsPlaying) { if (isMediaOpenInPlayer && this.$store.getters['getCurrentPlaybackSessionId'] !== payload.sessionId && !this.$store.state.playerIsPlaying) {
await AbsLogger.info({ message: `[default] userMediaProgressUpdate: Item is currently open in player, paused and this progress update is coming from a different session. Updating playback time to ${payload.data.currentTime}` }) await AbsLogger.info({ tag: 'default', message: `userMediaProgressUpdate: Item is currently open in player, paused and this progress update is coming from a different session. Updating playback time to ${payload.data.currentTime}` })
this.$eventBus.$emit('playback-time-update', payload.data.currentTime) this.$eventBus.$emit('playback-time-update', payload.data.currentTime)
} }
@ -237,12 +237,12 @@ export default {
// Progress update is more recent then local progress // Progress update is more recent then local progress
if (localProg && localProg.lastUpdate < prog.lastUpdate) { if (localProg && localProg.lastUpdate < prog.lastUpdate) {
if (localProg.currentTime == prog.currentTime && localProg.isFinished == prog.isFinished) { if (localProg.currentTime == prog.currentTime && localProg.isFinished == prog.isFinished) {
await AbsLogger.info({ message: `[default] userMediaProgressUpdate: server lastUpdate is more recent but progress is up-to-date (libraryItemId: ${prog.libraryItemId}${prog.episodeId ? ` episodeId: ${prog.episodeId}` : ''})` }) await AbsLogger.info({ tag: 'default', message: `userMediaProgressUpdate: server lastUpdate is more recent but progress is up-to-date (libraryItemId: ${prog.libraryItemId}${prog.episodeId ? ` episodeId: ${prog.episodeId}` : ''})` })
return return
} }
// Server progress is more up-to-date // Server progress is more up-to-date
await AbsLogger.info({ message: `[default] userMediaProgressUpdate: syncing progress from server with local item for "${prog.libraryItemId}" ${prog.episodeId ? `episode ${prog.episodeId}` : ''} | server lastUpdate=${prog.lastUpdate} > local lastUpdate=${localProg.lastUpdate}` }) await AbsLogger.info({ tag: 'default', message: `userMediaProgressUpdate: syncing progress from server with local item for "${prog.libraryItemId}" ${prog.episodeId ? `episode ${prog.episodeId}` : ''} | server lastUpdate=${prog.lastUpdate} > local lastUpdate=${localProg.lastUpdate}` })
const payload = { const payload = {
localMediaProgressId: localProg.id, localMediaProgressId: localProg.id,
mediaProgress: prog mediaProgress: prog
@ -280,7 +280,7 @@ export default {
} }
if (newLocalMediaProgress?.id) { if (newLocalMediaProgress?.id) {
await AbsLogger.info({ message: `[default] userMediaProgressUpdate: local media progress updated for ${newLocalMediaProgress.id}` }) await AbsLogger.info({ tag: 'default', message: `userMediaProgressUpdate: local media progress updated for ${newLocalMediaProgress.id}` })
this.$store.commit('globals/updateLocalMediaProgress', newLocalMediaProgress) this.$store.commit('globals/updateLocalMediaProgress', newLocalMediaProgress)
} }
}, },
@ -317,7 +317,7 @@ export default {
this.$socket.on('user_media_progress_updated', this.userMediaProgressUpdated) this.$socket.on('user_media_progress_updated', this.userMediaProgressUpdated)
if (this.$store.state.isFirstLoad) { if (this.$store.state.isFirstLoad) {
AbsLogger.info({ message: `[default] mounted: first load` }) AbsLogger.info({ tag: 'default', message: 'mounted: initializing first load' })
this.$store.commit('setIsFirstLoad', false) this.$store.commit('setIsFirstLoad', false)
this.loadSavedSettings() this.loadSavedSettings()
@ -330,19 +330,18 @@ export default {
await this.$store.dispatch('setupNetworkListener') await this.$store.dispatch('setupNetworkListener')
if (this.$store.state.user.serverConnectionConfig) { if (this.$store.state.user.serverConnectionConfig) {
AbsLogger.info({ message: `[default] Server connected, init libraries (ServerConfigName: ${this.$store.getters['user/getServerConfigName']})` }) AbsLogger.info({ tag: 'default', message: `mounted: Server connected, init libraries (ServerConfigName: ${this.$store.getters['user/getServerConfigName']})` })
await this.initLibraries() await this.initLibraries()
} else { } else {
AbsLogger.info({ message: `[default] Server not connected, attempt connection` }) AbsLogger.info({ tag: 'default', message: `mounted: Server not connected, attempt connection` })
await this.attemptConnection() await this.attemptConnection()
} }
console.log(`[default] finished connection attempt or already connected ${!!this.user}`)
await this.syncLocalSessions(true) await this.syncLocalSessions(true)
this.hasMounted = true this.hasMounted = true
console.log('[default] fully initialized') AbsLogger.info({ tag: 'default', message: 'mounted: fully initialized' })
this.$eventBus.$emit('abs-ui-ready') this.$eventBus.$emit('abs-ui-ready')
} }
}, },

View file

@ -1,22 +1,25 @@
<template> <template>
<div class="w-full h-full p-4"> <div class="w-full h-full py-4">
<div class="flex items-center mb-2 space-x-2"> <div class="flex items-center mb-2 space-x-2 px-4">
<p class="text-lg font-bold">{{ $strings.ButtonLogs }}</p> <p class="text-lg font-bold">{{ $strings.ButtonLogs }}</p>
<ui-icon-btn outlined borderless :icon="isCopied ? 'check' : 'content_copy'" @click="copyToClipboard" /> <ui-icon-btn outlined borderless :icon="isCopied ? 'check' : 'content_copy'" @click="copyToClipboard" />
<ui-icon-btn outlined borderless icon="share" @click="shareLogs" /> <ui-icon-btn outlined borderless icon="share" @click="shareLogs" />
<div class="flex-grow"></div> <div class="flex-grow"></div>
<ui-icon-btn outlined borderless icon="more_vert" @click="showDialog = true" /> <ui-icon-btn outlined borderless icon="more_vert" @click="showDialog = true" />
</div> </div>
<div class="w-full h-[calc(100%-40px)] overflow-y-auto relative" ref="logContainer"> <div class="w-full h-[calc(100%-40px)] overflow-y-auto relative" ref="logContainer">
<div v-if="!logs.length && !isLoading" class="flex items-center justify-center h-32"> <div v-if="!logs.length && !isLoading" class="flex items-center justify-center h-32 p-4">
<p class="text-gray-400">{{ $strings.MessageNoLogs }}</p> <p class="text-gray-400">{{ $strings.MessageNoLogs }}</p>
</div> </div>
<div v-if="hasScrolled" class="sticky top-0 left-0 w-full h-10 bg-gradient-to-t from-transparent to-bg z-10 pointer-events-none"></div> <div v-if="hasScrolled" class="sticky top-0 left-0 w-full h-10 bg-gradient-to-t from-transparent to-bg z-10 pointer-events-none"></div>
<div v-for="log in logs" :key="log.id" class="py-1"> <div v-for="(log, index) in logs" :key="log.id" class="py-2 px-4" :class="{ 'bg-white/5': index % 2 === 0 }">
<div class="flex items-center space-x-4 mb-1"> <div class="flex items-center space-x-4 mb-1">
<div class="text-xs uppercase font-bold" :class="{ 'text-error': log.level === 'error', 'text-blue-500': log.level === 'info' }">{{ log.level }}</div> <div class="text-xs uppercase font-bold" :class="{ 'text-error': log.level === 'error', 'text-blue-500': log.level === 'info' }">{{ log.level }}</div>
<div class="text-xs text-gray-400">{{ formatEpochToDatetimeString(log.timestamp) }}</div> <div class="text-xs text-gray-400">{{ formatEpochToDatetimeString(log.timestamp) }}</div>
<div class="flex-grow"></div>
<div class="text-xs text-gray-400">{{ log.tag }}</div>
</div> </div>
<div class="text-xs">{{ maskServerAddress ? log.maskedMessage : log.message }}</div> <div class="text-xs">{{ maskServerAddress ? log.maskedMessage : log.message }}</div>
</div> </div>

View file

@ -7,9 +7,10 @@ class AbsLoggerWeb extends WebPlugin {
this.logs = [] this.logs = []
} }
saveLog(level, message) { saveLog(level, tag, message) {
this.logs.push({ this.logs.push({
id: Math.random().toString(36).substring(2, 15), id: Math.random().toString(36).substring(2, 15),
tag: tag,
timestamp: Date.now(), timestamp: Date.now(),
level: level, level: level,
message: message message: message
@ -18,15 +19,15 @@ class AbsLoggerWeb extends WebPlugin {
async info(data) { async info(data) {
if (data?.message) { if (data?.message) {
this.saveLog('info', data.message) this.saveLog('info', data.tag || '', data.message)
console.log('AbsLogger: info', data.message) console.log('AbsLogger: info', `[${data.tag || ''}]:`, data.message)
} }
} }
async error(data) { async error(data) {
if (data?.message) { if (data?.message) {
this.saveLog('error', data.message) this.saveLog('error', data.tag || '', data.message)
console.error('AbsLogger: error', data.message) console.error('AbsLogger: error', `[${data.tag || ''}]:`, data.message)
} }
} }