diff --git a/Server.js b/Server.js deleted file mode 100644 index c173a0d3..00000000 --- a/Server.js +++ /dev/null @@ -1,304 +0,0 @@ -import { io } from 'socket.io-client' -import { Storage } from '@capacitor/storage' -import EventEmitter from 'events' - -class Server extends EventEmitter { - constructor(store, $axios) { - super() - - this.store = store - this.$axios = $axios - - this.url = null - this.socket = null - - this.user = null - this.connected = false - this.initialized = false - - this.stream = null - - this.isConnectingSocket = false - } - - get token() { - return this.user ? this.user.token : null - } - - getAxiosConfig() { - return { headers: { Authorization: `Bearer ${this.token}` } } - } - - getServerUrl(url) { - if (!url) return null - try { - var urlObject = new URL(url) - return `${urlObject.protocol}//${urlObject.hostname}:${urlObject.port}` - } catch (error) { - console.error('Invalid URL', error) - return null - } - } - - setUser(user) { - this.user = user - this.store.commit('user/setUser', user) - if (user) { - // this.store.commit('user/setSettings', user.settings) - Storage.set({ key: 'token', value: user.token }) - } else { - Storage.remove({ key: 'token' }) - } - } - - setServerUrl(url) { - this.url = url - this.store.commit('setServerUrl', url) - - if (url) { - Storage.set({ key: 'serverUrl', value: url }) - } else { - Storage.remove({ key: 'serverUrl' }) - } - } - - async connect(url, token) { - if (this.connected) { - console.warn('[SOCKET] Connection already established for ' + this.url) - return { success: true } - } - if (!url) { - console.error('Invalid url to connect') - return { - error: 'Invalid URL' - } - } - - var serverUrl = this.getServerUrl(url) - var res = await this.ping(serverUrl) - - if (!res || !res.success) { - return { - error: res ? res.error : 'Unknown Error' - } - } - var authRes = await this.authorize(serverUrl, token) - if (!authRes || authRes.error) { - return { - error: authRes ? authRes.error : 'Authorization Error' - } - } - - this.setServerUrl(serverUrl) - - this.setUser(authRes.user) - this.connectSocket() - - return { success: true } - } - - async check(url) { - var serverUrl = this.getServerUrl(url) - if (!serverUrl) { - return { - error: 'Invalid server url' - } - } - var res = await this.ping(serverUrl) - if (!res || res.error) { - return { - error: res ? res.error : 'Ping Failed' - } - } - return { - success: true, - serverUrl - } - } - - async login(url, username, password) { - var serverUrl = this.getServerUrl(url) - var authUrl = serverUrl + '/login' - return this.$axios.post(authUrl, { username, password }).then((res) => { - if (!res.data || !res.data.user) { - console.error(res.data.error) - return { - error: res.data.error || 'Unknown Error' - } - } - - this.setServerUrl(serverUrl) - this.setUser(res.data.user) - this.connectSocket() - return { - user: res.data.user - } - }).catch(error => { - console.error('[Server] Server auth failed', error) - var errorMsg = null - if (error.response) { - errorMsg = error.response.data || 'Unknown Error' - } else if (error.request) { - errorMsg = 'Server did not respond' - } else { - errorMsg = 'Failed to send request' - } - return { - error: errorMsg - } - }) - } - - logout() { - this.setUser(null) - this.stream = null - if (this.socket) { - this.socket.disconnect() - } - this.emit('logout') - } - - authorize(serverUrl, token) { - var authUrl = serverUrl + '/api/authorize' - return this.$axios.post(authUrl, null, { headers: { Authorization: `Bearer ${token}` } }).then((res) => { - return res.data - }).catch(error => { - console.error('[Server] Server auth failed', error) - var errorMsg = null - if (error.response) { - errorMsg = error.response.data || 'Unknown Error' - } else if (error.request) { - errorMsg = 'Server did not respond' - } else { - errorMsg = 'Failed to send request' - } - return { - error: errorMsg - } - }) - } - - ping(url) { - var pingUrl = url + '/ping' - console.log('[Server] Check server', pingUrl) - return this.$axios.get(pingUrl, { timeout: 1000 }).then((res) => { - return res.data - }).catch(error => { - console.error('Server check failed', error) - var errorMsg = null - if (error.response) { - errorMsg = error.response.data || 'Unknown Error' - } else if (error.request) { - errorMsg = 'Server did not respond' - } else { - errorMsg = 'Failed to send request' - } - return { - success: false, - error: errorMsg - } - }) - } - - connectSocket() { - if (this.socket && !this.connected) { - this.socket.connect() - console.log('[SOCKET] Submitting connect') - return - } - if (this.connected || this.socket) { - if (this.socket) console.error('[SOCKET] Socket already established', this.url) - else console.error('[SOCKET] Already connected to socket', this.url) - return - } - - console.log('[SOCKET] Connect Socket', this.url) - - const socketOptions = { - transports: ['websocket'], - upgrade: false, - // reconnectionAttempts: 3 - } - this.socket = io(this.url, socketOptions) - this.socket.on('connect', () => { - console.log('[SOCKET] Socket Connected ' + this.socket.id) - - // Authenticate socket with token - this.socket.emit('auth', this.token) - this.connected = true - this.emit('connected', true) - this.store.commit('setSocketConnected', true) - }) - this.socket.on('disconnect', (reason) => { - console.log('[SOCKET] Socket Disconnected: ' + reason) - this.connected = false - this.emit('connected', false) - this.emit('initialized', false) - this.initialized = false - this.store.commit('setSocketConnected', false) - - // this.socket.removeAllListeners() - // if (this.socket.io && this.socket.io.removeAllListeners) { - // console.log(`[SOCKET] Removing ALL IO listeners`) - // this.socket.io.removeAllListeners() - // } - }) - this.socket.on('init', (data) => { - console.log('[SOCKET] Initial socket data received', data) - if (data.stream) { - this.stream = data.stream - this.store.commit('setStreamAudiobook', data.stream.audiobook) - this.emit('initialStream', data.stream) - } - if (data.serverSettings) { - this.store.commit('setServerSettings', data.serverSettings) - } - this.initialized = true - this.emit('initialized', true) - }) - - this.socket.on('user_updated', (user) => { - if (this.user && user.id === this.user.id) { - this.setUser(user) - } - }) - - this.socket.on('current_user_audiobook_update', (payload) => { - this.emit('currentUserAudiobookUpdate', payload) - }) - - this.socket.on('show_error_toast', (payload) => { - this.emit('show_error_toast', payload) - }) - this.socket.on('show_success_toast', (payload) => { - this.emit('show_success_toast', payload) - }) - - this.socket.onAny((evt, args) => { - console.log(`[SOCKET] ${this.socket.id}: ${evt} ${JSON.stringify(args)}`) - }) - - this.socket.on('connect_error', (err) => { - console.error('[SOCKET] connection failed', err) - this.emit('socketConnectionFailed', err) - }) - - this.socket.io.on("reconnect_attempt", (attempt) => { - console.log(`[SOCKET] Reconnect Attempt ${this.socket.id}: ${attempt}`) - }) - - this.socket.io.on("reconnect_error", (err) => { - console.log(`[SOCKET] Reconnect Error ${this.socket.id}: ${err}`) - }) - - this.socket.io.on("reconnect_failed", () => { - console.log(`[SOCKET] Reconnect Failed ${this.socket.id}`) - }) - - this.socket.io.on("reconnect", () => { - console.log(`[SOCKET] Reconnect Success ${this.socket.id}`) - }) - } -} - -export default Server \ No newline at end of file diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle index 4ad9dba0..a0389efe 100644 --- a/android/app/capacitor.build.gradle +++ b/android/app/capacitor.build.gradle @@ -9,14 +9,12 @@ android { apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" dependencies { - implementation project(':capacitor-community-sqlite') implementation project(':capacitor-app') implementation project(':capacitor-dialog') implementation project(':capacitor-network') implementation project(':capacitor-status-bar') implementation project(':capacitor-storage') implementation project(':robingenz-capacitor-app-update') - implementation project(':capacitor-data-storage-sqlite') } diff --git a/android/app/src/main/assets/capacitor.plugins.json b/android/app/src/main/assets/capacitor.plugins.json index 1c40357f..8d8bfdc0 100644 --- a/android/app/src/main/assets/capacitor.plugins.json +++ b/android/app/src/main/assets/capacitor.plugins.json @@ -1,8 +1,4 @@ [ - { - "pkg": "@capacitor-community/sqlite", - "classpath": "com.getcapacitor.community.database.sqlite.CapacitorSQLitePlugin" - }, { "pkg": "@capacitor/app", "classpath": "com.capacitorjs.plugins.app.AppPlugin" @@ -26,9 +22,5 @@ { "pkg": "@robingenz/capacitor-app-update", "classpath": "dev.robingenz.capacitor.appupdate.AppUpdatePlugin" - }, - { - "pkg": "capacitor-data-storage-sqlite", - "classpath": "com.jeep.plugin.capacitor.capacitordatastoragesqlite.CapacitorDataStorageSqlitePlugin" } ] diff --git a/android/app/src/main/java/com/audiobookshelf/app/AudiobookManager.kt b/android/app/src/main/java/com/audiobookshelf/app/AudiobookManager.kt index 421dbd72..a81ef99f 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/AudiobookManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/AudiobookManager.kt @@ -8,9 +8,7 @@ import android.os.Looper import android.support.v4.media.MediaMetadataCompat import android.util.Log -import com.getcapacitor.JSArray import com.getcapacitor.JSObject -import com.jeep.plugin.capacitor.capacitordatastoragesqlite.CapacitorDataStorageSqlite import okhttp3.* import org.json.JSONArray import java.io.IOException @@ -191,29 +189,6 @@ class AudiobookManager { hasLoaded = true localMediaManager.loadLocalAudio() - - // Load downloads from sql db - var db = CapacitorDataStorageSqlite(ctx) - db.openStore("storage", "downloads", false, "no-encryption", 1) - var keyvalues = db.keysvalues() - keyvalues.forEach { - Log.d(tag, "keyvalue ${it.getString("key")} | ${it.getString("value")}") - - var dlobj = JSObject(it.getString("value")) - if (dlobj.has("audiobook")) { - var abobj = dlobj.getJSObject("audiobook")!! - abobj.put("isDownloaded", true) - abobj.put("contentUrl", dlobj.getString("contentUrl", "").toString()) - abobj.put("filename", dlobj.getString("filename", "").toString()) - abobj.put("folderUrl", dlobj.getString("folderUrl", "").toString()) - abobj.put("downloadFolderUrl", dlobj.getString("downloadFolderUrl", "").toString()) - abobj.put("localCoverUrl", dlobj.getString("coverUrl", "").toString()) - abobj.put("localCover", dlobj.getString("cover", "").toString()) - - var audiobook = Audiobook(abobj, serverUrl, token) - audiobooks.add(audiobook) - } - } } fun openStream(audiobook:Audiobook, streamListener:OnStreamData) { diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt b/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt index 762cc84e..29c5503a 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/DbManager.kt @@ -21,7 +21,7 @@ class DbManager : Plugin() { val tag = "DbManager" fun getDeviceData(): DeviceData { - return Paper.book("device").read("data") ?: DeviceData(mutableListOf(), null) + return Paper.book("device").read("data") ?: DeviceData(mutableListOf(), null, null) } fun saveDeviceData(deviceData:DeviceData) { Paper.book("device").write("data", deviceData) diff --git a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt index af6f3fad..d24d7ab3 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/data/DeviceClasses.kt @@ -15,7 +15,8 @@ data class ServerConnectionConfig( data class DeviceData( var serverConnectionConfigs:MutableList, - var lastServerConnectionConfigId:String? + var lastServerConnectionConfigId:String?, + var localLibraryItemIdPlaying:String? ) @JsonIgnoreProperties(ignoreUnknown = true) diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle index 590a60b1..8be8c435 100644 --- a/android/capacitor.settings.gradle +++ b/android/capacitor.settings.gradle @@ -2,9 +2,6 @@ include ':capacitor-android' project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') -include ':capacitor-community-sqlite' -project(':capacitor-community-sqlite').projectDir = new File('../node_modules/@capacitor-community/sqlite/android') - include ':capacitor-app' project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') @@ -22,6 +19,3 @@ project(':capacitor-storage').projectDir = new File('../node_modules/@capacitor/ include ':robingenz-capacitor-app-update' project(':robingenz-capacitor-app-update').projectDir = new File('../node_modules/@robingenz/capacitor-app-update/android') - -include ':capacitor-data-storage-sqlite' -project(':capacitor-data-storage-sqlite').projectDir = new File('../node_modules/capacitor-data-storage-sqlite/android') diff --git a/components/bookshelf/LazyBookshelf.vue b/components/bookshelf/LazyBookshelf.vue index 24b87168..4606cd26 100644 --- a/components/bookshelf/LazyBookshelf.vue +++ b/components/bookshelf/LazyBookshelf.vue @@ -59,15 +59,9 @@ export default { entityName() { return this.page }, - bookshelfView() { - return this.$store.state.bookshelfView - }, hasFilter() { return this.filterBy !== 'all' }, - isListView() { - return this.bookshelfView === 'list' - }, books() { return this.$store.getters['downloads/getAudiobooks'] }, @@ -121,13 +115,7 @@ export default { return this.$store.getters['downloads/getDownloads'] }, downloadedBooks() { - return this.downloads.map((dl) => { - var download = { ...dl } - var ab = { ...download.audiobook } - delete download.audiobook - ab.download = download - return ab - }) + return [] } }, methods: { diff --git a/components/home/BookshelfToolbar.vue b/components/home/BookshelfToolbar.vue index 8bde454d..1346871a 100644 --- a/components/home/BookshelfToolbar.vue +++ b/components/home/BookshelfToolbar.vue @@ -9,7 +9,6 @@

{{ selectedSeriesName }} ({{ totalEntities }})