@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.
- package/dist/index.cjs +2244 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +314 -0
- package/dist/index.d.mts +314 -0
- package/dist/index.mjs +2244 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +46 -28
- package/.dockerignore +0 -1
- package/.travis.yml +0 -9
- package/Dockerfile +0 -31
- package/Makefile +0 -14
- package/dist/constants.js +0 -20
- package/dist/constants.js.map +0 -1
- package/dist/index.js +0 -442
- package/dist/index.js.map +0 -1
- package/dist/interfaces/mpris-interface.js +0 -49
- package/dist/interfaces/mpris-interface.js.map +0 -1
- package/dist/interfaces/player.js +0 -406
- package/dist/interfaces/player.js.map +0 -1
- package/dist/interfaces/playlists.js +0 -139
- package/dist/interfaces/playlists.js.map +0 -1
- package/dist/interfaces/root.js +0 -216
- package/dist/interfaces/root.js.map +0 -1
- package/dist/interfaces/tracklist.js +0 -160
- package/dist/interfaces/tracklist.js.map +0 -1
- package/dist/interfaces/types.js +0 -78
- package/dist/interfaces/types.js.map +0 -1
- package/dist/logging.js +0 -14
- package/dist/logging.js.map +0 -1
- package/src/constants.js +0 -31
- package/src/index.js +0 -477
- package/src/interfaces/mpris-interface.js +0 -53
- package/src/interfaces/player.js +0 -204
- package/src/interfaces/playlists.js +0 -84
- package/src/interfaces/root.js +0 -99
- package/src/interfaces/tracklist.js +0 -85
- package/src/interfaces/types.js +0 -75
- package/src/logging.js +0 -13
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","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":";;;;AAEA,MAAaA,0BAA0C;AACvD,MAAaC,yBAAyC;AACtD,MAAaC,0BAA0C;AAEvD,MAAaC,mBAA+B;AAC5C,MAAaC,oBAAgC;AAC7C,MAAaC,uBAAmC;AAEhD,MAAMC,mBAAqC;CACzCN;CACAC;CACAC;;AAGF,MAAMK,eAA6B;CAACJ;CAAkBE;CAAsBD;;AAE5E,MAAaI,qBAAqBC,UAAAA;CAChC,OAAO,OAAOA,UAAU,YAAYF,aAAaG,SAASD,KAAAA;AAC5D;AAEA,MAAaE,yBAAyBF,UAAAA;CACpC,OAAO,OAAOA,UAAU,YAAYH,iBAAiBI,SAASD,KAAAA;AAChE;;;ACxBA,MAAMG,iBACJC,QAAQC,IAAIC,wBAAwBC,KAAAA,KAAaH,QAAQC,IAAIC,wBAAwB;AAQvF,MAAaM,QAAQH,YAAAA;CACnB,IAAIN,gBACFO,QAAQE,KAAKH,OAAAA;AAEjB;;;ACPA,MAAaM,0BAA0BC,KAAaC,UAAAA;CAClD,IAAID,QAAQ,iBACV,OAAO;MACF,IAAIA,QAAQ,gBACjB,OAAO;MACF,IAAI,OAAOC,UAAU,UAC1B,OAAO;MACF,IAAI,OAAOA,UAAU,WAC1B,OAAO;MACF,IAAI,OAAOA,UAAU,UAC1B,OAAO;MACF,IAAIC,MAAMC,QAAQF,KAAAA,KAAUA,MAAMG,OAAOC,MAAM,OAAOA,MAAM,QAAA,GACjE,OAAO;MACF;EAELP,KAAK,yCAAyCE,IAAI,IAAIM,OAAOL,KAAAA,GAAQ;EACrE,OAAO;CACT;AACF;AAEA,MAAaM,mBAAmBC,oBAAAA;CAC9B,MAAMC,gBAAyC,CAAC;CAChD,KAAK,MAAMC,KAAKC,OAAOC,KAAKJ,eAAAA,GAAkB;EAC5C,MAAMP,QAAQO,gBAAgBE;EAC9B,IAAIT,UAAUY,KAAAA,KAAaZ,UAAU,MAAM;GACzCH,KAAK,0CAA0CY,GAAG;GAClD;EACF;EACA,IAAIT,iBAAiBJ,SACnBY,cAAcC,KAAKT,MAAMA;OAEzBQ,cAAcC,KAAKT;CAEvB;CACA,OAAOQ;AACT;AAEA,MAAaK,kBAAkBL,kBAAAA;CAC7B,MAAMD,kBAA2C,CAAC;CAClD,MAAMO,QAAQN;CACd,KAAK,MAAMC,KAAKC,OAAOC,KAAKG,KAAAA,GAAQ;EAClC,MAAMd,QAAQc,MAAML;EACpB,MAAMM,YAAYjB,uBAAuBW,GAAGT,KAAAA;EAC5C,IAAIe,WACFR,gBAAgBE,KAAK,IAAIb,QAAQmB,WAAWf,KAAAA;CAEhD;CACA,OAAOO;AACT;AAEA,MAAaS,gBAA0C;CAAC;CAAK;CAAI;;AAEjE,MAAaC,kBAAkBC,aAAAA;CAC7B,IAAI,CAACA,UACH,OAAOF;CAGT,MAAM,EAAEG,IAAIC,MAAMC,SAASH;CAC3B,OAAO;EAACC;EAAIC;EAAMC;;AACpB;AAEA,MAAaC,mBAAmBC,SAAAA;CAC9B,MAAM,CAACJ,IAAIC,MAAMC,QAAQE;CACzB,OAAO;EAAEJ;EAAIC;EAAMC;CAAK;AAC1B;;;;;;;;;;;;;AC5DA,MAAM,EAAEU,cAAcN;AAItB,MAAMO,gBAAgB;CACpBC,YAAY;CACZC,MAAM;CACNC,SAAS;CACTC,QAAQ;CACRC,YAAY;AACd;AAEA,IAAaC,iBAAb,cAAoCP,UAAAA;CAQxBQ,qBAAqBC,UAA4BC,WAA0B;EACnF,KAAKC,OAAOC,KAAKX,cAAcQ,WAAWC,SAAAA;CAC5C;CAEAG,YAAYJ,UAAkBK,YAA2B;EAEvD,IAAIJ,YAAqBI;EAEzB,IAAIL,aAAa,YACfC,YAAYZ,eAAqBgB,UAAAA;OAC5B,IAAIL,aAAa,kBACtB,IAAIK,YACFJ,YAAY,CAAC,MAAMZ,eAAqBgB,UAAAA,CAAAA;OAExCJ,YAAY,CAAC,OAAOZ,aAAAA;OAEjB,IAAIW,aAAa,UACtBC,YAAY,WACTQ,QAAQC,MAAMA,EAAE,gBAAgB,CAAA,CAChCC,KAAKD,MAAMA,EAAE,gBAAgB;EAGlC,IAAI,CAACxB,UAAU0B,QAAQC,IAAI,MAAM,IAAIb,UAAU,GAAGC,SAAAA,GAAY;GAC5DW,QAAQE,IAAI,MAAM,IAAId,YAAYC,SAAAA;GAElC,IAAID,aAAa,gBAAgB,CAACb,kBAAkBkB,UAAAA,GAClDf,KAAK,mDAAmDyB,OAAOV,UAAAA,GAAa;QACvE,IAAIL,aAAa,oBAAoB,CAACZ,sBAAsBiB,UAAAA,GACjEf,KAAK,uDAAuDyB,OAAOV,UAAAA,GAAa;QAEhFd,UAAUyB,sBAAsB,MAAM,GAAGhB,WAAWC,UAAU,GAAG,CAAA,CAAE;EAEvE;CACF;CAtCA,YAAYgB,MAAcf,QAAgB;EACxC,MAAMe,IAAAA,GAHRf,mBAAAA,MAAAA,UAAAA,KAAAA,CAAAA;EAIE,KAAKA,SAASA;CAChB;AAoCF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACzDA,MAAM,EAAEmB,UAAAA,YAAUC,QAAAA,aAAWH;AAC7B,MAAMI,gBAAcJ,YAAcI;SA+B/BF,WAAS;CAAEG,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,UAK/CF,WAAS,EAAEG,WAAW,IAAI,CAAA,GAAA,UAQ1BH,WAAS;CAAEG,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,UAK/CF,WAAS;CAAEG,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,UAK/CF,WAAS;CAAEG,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,UAK/CF,WAAS;CAAEG,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,UAK/CF,WAAS;CAAEG,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,UAK/CF,WAAS;CAAEG,WAAW;CAAMC,QAAQF;AAAY,CAAA,GAAA,UAKhDF,WAAS;CAAEG,WAAW;CAAMC,QAAQF;AAAY,CAAA,GAAA,UAKhDD,SAAO,CAAC,CAAA,GAAA,WAKRA,SAAO,CAAC,CAAA;AAlFX,IAAaI,gBAAb,cAAmCN,eAAAA;CA6BjC,IACIO,UAAmB;EACrB,OAAO,KAAKC;CACd;CAEA,IACIC,aAAsB;EACxB,OAAO,KAAKC;CACd;CACA,IAAID,WAAWE,OAAgB;EAC7B,KAAKC,qBAAqB,cAAcD,KAAAA;CAC1C;CAEA,IACIE,mBAA4B;EAC9B,OAAO,KAAKC;CACd;CAEA,IACIC,WAAoB;EACtB,OAAO,KAAKC;CACd;CAEA,IACIC,eAAwB;EAC1B,OAAO,KAAKC;CACd;CAEA,IACIC,WAAmB;EACrB,OAAO,KAAKC;CACd;CAEA,IACIC,eAAuB;EACzB,OAAO,KAAKC;CACd;CAEA,IACIC,sBAAgC;EAClC,OAAO,KAAKC;CACd;CAEA,IACIC,qBAA+B;EACjC,OAAO,KAAKC;CACd;CAGAC,QAAc;EACZ,KAAKC,OAAOC,KAAK,OAAA;CACnB;CAGAC,OAAa;EACX,KAAKF,OAAOC,KAAK,MAAA;CACnB;CApFA,YAAYD,QAAgBG,OAA6B,CAAC,GAAG;EAC3D,MAAM,0BAA0BH,MAAAA,GAgBlC,mBAAA,MAAQpB,aAAAA,aAAAA,IAAAA,GAAW,KAAA,GACnB,mBAAA,MAAQE,eAAc,KAAA,GACtB,mBAAA,MAAQI,qBAAoB,KAAA,GAC5B,mBAAA,MAAQE,aAAY,IAAA,GACpB,mBAAA,MAAQE,iBAAgB,KAAA,GACxB,mBAAA,MAAQE,aAAY,EAAA,GAEpB,mBAAA,MAAQE,iBAAgB,EAAA,GACxB,mBAAA,MAAQE,wBAAiC,CAAA,CAAE,GAC3C,mBAAA,MAAQE,uBAAgC,CAAA,CAAE;EAvBxC,IAAIK,KAAKC,aAAaC,KAAAA,GACpB,KAAKb,YAAYW,KAAKC;EAExB,IAAID,KAAKG,wBAAwBD,KAAAA,GAC/B,KAAKT,uBAAuBO,KAAKG;EAEnC,IAAIH,KAAKI,uBAAuBF,KAAAA,GAC9B,KAAKP,sBAAsBK,KAAKI;EAElC,IAAIJ,KAAKK,iBAAiBH,KAAAA,GACxB,KAAKX,gBAAgBS,KAAKK;CAE9B;AAsEF;4CAtFa9B,eAAAA;;;;EA8BPC;;;;;EAKAE;;;;;EAQAI;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKJE;;;;;EAKAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjFF,MAAM,EAAEe,UAAAA,YAAUC,QAAAA,UAAQC,QAAAA,aAAWR;SAsBlCM,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS;CAAEG,WAAW;CAASC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAKjEL,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,UAK7DL,WAAS,EAAEG,WAAW,IAAI,CAAA,GAAA,SAQ1BH,WAAS,EAAEG,WAAW,IAAI,CAAA,GAAA,SAQ1BH,WAAS,EAAEG,WAAW,IAAI,CAAA,GAAA,SAQ1BH,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,SAY7DL,WAAS,EAAEG,WAAW,IAAI,CAAA,GAAA,SAmB1BH,WAAS;CAAEG,WAAW;CAAKC,QAAQV,YAAcW;AAAY,CAAA,GAAA,SAW7DJ,SAAO,CAAC,CAAA,GAAA,SAKRA,SAAO,CAAC,CAAA,GAAA,SAKRA,SAAO,CAAC,CAAA,GAAA,SAKRA,SAAO,CAAC,CAAA,GAAA,SAKRA,SAAO,CAAC,CAAA,GAAA,SAKRA,SAAO,CAAC,CAAA,GAAA,SAKRA,SAAO,EAAEK,aAAa,IAAI,CAAA,GAAA,SAM1BL,SAAO,EAAEK,aAAa,KAAK,CAAA,GAAA,SAS3BL,SAAO,EAAEK,aAAa,IAAI,CAAA,GAAA,SAK1BJ,SAAO,EAAEC,WAAW,IAAI,CAAA;AArL3B,IAAaI,kBAAb,cAAqCR,eAAAA;CAoBnC,IACIS,aAAsB;EACxB,OAAO,KAAKC;CACd;CAEA,IACIC,WAAoB;EACtB,OAAO,KAAKC;CACd;CAEA,IACIC,UAAmB;EACrB,OAAO,KAAKC;CACd;CAEA,IACIC,UAAmB;EACrB,OAAO,KAAKC;CACd;CAEA,IACIC,YAAqB;EACvB,OAAO,KAAKC;CACd;CAEA,IACIC,gBAAyB;EAC3B,OAAO,KAAKC;CACd;CAEA,IACIC,WAAoC;EACtC,OAAO,KAAKC;CACd;CAEA,IACIC,cAAsB;EACxB,OAAO,KAAKC;CACd;CAEA,IACIC,cAAsB;EACxB,OAAO,KAAKC;CACd;CAEA,IACIC,OAAe;EACjB,OAAO,KAAKC;CACd;CACA,IAAID,KAAKE,OAAe;EACtB,KAAKC,qBAAqB,QAAQD,KAAAA;CACpC;CAEA,IACIE,UAAmB;EACrB,OAAO,KAAKC;CACd;CACA,IAAID,QAAQF,OAAgB;EAC1B,KAAKC,qBAAqB,WAAWD,KAAAA;CACvC;CAEA,IACII,SAAiB;EACnB,OAAO,KAAKC;CACd;CACA,IAAID,OAAOJ,OAAe;EACxB,KAAKC,qBAAqB,UAAUD,KAAAA;CACtC;CAEA,IACIM,WAAmB;EACrB,MAAMC,iBAAiB,KAAKC,OAAOC,YAAW;EAC9C,MAAMC,WAAWC,KAAKC,MAAML,kBAAkB,CAAA;EAC9C,IAAIM,MAAMH,QAAAA,GAGR,MAAM,IAAI9C,UAAUkD,6CAAKC,2CADkCR,gBAClCQ;EAE3B,OAAOL;CACT;CAEA,IACIM,aAAqB;EACvB,IAAI,CAACjD,kBAAkB,KAAKkD,WAAW,GAGrC,MAAM,IAAIrD,UAAUkD,+CAAKC,8CADqC,KAAKE,aAC1CF;EAG3B,OAAO,KAAKE;CACd;CACA,IAAID,WAAWhB,OAAe;EAC5B,IAAI,CAACjC,kBAAkBiC,KAAAA,GAGrB,MAAM,IAAIpC,UAAUkD,+CAAKC,iDADwCf,OACxCe;EAE3B,KAAKd,qBAAqB,cAAcD,KAAAA;CAC1C;CAEA,IACIkB,iBAAyB;EAC3B,IAAI,CAAClD,sBAAsB,KAAKmD,eAAe,GAG7C,MAAM,IAAIvD,UAAUkD,mDAAKC,kDADyC,KAAKI,iBAC9CJ;EAG3B,OAAO,KAAKI;CACd;CAGAC,OAAa;EACX,KAAKZ,OAAOa,KAAK,MAAA;CACnB;CAGAC,WAAiB;EACf,KAAKd,OAAOa,KAAK,UAAA;CACnB;CAGAE,QAAc;EACZ,KAAKf,OAAOa,KAAK,OAAA;CACnB;CAGAG,YAAkB;EAChB,KAAKhB,OAAOa,KAAK,WAAA;CACnB;CAGAI,OAAa;EACX,KAAKjB,OAAOa,KAAK,MAAA;CACnB;CAGAK,OAAa;EACX,KAAKlB,OAAOa,KAAK,MAAA;CACnB;CAGAM,KAAKC,QAAsB;EAEzB,KAAKpB,OAAOa,KAAK,QAAQQ,OAAOD,MAAAA,CAAAA;CAClC;CAGAE,YAAYC,SAAiBrB,UAAwB;EACnD,KAAKF,OAAOa,KAAK,YAAY;GAC3BU;GAEArB,UAAUmB,OAAOnB,QAAAA;EACnB,CAAA;CACF;CAGAsB,QAAQC,KAAmB;EACzB,KAAKzB,OAAOa,KAAK,QAAQ,EAAEY,IAAI,CAAA;CACjC;CAGAC,OAAOxB,UAA0B;EAC/B,OAAOA;CACT;CAvLA,YAAYF,QAAgB;EAC1B,MAAM,iCAAiCA,MAAAA,GAGzC,mBAAA,MAAQ3B,gBAAAA,aAAAA,IAAAA,GAAc,KAAA,GACtB,mBAAA,MAAQE,aAAY,IAAA,GACpB,mBAAA,MAAQE,YAAW,IAAA,GACnB,mBAAA,MAAQE,YAAW,IAAA,GACnB,mBAAA,MAAQE,cAAa,IAAA,GACrB,mBAAA,MAAQE,kBAAiB,IAAA,GACzB,mBAAA,MAAQE,aAAqC,CAAC,CAAA,GAC9C,mBAAA,MAAQE,gBAAe,CAAA,GACvB,mBAAA,MAAQE,gBAAe,CAAA,GACvB,mBAAA,MAAQE,SAAQ,CAAA,GAChB,mBAAA,MAAQI,YAAW,KAAA,GACnB,mBAAA,MAAQE,WAAU,CAAA,GAClB,mBAAA,MAAQY,eAAchD,gBAAAA,GACtB,mBAAA,MAAQkD,mBAAkBjD,uBAAAA;CAf1B;AAsLF;4CAzLaS,iBAAAA;;;;EAqBPC;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAKAE;;;;;EAQAI;;;;;EAQAE;;;;;EAQAE;;;;;EAYAU;;;;;EAmBAE;;;;;EAWJE;;;;;EAKAE;;;;;EAKAC;;;;;EAKAC;;;;;EAKAC;;;;;EAKAC;;;;;EAKAC;;;;;EAMAG;;;;;EASAE;;;;;EAKAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC5LF,MAAM,EAAEK,UAAAA,YAAUC,QAAAA,UAAQC,QAAAA,aAAWL;AACrC,MAAMM,gBAAcN,YAAcM;SAU/BH,WAAS;CAAEI,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,UAK/CH,WAAS;CAAEI,WAAW;CAAMC,QAAQF;AAAY,CAAA,GAAA,UAKhDH,WAAS;CAAEI,WAAW;CAAYC,QAAQF;AAAY,CAAA,GAAA,UAWtDF,SAAO,EAAEK,aAAa,IAAI,CAAA,GAAA,UAK1BL,SAAO;CAAEK,aAAa;CAAQC,cAAc;AAAS,CAAA,GAAA,UAoCrDL,SAAO,EAAEE,WAAW,QAAQ,CAAA;AAtE/B,IAAaI,qBAAb,cAAwCV,eAAAA;CAQtC,IACIW,gBAAwB;EAC1B,OAAO,KAAKC;CACd;CAEA,IACIC,YAAsB;EACxB,OAAO,CAAC,gBAAgB,aAAA;CAC1B;CAEA,IACIC,iBAAsD;EACxD,OAAO,KAAKC;CACd;CAEAC,oBAAoBC,YAA0B;EAC5C,MAAMC,IAAI,KAAKC,OAAOC,iBAAiBH,UAAAA;EAEvC,KAAKI,YAAY,kBAAkB,KAAKF,OAAOG,UAAUJ,MAAM,IAAA;CACjE;CAGAK,iBAAiBN,YAA0B;EACzC,KAAKE,OAAOK,KAAK,oBAAoBP,UAAAA;CACvC;CAGAQ,aACEC,OACAC,UACAC,OACAC,cAC4B;EAC5B,IAAI,CAAC,KAAKV,OAAOG,WACf,OAAO,CAAA;EAGT,MAAMQ,SAAS,KAAKX,OAAOG,UACxBS,MAAMC,GAAGC,MAAAA;GACR,IAAIC,MAAM;GACV,QAAQN,OAAR;IACE,KAAK;KACHM,MAAMF,EAAEG,OAAOF,EAAEE,OAAO,IAAI;KAC5B;IAIF,KAAK,eACH;GACJ;GACA,OAAOD;EACT,CAAA,CAAA,CACCE,MAAMV,OAAOC,WAAWD,KAAAA,CAAAA,CACxBW,KAAKC,MAAMrC,eAAqBqC,CAAAA,CAAAA;EAEnC,IAAIT,cACFC,OAAOU,QAAO;EAGhB,OAAOV;CACT;CAGAW,gBAAgBC,UAA8C;EAC5D,OAAOzC,eAAqByC,QAAAA;CAC9B;CAxEA,YAAYvB,QAAgB;EAC1B,MAAM,oCAAoCA,MAAAA,GAG5C,mBAAA,MAAQJ,oBAAAA,aAAAA,IAAAA,GAAuD,CAAC,OAAOd,aAAAA,EAAoB,GAC3F,mBAAA,MAAQW,kBAAiB,CAAA;CAHzB;AAuEF;4CA1EaF,oBAAAA;;;;EASPC;;;;;EAKAE;;;;;EAKAC;;;;;EAWJS;;;;;EAKAE;;;;;EAoCAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1EF,MAAM,EAAEO,UAAUC,QAAQC,WAAWL;AACrC,MAAMM,cAAcN,YAAcM;OAc/BH,SAAS;CAAEI,WAAW;CAAMC,QAAQF;AAAY,CAAA,GAAA,QAKhDH,SAAS;CAAEI,WAAW;CAAKC,QAAQF;AAAY,CAAA,GAAA,QAK/CF,OAAO;CAAEK,aAAa;CAAMC,cAAc;AAAS,CAAA,GAAA,QASnDN,OAAO,EAAEK,aAAa,MAAM,CAAA,GAAA,QAK5BL,OAAO,EAAEK,aAAa,IAAI,CAAA,GAAA,QAK1BL,OAAO,EAAEK,aAAa,IAAI,CAAA,GAAA,QAK1BJ,OAAO,EAAEE,WAAW,MAAM,CAAA,GAAA,QAO1BF,OAAO,EAAEE,WAAW,QAAQ,CAAA,GAAA,QAK5BF,OAAO,EAAEE,WAAW,IAAI,CAAA,GAAA,QAKxBF,OAAO,EAAEE,WAAW,SAAS,CAAA;AA/DhC,IAAaI,qBAAb,cAAwCV,eAAAA;CAQtCW,UAAUC,aAA4B;EACpC,KAAKC,YAAY,UAAUD,WAAAA;CAC7B;CAEA,IACIE,SAAmB;EACrB,OAAO,KAAKC;CACd;CAEA,IACIC,gBAAyB;EAC3B,OAAO,KAAKC;CACd;CAGAC,kBAAkBC,UAA+C;EAC/D,OAAO,KAAKC,OAAOC,OAChBC,QAAQC,MAAAA;GACP,OAAOJ,SAASK,MAAMC,OAAOA,OAAOF,EAAE,gBAAgB;EACxD,CAAA,CAAA,CACCG,KAAKH,MAAMtB,eAAqBsB,CAAAA,CAAAA;CACrC;CAGAK,SAASC,KAAaC,YAAoBC,cAA6B;EACrE,KAAKX,OAAOY,KAAK,YAAY;GAAEH;GAAKC;GAAYC;EAAa,CAAA;CAC/D;CAGAE,YAAYC,SAAuB;EACjC,KAAKd,OAAOY,KAAK,eAAeE,OAAAA;CAClC;CAGAC,KAAKD,SAAuB;EAC1B,KAAKd,OAAOY,KAAK,QAAQE,OAAAA;CAC3B;CAGAE,kBAAkBC,eAA4C;EAC5D,KAAK1B,UAAU0B,aAAAA;EAEf,OAAO,CAAC,KAAKtB,SAAS,2CAAA;CACxB;CAGAuB,WAAWC,UAA0C;EACnD,OAAOtC,eAAqBsC,QAAAA;CAC9B;CAGAC,aAAaC,MAAsB;EACjC,OAAOA;CACT;CAGAC,qBAAqBD,MAAcF,UAAoD;EACrF,OAAO,CAACE,MAAMxC,eAAqBsC,QAAAA,CAAAA;CACrC;CAjEA,YAAYnB,QAAgB;EAC1B,MAAM,oCAAoCA,MAAAA,GAG5C,mBAAA,MAAQL,YAAAA,WAAAA,IAAAA,GAAoB,CAAA,EAAE,GAC9B,mBAAA,MAAQE,kBAAiB,KAAA;CAHzB;AAgEF;wCAnEaP,oBAAAA;;;;EAaPI;;;;;EAKAE;;;;;EAKJE;;;;;EASAU;;;;;EAKAK;;;;;EAKAE;;;;;EAKAC;;;;;EAOAE;;;;;EAKAE;;;;;EAKAE;;;;;;;;;;;;;;;;;;;;;;;;;;AClDF,MAAMY,aAAa;AAEnB,MAAMC,WAAWC,QAAAA;CACf,OAAOA,IAAIC,OAAO,CAAA,CAAA,CAAGC,YAAW,IAAKF,IAAIG,UAAU,CAAA;AACrD;IAqGE,kCAAA,IAAA,QAAA,GAeA,oCAAA,IAAA,QAAA,GAqBA,uCAAA,IAAA,QAAA,GAiBA,uCAAA,IAAA,QAAA,GAsBA,oCAAA,IAAA,QAAA,GAqBA,0CAAA,IAAA,QAAA;AA5JF,IAAaC,SAAb,cAA4BjB,aAAAA;CAmB1B,MAAckB,KAAKC,MAAoC;EACrD,KAAKC,cAAc,0BAA0B,KAAKC;EAClDjB,WAAWkB,mBAAmB,KAAKF,WAAW;EAE9C,KAAKG,OAAOpB,WAAAA;EAEZ,KAAKoB,KAAKC,GAAG,UAAUC,QAAAA;GACrB,KAAKC,KAAK,SAASD,eAAeE,QAAQF,MAAM,IAAIE,MAAMC,OAAOH,GAAAA,CAAAA,CAAAA;EACnE,CAAA;EAEA,KAAKI,aAAa,CAAC;EAEnB,0BAAA,MAAK,mBAAA,gBAAA,CAAA,CAAA,KAAL,MAAuBV,IAAAA;EAEvB,IAAI,KAAKW,oBAAoBC,QAAQ,QAAA,KAAa,GAChD,0BAAA,MAAK,qBAAA,kBAAA,CAAA,CAAA,KAAL,IAAI;EAEN,IAAI,KAAKD,oBAAoBC,QAAQ,WAAA,KAAgB,GACnD,0BAAA,MAAK,wBAAA,qBAAA,CAAA,CAAA,KAAL,IAAI;EAEN,IAAI,KAAKD,oBAAoBC,QAAQ,WAAA,KAAgB,GACnD,0BAAA,MAAK,wBAAA,qBAAA,CAAA,CAAA,KAAL,IAAI;EAGN,KAAK,MAAMC,SAASC,OAAOC,OAAO,KAAKL,UAAU,GAC/C,IAAIG,UAAUG,KAAAA,GACZ,KAAKZ,KAAKa,OAAOzB,YAAYqB,KAAAA;EAIjC,IAAI;GAEF,IAAIK,MADgB,KAAKd,KAAKe,YAAY,KAAKlB,aAAanB,SAASsC,YAAY,MACnErC,iBAAiBsC,QAAQ;IACrC,KAAKpB,cAAc,GAAG,KAAKA,YAAY,WAAWqB,QAAQC;IAC1D,MAAM,KAAKnB,KAAKe,YAAY,KAAKlB,WAAW;GAC9C;EACF,SAASK,KAAK;GACZ,KAAKC,KAAK,SAASD,eAAeE,QAAQF,MAAM,IAAIE,MAAMC,OAAOH,GAAAA,CAAAA,CAAAA;EACnE;CACF;;;;;;;;;IAqEAkB,WAAWC,SAA0B;EACnC,IAAIC,OAAO,yBAAyB,KAAKxB;EACzC,IAAIuB,SACFC,QAAQ,IAAID;EAEd,OAAOC;CACT;;;;;;;;IAqCAC,cAAsB;EACpB,OAAO;CACT;;;;;;;IASAC,OAAOC,UAAwB;MAK7B;EAJA,MAAMC,SAASC,KAAKC,MAAMH,YAAY,CAAA;EACtC,IAAII,MAAMH,MAAAA,GACR,MAAM,IAAItB,MAAM,iCAAiCqB,SAAS,EAAE;GAE9D,0BAAA,KAAKnB,WAAWwB,YAAM,QAAtB,4BAAA,KAAA,KAAA,wBAAwBC,OAAOL,MAAAA;CACjC;CAEAM,cAAcC,SAAyB;EACrC,KAAK,IAAIC,IAAI,GAAGA,IAAI,KAAKC,OAAOC,QAAQF,KAAK;GAC3C,MAAMG,QAAQ,KAAKF,OAAOD;GAE1B,KAAIG,UAAAA,QAAAA,UAAAA,KAAAA,IAAAA,KAAAA,IAAAA,MAAQ,sBAAqBJ,SAC/B,OAAOC;EAEX;EAEA,OAAO;CACT;CAEAI,SAASL,SAAoC;EAC3C,OAAO,KAAKE,OAAO,KAAKH,cAAcC,OAAAA;CACxC;CAEAM,SAASF,OAAoB;MAE3B,4BASA;EAVA,KAAKF,OAAOK,KAAKH,KAAAA;GACjB,6BAAA,KAAK/B,WAAWmC,eAAS,QAAzB,+BAAA,KAAA,KAAA,2BAA2BC,UAAU,KAAKP,MAAM;EAEhD,IAAIQ,aAAa;EACjB,IAAI,KAAKR,OAAOC,SAAS,GAAG;GAC1B,MAAMQ,WAAW,KAAKT,OAAO,KAAKA,OAAOC,SAAS;GAClD,KAAIQ,aAAAA,QAAAA,aAAAA,KAAAA,IAAAA,KAAAA,IAAAA,SAAW,sBAAqBhC,KAAAA,GAClC+B,aAAaC,SAAS;EAE1B;GACA,8BAAA,KAAKtC,WAAWmC,eAAS,QAAzB,gCAAA,KAAA,KAAA,4BAA2BI,WAAWF,UAAAA;CACxC;CAEAG,YAAYb,SAAuB;MAGjC,4BAEA;EAJA,MAAMC,IAAI,KAAKF,cAAcC,OAAAA;EAC7B,KAAKE,OAAOY,OAAOb,GAAG,CAAA;GACtB,6BAAA,KAAK5B,WAAWmC,eAAS,QAAzB,+BAAA,KAAA,KAAA,2BAA2BC,UAAU,KAAKP,MAAM;GAEhD,8BAAA,KAAK7B,WAAWmC,eAAS,QAAzB,gCAAA,KAAA,KAAA,4BAA2BO,aAAaf,OAAAA;CAC1C;;;;;;;;IAUAgB,iBAAiBC,YAA4B;EAC3C,KAAK,IAAIhB,IAAI,GAAGA,IAAI,KAAKiB,UAAUf,QAAQF,KAAK;GAC9C,MAAMkB,WAAW,KAAKD,UAAUjB;GAEhC,KAAIkB,aAAAA,QAAAA,aAAAA,KAAAA,IAAAA,KAAAA,IAAAA,SAAUC,QAAOH,YACnB,OAAOhB;EAEX;EAEA,OAAO;CACT;;;;;;;;IAUAoB,aAAaH,WAA6B;EACxC,KAAKA,YAAYA;EACjB,KAAKI,gBAAgBJ,UAAUf;EAE/B,KAAKe,UAAUK,SAASJ,aAAAA;GACtB,IAAIA,UAAU;QACZ;KAAA,6BAAA,KAAK9C,WAAW6C,eAAS,QAAzB,+BAAA,KAAA,KAAA,2BAA2BM,gBAAgBL,QAAAA;GAC7C;EACF,CAAA;CACF;;;;;;;;IAUAM,kBAAkBR,YAA0B;MAC1C;GAAA,6BAAA,KAAK5C,WAAW6C,eAAS,QAAzB,+BAAA,KAAA,KAAA,2BAA2BQ,oBAAoBT,UAAAA;CACjD;CA5QA,YAAYU,SAAwB;MAIPA;EAH3B,MAAK,GAmDP,2BAAA,MAAA,iBAAA,GAeA,2BAAA,MAAA,mBAAA,GAqBA,2BAAA,MAAA,sBAAA,GAiBA,2BAAA,MAAA,sBAAA,GAsBA,2BAAA,MAAA,mBAAA,GAqBA,2BAAA,MAAA,yBAAA,GA3JA9D,iBAAAA,MAAAA,QAAAA,KAAAA,CAAAA,GACAS,iBAAAA,MAAAA,uBAAAA,KAAAA,CAAAA,GACAV,iBAAAA,MAAAA,eAAAA,KAAAA,CAAAA,GACA,iBAAA,MAAQG,QAAR,KAAA,CAAA,GACAM,iBAAAA,MAAAA,cAA+B,CAAC,CAAA,GAChC,iBAAA,MAAQuD,WAAmB,CAAA,CAAE;EAK3B,KAAK/D,OAAO8D,QAAQ9D;EACpB,KAAKS,uBAAsBqD,+BAAAA,QAAQrD,yBAAmB,QAA3BqD,iCAAAA,KAAAA,IAAAA,+BAA+B,CAAC,QAAA;EAC3D,KAAKC,UAAU,CAAA;EACf,KAAKlE,KAAKiE,OAAAA,CAAAA,CAASE,OAAO5D,QAAAA;GACxB,KAAKC,KAAK,SAASD,eAAeE,QAAQF,MAAM,IAAIE,MAAMC,OAAOH,GAAAA,CAAAA,CAAAA;EACnE,CAAA;CACF;AA2QF;AANE,iBAtRWR,QAsRJqE,2BAA0CjF,uBAAiC;AAClF,iBAvRWY,QAuRJsE,0BAAyClF,sBAAgC;AAChF,iBAxRWY,QAwRJuE,2BAA0CnF,uBAAiC;AAClF,iBAzRWY,QAyRJwE,oBAA+BpF,gBAA0B;AAChE,iBA1RWY,QA0RJyE,qBAAgCrF,iBAA2B;AAClE,iBA3RWY,QA2RJ0E,wBAAmCtF,oBAA8B;AA/NxE,SAAA,iBAAkBc,MAAmB;CACnC,KAAKU,WAAW+D,OAAO,IAAIpF,cAAc,MAAMW,IAAAA;CAC/C,0BAAA,MAAK,2BAAA,wBAAA,CAAA,CAAA,KAAL,MAA+B,KAAKU,WAAW+D,MAAM;EACnD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD;AACH;AAEA,SAAA,qBAAA;CACE,KAAK/D,WAAWwB,SAAS,IAAI/C,gBAAgB,IAAI;CAiBjD,0BAAA,MAAK,2BAAA,wBAAA,CAAA,CAAA,KAAL,MAA+B,KAAKuB,WAAWwB,QAAQwC;EAfrD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CAEqDA,CAAAA;AACzD;AAEA,SAAA,wBAAA;CACE,KAAKhE,WAAWmC,YAAY,IAAIvD,mBAAmB,IAAI;CACvD,0BAAA,MAAK,2BAAA,wBAAA,CAAA,CAAA,KAAL,MAA+B,KAAKoB,WAAWmC,WAAW,CAAC,eAAA,CAAgB;CAE3E/B,OAAO6D,eAAe,MAAM,UAAU;EACpCC,WAAK;GACH,OAAO,KAAKX;EACd;EACAY,MAAMC,UAAAA;OAEJ;GADA,KAAKb,UAAUa;IACf,6BAAA,KAAKpE,WAAWmC,eAAS,QAAzB,+BAAA,KAAA,KAAA,2BAA2BkC,kBAAkBD,KAAAA;EAC/C;EACAE,YAAY;EACZC,cAAc;CAChB,CAAA;AACF;AAEA,SAAA,wBAAA;CACE,KAAKvE,WAAW6C,YAAY,IAAInE,mBAAmB,IAAI;CACvD,0BAAA,MAAK,2BAAA,wBAAA,CAAA,CAAA,KAAL,MAA+B,KAAKsB,WAAW6C,WAAW,CAAC,iBAAiB,gBAAA,CAAiB;AAC/F;AAmBA,SAAA,mBAAoB1C,OAAuBX,MAAY;CACrD,MAAMgF,YAAYzF,QAAQS,IAAAA;CAE1BY,OAAO6D,eAAe,MAAMO,WAAW;EACrCN,WAAK;GACH,MAAME,QAAQK,QAAQP,IAAI/D,OAAOX,IAAAA;GACjC,IAAIA,SAAS,kBACX,OAAOX,gBAAsBuF,KAAAA;QACxB,IAAI5E,SAAS,YAClB,OAAOX,gBAAsBuF,KAAAA;GAE/B,OAAOA;EACT;EACAD,MAAMC,UAAAA;GACJjE,MAAMyE,YAAYpF,MAAM4E,KAAAA;EAC1B;EACAE,YAAY;EACZC,cAAc;CAChB,CAAA;AACF;AAEA,SAAA,yBAA0BpE,OAAuB0E,OAAe;CAC9D,KAAK,MAAMC,QAAQD,OACjB,0BAAA,MAAK,qBAAA,kBAAA,CAAA,CAAA,KAAL,MAAyB1E,OAAO2E,IAAAA;AAEpC;;;AClOF,IAAA,cAAeC"}
|
package/package.json
CHANGED
|
@@ -1,14 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jellybrick/mpris-service",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.0",
|
|
4
4
|
"description": "Node.js implementation for the MPRIS D-Bus Interface Specification to create a mediaplayer service",
|
|
5
|
-
"
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.cjs",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"types": "./dist/index.d.cts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": {
|
|
12
|
+
"types": "./dist/index.d.mts",
|
|
13
|
+
"default": "./dist/index.mjs"
|
|
14
|
+
},
|
|
15
|
+
"require": {
|
|
16
|
+
"types": "./dist/index.d.cts",
|
|
17
|
+
"default": "./dist/index.cjs"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"./package.json": "./package.json"
|
|
21
|
+
},
|
|
22
|
+
"files": [
|
|
23
|
+
"dist"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=12.20.0"
|
|
12
27
|
},
|
|
13
28
|
"repository": {
|
|
14
29
|
"type": "git",
|
|
@@ -27,27 +42,30 @@
|
|
|
27
42
|
},
|
|
28
43
|
"homepage": "https://github.com/JellyBrick/mpris-service",
|
|
29
44
|
"dependencies": {
|
|
30
|
-
"@jellybrick/dbus-next": "^0.
|
|
31
|
-
"
|
|
32
|
-
"source-map-support": "^0.5.21"
|
|
45
|
+
"@jellybrick/dbus-next": "^0.11.1",
|
|
46
|
+
"fast-equals": "^6.0.0"
|
|
33
47
|
},
|
|
34
48
|
"devDependencies": {
|
|
35
|
-
"@
|
|
36
|
-
"@
|
|
37
|
-
"@
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
49
|
+
"@stylistic/eslint-plugin": "^5.10.0",
|
|
50
|
+
"@swc/core": "^1.15.41",
|
|
51
|
+
"@types/node": "^25.9.3",
|
|
52
|
+
"eslint-plugin-perfectionist": "^5.9.1",
|
|
53
|
+
"oxfmt": "^0.55.0",
|
|
54
|
+
"oxlint": "^1.70.0",
|
|
55
|
+
"oxlint-tsgolint": "^0.23.0",
|
|
56
|
+
"tsdown": "^0.22.3",
|
|
57
|
+
"typescript": "^6.0.3",
|
|
58
|
+
"unplugin-swc": "^1.5.9",
|
|
59
|
+
"vitest": "^4.1.9"
|
|
46
60
|
},
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsdown",
|
|
63
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
64
|
+
"lint": "oxlint --type-aware --deny-warnings src test",
|
|
65
|
+
"format": "oxfmt --write src test *.config.ts",
|
|
66
|
+
"format:check": "oxfmt --check src test *.config.ts",
|
|
67
|
+
"test": "vitest run",
|
|
68
|
+
"test:integration": "MPRIS_INTEGRATION=1 dbus-run-session -- vitest run",
|
|
69
|
+
"check": "pnpm run lint && pnpm run format:check && pnpm run typecheck && pnpm run build && pnpm run test"
|
|
52
70
|
}
|
|
53
|
-
}
|
|
71
|
+
}
|
package/.dockerignore
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
node_modules
|
package/.travis.yml
DELETED
package/Dockerfile
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
FROM ubuntu:20.04
|
|
2
|
-
|
|
3
|
-
WORKDIR /app
|
|
4
|
-
|
|
5
|
-
RUN echo force-unsafe-io > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup
|
|
6
|
-
RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80retry
|
|
7
|
-
|
|
8
|
-
RUN export DEBIAN_FRONTEND=noninteractive; \
|
|
9
|
-
export DEBCONF_NONINTERACTIVE_SEEN=true; \
|
|
10
|
-
echo 'tzdata tzdata/Areas select Etc' | debconf-set-selections; \
|
|
11
|
-
echo 'tzdata tzdata/Zones/Etc select UTC' | debconf-set-selections; \
|
|
12
|
-
apt update && apt install -y --no-install-recommends \
|
|
13
|
-
build-essential \
|
|
14
|
-
curl \
|
|
15
|
-
ca-certificates \
|
|
16
|
-
git \
|
|
17
|
-
python2 \
|
|
18
|
-
dbus
|
|
19
|
-
|
|
20
|
-
ADD package.json /app
|
|
21
|
-
|
|
22
|
-
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash && \
|
|
23
|
-
. /root/.nvm/nvm.sh && \
|
|
24
|
-
for v in v6.17.1 v14.16.0; do \
|
|
25
|
-
nvm install $v; \
|
|
26
|
-
done ; \
|
|
27
|
-
npm install
|
|
28
|
-
|
|
29
|
-
ADD . /app
|
|
30
|
-
|
|
31
|
-
CMD [ "make", "test" ]
|
package/Makefile
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
.PHONY: docker-test test
|
|
2
|
-
|
|
3
|
-
docker-test:
|
|
4
|
-
docker build -t mpris-service-test .
|
|
5
|
-
docker run -it mpris-service-test
|
|
6
|
-
|
|
7
|
-
test:
|
|
8
|
-
. /root/.nvm/nvm.sh ; \
|
|
9
|
-
for v in v6.17.1 v14.16.0 ; do \
|
|
10
|
-
nvm use $$v ; \
|
|
11
|
-
PYTHON=python2 npm install ; \
|
|
12
|
-
PYTHON=python2 npm rebuild ; \
|
|
13
|
-
dbus-run-session npm run test ; \
|
|
14
|
-
done
|
package/dist/constants.js
DELETED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const constants = {
|
|
4
|
-
PLAYBACK_STATUS_PLAYING: 'Playing',
|
|
5
|
-
PLAYBACK_STATUS_PAUSED: 'Paused',
|
|
6
|
-
PLAYBACK_STATUS_STOPPED: 'Stopped',
|
|
7
|
-
LOOP_STATUS_NONE: 'None',
|
|
8
|
-
LOOP_STATUS_TRACK: 'Track',
|
|
9
|
-
LOOP_STATUS_PLAYLIST: 'Playlist'
|
|
10
|
-
};
|
|
11
|
-
const playbackStatuses = [constants.PLAYBACK_STATUS_PLAYING, constants.PLAYBACK_STATUS_PAUSED, constants.PLAYBACK_STATUS_STOPPED];
|
|
12
|
-
const loopStatuses = [constants.LOOP_STATUS_NONE, constants.LOOP_STATUS_PLAYLIST, constants.LOOP_STATUS_TRACK];
|
|
13
|
-
constants.isLoopStatusValid = function (value) {
|
|
14
|
-
return loopStatuses.includes(value);
|
|
15
|
-
};
|
|
16
|
-
constants.isPlaybackStatusValid = function (value) {
|
|
17
|
-
return playbackStatuses.includes(value);
|
|
18
|
-
};
|
|
19
|
-
module.exports = constants;
|
|
20
|
-
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","names":["constants","PLAYBACK_STATUS_PLAYING","PLAYBACK_STATUS_PAUSED","PLAYBACK_STATUS_STOPPED","LOOP_STATUS_NONE","LOOP_STATUS_TRACK","LOOP_STATUS_PLAYLIST","playbackStatuses","loopStatuses","isLoopStatusValid","value","includes","isPlaybackStatusValid","module","exports"],"sourceRoot":"../src/","sources":["constants.js"],"sourcesContent":["const constants = {\n PLAYBACK_STATUS_PLAYING: 'Playing',\n PLAYBACK_STATUS_PAUSED: 'Paused',\n PLAYBACK_STATUS_STOPPED: 'Stopped',\n\n LOOP_STATUS_NONE: 'None',\n LOOP_STATUS_TRACK: 'Track',\n LOOP_STATUS_PLAYLIST: 'Playlist'\n};\n\nconst playbackStatuses = [\n constants.PLAYBACK_STATUS_PLAYING,\n constants.PLAYBACK_STATUS_PAUSED,\n constants.PLAYBACK_STATUS_STOPPED\n];\n\nconst loopStatuses = [\n constants.LOOP_STATUS_NONE,\n constants.LOOP_STATUS_PLAYLIST,\n constants.LOOP_STATUS_TRACK\n];\n\nconstants.isLoopStatusValid = function(value) {\n return loopStatuses.includes(value);\n};\n\nconstants.isPlaybackStatusValid = function(value) {\n return playbackStatuses.includes(value);\n};\n\nmodule.exports = constants;\n"],"mappings":";;AAAA,MAAMA,SAAS,GAAG;EAChBC,uBAAuB,EAAE,SAAS;EAClCC,sBAAsB,EAAE,QAAQ;EAChCC,uBAAuB,EAAE,SAAS;EAElCC,gBAAgB,EAAE,MAAM;EACxBC,iBAAiB,EAAE,OAAO;EAC1BC,oBAAoB,EAAE;AACxB,CAAC;AAED,MAAMC,gBAAgB,GAAG,CACvBP,SAAS,CAACC,uBAAuB,EACjCD,SAAS,CAACE,sBAAsB,EAChCF,SAAS,CAACG,uBAAuB,CAClC;AAED,MAAMK,YAAY,GAAG,CACnBR,SAAS,CAACI,gBAAgB,EAC1BJ,SAAS,CAACM,oBAAoB,EAC9BN,SAAS,CAACK,iBAAiB,CAC5B;AAEDL,SAAS,CAACS,iBAAiB,GAAG,UAASC,KAAK,EAAE;EAC5C,OAAOF,YAAY,CAACG,QAAQ,CAACD,KAAK,CAAC;AACrC,CAAC;AAEDV,SAAS,CAACY,qBAAqB,GAAG,UAASF,KAAK,EAAE;EAChD,OAAOH,gBAAgB,CAACI,QAAQ,CAACD,KAAK,CAAC;AACzC,CAAC;AAEDG,MAAM,CAACC,OAAO,GAAGd,SAAS","ignoreList":[]}
|