2021-09-01 20:07:11 -05:00
|
|
|
<template>
|
2022-12-07 15:41:32 -05:00
|
|
|
<div class="select-none w-full layout-wrapper bg-bg text-white">
|
2021-09-01 20:07:11 -05:00
|
|
|
<app-appbar />
|
2021-12-31 16:57:53 -06:00
|
|
|
<div id="content" class="overflow-hidden relative" :class="playerIsOpen ? 'playerOpen' : ''">
|
2021-09-01 20:07:11 -05:00
|
|
|
<Nuxt />
|
|
|
|
</div>
|
2021-11-01 21:06:51 -05:00
|
|
|
<app-audio-player-container ref="streamContainer" />
|
2021-10-06 07:24:15 -05:00
|
|
|
<modals-libraries-modal />
|
2022-12-03 17:05:43 -06:00
|
|
|
<modals-playlists-add-create-modal />
|
2021-11-14 19:59:34 -06:00
|
|
|
<app-side-drawer />
|
2021-10-17 20:20:00 -05:00
|
|
|
<readers-reader />
|
2021-09-01 20:07:11 -05:00
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
|
|
|
export default {
|
|
|
|
data() {
|
2022-04-07 18:46:58 -05:00
|
|
|
return {
|
|
|
|
attemptingConnection: false,
|
2022-04-09 18:36:32 -05:00
|
|
|
inittingLibraries: false,
|
|
|
|
hasMounted: false,
|
|
|
|
disconnectTime: 0
|
2022-04-07 18:46:58 -05:00
|
|
|
}
|
2021-09-01 20:07:11 -05:00
|
|
|
},
|
2021-11-14 19:59:34 -06:00
|
|
|
watch: {
|
|
|
|
networkConnected: {
|
2022-04-07 18:46:58 -05:00
|
|
|
handler(newVal, oldVal) {
|
2022-04-09 18:36:32 -05:00
|
|
|
if (!this.hasMounted) {
|
|
|
|
// watcher runs before mount, handling libraries/connection should be handled in mount
|
|
|
|
return
|
|
|
|
}
|
2021-11-14 19:59:34 -06:00
|
|
|
if (newVal) {
|
2022-04-07 18:46:58 -05:00
|
|
|
console.log(`[default] network connected changed ${oldVal} -> ${newVal}`)
|
|
|
|
if (!this.user) {
|
|
|
|
this.attemptConnection()
|
|
|
|
} else if (!this.currentLibraryId) {
|
|
|
|
this.initLibraries()
|
2022-04-09 18:36:32 -05:00
|
|
|
} else {
|
|
|
|
var timeSinceDisconnect = Date.now() - this.disconnectTime
|
|
|
|
if (timeSinceDisconnect > 5000) {
|
|
|
|
console.log('Time since disconnect was', timeSinceDisconnect, 'sync with server')
|
|
|
|
setTimeout(() => {
|
|
|
|
// TODO: Some issue here
|
|
|
|
this.syncLocalMediaProgress()
|
|
|
|
}, 4000)
|
|
|
|
}
|
2022-04-07 18:46:58 -05:00
|
|
|
}
|
2022-04-09 18:36:32 -05:00
|
|
|
} else {
|
|
|
|
console.log(`[default] lost network connection`)
|
|
|
|
this.disconnectTime = Date.now()
|
2021-11-14 19:59:34 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
2021-09-01 20:07:11 -05:00
|
|
|
computed: {
|
2021-09-12 18:37:08 -05:00
|
|
|
playerIsOpen() {
|
2022-04-10 20:31:47 -05:00
|
|
|
return this.$store.state.playerLibraryItemId
|
2021-09-01 20:07:11 -05:00
|
|
|
},
|
|
|
|
routeName() {
|
|
|
|
return this.$route.name
|
2021-11-14 19:59:34 -06:00
|
|
|
},
|
|
|
|
networkConnected() {
|
|
|
|
return this.$store.state.networkConnected
|
2021-12-04 19:56:29 -06:00
|
|
|
},
|
2022-04-03 14:24:17 -05:00
|
|
|
user() {
|
|
|
|
return this.$store.state.user.user
|
|
|
|
},
|
2021-12-04 19:56:29 -06:00
|
|
|
currentLibraryId() {
|
|
|
|
return this.$store.state.libraries.currentLibraryId
|
2021-09-01 20:07:11 -05:00
|
|
|
}
|
|
|
|
},
|
|
|
|
methods: {
|
|
|
|
initialStream(stream) {
|
|
|
|
if (this.$refs.streamContainer && this.$refs.streamContainer.audioPlayerReady) {
|
|
|
|
this.$refs.streamContainer.streamOpen(stream)
|
|
|
|
}
|
2021-09-02 12:19:26 -05:00
|
|
|
},
|
2021-12-05 18:31:47 -06:00
|
|
|
async loadSavedSettings() {
|
|
|
|
var userSavedServerSettings = await this.$localStore.getServerSettings()
|
|
|
|
if (userSavedServerSettings) {
|
|
|
|
this.$store.commit('setServerSettings', userSavedServerSettings)
|
|
|
|
}
|
|
|
|
|
|
|
|
var userSavedSettings = await this.$localStore.getUserSettings()
|
|
|
|
if (userSavedSettings) {
|
|
|
|
this.$store.commit('user/setSettings', userSavedSettings)
|
|
|
|
}
|
|
|
|
},
|
2021-11-14 19:59:34 -06:00
|
|
|
async attemptConnection() {
|
2022-04-09 18:36:32 -05:00
|
|
|
console.warn('[default] attemptConnection')
|
2021-11-14 19:59:34 -06:00
|
|
|
if (!this.networkConnected) {
|
2022-04-09 18:36:32 -05:00
|
|
|
console.warn('[default] No network connection')
|
2021-11-14 19:59:34 -06:00
|
|
|
return
|
|
|
|
}
|
2022-04-07 18:46:58 -05:00
|
|
|
if (this.attemptingConnection) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
this.attemptingConnection = true
|
2021-11-14 19:59:34 -06:00
|
|
|
|
2022-04-03 14:24:17 -05:00
|
|
|
var deviceData = await this.$db.getDeviceData()
|
|
|
|
var serverConfig = null
|
|
|
|
if (deviceData && deviceData.lastServerConnectionConfigId && deviceData.serverConnectionConfigs.length) {
|
|
|
|
serverConfig = deviceData.serverConnectionConfigs.find((scc) => scc.id == deviceData.lastServerConnectionConfigId)
|
2021-11-14 19:59:34 -06:00
|
|
|
}
|
2022-04-03 14:24:17 -05:00
|
|
|
if (!serverConfig) {
|
|
|
|
// No last server config set
|
2022-04-07 18:46:58 -05:00
|
|
|
this.attemptingConnection = false
|
2022-04-03 14:24:17 -05:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2022-04-07 18:46:58 -05:00
|
|
|
console.log(`[default] Got server config, attempt authorize ${serverConfig.address}`)
|
|
|
|
|
2022-07-22 17:00:49 -05:00
|
|
|
var authRes = await this.$axios.$post(`${serverConfig.address}/api/authorize`, null, { headers: { Authorization: `Bearer ${serverConfig.token}` }, timeout: 3000 }).catch((error) => {
|
2022-04-03 14:24:17 -05:00
|
|
|
console.error('[Server] Server auth failed', error)
|
|
|
|
var errorMsg = error.response ? error.response.data || 'Unknown Error' : 'Unknown Error'
|
|
|
|
this.error = errorMsg
|
|
|
|
return false
|
|
|
|
})
|
2022-04-07 18:46:58 -05:00
|
|
|
if (!authRes) {
|
|
|
|
this.attemptingConnection = false
|
|
|
|
return
|
|
|
|
}
|
2022-04-03 14:24:17 -05:00
|
|
|
|
2022-07-28 18:36:43 -05:00
|
|
|
const { user, userDefaultLibraryId, serverSettings } = authRes
|
|
|
|
this.$store.commit('setServerSettings', serverSettings)
|
2022-04-10 20:31:47 -05:00
|
|
|
|
|
|
|
// Set library - Use last library if set and available fallback to default user library
|
|
|
|
var lastLibraryId = await this.$localStore.getLastLibraryId()
|
|
|
|
if (lastLibraryId && (!user.librariesAccessible.length || user.librariesAccessible.includes(lastLibraryId))) {
|
|
|
|
this.$store.commit('libraries/setCurrentLibrary', lastLibraryId)
|
|
|
|
} else if (userDefaultLibraryId) {
|
2022-04-03 14:24:17 -05:00
|
|
|
this.$store.commit('libraries/setCurrentLibrary', userDefaultLibraryId)
|
|
|
|
}
|
|
|
|
var serverConnectionConfig = await this.$db.setServerConnectionConfig(serverConfig)
|
|
|
|
|
|
|
|
this.$store.commit('user/setUser', user)
|
|
|
|
this.$store.commit('user/setServerConnectionConfig', serverConnectionConfig)
|
|
|
|
|
|
|
|
this.$socket.connect(serverConnectionConfig.address, serverConnectionConfig.token)
|
|
|
|
|
2022-04-09 18:36:32 -05:00
|
|
|
console.log('[default] Successful connection on last saved connection config', JSON.stringify(serverConnectionConfig))
|
2022-04-03 14:24:17 -05:00
|
|
|
await this.initLibraries()
|
2022-04-07 18:46:58 -05:00
|
|
|
this.attemptingConnection = false
|
2021-12-05 18:31:47 -06:00
|
|
|
},
|
2022-03-23 17:59:14 -05:00
|
|
|
itemRemoved(libraryItem) {
|
|
|
|
if (this.$route.name.startsWith('item')) {
|
|
|
|
if (this.$route.params.id === libraryItem.id) {
|
2021-12-05 18:31:47 -06:00
|
|
|
this.$router.replace(`/bookshelf`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
userLoggedOut() {
|
|
|
|
// Only cancels stream if streamining not playing downloaded
|
2022-04-02 12:12:00 -05:00
|
|
|
this.$eventBus.$emit('close-stream')
|
2021-12-05 18:31:47 -06:00
|
|
|
},
|
2022-04-03 14:24:17 -05:00
|
|
|
socketConnectionFailed(err) {
|
|
|
|
this.$toast.error('Socket connection error: ' + err.message)
|
|
|
|
},
|
|
|
|
async initLibraries() {
|
2022-04-07 18:46:58 -05:00
|
|
|
if (this.inittingLibraries) {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
this.inittingLibraries = true
|
2022-04-03 14:24:17 -05:00
|
|
|
await this.$store.dispatch('libraries/load')
|
2022-04-10 20:31:47 -05:00
|
|
|
console.log(`[default] initLibraries loaded ${this.currentLibraryId}`)
|
2022-06-05 16:32:28 -05:00
|
|
|
await this.$store.dispatch('libraries/fetch', this.currentLibraryId)
|
2022-04-03 14:24:17 -05:00
|
|
|
this.$eventBus.$emit('library-changed')
|
2022-04-07 18:46:58 -05:00
|
|
|
this.inittingLibraries = false
|
2022-04-09 18:36:32 -05:00
|
|
|
},
|
|
|
|
async syncLocalMediaProgress() {
|
|
|
|
if (!this.user) {
|
|
|
|
console.log('[default] No need to sync local media progress - not connected to server')
|
2022-07-13 19:17:34 -05:00
|
|
|
this.$store.commit('setLastLocalMediaSyncResults', null)
|
2022-04-09 18:36:32 -05:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
console.log('[default] Calling syncLocalMediaProgress')
|
|
|
|
var response = await this.$db.syncLocalMediaProgressWithServer()
|
|
|
|
if (!response) {
|
2022-04-10 20:31:47 -05:00
|
|
|
if (this.$platform != 'web') this.$toast.error('Failed to sync local media with server')
|
2022-07-13 19:17:34 -05:00
|
|
|
this.$store.commit('setLastLocalMediaSyncResults', null)
|
2022-04-09 18:36:32 -05:00
|
|
|
return
|
|
|
|
}
|
|
|
|
const { numLocalMediaProgressForServer, numServerProgressUpdates, numLocalProgressUpdates } = response
|
|
|
|
if (numLocalMediaProgressForServer > 0) {
|
2022-07-13 19:17:34 -05:00
|
|
|
response.syncedAt = Date.now()
|
|
|
|
response.serverConfigName = this.$store.getters['user/getServerConfigName']
|
|
|
|
this.$store.commit('setLastLocalMediaSyncResults', response)
|
|
|
|
|
2022-04-09 18:36:32 -05:00
|
|
|
if (numServerProgressUpdates > 0 || numLocalProgressUpdates > 0) {
|
|
|
|
console.log(`[default] ${numServerProgressUpdates} Server progress updates | ${numLocalProgressUpdates} Local progress updates`)
|
|
|
|
} else {
|
|
|
|
console.log('[default] syncLocalMediaProgress No updates were necessary')
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
console.log('[default] syncLocalMediaProgress No local media progress to sync')
|
2022-07-13 19:17:34 -05:00
|
|
|
this.$store.commit('setLastLocalMediaSyncResults', null)
|
2022-04-09 18:36:32 -05:00
|
|
|
}
|
2022-04-09 20:29:59 -05:00
|
|
|
},
|
2022-06-01 19:38:26 -05:00
|
|
|
async userUpdated(user) {
|
2022-04-09 20:29:59 -05:00
|
|
|
if (this.user && this.user.id == user.id) {
|
|
|
|
this.$store.commit('user/setUser', user)
|
|
|
|
}
|
2022-06-01 19:38:26 -05:00
|
|
|
},
|
|
|
|
async userMediaProgressUpdated(prog) {
|
|
|
|
console.log(`[default] userMediaProgressUpdate checking for local media progress ${prog.id}`)
|
|
|
|
|
|
|
|
// Update local media progress if exists
|
|
|
|
var localProg = this.$store.getters['globals/getLocalMediaProgressByServerItemId'](prog.libraryItemId, prog.episodeId)
|
|
|
|
var newLocalMediaProgress = null
|
|
|
|
if (localProg && localProg.lastUpdate < prog.lastUpdate) {
|
|
|
|
// Server progress is more up-to-date
|
|
|
|
console.log(`[default] syncing progress from server with local item for "${prog.libraryItemId}" ${prog.episodeId ? `episode ${prog.episodeId}` : ''}`)
|
|
|
|
const payload = {
|
|
|
|
localMediaProgressId: localProg.id,
|
|
|
|
mediaProgress: prog
|
|
|
|
}
|
|
|
|
newLocalMediaProgress = await this.$db.syncServerMediaProgressWithLocalMediaProgress(payload)
|
2022-07-13 17:10:47 -05:00
|
|
|
} else if (!localProg) {
|
2022-06-01 19:38:26 -05:00
|
|
|
// Check if local library item exists
|
2022-07-13 17:10:47 -05:00
|
|
|
// local media progress may not exist yet if it hasn't been played
|
2022-07-13 16:44:02 -05:00
|
|
|
var localLibraryItem = await this.$db.getLocalLibraryItemByLId(prog.libraryItemId)
|
2022-06-01 19:38:26 -05:00
|
|
|
if (localLibraryItem) {
|
|
|
|
if (prog.episodeId) {
|
|
|
|
// If episode check if local episode exists
|
|
|
|
var lliEpisodes = localLibraryItem.media.episodes || []
|
|
|
|
var localEpisode = lliEpisodes.find((ep) => ep.serverEpisodeId === prog.episodeId)
|
|
|
|
if (localEpisode) {
|
|
|
|
// Add new local media progress
|
|
|
|
const payload = {
|
|
|
|
localLibraryItemId: localLibraryItem.id,
|
|
|
|
localEpisodeId: localEpisode.id,
|
|
|
|
mediaProgress: prog
|
|
|
|
}
|
|
|
|
newLocalMediaProgress = await this.$db.syncServerMediaProgressWithLocalMediaProgress(payload)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Add new local media progress
|
|
|
|
const payload = {
|
|
|
|
localLibraryItemId: localLibraryItem.id,
|
|
|
|
mediaProgress: prog
|
|
|
|
}
|
|
|
|
newLocalMediaProgress = await this.$db.syncServerMediaProgressWithLocalMediaProgress(payload)
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
console.log(`[default] userMediaProgressUpdate no local media progress or lli found for this server item ${prog.id}`)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newLocalMediaProgress && newLocalMediaProgress.id) {
|
|
|
|
console.log(`[default] local media progress updated for ${newLocalMediaProgress.id}`)
|
|
|
|
this.$store.commit('globals/updateLocalMediaProgress', newLocalMediaProgress)
|
|
|
|
}
|
2021-09-12 18:37:08 -05:00
|
|
|
}
|
2021-09-01 20:07:11 -05:00
|
|
|
},
|
2021-11-14 19:59:34 -06:00
|
|
|
async mounted() {
|
2022-04-09 20:29:59 -05:00
|
|
|
this.$socket.on('user_updated', this.userUpdated)
|
2022-06-01 19:38:26 -05:00
|
|
|
this.$socket.on('user_media_progress_updated', this.userMediaProgressUpdated)
|
2021-09-01 20:07:11 -05:00
|
|
|
|
2021-09-19 18:44:10 -05:00
|
|
|
if (this.$store.state.isFirstLoad) {
|
|
|
|
this.$store.commit('setIsFirstLoad', false)
|
2022-07-01 20:05:11 -05:00
|
|
|
|
|
|
|
const deviceData = await this.$db.getDeviceData()
|
|
|
|
this.$store.commit('setDeviceData', deviceData)
|
2022-12-04 10:41:09 -06:00
|
|
|
this.$setOrientationLock(this.$store.getters['getOrientationLockSetting'])
|
2022-07-01 20:05:11 -05:00
|
|
|
|
2021-11-21 06:54:10 -06:00
|
|
|
await this.$store.dispatch('setupNetworkListener')
|
2022-04-03 14:24:17 -05:00
|
|
|
|
2022-07-22 17:00:49 -05:00
|
|
|
await this.$store.dispatch('globals/loadLocalMediaProgress')
|
|
|
|
|
2022-04-03 14:24:17 -05:00
|
|
|
if (this.$store.state.user.serverConnectionConfig) {
|
2022-04-07 18:46:58 -05:00
|
|
|
console.log(`[default] server connection config set - call init libraries`)
|
2022-04-03 14:24:17 -05:00
|
|
|
await this.initLibraries()
|
|
|
|
} else {
|
2022-04-07 18:46:58 -05:00
|
|
|
console.log(`[default] no server connection config - call attempt connection`)
|
2022-04-03 14:24:17 -05:00
|
|
|
await this.attemptConnection()
|
|
|
|
}
|
|
|
|
|
2022-04-09 18:36:32 -05:00
|
|
|
console.log(`[default] finished connection attempt or already connected ${!!this.user}`)
|
|
|
|
await this.syncLocalMediaProgress()
|
2022-07-22 17:00:49 -05:00
|
|
|
|
2021-12-05 18:31:47 -06:00
|
|
|
this.loadSavedSettings()
|
2022-04-09 18:36:32 -05:00
|
|
|
this.hasMounted = true
|
2022-08-19 16:36:56 -04:00
|
|
|
|
|
|
|
console.log('[default] fully initialized')
|
|
|
|
this.$eventBus.$emit('abs-ui-ready')
|
2021-09-19 18:44:10 -05:00
|
|
|
}
|
|
|
|
},
|
|
|
|
beforeDestroy() {
|
2022-04-09 20:29:59 -05:00
|
|
|
this.$socket.off('user_updated', this.userUpdated)
|
2022-06-01 19:38:26 -05:00
|
|
|
this.$socket.off('user_media_progress_updated', this.userMediaProgressUpdated)
|
2021-09-01 20:07:11 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
</script>
|