mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Setting up Playlist model
This commit is contained in:
		
							parent
							
								
									24e90e2ead
								
							
						
					
					
						commit
						98c4045a71
					
				
							
								
								
									
										46
									
								
								server/Db.js
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								server/Db.js
									
									
									
									
									
								
							| @ -5,6 +5,7 @@ const { version } = require('../package.json') | ||||
| const LibraryItem = require('./objects/LibraryItem') | ||||
| const User = require('./objects/user/User') | ||||
| const Collection = require('./objects/Collection') | ||||
| const Playlist = require('./objects/Playlist') | ||||
| const Library = require('./objects/Library') | ||||
| const Author = require('./objects/entities/Author') | ||||
| const Series = require('./objects/entities/Series') | ||||
| @ -20,6 +21,7 @@ class Db { | ||||
|     this.LibrariesPath = Path.join(global.ConfigPath, 'libraries') | ||||
|     this.SettingsPath = Path.join(global.ConfigPath, 'settings') | ||||
|     this.CollectionsPath = Path.join(global.ConfigPath, 'collections') | ||||
|     this.PlaylistsPath = Path.join(global.ConfigPath, 'playlists') | ||||
|     this.AuthorsPath = Path.join(global.ConfigPath, 'authors') | ||||
|     this.SeriesPath = Path.join(global.ConfigPath, 'series') | ||||
|     this.FeedsPath = Path.join(global.ConfigPath, 'feeds') | ||||
| @ -31,6 +33,7 @@ class Db { | ||||
|     this.librariesDb = new njodb.Database(this.LibrariesPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.settingsDb = new njodb.Database(this.SettingsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.collectionsDb = new njodb.Database(this.CollectionsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.playlistsDb = new njodb.Database(this.PlaylistsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.authorsDb = new njodb.Database(this.AuthorsPath, { lockoptions: { stale: staleTime } }) | ||||
|     this.seriesDb = new njodb.Database(this.SeriesPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.feedsDb = new njodb.Database(this.FeedsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
| @ -40,6 +43,7 @@ class Db { | ||||
|     this.libraries = [] | ||||
|     this.settings = [] | ||||
|     this.collections = [] | ||||
|     this.playlists = [] | ||||
|     this.authors = [] | ||||
|     this.series = [] | ||||
| 
 | ||||
| @ -61,6 +65,7 @@ class Db { | ||||
|     else if (entityName === 'library') return this.librariesDb | ||||
|     else if (entityName === 'settings') return this.settingsDb | ||||
|     else if (entityName === 'collection') return this.collectionsDb | ||||
|     else if (entityName === 'playlist') return this.playlistsDb | ||||
|     else if (entityName === 'author') return this.authorsDb | ||||
|     else if (entityName === 'series') return this.seriesDb | ||||
|     else if (entityName === 'feed') return this.feedsDb | ||||
| @ -74,6 +79,7 @@ class Db { | ||||
|     else if (entityName === 'library') return 'libraries' | ||||
|     else if (entityName === 'settings') return 'settings' | ||||
|     else if (entityName === 'collection') return 'collections' | ||||
|     else if (entityName === 'playlist') return 'playlists' | ||||
|     else if (entityName === 'author') return 'authors' | ||||
|     else if (entityName === 'series') return 'series' | ||||
|     else if (entityName === 'feed') return 'feeds' | ||||
| @ -81,15 +87,17 @@ class Db { | ||||
|   } | ||||
| 
 | ||||
|   reinit() { | ||||
|     this.libraryItemsDb = new njodb.Database(this.LibraryItemsPath) | ||||
|     this.usersDb = new njodb.Database(this.UsersPath) | ||||
|     this.sessionsDb = new njodb.Database(this.SessionsPath) | ||||
|     this.librariesDb = new njodb.Database(this.LibrariesPath, { datastores: 2 }) | ||||
|     this.settingsDb = new njodb.Database(this.SettingsPath, { datastores: 2 }) | ||||
|     this.collectionsDb = new njodb.Database(this.CollectionsPath, { datastores: 2 }) | ||||
|     this.authorsDb = new njodb.Database(this.AuthorsPath) | ||||
|     this.seriesDb = new njodb.Database(this.SeriesPath, { datastores: 2 }) | ||||
|     this.feedsDb = new njodb.Database(this.FeedsPath, { datastores: 2 }) | ||||
|     const staleTime = 1000 * 60 * 2 | ||||
|     this.libraryItemsDb = new njodb.Database(this.LibraryItemsPath, { lockoptions: { stale: staleTime } }) | ||||
|     this.usersDb = new njodb.Database(this.UsersPath, { lockoptions: { stale: staleTime } }) | ||||
|     this.sessionsDb = new njodb.Database(this.SessionsPath, { lockoptions: { stale: staleTime } }) | ||||
|     this.librariesDb = new njodb.Database(this.LibrariesPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.settingsDb = new njodb.Database(this.SettingsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.collectionsDb = new njodb.Database(this.CollectionsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.playlistsDb = new njodb.Database(this.PlaylistsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.authorsDb = new njodb.Database(this.AuthorsPath, { lockoptions: { stale: staleTime } }) | ||||
|     this.seriesDb = new njodb.Database(this.SeriesPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     this.feedsDb = new njodb.Database(this.FeedsPath, { datastores: 2, lockoptions: { stale: staleTime } }) | ||||
|     return this.init() | ||||
|   } | ||||
| 
 | ||||
| @ -135,20 +143,20 @@ class Db { | ||||
|   } | ||||
| 
 | ||||
|   async load() { | ||||
|     var p1 = this.libraryItemsDb.select(() => true).then((results) => { | ||||
|     const p1 = this.libraryItemsDb.select(() => true).then((results) => { | ||||
|       this.libraryItems = results.data.map(a => new LibraryItem(a)) | ||||
|       Logger.info(`[DB] ${this.libraryItems.length} Library Items Loaded`) | ||||
|     }) | ||||
|     var p2 = this.usersDb.select(() => true).then((results) => { | ||||
|     const p2 = this.usersDb.select(() => true).then((results) => { | ||||
|       this.users = results.data.map(u => new User(u)) | ||||
|       Logger.info(`[DB] ${this.users.length} Users Loaded`) | ||||
|     }) | ||||
|     var p3 = this.librariesDb.select(() => true).then((results) => { | ||||
|     const p3 = this.librariesDb.select(() => true).then((results) => { | ||||
|       this.libraries = results.data.map(l => new Library(l)) | ||||
|       this.libraries.sort((a, b) => a.displayOrder - b.displayOrder) | ||||
|       Logger.info(`[DB] ${this.libraries.length} Libraries Loaded`) | ||||
|     }) | ||||
|     var p4 = this.settingsDb.select(() => true).then(async (results) => { | ||||
|     const p4 = this.settingsDb.select(() => true).then(async (results) => { | ||||
|       if (results.data && results.data.length) { | ||||
|         this.settings = results.data | ||||
|         var serverSettings = this.settings.find(s => s.id === 'server-settings') | ||||
| @ -179,19 +187,23 @@ class Db { | ||||
|         } | ||||
|       } | ||||
|     }) | ||||
|     var p5 = this.collectionsDb.select(() => true).then((results) => { | ||||
|     const p5 = this.collectionsDb.select(() => true).then((results) => { | ||||
|       this.collections = results.data.map(l => new Collection(l)) | ||||
|       Logger.info(`[DB] ${this.collections.length} Collections Loaded`) | ||||
|     }) | ||||
|     var p6 = this.authorsDb.select(() => true).then((results) => { | ||||
|     const p6 = this.playlistsDb.select(() => true).then((results) => { | ||||
|       this.playlists = results.data.map(l => new Playlist(l)) | ||||
|       Logger.info(`[DB] ${this.playlists.length} Playlists Loaded`) | ||||
|     }) | ||||
|     const p7 = this.authorsDb.select(() => true).then((results) => { | ||||
|       this.authors = results.data.map(l => new Author(l)) | ||||
|       Logger.info(`[DB] ${this.authors.length} Authors Loaded`) | ||||
|     }) | ||||
|     var p7 = this.seriesDb.select(() => true).then((results) => { | ||||
|     const p8 = this.seriesDb.select(() => true).then((results) => { | ||||
|       this.series = results.data.map(l => new Series(l)) | ||||
|       Logger.info(`[DB] ${this.series.length} Series Loaded`) | ||||
|     }) | ||||
|     await Promise.all([p1, p2, p3, p4, p5, p6, p7]) | ||||
|     await Promise.all([p1, p2, p3, p4, p5, p6, p7, p8]) | ||||
| 
 | ||||
|     // Update server version in server settings
 | ||||
|     if (this.previousVersion) { | ||||
|  | ||||
							
								
								
									
										132
									
								
								server/objects/Playlist.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								server/objects/Playlist.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,132 @@ | ||||
| const Logger = require('../Logger') | ||||
| const { getId } = require('../utils/index') | ||||
| 
 | ||||
| class Playlist { | ||||
|   constructor(playlist) { | ||||
|     this.id = null | ||||
|     this.libraryId = null | ||||
|     this.userId = null | ||||
| 
 | ||||
|     this.name = null | ||||
|     this.description = null | ||||
| 
 | ||||
|     this.coverPath = null | ||||
| 
 | ||||
|     // Array of objects like { libraryItemId: "", episodeId: "" }
 | ||||
|     //  episodeId optional
 | ||||
|     this.items = [] | ||||
| 
 | ||||
|     this.lastUpdate = null | ||||
|     this.createdAt = null | ||||
| 
 | ||||
|     if (playlist) { | ||||
|       this.construct(playlist) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   toJSON() { | ||||
|     return { | ||||
|       id: this.id, | ||||
|       libraryId: this.libraryId, | ||||
|       userId: this.userId, | ||||
|       name: this.name, | ||||
|       description: this.description, | ||||
|       coverPath: this.coverPath, | ||||
|       items: [...this.items], | ||||
|       lastUpdate: this.lastUpdate, | ||||
|       createdAt: this.createdAt | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // Expands the items array
 | ||||
|   toJSONExpanded(libraryItems) { | ||||
|     var json = this.toJSON() | ||||
|     json.items = json.items.map(item => { | ||||
|       const libraryItem = libraryItems.find(li => li.id === item.libraryItemId) | ||||
|       if (!libraryItem) { | ||||
|         // Not found
 | ||||
|         return null | ||||
|       } | ||||
|       if (item.episodeId) { | ||||
|         if (!libraryItem.isPodcast) { | ||||
|           // Invalid
 | ||||
|           return null | ||||
|         } | ||||
|         const episode = libraryItem.media.episodes.find(ep => ep.id === item.episodeId) | ||||
|         if (!episode) { | ||||
|           // Not found
 | ||||
|           return null | ||||
|         } | ||||
| 
 | ||||
|         const episodeJson = episode.toJSONExpanded() | ||||
|         episodeJson.libraryItem = libraryItem.toJSONMinified() | ||||
|         return episodeJson | ||||
|       } else { | ||||
|         return libraryItem.toJSONExpanded() | ||||
|       } | ||||
|     }).filter(i => i) | ||||
|     return json | ||||
|   } | ||||
| 
 | ||||
|   construct(playlist) { | ||||
|     this.id = playlist.id | ||||
|     this.libraryId = playlist.libraryId | ||||
|     this.userId = playlist.userId | ||||
|     this.name = playlist.name | ||||
|     this.description = playlist.description || null | ||||
|     this.coverPath = playlist.coverPath || null | ||||
|     this.items = playlist.items ? playlist.items.map(i => ({ ...i })) : [] | ||||
|     this.lastUpdate = playlist.lastUpdate || null | ||||
|     this.createdAt = playlist.createdAt || null | ||||
|   } | ||||
| 
 | ||||
|   setData(data) { | ||||
|     if (!data.userId || !data.libraryId || !data.name) { | ||||
|       return false | ||||
|     } | ||||
|     this.id = getId('pl') | ||||
|     this.userId = data.userId | ||||
|     this.libraryId = data.libraryId | ||||
|     this.name = data.name | ||||
|     this.description = data.description || null | ||||
|     this.coverPath = data.coverPath || null | ||||
|     this.items = data.items ? data.items.map(i => ({ ...i })) : [] | ||||
|     this.lastUpdate = Date.now() | ||||
|     this.createdAt = Date.now() | ||||
|     return true | ||||
|   } | ||||
| 
 | ||||
|   addItem(libraryItemId, episodeId = null) { | ||||
|     this.items.push({ | ||||
|       libraryItemId, | ||||
|       episodeId: episodeId || null | ||||
|     }) | ||||
|     this.lastUpdate = Date.now() | ||||
|   } | ||||
| 
 | ||||
|   removeItem(libraryItemId, episodeId = null) { | ||||
|     if (episodeId) this.items = this.items.filter(i => i.libraryItemId !== libraryItemId || i.episodeId !== episodeId) | ||||
|     else this.items = this.items.filter(i => i !== i.libraryItemId !== libraryItemId) | ||||
|     this.lastUpdate = Date.now() | ||||
|   } | ||||
| 
 | ||||
|   update(payload) { | ||||
|     let hasUpdates = false | ||||
|     for (const key in payload) { | ||||
|       if (key === 'items') { | ||||
|         if (payload.items && JSON.stringify(payload.items) !== JSON.stringify(this.items)) { | ||||
|           this.items = payload.items.map(i => ({ ...i })) | ||||
|           hasUpdates = true | ||||
|         } | ||||
|       } else if (this[key] !== undefined && this[key] !== payload[key]) { | ||||
|         hasUpdates = true | ||||
|         this[key] = payload[key] | ||||
|       } | ||||
|     } | ||||
|     if (hasUpdates) { | ||||
|       this.lastUpdate = Date.now() | ||||
|     } | ||||
|     return hasUpdates | ||||
|   } | ||||
| } | ||||
| module.exports = Playlist | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user