@jellybrick/mpris-service 2.1.5 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["PLAYBACK_STATUS_PLAYING","PLAYBACK_STATUS_PAUSED","PLAYBACK_STATUS_STOPPED","LOOP_STATUS_NONE","LOOP_STATUS_TRACK","LOOP_STATUS_PLAYLIST","playbackStatuses","loopStatuses","isLoopStatusValid","value","includes","isPlaybackStatusValid","loggingEnabled","process","env","MPRIS_SERVICE_DEBUG","undefined","debug","message","console","log","warn","Variant","warn","guessMetadataSignature","key","value","Array","isArray","every","v","String","metadataToPlain","metadataVariant","metadataPlain","k","Object","keys","undefined","metadataToDbus","plain","signature","emptyPlaylist","playlistToDbus","playlist","Id","Name","Icon","playlistToPlain","wire","interface","dbusInterface","deepEqual","isLoopStatusValid","isPlaybackStatusValid","types","warn","Interface","settableEvent","Fullscreen","Rate","Shuffle","Volume","LoopStatus","MprisInterface","_setPropertyInternal","property","valueDbus","player","emit","setProperty","valuePlain","metadataToDbus","playlistToDbus","emptyPlaylist","filter","t","map","Reflect","get","set","String","emitPropertiesChanged","name","interface","dbusInterface","MprisInterface","property","method","ACCESS_READ","signature","access","RootInterface","CanQuit","_CanQuit","Fullscreen","_Fullscreen","value","_setPropertyInternal","CanSetFullscreen","_CanSetFullscreen","CanRaise","_CanRaise","HasTrackList","_HasTrackList","Identity","_Identity","DesktopEntry","_DesktopEntry","SupportedUriSchemes","_SupportedUriSchemes","SupportedMimeTypes","_SupportedMimeTypes","Raise","player","emit","Quit","opts","identity","undefined","supportedUriSchemes","supportedMimeTypes","desktopEntry","DBusError","interface","dbusInterface","isLoopStatusValid","isPlaybackStatusValid","LOOP_STATUS_NONE","PLAYBACK_STATUS_STOPPED","MprisInterface","property","method","signal","signature","access","ACCESS_READ","inSignature","PlayerInterface","CanControl","_CanControl","CanPause","_CanPause","CanPlay","_CanPlay","CanSeek","_CanSeek","CanGoNext","_CanGoNext","CanGoPrevious","_CanGoPrevious","Metadata","_Metadata","MaximumRate","_MaximumRate","MinimumRate","_MinimumRate","Rate","_Rate","value","_setPropertyInternal","Shuffle","_Shuffle","Volume","_Volume","Position","playerPosition","player","getPosition","position","Math","floor","isNaN","err","message","LoopStatus","_LoopStatus","PlaybackStatus","_PlaybackStatus","Next","emit","Previous","Pause","PlayPause","Stop","Play","Seek","offset","Number","SetPosition","trackId","OpenUri","uri","Seeked","interface","dbusInterface","MprisInterface","types","property","method","signal","ACCESS_READ","signature","access","inSignature","outSignature","PlaylistsInterface","PlaylistCount","_PlaylistCount","Orderings","ActivePlaylist","_ActivePlaylist","setActivePlaylistId","playlistId","i","player","getPlaylistIndex","setProperty","playlists","ActivatePlaylist","emit","GetPlaylists","index","maxCount","order","reverseOrder","result","sort","a","b","ret","Name","slice","map","p","playlistToDbus","reverse","PlaylistChanged","playlist","emptyPlaylist","interface","dbusInterface","MprisInterface","types","property","method","signal","ACCESS_READ","signature","access","inSignature","outSignature","TracklistInterface","setTracks","tracksPlain","setProperty","Tracks","_Tracks","CanEditTracks","_CanEditTracks","GetTracksMetadata","trackIds","player","tracks","filter","t","some","id","map","metadataToDbus","AddTrack","uri","afterTrack","setAsCurrent","emit","RemoveTrack","trackId","GoTo","TrackListReplaced","replacedPlain","TrackAdded","metadata","TrackRemoved","path","TrackMetadataChanged","EventEmitter","NameFlag","RequestNameReply","sessionBus","validators","constants","PlayerInterface","PlaylistsInterface","RootInterface","TracklistInterface","types","MPRIS_PATH","lcfirst","str","charAt","toLowerCase","substring","Player","init","opts","serviceName","name","assertBusNameValid","_bus","on","err","emit","Error","String","interfaces","supportedInterfaces","indexOf","iface","Object","values","undefined","export","reply","requestName","DO_NOT_QUEUE","EXISTS","process","pid","objectPath","subpath","path","getPosition","seeked","position","seekTo","Math","floor","isNaN","player","Seeked","getTrackIndex","trackId","i","tracks","length","track","getTrack","addTrack","push","tracklist","setTracks","afterTrack","previous","TrackAdded","removeTrack","splice","TrackRemoved","getPlaylistIndex","playlistId","playlists","playlist","Id","setPlaylists","playlistCount","forEach","PlaylistChanged","setActivePlaylist","setActivePlaylistId","options","_tracks","catch","PLAYBACK_STATUS_PLAYING","PLAYBACK_STATUS_PAUSED","PLAYBACK_STATUS_STOPPED","LOOP_STATUS_NONE","LOOP_STATUS_TRACK","LOOP_STATUS_PLAYLIST","root","eventedProps","defineProperty","get","set","value","TrackListReplaced","enumerable","configurable","localName","Reflect","playlistToPlain","metadataToPlain","setProperty","props","prop","Player"],"sources":["../src/constants.ts","../src/logging.ts","../src/interfaces/types.ts","../src/interfaces/mpris-interface.ts","../src/interfaces/root.ts","../src/interfaces/player.ts","../src/interfaces/playlists.ts","../src/interfaces/tracklist.ts","../src/player.ts","../src/index.ts"],"sourcesContent":["import type { LoopStatus, PlayBackStatus } from '@/types';\n\nexport const PLAYBACK_STATUS_PLAYING: PlayBackStatus = 'Playing';\nexport const PLAYBACK_STATUS_PAUSED: PlayBackStatus = 'Paused';\nexport const PLAYBACK_STATUS_STOPPED: PlayBackStatus = 'Stopped';\n\nexport const LOOP_STATUS_NONE: LoopStatus = 'None';\nexport const LOOP_STATUS_TRACK: LoopStatus = 'Track';\nexport const LOOP_STATUS_PLAYLIST: LoopStatus = 'Playlist';\n\nconst playbackStatuses: PlayBackStatus[] = [\n PLAYBACK_STATUS_PLAYING,\n PLAYBACK_STATUS_PAUSED,\n PLAYBACK_STATUS_STOPPED,\n];\n\nconst loopStatuses: LoopStatus[] = [LOOP_STATUS_NONE, LOOP_STATUS_PLAYLIST, LOOP_STATUS_TRACK];\n\nexport const isLoopStatusValid = (value: unknown): value is LoopStatus => {\n return typeof value === 'string' && loopStatuses.includes(value as LoopStatus);\n};\n\nexport const isPlaybackStatusValid = (value: unknown): value is PlayBackStatus => {\n return typeof value === 'string' && playbackStatuses.includes(value as PlayBackStatus);\n};\n","const loggingEnabled =\n process.env.MPRIS_SERVICE_DEBUG !== undefined && process.env.MPRIS_SERVICE_DEBUG !== '0';\n\nexport const debug = (message: unknown): void => {\n if (loggingEnabled) {\n console.log(message);\n }\n};\n\nexport const warn = (message: unknown): void => {\n if (loggingEnabled) {\n console.warn(message);\n }\n};\n","import { Variant } from '@jellybrick/dbus-next';\n\nimport { warn } from '@/logging';\n\nimport type { Playlist, Track } from '@/types';\n\nexport const guessMetadataSignature = (key: string, value: unknown): string | null => {\n if (key === 'mpris:trackid') {\n return 'o';\n } else if (key === 'mpris:length') {\n return 'x';\n } else if (typeof value === 'string') {\n return 's';\n } else if (typeof value === 'boolean') {\n return 'b';\n } else if (typeof value === 'number') {\n return 'd';\n } else if (Array.isArray(value) && value.every((v) => typeof v === 'string')) {\n return 'as';\n } else {\n // type not supported yet\n warn(`could not determine metadata type for ${key}: ${String(value)}`);\n return null;\n }\n};\n\nexport const metadataToPlain = (metadataVariant: Record<string, unknown>): Track => {\n const metadataPlain: Record<string, unknown> = {};\n for (const k of Object.keys(metadataVariant)) {\n const value = metadataVariant[k];\n if (value === undefined || value === null) {\n warn(`ignoring a null metadata value for key ${k}`);\n continue;\n }\n if (value instanceof Variant) {\n metadataPlain[k] = value.value;\n } else {\n metadataPlain[k] = value;\n }\n }\n return metadataPlain as Track;\n};\n\nexport const metadataToDbus = (metadataPlain: Track): Record<string, Variant> => {\n const metadataVariant: Record<string, Variant> = {};\n const plain = metadataPlain as Record<string, unknown>;\n for (const k of Object.keys(plain)) {\n const value = plain[k];\n const signature = guessMetadataSignature(k, value);\n if (signature) {\n metadataVariant[k] = new Variant(signature, value);\n }\n }\n return metadataVariant;\n};\n\nexport const emptyPlaylist: [string, string, string] = ['/', '', ''];\n\nexport const playlistToDbus = (playlist?: Playlist | null): [string, string, string] => {\n if (!playlist) {\n return emptyPlaylist;\n }\n\n const { Id, Name, Icon } = playlist;\n return [Id, Name, Icon];\n};\n\nexport const playlistToPlain = (wire: [string, string, string]): Playlist => {\n const [Id, Name, Icon] = wire;\n return { Id, Name, Icon };\n};\n","import { interface as dbusInterface } from '@jellybrick/dbus-next';\nimport { deepEqual } from 'fast-equals';\n\nimport { isLoopStatusValid, isPlaybackStatusValid } from '@/constants';\nimport * as types from '@/interfaces/types';\nimport { warn } from '@/logging';\n\nimport type { Player } from '@/player';\nimport type { EventsMap, Playlist, Track } from '@/types';\n\nconst { Interface } = dbusInterface;\n\ntype SettableProperty = 'Fullscreen' | 'Rate' | 'Shuffle' | 'Volume' | 'LoopStatus';\n\nconst settableEvent = {\n Fullscreen: 'fullscreen',\n Rate: 'rate',\n Shuffle: 'shuffle',\n Volume: 'volume',\n LoopStatus: 'loopStatus',\n} as const satisfies Record<SettableProperty, keyof EventsMap>;\n\nexport class MprisInterface extends Interface {\n player: Player;\n\n constructor(name: string, player: Player) {\n super(name);\n this.player = player;\n }\n\n protected _setPropertyInternal(property: SettableProperty, valueDbus: unknown): void {\n this.player.emit(settableEvent[property], valueDbus as never);\n }\n\n setProperty(property: string, valuePlain: unknown): void {\n // convert the plain value to a dbus value (default to the plain value)\n let valueDbus: unknown = valuePlain;\n\n if (property === 'Metadata') {\n valueDbus = types.metadataToDbus(valuePlain as Track);\n } else if (property === 'ActivePlaylist') {\n if (valuePlain) {\n valueDbus = [true, types.playlistToDbus(valuePlain as Playlist)];\n } else {\n valueDbus = [false, types.emptyPlaylist];\n }\n } else if (property === 'Tracks') {\n valueDbus = (valuePlain as Track[])\n .filter((t) => t['mpris:trackid'])\n .map((t) => t['mpris:trackid']);\n }\n\n if (!deepEqual(Reflect.get(this, `_${property}`), valueDbus)) {\n Reflect.set(this, `_${property}`, valueDbus);\n\n if (property === 'LoopStatus' && !isLoopStatusValid(valuePlain)) {\n warn(`setting player loop status to an invalid value: ${String(valuePlain)}`);\n } else if (property === 'PlaybackStatus' && !isPlaybackStatusValid(valuePlain)) {\n warn(`setting player playback status to an invalid value: ${String(valuePlain)}`);\n } else {\n Interface.emitPropertiesChanged(this, { [property]: valueDbus }, []);\n }\n }\n }\n}\n","import { interface as dbusInterface } from '@jellybrick/dbus-next';\n\nimport { MprisInterface } from '@/interfaces/mpris-interface';\n\nimport type { Player } from '@/player';\nimport type { RootInterfaceOptions } from '@/types';\n\nconst { property, method } = dbusInterface;\nconst ACCESS_READ = dbusInterface.ACCESS_READ as 'read';\n\nexport class RootInterface extends MprisInterface {\n constructor(player: Player, opts: RootInterfaceOptions = {}) {\n super('org.mpris.MediaPlayer2', player);\n\n if (opts.identity !== undefined) {\n this._Identity = opts.identity;\n }\n if (opts.supportedUriSchemes !== undefined) {\n this._SupportedUriSchemes = opts.supportedUriSchemes;\n }\n if (opts.supportedMimeTypes !== undefined) {\n this._SupportedMimeTypes = opts.supportedMimeTypes;\n }\n if (opts.desktopEntry !== undefined) {\n this._DesktopEntry = opts.desktopEntry;\n }\n }\n\n private _CanQuit = true;\n private _Fullscreen = false;\n private _CanSetFullscreen = false;\n private _CanRaise = true;\n private _HasTrackList = false;\n private _Identity = '';\n // TODO optional properties\n private _DesktopEntry = '';\n private _SupportedUriSchemes: string[] = [];\n private _SupportedMimeTypes: string[] = [];\n\n @property({ signature: 'b', access: ACCESS_READ })\n get CanQuit(): boolean {\n return this._CanQuit;\n }\n\n @property({ signature: 'b' })\n get Fullscreen(): boolean {\n return this._Fullscreen;\n }\n set Fullscreen(value: boolean) {\n this._setPropertyInternal('Fullscreen', value);\n }\n\n @property({ signature: 'b', access: ACCESS_READ })\n get CanSetFullscreen(): boolean {\n return this._CanSetFullscreen;\n }\n\n @property({ signature: 'b', access: ACCESS_READ })\n get CanRaise(): boolean {\n return this._CanRaise;\n }\n\n @property({ signature: 'b', access: ACCESS_READ })\n get HasTrackList(): boolean {\n return this._HasTrackList;\n }\n\n @property({ signature: 's', access: ACCESS_READ })\n get Identity(): string {\n return this._Identity;\n }\n\n @property({ signature: 's', access: ACCESS_READ })\n get DesktopEntry(): string {\n return this._DesktopEntry;\n }\n\n @property({ signature: 'as', access: ACCESS_READ })\n get SupportedUriSchemes(): string[] {\n return this._SupportedUriSchemes;\n }\n\n @property({ signature: 'as', access: ACCESS_READ })\n get SupportedMimeTypes(): string[] {\n return this._SupportedMimeTypes;\n }\n\n @method({})\n Raise(): void {\n this.player.emit('raise');\n }\n\n @method({})\n Quit(): void {\n this.player.emit('quit');\n }\n}\n","import { DBusError, interface as dbusInterface, type Variant } from '@jellybrick/dbus-next';\n\nimport {\n isLoopStatusValid,\n isPlaybackStatusValid,\n LOOP_STATUS_NONE,\n PLAYBACK_STATUS_STOPPED,\n} from '@/constants';\nimport { MprisInterface } from '@/interfaces/mpris-interface';\n\nimport type { Player } from '@/player';\n\nconst { property, method, signal } = dbusInterface;\n\nexport class PlayerInterface extends MprisInterface {\n constructor(player: Player) {\n super('org.mpris.MediaPlayer2.Player', player);\n }\n\n private _CanControl = true;\n private _CanPause = true;\n private _CanPlay = true;\n private _CanSeek = true;\n private _CanGoNext = true;\n private _CanGoPrevious = true;\n private _Metadata: Record<string, Variant> = {};\n private _MaximumRate = 1;\n private _MinimumRate = 1;\n private _Rate = 1;\n private _Shuffle = false;\n private _Volume = 0;\n private _LoopStatus = LOOP_STATUS_NONE;\n private _PlaybackStatus = PLAYBACK_STATUS_STOPPED;\n\n @property({ signature: 'b', access: dbusInterface.ACCESS_READ })\n get CanControl(): boolean {\n return this._CanControl;\n }\n\n @property({ signature: 'b', access: dbusInterface.ACCESS_READ })\n get CanPause(): boolean {\n return this._CanPause;\n }\n\n @property({ signature: 'b', access: dbusInterface.ACCESS_READ })\n get CanPlay(): boolean {\n return this._CanPlay;\n }\n\n @property({ signature: 'b', access: dbusInterface.ACCESS_READ })\n get CanSeek(): boolean {\n return this._CanSeek;\n }\n\n @property({ signature: 'b', access: dbusInterface.ACCESS_READ })\n get CanGoNext(): boolean {\n return this._CanGoNext;\n }\n\n @property({ signature: 'b', access: dbusInterface.ACCESS_READ })\n get CanGoPrevious(): boolean {\n return this._CanGoPrevious;\n }\n\n @property({ signature: 'a{sv}', access: dbusInterface.ACCESS_READ })\n get Metadata(): Record<string, Variant> {\n return this._Metadata;\n }\n\n @property({ signature: 'd', access: dbusInterface.ACCESS_READ })\n get MaximumRate(): number {\n return this._MaximumRate;\n }\n\n @property({ signature: 'd', access: dbusInterface.ACCESS_READ })\n get MinimumRate(): number {\n return this._MinimumRate;\n }\n\n @property({ signature: 'd' })\n get Rate(): number {\n return this._Rate;\n }\n set Rate(value: number) {\n this._setPropertyInternal('Rate', value);\n }\n\n @property({ signature: 'b' })\n get Shuffle(): boolean {\n return this._Shuffle;\n }\n set Shuffle(value: boolean) {\n this._setPropertyInternal('Shuffle', value);\n }\n\n @property({ signature: 'd' })\n get Volume(): number {\n return this._Volume;\n }\n set Volume(value: number) {\n this._setPropertyInternal('Volume', value);\n }\n\n @property({ signature: 'x', access: dbusInterface.ACCESS_READ })\n get Position(): number {\n const playerPosition = this.player.getPosition();\n const position = Math.floor(playerPosition || 0);\n if (isNaN(position)) {\n const err = 'github.mpris_service.InvalidPositionError';\n const message = `The player has set an invalid position: ${playerPosition}`;\n throw new DBusError(err, message);\n }\n return position;\n }\n\n @property({ signature: 's' })\n get LoopStatus(): string {\n if (!isLoopStatusValid(this._LoopStatus)) {\n const err = 'github.mpris_service.InvalidLoopStatusError';\n const message = `The player has set an invalid loop status: ${this._LoopStatus}`;\n throw new DBusError(err, message);\n }\n\n return this._LoopStatus;\n }\n set LoopStatus(value: string) {\n if (!isLoopStatusValid(value)) {\n const err = 'github.mpris_service.InvalidLoopStatusError';\n const message = `Tried to set loop status to an invalid value: ${value}`;\n throw new DBusError(err, message);\n }\n this._setPropertyInternal('LoopStatus', value);\n }\n\n @property({ signature: 's', access: dbusInterface.ACCESS_READ })\n get PlaybackStatus(): string {\n if (!isPlaybackStatusValid(this._PlaybackStatus)) {\n const err = 'github.mpris_service.InvalidPlaybackStatusError';\n const message = `The player has set an invalid playback status: ${this._PlaybackStatus}`;\n throw new DBusError(err, message);\n }\n\n return this._PlaybackStatus;\n }\n\n @method({})\n Next(): void {\n this.player.emit('next');\n }\n\n @method({})\n Previous(): void {\n this.player.emit('previous');\n }\n\n @method({})\n Pause(): void {\n this.player.emit('pause');\n }\n\n @method({})\n PlayPause(): void {\n this.player.emit('playpause');\n }\n\n @method({})\n Stop(): void {\n this.player.emit('stop');\n }\n\n @method({})\n Play(): void {\n this.player.emit('play');\n }\n\n @method({ inSignature: 'x' })\n Seek(offset: bigint): void {\n // XXX overflow\n this.player.emit('seek', Number(offset));\n }\n\n @method({ inSignature: 'ox' })\n SetPosition(trackId: string, position: bigint): void {\n this.player.emit('position', {\n trackId,\n // XXX overflow\n position: Number(position),\n });\n }\n\n @method({ inSignature: 's' })\n OpenUri(uri: string): void {\n this.player.emit('open', { uri });\n }\n\n @signal({ signature: 'x' })\n Seeked(position: number): number {\n return position;\n }\n}\n","import { interface as dbusInterface } from '@jellybrick/dbus-next';\n\nimport { MprisInterface } from '@/interfaces/mpris-interface';\nimport * as types from '@/interfaces/types';\n\nimport type { Player } from '@/player';\nimport type { Playlist } from '@/types';\n\nconst { property, method, signal } = dbusInterface;\nconst ACCESS_READ = dbusInterface.ACCESS_READ as 'read';\n\nexport class PlaylistsInterface extends MprisInterface {\n constructor(player: Player) {\n super('org.mpris.MediaPlayer2.Playlists', player);\n }\n\n private _ActivePlaylist: [boolean, [string, string, string]] = [false, types.emptyPlaylist];\n private _PlaylistCount = 0;\n\n @property({ signature: 'u', access: ACCESS_READ })\n get PlaylistCount(): number {\n return this._PlaylistCount;\n }\n\n @property({ signature: 'as', access: ACCESS_READ })\n get Orderings(): string[] {\n return ['Alphabetical', 'UserDefined'];\n }\n\n @property({ signature: '(b(oss))', access: ACCESS_READ })\n get ActivePlaylist(): [boolean, [string, string, string]] {\n return this._ActivePlaylist;\n }\n\n setActivePlaylistId(playlistId: string): void {\n const i = this.player.getPlaylistIndex(playlistId);\n\n this.setProperty('ActivePlaylist', this.player.playlists[i] || null);\n }\n\n @method({ inSignature: 'o' })\n ActivatePlaylist(playlistId: string): void {\n this.player.emit('activatePlaylist', playlistId);\n }\n\n @method({ inSignature: 'uusb', outSignature: 'a(oss)' })\n GetPlaylists(\n index: number,\n maxCount: number,\n order: string,\n reverseOrder: boolean,\n ): [string, string, string][] {\n if (!this.player.playlists) {\n return [];\n }\n\n const result = this.player.playlists\n .sort((a, b) => {\n let ret = 1;\n switch (order) {\n case 'Alphabetical':\n ret = a.Name > b.Name ? 1 : -1;\n break;\n // case 'CreationDate':\n // case 'ModifiedDate':\n // case 'LastPlayDate':\n case 'UserDefined':\n break;\n }\n return ret;\n })\n .slice(index, maxCount + index)\n .map((p) => types.playlistToDbus(p));\n\n if (reverseOrder) {\n result.reverse();\n }\n\n return result;\n }\n\n @signal({ signature: '(oss)' })\n PlaylistChanged(playlist: Playlist): [string, string, string] {\n return types.playlistToDbus(playlist);\n }\n}\n","import { interface as dbusInterface, type Variant } from '@jellybrick/dbus-next';\n\nimport { MprisInterface } from '@/interfaces/mpris-interface';\nimport * as types from '@/interfaces/types';\n\nimport type { Player } from '@/player';\nimport type { Track } from '@/types';\n\nconst { property, method, signal } = dbusInterface;\nconst ACCESS_READ = dbusInterface.ACCESS_READ as 'read';\n\nexport class TracklistInterface extends MprisInterface {\n constructor(player: Player) {\n super('org.mpris.MediaPlayer2.TrackList', player);\n }\n\n private _Tracks: string[] = [];\n private _CanEditTracks = false;\n\n setTracks(tracksPlain: Track[]): void {\n this.setProperty('Tracks', tracksPlain);\n }\n\n @property({ signature: 'ao', access: ACCESS_READ })\n get Tracks(): string[] {\n return this._Tracks;\n }\n\n @property({ signature: 'b', access: ACCESS_READ })\n get CanEditTracks(): boolean {\n return this._CanEditTracks;\n }\n\n @method({ inSignature: 'ao', outSignature: 'aa{sv}' })\n GetTracksMetadata(trackIds: string[]): Record<string, Variant>[] {\n return this.player.tracks\n .filter((t) => {\n return trackIds.some((id) => id === t['mpris:trackid']);\n })\n .map((t) => types.metadataToDbus(t));\n }\n\n @method({ inSignature: 'sob' })\n AddTrack(uri: string, afterTrack: string, setAsCurrent: boolean): void {\n this.player.emit('addTrack', { uri, afterTrack, setAsCurrent });\n }\n\n @method({ inSignature: 'o' })\n RemoveTrack(trackId: string): void {\n this.player.emit('removeTrack', trackId);\n }\n\n @method({ inSignature: 'o' })\n GoTo(trackId: string): void {\n this.player.emit('goTo', trackId);\n }\n\n @signal({ signature: 'aoo' })\n TrackListReplaced(replacedPlain: Track[]): [string[], string] {\n this.setTracks(replacedPlain);\n // TODO what's the active track?\n return [this._Tracks, '/org/mpris/MediaPlayer2/TrackList/NoTrack'];\n }\n\n @signal({ signature: 'a{sv}' })\n TrackAdded(metadata: Track): Record<string, Variant> {\n return types.metadataToDbus(metadata);\n }\n\n @signal({ signature: 'o' })\n TrackRemoved(path: string): string {\n return path;\n }\n\n @signal({ signature: 'oa{sv}' })\n TrackMetadataChanged(path: string, metadata: Track): [string, Record<string, Variant>] {\n return [path, types.metadataToDbus(metadata)];\n }\n}\n","import { EventEmitter } from 'node:events';\n\nimport { NameFlag, RequestNameReply, sessionBus, validators } from '@jellybrick/dbus-next';\n\nimport * as constants from '@/constants';\nimport {\n PlayerInterface,\n PlaylistsInterface,\n RootInterface,\n TracklistInterface,\n type MprisInterface,\n} from '@/interfaces';\nimport * as types from '@/interfaces/types';\n\nimport type {\n EventsMap,\n Interfaces,\n LoopStatus,\n PlayBackStatus,\n Playlist,\n PlayerOptions,\n Track,\n} from '@/types';\nimport type { MessageBus } from '@jellybrick/dbus-next';\n\nconst MPRIS_PATH = '/org/mpris/MediaPlayer2';\n\nconst lcfirst = (str: string): string => {\n return str.charAt(0).toLowerCase() + str.substring(1);\n};\n\ninterface PlayerInterfaces {\n root?: RootInterface;\n player?: PlayerInterface;\n tracklist?: TracklistInterface;\n playlists?: PlaylistsInterface;\n}\n\n// oxlint-disable-next-line typescript/no-unsafe-declaration-merging\nexport interface Player {\n identity: string;\n fullscreen: boolean;\n supportedUriSchemes: string[];\n supportedMimeTypes: string[];\n canQuit: boolean;\n canRaise: boolean;\n canSetFullscreen: boolean;\n hasTrackList: boolean;\n desktopEntry: string;\n playbackStatus: PlayBackStatus;\n loopStatus: LoopStatus;\n rate: number;\n shuffle: boolean;\n metadata: Track;\n volume: number;\n canControl: boolean;\n canPause: boolean;\n canPlay: boolean;\n canSeek: boolean;\n canGoNext: boolean;\n canGoPrevious: boolean;\n minimumRate: number;\n maximumRate: number;\n canEditTracks: boolean;\n tracks: Track[];\n playlistCount: number;\n activePlaylist: string;\n playlists: Playlist[];\n}\n\nexport class Player extends EventEmitter<EventsMap> {\n name: string;\n supportedInterfaces: Interfaces[];\n serviceName!: string;\n private _bus!: MessageBus;\n interfaces: PlayerInterfaces = {};\n private _tracks: Track[] = [];\n\n constructor(options: PlayerOptions) {\n super();\n\n this.name = options.name;\n this.supportedInterfaces = options.supportedInterfaces ?? ['player'];\n this._tracks = [];\n this.init(options).catch((err: unknown) => {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n });\n }\n\n private async init(opts: PlayerOptions): Promise<void> {\n this.serviceName = `org.mpris.MediaPlayer2.${this.name}`;\n validators.assertBusNameValid(this.serviceName);\n\n this._bus = sessionBus();\n\n this._bus.on('error', (err: unknown) => {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n });\n\n this.interfaces = {};\n\n this.#addRootInterface(opts);\n\n if (this.supportedInterfaces.indexOf('player') >= 0) {\n this.#addPlayerInterface();\n }\n if (this.supportedInterfaces.indexOf('trackList') >= 0) {\n this.#addTracklistInterface();\n }\n if (this.supportedInterfaces.indexOf('playlists') >= 0) {\n this.#addPlaylistsInterface();\n }\n\n for (const iface of Object.values(this.interfaces)) {\n if (iface !== undefined) {\n this._bus.export(MPRIS_PATH, iface);\n }\n }\n\n try {\n const reply = await this._bus.requestName(this.serviceName, NameFlag.DO_NOT_QUEUE);\n if (reply === RequestNameReply.EXISTS) {\n this.serviceName = `${this.serviceName}.instance${process.pid}`;\n await this._bus.requestName(this.serviceName);\n }\n } catch (err) {\n this.emit('error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n #addRootInterface(opts: PlayerOptions): void {\n this.interfaces.root = new RootInterface(this, opts);\n this.#addEventedPropertiesList(this.interfaces.root, [\n 'Identity',\n 'Fullscreen',\n 'SupportedUriSchemes',\n 'SupportedMimeTypes',\n 'CanQuit',\n 'CanRaise',\n 'CanSetFullscreen',\n 'HasTrackList',\n 'DesktopEntry',\n ]);\n }\n\n #addPlayerInterface(): void {\n this.interfaces.player = new PlayerInterface(this);\n const eventedProps = [\n 'PlaybackStatus',\n 'LoopStatus',\n 'Rate',\n 'Shuffle',\n 'Metadata',\n 'Volume',\n 'CanControl',\n 'CanPause',\n 'CanPlay',\n 'CanSeek',\n 'CanGoNext',\n 'CanGoPrevious',\n 'MinimumRate',\n 'MaximumRate',\n ];\n this.#addEventedPropertiesList(this.interfaces.player, eventedProps);\n }\n\n #addTracklistInterface(): void {\n this.interfaces.tracklist = new TracklistInterface(this);\n this.#addEventedPropertiesList(this.interfaces.tracklist, ['CanEditTracks']);\n\n Object.defineProperty(this, 'tracks', {\n get: () => {\n return this._tracks;\n },\n set: (value: Track[]) => {\n this._tracks = value;\n this.interfaces.tracklist?.TrackListReplaced(value);\n },\n enumerable: true,\n configurable: true,\n });\n }\n\n #addPlaylistsInterface(): void {\n this.interfaces.playlists = new PlaylistsInterface(this);\n this.#addEventedPropertiesList(this.interfaces.playlists, ['PlaylistCount', 'ActivePlaylist']);\n }\n\n /**\n * Get a valid object path with the `subpath` as the basename which is suitable\n * for use as an id.\n *\n * @name Player#objectPath\n * @function\n * @param {String} subpath - The basename of this path\n * @returns {String} - A valid object path that can be used as an id.\n */\n objectPath(subpath?: string): string {\n let path = `/org/node/mediaplayer/${this.name}`;\n if (subpath) {\n path += `/${subpath}`;\n }\n return path;\n }\n\n #addEventedProperty(iface: MprisInterface, name: string): void {\n const localName = lcfirst(name);\n\n Object.defineProperty(this, localName, {\n get: () => {\n const value = Reflect.get(iface, name);\n if (name === 'ActivePlaylist') {\n return types.playlistToPlain(value as [string, string, string]);\n } else if (name === 'Metadata') {\n return types.metadataToPlain(value as Record<string, unknown>);\n }\n return value;\n },\n set: (value: unknown) => {\n iface.setProperty(name, value);\n },\n enumerable: true,\n configurable: true,\n });\n }\n\n #addEventedPropertiesList(iface: MprisInterface, props: string[]): void {\n for (const prop of props) {\n this.#addEventedProperty(iface, prop);\n }\n }\n\n /**\n * Gets the position of this player. This method is intended to be overridden\n * by the user to return the position of the player in microseconds.\n *\n * @name Player#getPosition\n * @function\n * @returns {Number} - The current position of the player in microseconds. (Integer)\n */\n getPosition(): number {\n return 0;\n }\n\n /**\n * Emits the `Seeked` DBus signal to listening clients with the given position.\n *\n * @name Player#seeked\n * @function\n * @param {Number} position - The position in microseconds. (Integer)\n */\n seeked(position: number): void {\n const seekTo = Math.floor(position || 0);\n if (isNaN(seekTo)) {\n throw new Error(`seeked expected a number (got ${position})`);\n }\n this.interfaces.player?.Seeked(seekTo);\n }\n\n getTrackIndex(trackId: string): number {\n for (let i = 0; i < this.tracks.length; i++) {\n const track = this.tracks[i];\n\n if (track?.['mpris:trackid'] === trackId) {\n return i;\n }\n }\n\n return -1;\n }\n\n getTrack(trackId: string): Track | undefined {\n return this.tracks[this.getTrackIndex(trackId)];\n }\n\n addTrack(track: Track): void {\n this.tracks.push(track);\n this.interfaces.tracklist?.setTracks(this.tracks);\n\n let afterTrack = '/org/mpris/MediaPlayer2/TrackList/NoTrack';\n if (this.tracks.length > 2) {\n const previous = this.tracks[this.tracks.length - 2];\n if (previous?.['mpris:trackid'] !== undefined) {\n afterTrack = previous['mpris:trackid'];\n }\n }\n this.interfaces.tracklist?.TrackAdded(afterTrack as unknown as Track);\n }\n\n removeTrack(trackId: string): void {\n const i = this.getTrackIndex(trackId);\n this.tracks.splice(i, 1);\n this.interfaces.tracklist?.setTracks(this.tracks);\n\n this.interfaces.tracklist?.TrackRemoved(trackId);\n }\n\n /**\n * Get the index of a playlist entry in the `playlists` list property of the\n * player from the given id.\n *\n * @name Player#getPlaylistIndex\n * @function\n * @param {String} playlistId - The id for the playlist entry.\n */\n getPlaylistIndex(playlistId: string): number {\n for (let i = 0; i < this.playlists.length; i++) {\n const playlist = this.playlists[i];\n\n if (playlist?.Id === playlistId) {\n return i;\n }\n }\n\n return -1;\n }\n\n /**\n * Set the list of playlists advertised to listeners on the bus. Each playlist\n * must have string members `Id`, `Name`, and `Icon`.\n *\n * @name Player#setPlaylists\n * @function\n * @param {Array} playlists - A list of playlists.\n */\n setPlaylists(playlists: Playlist[]): void {\n this.playlists = playlists;\n this.playlistCount = playlists.length;\n\n this.playlists.forEach((playlist) => {\n if (playlist) {\n this.interfaces.playlists?.PlaylistChanged(playlist);\n }\n });\n }\n\n /**\n * Set the playlist identified by `playlistId` to be the currently active\n * playlist.\n *\n * @name Player#setActivePlaylist\n * @function\n * @param {String} playlistId - The id of the playlist to activate.\n */\n setActivePlaylist(playlistId: string): void {\n this.interfaces.playlists?.setActivePlaylistId(playlistId);\n }\n\n static PLAYBACK_STATUS_PLAYING: PlayBackStatus = constants.PLAYBACK_STATUS_PLAYING;\n static PLAYBACK_STATUS_PAUSED: PlayBackStatus = constants.PLAYBACK_STATUS_PAUSED;\n static PLAYBACK_STATUS_STOPPED: PlayBackStatus = constants.PLAYBACK_STATUS_STOPPED;\n static LOOP_STATUS_NONE: LoopStatus = constants.LOOP_STATUS_NONE;\n static LOOP_STATUS_TRACK: LoopStatus = constants.LOOP_STATUS_TRACK;\n static LOOP_STATUS_PLAYLIST: LoopStatus = constants.LOOP_STATUS_PLAYLIST;\n}\n","import { Player } from '@/player';\n\nexport type * from '@/types';\n\nexport default Player;\n"],"mappings":"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"}
@@ -0,0 +1,314 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { Variant } from "@jellybrick/dbus-next";
3
+
4
+ //#region src/interfaces/mpris-interface.d.ts
5
+ declare const Interface: typeof import("@jellybrick/dbus-next").Interface;
6
+ type SettableProperty = 'Fullscreen' | 'Rate' | 'Shuffle' | 'Volume' | 'LoopStatus';
7
+ declare class MprisInterface extends Interface {
8
+ player: Player;
9
+ constructor(name: string, player: Player);
10
+ protected _setPropertyInternal(property: SettableProperty, valueDbus: unknown): void;
11
+ setProperty(property: string, valuePlain: unknown): void;
12
+ }
13
+ //#endregion
14
+ //#region src/types.d.ts
15
+ type PlayBackStatus = 'Playing' | 'Paused' | 'Stopped';
16
+ type LoopStatus = 'None' | 'Track' | 'Playlist';
17
+ type Interfaces = 'player' | 'trackList' | 'playlists';
18
+ interface Playlist {
19
+ Id: string;
20
+ Name: string;
21
+ Icon: string;
22
+ }
23
+ interface Track {
24
+ 'mpris:trackid'?: string;
25
+ 'mpris:length'?: number;
26
+ 'mpris:artUrl'?: string;
27
+ 'xesam:album'?: string;
28
+ 'xesam:albumArtist'?: string[];
29
+ 'xesam:artist'?: string[];
30
+ 'xesam:asText'?: string;
31
+ 'xesam:audioBPM'?: number;
32
+ 'xesam:autoRating'?: number;
33
+ 'xesam:comment'?: string[];
34
+ 'xesam:composer'?: string[];
35
+ 'xesam:contentCreated'?: string;
36
+ 'xesam:discNumber'?: number;
37
+ 'xesam:firstUsed'?: string;
38
+ 'xesam:genre'?: string[];
39
+ 'xesam:lastUsed'?: string;
40
+ 'xesam:lyricist'?: string[];
41
+ 'xesam:title'?: string;
42
+ 'xesam:trackNumber'?: number;
43
+ 'xesam:url'?: string;
44
+ 'xesam:useCount'?: number;
45
+ 'xesam:userRating'?: number;
46
+ }
47
+ interface Position {
48
+ trackId: string;
49
+ position: number;
50
+ }
51
+ interface RootInterfaceOptions {
52
+ identity?: string;
53
+ supportedUriSchemes?: string[];
54
+ supportedMimeTypes?: string[];
55
+ desktopEntry?: string;
56
+ }
57
+ interface AdditionalPlayerOptions {
58
+ name: string;
59
+ supportedInterfaces?: Interfaces[];
60
+ }
61
+ type PlayerOptions = RootInterfaceOptions & AdditionalPlayerOptions;
62
+ interface Events {
63
+ raise: void;
64
+ quit: void;
65
+ fullscreen: boolean;
66
+ next: void;
67
+ previous: void;
68
+ pause: void;
69
+ playpause: void;
70
+ stop: void;
71
+ play: void;
72
+ seek: number;
73
+ position: Position;
74
+ open: {
75
+ uri: string;
76
+ };
77
+ volume: number;
78
+ shuffle: boolean;
79
+ rate: number;
80
+ loopStatus: LoopStatus;
81
+ addTrack: {
82
+ uri: string;
83
+ afterTrack: string;
84
+ setAsCurrent: boolean;
85
+ };
86
+ removeTrack: string;
87
+ goTo: string;
88
+ activatePlaylist: string;
89
+ error: Error;
90
+ }
91
+ type ToArgs<T> = [T] extends [void] ? [] : [data: T];
92
+ type EventsMap = { [K in keyof Events]: ToArgs<Events[K]> };
93
+ //#endregion
94
+ //#region src/interfaces/root.d.ts
95
+ declare class RootInterface extends MprisInterface {
96
+ constructor(player: Player, opts?: RootInterfaceOptions);
97
+ private _CanQuit;
98
+ private _Fullscreen;
99
+ private _CanSetFullscreen;
100
+ private _CanRaise;
101
+ private _HasTrackList;
102
+ private _Identity;
103
+ private _DesktopEntry;
104
+ private _SupportedUriSchemes;
105
+ private _SupportedMimeTypes;
106
+ get CanQuit(): boolean;
107
+ get Fullscreen(): boolean;
108
+ set Fullscreen(value: boolean);
109
+ get CanSetFullscreen(): boolean;
110
+ get CanRaise(): boolean;
111
+ get HasTrackList(): boolean;
112
+ get Identity(): string;
113
+ get DesktopEntry(): string;
114
+ get SupportedUriSchemes(): string[];
115
+ get SupportedMimeTypes(): string[];
116
+ Raise(): void;
117
+ Quit(): void;
118
+ }
119
+ //#endregion
120
+ //#region src/interfaces/player.d.ts
121
+ declare class PlayerInterface extends MprisInterface {
122
+ constructor(player: Player);
123
+ private _CanControl;
124
+ private _CanPause;
125
+ private _CanPlay;
126
+ private _CanSeek;
127
+ private _CanGoNext;
128
+ private _CanGoPrevious;
129
+ private _Metadata;
130
+ private _MaximumRate;
131
+ private _MinimumRate;
132
+ private _Rate;
133
+ private _Shuffle;
134
+ private _Volume;
135
+ private _LoopStatus;
136
+ private _PlaybackStatus;
137
+ get CanControl(): boolean;
138
+ get CanPause(): boolean;
139
+ get CanPlay(): boolean;
140
+ get CanSeek(): boolean;
141
+ get CanGoNext(): boolean;
142
+ get CanGoPrevious(): boolean;
143
+ get Metadata(): Record<string, Variant>;
144
+ get MaximumRate(): number;
145
+ get MinimumRate(): number;
146
+ get Rate(): number;
147
+ set Rate(value: number);
148
+ get Shuffle(): boolean;
149
+ set Shuffle(value: boolean);
150
+ get Volume(): number;
151
+ set Volume(value: number);
152
+ get Position(): number;
153
+ get LoopStatus(): string;
154
+ set LoopStatus(value: string);
155
+ get PlaybackStatus(): string;
156
+ Next(): void;
157
+ Previous(): void;
158
+ Pause(): void;
159
+ PlayPause(): void;
160
+ Stop(): void;
161
+ Play(): void;
162
+ Seek(offset: bigint): void;
163
+ SetPosition(trackId: string, position: bigint): void;
164
+ OpenUri(uri: string): void;
165
+ Seeked(position: number): number;
166
+ }
167
+ //#endregion
168
+ //#region src/interfaces/playlists.d.ts
169
+ declare class PlaylistsInterface extends MprisInterface {
170
+ constructor(player: Player);
171
+ private _ActivePlaylist;
172
+ private _PlaylistCount;
173
+ get PlaylistCount(): number;
174
+ get Orderings(): string[];
175
+ get ActivePlaylist(): [boolean, [string, string, string]];
176
+ setActivePlaylistId(playlistId: string): void;
177
+ ActivatePlaylist(playlistId: string): void;
178
+ GetPlaylists(index: number, maxCount: number, order: string, reverseOrder: boolean): [string, string, string][];
179
+ PlaylistChanged(playlist: Playlist): [string, string, string];
180
+ }
181
+ //#endregion
182
+ //#region src/interfaces/tracklist.d.ts
183
+ declare class TracklistInterface extends MprisInterface {
184
+ constructor(player: Player);
185
+ private _Tracks;
186
+ private _CanEditTracks;
187
+ setTracks(tracksPlain: Track[]): void;
188
+ get Tracks(): string[];
189
+ get CanEditTracks(): boolean;
190
+ GetTracksMetadata(trackIds: string[]): Record<string, Variant>[];
191
+ AddTrack(uri: string, afterTrack: string, setAsCurrent: boolean): void;
192
+ RemoveTrack(trackId: string): void;
193
+ GoTo(trackId: string): void;
194
+ TrackListReplaced(replacedPlain: Track[]): [string[], string];
195
+ TrackAdded(metadata: Track): Record<string, Variant>;
196
+ TrackRemoved(path: string): string;
197
+ TrackMetadataChanged(path: string, metadata: Track): [string, Record<string, Variant>];
198
+ }
199
+ //#endregion
200
+ //#region src/player.d.ts
201
+ interface PlayerInterfaces {
202
+ root?: RootInterface;
203
+ player?: PlayerInterface;
204
+ tracklist?: TracklistInterface;
205
+ playlists?: PlaylistsInterface;
206
+ }
207
+ interface Player {
208
+ identity: string;
209
+ fullscreen: boolean;
210
+ supportedUriSchemes: string[];
211
+ supportedMimeTypes: string[];
212
+ canQuit: boolean;
213
+ canRaise: boolean;
214
+ canSetFullscreen: boolean;
215
+ hasTrackList: boolean;
216
+ desktopEntry: string;
217
+ playbackStatus: PlayBackStatus;
218
+ loopStatus: LoopStatus;
219
+ rate: number;
220
+ shuffle: boolean;
221
+ metadata: Track;
222
+ volume: number;
223
+ canControl: boolean;
224
+ canPause: boolean;
225
+ canPlay: boolean;
226
+ canSeek: boolean;
227
+ canGoNext: boolean;
228
+ canGoPrevious: boolean;
229
+ minimumRate: number;
230
+ maximumRate: number;
231
+ canEditTracks: boolean;
232
+ tracks: Track[];
233
+ playlistCount: number;
234
+ activePlaylist: string;
235
+ playlists: Playlist[];
236
+ }
237
+ declare class Player extends EventEmitter<EventsMap> {
238
+ #private;
239
+ name: string;
240
+ supportedInterfaces: Interfaces[];
241
+ serviceName: string;
242
+ private _bus;
243
+ interfaces: PlayerInterfaces;
244
+ private _tracks;
245
+ constructor(options: PlayerOptions);
246
+ private init;
247
+ /**
248
+ * Get a valid object path with the `subpath` as the basename which is suitable
249
+ * for use as an id.
250
+ *
251
+ * @name Player#objectPath
252
+ * @function
253
+ * @param {String} subpath - The basename of this path
254
+ * @returns {String} - A valid object path that can be used as an id.
255
+ */
256
+ objectPath(subpath?: string): string;
257
+ /**
258
+ * Gets the position of this player. This method is intended to be overridden
259
+ * by the user to return the position of the player in microseconds.
260
+ *
261
+ * @name Player#getPosition
262
+ * @function
263
+ * @returns {Number} - The current position of the player in microseconds. (Integer)
264
+ */
265
+ getPosition(): number;
266
+ /**
267
+ * Emits the `Seeked` DBus signal to listening clients with the given position.
268
+ *
269
+ * @name Player#seeked
270
+ * @function
271
+ * @param {Number} position - The position in microseconds. (Integer)
272
+ */
273
+ seeked(position: number): void;
274
+ getTrackIndex(trackId: string): number;
275
+ getTrack(trackId: string): Track | undefined;
276
+ addTrack(track: Track): void;
277
+ removeTrack(trackId: string): void;
278
+ /**
279
+ * Get the index of a playlist entry in the `playlists` list property of the
280
+ * player from the given id.
281
+ *
282
+ * @name Player#getPlaylistIndex
283
+ * @function
284
+ * @param {String} playlistId - The id for the playlist entry.
285
+ */
286
+ getPlaylistIndex(playlistId: string): number;
287
+ /**
288
+ * Set the list of playlists advertised to listeners on the bus. Each playlist
289
+ * must have string members `Id`, `Name`, and `Icon`.
290
+ *
291
+ * @name Player#setPlaylists
292
+ * @function
293
+ * @param {Array} playlists - A list of playlists.
294
+ */
295
+ setPlaylists(playlists: Playlist[]): void;
296
+ /**
297
+ * Set the playlist identified by `playlistId` to be the currently active
298
+ * playlist.
299
+ *
300
+ * @name Player#setActivePlaylist
301
+ * @function
302
+ * @param {String} playlistId - The id of the playlist to activate.
303
+ */
304
+ setActivePlaylist(playlistId: string): void;
305
+ static PLAYBACK_STATUS_PLAYING: PlayBackStatus;
306
+ static PLAYBACK_STATUS_PAUSED: PlayBackStatus;
307
+ static PLAYBACK_STATUS_STOPPED: PlayBackStatus;
308
+ static LOOP_STATUS_NONE: LoopStatus;
309
+ static LOOP_STATUS_TRACK: LoopStatus;
310
+ static LOOP_STATUS_PLAYLIST: LoopStatus;
311
+ }
312
+ //#endregion
313
+ export { type AdditionalPlayerOptions, type Events, type EventsMap, type Interfaces, type LoopStatus, type PlayBackStatus, type PlayerOptions, type Playlist, type Position, type RootInterfaceOptions, type Track, Player as default };
314
+ //# sourceMappingURL=index.d.cts.map