├── .eslintignore ├── .eslintrc.yml ├── .gitignore ├── README.md ├── config.json ├── dep └── jellyfin-sdk-0.10.0-1.tgz ├── dist ├── UIConfig.json ├── assets │ └── images │ │ ├── album.png │ │ ├── avatar.png │ │ ├── folder.png │ │ ├── folder.xcf │ │ ├── genre.png │ │ ├── jellyfin-mono.png │ │ ├── jellyfin.png │ │ ├── jellyfin.svg │ │ ├── playlist.png │ │ └── song.png ├── i18n │ ├── strings_en.json │ ├── strings_zh.json │ └── strings_zh_TW.json ├── index.d.ts ├── index.d.ts.map ├── index.js ├── index.js.map ├── lib │ ├── JellyfinContext.d.ts │ ├── JellyfinContext.d.ts.map │ ├── JellyfinContext.js │ ├── JellyfinContext.js.map │ ├── connection │ │ ├── ConnectionManager.d.ts │ │ ├── ConnectionManager.d.ts.map │ │ ├── ConnectionManager.js │ │ ├── ConnectionManager.js.map │ │ ├── ServerConnection.d.ts │ │ ├── ServerConnection.d.ts.map │ │ ├── ServerConnection.js │ │ ├── ServerConnection.js.map │ │ ├── ServerPoller.d.ts │ │ ├── ServerPoller.d.ts.map │ │ ├── ServerPoller.js │ │ └── ServerPoller.js.map │ ├── controller │ │ ├── browse │ │ │ ├── index.d.ts │ │ │ ├── index.d.ts.map │ │ │ ├── index.js │ │ │ ├── index.js.map │ │ │ └── view-handlers │ │ │ │ ├── AlbumViewHandler.d.ts │ │ │ │ ├── AlbumViewHandler.d.ts.map │ │ │ │ ├── AlbumViewHandler.js │ │ │ │ ├── AlbumViewHandler.js.map │ │ │ │ ├── ArtistViewHandler.d.ts │ │ │ │ ├── ArtistViewHandler.d.ts.map │ │ │ │ ├── ArtistViewHandler.js │ │ │ │ ├── ArtistViewHandler.js.map │ │ │ │ ├── BaseViewHandler.d.ts │ │ │ │ ├── BaseViewHandler.d.ts.map │ │ │ │ ├── BaseViewHandler.js │ │ │ │ ├── BaseViewHandler.js.map │ │ │ │ ├── CollectionViewHandler.d.ts │ │ │ │ ├── CollectionViewHandler.d.ts.map │ │ │ │ ├── CollectionViewHandler.js │ │ │ │ ├── CollectionViewHandler.js.map │ │ │ │ ├── CollectionsViewHandler.d.ts │ │ │ │ ├── CollectionsViewHandler.d.ts.map │ │ │ │ ├── CollectionsViewHandler.js │ │ │ │ ├── CollectionsViewHandler.js.map │ │ │ │ ├── Explodable.d.ts │ │ │ │ ├── Explodable.d.ts.map │ │ │ │ ├── Explodable.js │ │ │ │ ├── Explodable.js.map │ │ │ │ ├── FilterSelectionViewHandler.d.ts │ │ │ │ ├── FilterSelectionViewHandler.d.ts.map │ │ │ │ ├── FilterSelectionViewHandler.js │ │ │ │ ├── FilterSelectionViewHandler.js.map │ │ │ │ ├── FilterableViewHandler.d.ts │ │ │ │ ├── FilterableViewHandler.d.ts.map │ │ │ │ ├── FilterableViewHandler.js │ │ │ │ ├── FilterableViewHandler.js.map │ │ │ │ ├── FolderViewHandler.d.ts │ │ │ │ ├── FolderViewHandler.d.ts.map │ │ │ │ ├── FolderViewHandler.js │ │ │ │ ├── FolderViewHandler.js.map │ │ │ │ ├── GenreViewHandler.d.ts │ │ │ │ ├── GenreViewHandler.d.ts.map │ │ │ │ ├── GenreViewHandler.js │ │ │ │ ├── GenreViewHandler.js.map │ │ │ │ ├── LibraryViewHandler.d.ts │ │ │ │ ├── LibraryViewHandler.d.ts.map │ │ │ │ ├── LibraryViewHandler.js │ │ │ │ ├── LibraryViewHandler.js.map │ │ │ │ ├── PlaylistViewHandler.d.ts │ │ │ │ ├── PlaylistViewHandler.d.ts.map │ │ │ │ ├── PlaylistViewHandler.js │ │ │ │ ├── PlaylistViewHandler.js.map │ │ │ │ ├── RootViewHandler.d.ts │ │ │ │ ├── RootViewHandler.d.ts.map │ │ │ │ ├── RootViewHandler.js │ │ │ │ ├── RootViewHandler.js.map │ │ │ │ ├── SongViewHandler.d.ts │ │ │ │ ├── SongViewHandler.d.ts.map │ │ │ │ ├── SongViewHandler.js │ │ │ │ ├── SongViewHandler.js.map │ │ │ │ ├── UserViewViewHandler.d.ts │ │ │ │ ├── UserViewViewHandler.d.ts.map │ │ │ │ ├── UserViewViewHandler.js │ │ │ │ ├── UserViewViewHandler.js.map │ │ │ │ ├── View.d.ts │ │ │ │ ├── View.d.ts.map │ │ │ │ ├── View.js │ │ │ │ ├── View.js.map │ │ │ │ ├── ViewHandler.d.ts │ │ │ │ ├── ViewHandler.d.ts.map │ │ │ │ ├── ViewHandler.js │ │ │ │ ├── ViewHandler.js.map │ │ │ │ ├── ViewHandlerFactory.d.ts │ │ │ │ ├── ViewHandlerFactory.d.ts.map │ │ │ │ ├── ViewHandlerFactory.js │ │ │ │ ├── ViewHandlerFactory.js.map │ │ │ │ ├── ViewHelper.d.ts │ │ │ │ ├── ViewHelper.d.ts.map │ │ │ │ ├── ViewHelper.js │ │ │ │ ├── ViewHelper.js.map │ │ │ │ └── renderer │ │ │ │ ├── AlbumRenderer.d.ts │ │ │ │ ├── AlbumRenderer.d.ts.map │ │ │ │ ├── AlbumRenderer.js │ │ │ │ ├── AlbumRenderer.js.map │ │ │ │ ├── ArtistRenderer.d.ts │ │ │ │ ├── ArtistRenderer.d.ts.map │ │ │ │ ├── ArtistRenderer.js │ │ │ │ ├── ArtistRenderer.js.map │ │ │ │ ├── BaseRenderer.d.ts │ │ │ │ ├── BaseRenderer.d.ts.map │ │ │ │ ├── BaseRenderer.js │ │ │ │ ├── BaseRenderer.js.map │ │ │ │ ├── CollectionRenderer.d.ts │ │ │ │ ├── CollectionRenderer.d.ts.map │ │ │ │ ├── CollectionRenderer.js │ │ │ │ ├── CollectionRenderer.js.map │ │ │ │ ├── FolderRenderer.d.ts │ │ │ │ ├── FolderRenderer.d.ts.map │ │ │ │ ├── FolderRenderer.js │ │ │ │ ├── FolderRenderer.js.map │ │ │ │ ├── GenreRenderer.d.ts │ │ │ │ ├── GenreRenderer.d.ts.map │ │ │ │ ├── GenreRenderer.js │ │ │ │ ├── GenreRenderer.js.map │ │ │ │ ├── PlaylistRenderer.d.ts │ │ │ │ ├── PlaylistRenderer.d.ts.map │ │ │ │ ├── PlaylistRenderer.js │ │ │ │ ├── PlaylistRenderer.js.map │ │ │ │ ├── ServerRenderer.d.ts │ │ │ │ ├── ServerRenderer.d.ts.map │ │ │ │ ├── ServerRenderer.js │ │ │ │ ├── ServerRenderer.js.map │ │ │ │ ├── SongRenderer.d.ts │ │ │ │ ├── SongRenderer.d.ts.map │ │ │ │ ├── SongRenderer.js │ │ │ │ ├── SongRenderer.js.map │ │ │ │ ├── UserViewRenderer.d.ts │ │ │ │ ├── UserViewRenderer.d.ts.map │ │ │ │ ├── UserViewRenderer.js │ │ │ │ ├── UserViewRenderer.js.map │ │ │ │ ├── index.d.ts │ │ │ │ ├── index.d.ts.map │ │ │ │ ├── index.js │ │ │ │ └── index.js.map │ │ ├── play │ │ │ ├── PlayController.d.ts │ │ │ ├── PlayController.d.ts.map │ │ │ ├── PlayController.js │ │ │ └── PlayController.js.map │ │ └── search │ │ │ ├── SearchController.d.ts │ │ │ ├── SearchController.d.ts.map │ │ │ ├── SearchController.js │ │ │ └── SearchController.js.map │ ├── entities │ │ ├── Album.d.ts │ │ ├── Album.d.ts.map │ │ ├── Album.js │ │ ├── Album.js.map │ │ ├── Artist.d.ts │ │ ├── Artist.d.ts.map │ │ ├── Artist.js │ │ ├── Artist.js.map │ │ ├── BaseEntity.d.ts │ │ ├── BaseEntity.d.ts.map │ │ ├── BaseEntity.js │ │ ├── BaseEntity.js.map │ │ ├── Collection.d.ts │ │ ├── Collection.d.ts.map │ │ ├── Collection.js │ │ ├── Collection.js.map │ │ ├── Folder.d.ts │ │ ├── Folder.d.ts.map │ │ ├── Folder.js │ │ ├── Folder.js.map │ │ ├── Genre.d.ts │ │ ├── Genre.d.ts.map │ │ ├── Genre.js │ │ ├── Genre.js.map │ │ ├── Playlist.d.ts │ │ ├── Playlist.d.ts.map │ │ ├── Playlist.js │ │ ├── Playlist.js.map │ │ ├── Server.d.ts │ │ ├── Server.d.ts.map │ │ ├── Server.js │ │ ├── Server.js.map │ │ ├── Song.d.ts │ │ ├── Song.d.ts.map │ │ ├── Song.js │ │ ├── Song.js.map │ │ ├── UserView.d.ts │ │ ├── UserView.d.ts.map │ │ ├── UserView.js │ │ ├── UserView.js.map │ │ ├── index.d.ts │ │ ├── index.d.ts.map │ │ ├── index.js │ │ └── index.js.map │ ├── model │ │ ├── AlbumModel.d.ts │ │ ├── AlbumModel.d.ts.map │ │ ├── AlbumModel.js │ │ ├── AlbumModel.js.map │ │ ├── ArtistModel.d.ts │ │ ├── ArtistModel.d.ts.map │ │ ├── ArtistModel.js │ │ ├── ArtistModel.js.map │ │ ├── BaseModel.d.ts │ │ ├── BaseModel.d.ts.map │ │ ├── BaseModel.js │ │ ├── BaseModel.js.map │ │ ├── CollectionModel.d.ts │ │ ├── CollectionModel.d.ts.map │ │ ├── CollectionModel.js │ │ ├── CollectionModel.js.map │ │ ├── FolderModel.d.ts │ │ ├── FolderModel.d.ts.map │ │ ├── FolderModel.js │ │ ├── FolderModel.js.map │ │ ├── GenreModel.d.ts │ │ ├── GenreModel.d.ts.map │ │ ├── GenreModel.js │ │ ├── GenreModel.js.map │ │ ├── PlaylistModel.d.ts │ │ ├── PlaylistModel.d.ts.map │ │ ├── PlaylistModel.js │ │ ├── PlaylistModel.js.map │ │ ├── SongModel.d.ts │ │ ├── SongModel.d.ts.map │ │ ├── SongModel.js │ │ ├── SongModel.js.map │ │ ├── UserViewModel.d.ts │ │ ├── UserViewModel.d.ts.map │ │ ├── UserViewModel.js │ │ ├── UserViewModel.js.map │ │ ├── filter │ │ │ ├── AZFilterModel.d.ts │ │ │ ├── AZFilterModel.d.ts.map │ │ │ ├── AZFilterModel.js │ │ │ ├── AZFilterModel.js.map │ │ │ ├── FilterFilterModel.d.ts │ │ │ ├── FilterFilterModel.d.ts.map │ │ │ ├── FilterFilterModel.js │ │ │ ├── FilterFilterModel.js.map │ │ │ ├── FilterModel.d.ts │ │ │ ├── FilterModel.d.ts.map │ │ │ ├── FilterModel.js │ │ │ ├── FilterModel.js.map │ │ │ ├── GenreFilterModel.d.ts │ │ │ ├── GenreFilterModel.d.ts.map │ │ │ ├── GenreFilterModel.js │ │ │ ├── GenreFilterModel.js.map │ │ │ ├── SortFilterModel.d.ts │ │ │ ├── SortFilterModel.d.ts.map │ │ │ ├── SortFilterModel.js │ │ │ ├── SortFilterModel.js.map │ │ │ ├── YearFilterModel.d.ts │ │ │ ├── YearFilterModel.d.ts.map │ │ │ ├── YearFilterModel.js │ │ │ └── YearFilterModel.js.map │ │ ├── index.d.ts │ │ ├── index.d.ts.map │ │ ├── index.js │ │ ├── index.js.map │ │ └── parser │ │ │ ├── AlbumParser.d.ts │ │ │ ├── AlbumParser.d.ts.map │ │ │ ├── AlbumParser.js │ │ │ ├── AlbumParser.js.map │ │ │ ├── ArtistParser.d.ts │ │ │ ├── ArtistParser.d.ts.map │ │ │ ├── ArtistParser.js │ │ │ ├── ArtistParser.js.map │ │ │ ├── BaseParser.d.ts │ │ │ ├── BaseParser.d.ts.map │ │ │ ├── BaseParser.js │ │ │ ├── BaseParser.js.map │ │ │ ├── CollectionParser.d.ts │ │ │ ├── CollectionParser.d.ts.map │ │ │ ├── CollectionParser.js │ │ │ ├── CollectionParser.js.map │ │ │ ├── FolderContentParser.d.ts │ │ │ ├── FolderContentParser.d.ts.map │ │ │ ├── FolderContentParser.js │ │ │ ├── FolderContentParser.js.map │ │ │ ├── FolderParser.d.ts │ │ │ ├── FolderParser.d.ts.map │ │ │ ├── FolderParser.js │ │ │ ├── FolderParser.js.map │ │ │ ├── GenreParser.d.ts │ │ │ ├── GenreParser.d.ts.map │ │ │ ├── GenreParser.js │ │ │ ├── GenreParser.js.map │ │ │ ├── LyricsParser.d.ts │ │ │ ├── LyricsParser.d.ts.map │ │ │ ├── LyricsParser.js │ │ │ ├── LyricsParser.js.map │ │ │ ├── Parser.d.ts │ │ │ ├── Parser.d.ts.map │ │ │ ├── Parser.js │ │ │ ├── Parser.js.map │ │ │ ├── PlaylistParser.d.ts │ │ │ ├── PlaylistParser.d.ts.map │ │ │ ├── PlaylistParser.js │ │ │ ├── PlaylistParser.js.map │ │ │ ├── SongParser.d.ts │ │ │ ├── SongParser.d.ts.map │ │ │ ├── SongParser.js │ │ │ ├── SongParser.js.map │ │ │ ├── UserViewParser.d.ts │ │ │ ├── UserViewParser.d.ts.map │ │ │ ├── UserViewParser.js │ │ │ └── UserViewParser.js.map │ └── util │ │ ├── AlbumArtHandler.d.ts │ │ ├── AlbumArtHandler.d.ts.map │ │ ├── AlbumArtHandler.js │ │ ├── AlbumArtHandler.js.map │ │ ├── JellyfinNowPlayingMetadataProvider.d.ts │ │ ├── JellyfinNowPlayingMetadataProvider.d.ts.map │ │ ├── JellyfinNowPlayingMetadataProvider.js │ │ ├── JellyfinNowPlayingMetadataProvider.js.map │ │ ├── PluginConfig.d.ts │ │ ├── PluginConfig.d.ts.map │ │ ├── PluginConfig.js │ │ ├── PluginConfig.js.map │ │ ├── ServerHelper.d.ts │ │ ├── ServerHelper.d.ts.map │ │ ├── ServerHelper.js │ │ ├── ServerHelper.js.map │ │ ├── SongHelper.d.ts │ │ ├── SongHelper.d.ts.map │ │ ├── SongHelper.js │ │ ├── SongHelper.js.map │ │ ├── StopWatch.d.ts │ │ ├── StopWatch.d.ts.map │ │ ├── StopWatch.js │ │ ├── StopWatch.js.map │ │ ├── Type.d.ts │ │ ├── Type.d.ts.map │ │ ├── Type.js │ │ ├── Type.js.map │ │ ├── UI.d.ts │ │ ├── UI.d.ts.map │ │ ├── UI.js │ │ ├── UI.js.map │ │ ├── index.d.ts │ │ ├── index.d.ts.map │ │ ├── index.js │ │ └── index.js.map └── package.json ├── fixup.sh ├── install.sh ├── package-lock.json ├── package.json ├── src ├── UIConfig.json ├── assets │ └── images │ │ ├── album.png │ │ ├── avatar.png │ │ ├── folder.png │ │ ├── folder.xcf │ │ ├── genre.png │ │ ├── jellyfin-mono.png │ │ ├── jellyfin.png │ │ ├── jellyfin.svg │ │ ├── playlist.png │ │ └── song.png ├── config.json ├── i18n │ ├── strings_en.json │ ├── strings_zh.json │ └── strings_zh_TW.json ├── index.ts ├── lib │ ├── JellyfinContext.ts │ ├── connection │ │ ├── ConnectionManager.ts │ │ ├── ServerConnection.ts │ │ └── ServerPoller.ts │ ├── controller │ │ ├── browse │ │ │ ├── index.ts │ │ │ └── view-handlers │ │ │ │ ├── AlbumViewHandler.ts │ │ │ │ ├── ArtistViewHandler.ts │ │ │ │ ├── BaseViewHandler.ts │ │ │ │ ├── CollectionViewHandler.ts │ │ │ │ ├── CollectionsViewHandler.ts │ │ │ │ ├── Explodable.ts │ │ │ │ ├── FilterSelectionViewHandler.ts │ │ │ │ ├── FilterableViewHandler.ts │ │ │ │ ├── FolderViewHandler.ts │ │ │ │ ├── GenreViewHandler.ts │ │ │ │ ├── LibraryViewHandler.ts │ │ │ │ ├── PlaylistViewHandler.ts │ │ │ │ ├── RootViewHandler.ts │ │ │ │ ├── SongViewHandler.ts │ │ │ │ ├── UserViewViewHandler.ts │ │ │ │ ├── View.ts │ │ │ │ ├── ViewHandler.ts │ │ │ │ ├── ViewHandlerFactory.ts │ │ │ │ ├── ViewHelper.ts │ │ │ │ └── renderer │ │ │ │ ├── AlbumRenderer.ts │ │ │ │ ├── ArtistRenderer.ts │ │ │ │ ├── BaseRenderer.ts │ │ │ │ ├── CollectionRenderer.ts │ │ │ │ ├── FolderRenderer.ts │ │ │ │ ├── GenreRenderer.ts │ │ │ │ ├── PlaylistRenderer.ts │ │ │ │ ├── ServerRenderer.ts │ │ │ │ ├── SongRenderer.ts │ │ │ │ ├── UserViewRenderer.ts │ │ │ │ └── index.ts │ │ ├── play │ │ │ └── PlayController.ts │ │ └── search │ │ │ └── SearchController.ts │ ├── entities │ │ ├── Album.ts │ │ ├── Artist.ts │ │ ├── BaseEntity.ts │ │ ├── Collection.ts │ │ ├── Folder.ts │ │ ├── Genre.ts │ │ ├── Playlist.ts │ │ ├── Server.ts │ │ ├── Song.ts │ │ ├── UserView.ts │ │ └── index.ts │ ├── model │ │ ├── AlbumModel.ts │ │ ├── ArtistModel.ts │ │ ├── BaseModel.ts │ │ ├── CollectionModel.ts │ │ ├── FolderModel.ts │ │ ├── GenreModel.ts │ │ ├── PlaylistModel.ts │ │ ├── SongModel.ts │ │ ├── UserViewModel.ts │ │ ├── filter │ │ │ ├── AZFilterModel.ts │ │ │ ├── FilterFilterModel.ts │ │ │ ├── FilterModel.ts │ │ │ ├── GenreFilterModel.ts │ │ │ ├── SortFilterModel.ts │ │ │ └── YearFilterModel.ts │ │ ├── index.ts │ │ └── parser │ │ │ ├── AlbumParser.ts │ │ │ ├── ArtistParser.ts │ │ │ ├── BaseParser.ts │ │ │ ├── CollectionParser.ts │ │ │ ├── FolderContentParser.ts │ │ │ ├── FolderParser.ts │ │ │ ├── GenreParser.ts │ │ │ ├── LyricsParser.ts │ │ │ ├── Parser.ts │ │ │ ├── PlaylistParser.ts │ │ │ ├── SongParser.ts │ │ │ └── UserViewParser.ts │ └── util │ │ ├── AlbumArtHandler.ts │ │ ├── JellyfinNowPlayingMetadataProvider.ts │ │ ├── PluginConfig.ts │ │ ├── ServerHelper.ts │ │ ├── SongHelper.ts │ │ ├── StopWatch.ts │ │ ├── Type.ts │ │ ├── UI.ts │ │ └── index.ts └── tsconfig.json ├── tsconfig.json └── uninstall.sh /.eslintignore: -------------------------------------------------------------------------------- 1 | .git 2 | .github 3 | node_modules/ 4 | dist/ 5 | test/ -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | test 3 | tsconfig.tsbuildinfo -------------------------------------------------------------------------------- /config.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/config.json -------------------------------------------------------------------------------- /dep/jellyfin-sdk-0.10.0-1.tgz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dep/jellyfin-sdk-0.10.0-1.tgz -------------------------------------------------------------------------------- /dist/assets/images/album.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/album.png -------------------------------------------------------------------------------- /dist/assets/images/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/avatar.png -------------------------------------------------------------------------------- /dist/assets/images/folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/folder.png -------------------------------------------------------------------------------- /dist/assets/images/folder.xcf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/folder.xcf -------------------------------------------------------------------------------- /dist/assets/images/genre.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/genre.png -------------------------------------------------------------------------------- /dist/assets/images/jellyfin-mono.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/jellyfin-mono.png -------------------------------------------------------------------------------- /dist/assets/images/jellyfin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/jellyfin.png -------------------------------------------------------------------------------- /dist/assets/images/jellyfin.svg: -------------------------------------------------------------------------------- 1 | 2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | icon-transparent 19 | 20 | 21 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /dist/assets/images/playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/playlist.png -------------------------------------------------------------------------------- /dist/assets/images/song.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/dist/assets/images/song.png -------------------------------------------------------------------------------- /dist/index.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAyB,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAEzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kDAAkD,CAAC;AASrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,kCAAkC,MAAM,+CAA+C,CAAC;AAE/F,UAAU,UAAW,SAAQ,iBAAiB;IAC5C,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;CAC1B;AAQD,cAAM,kBAAmB,YAAW,uBAAuB;;gBAa7C,OAAO,EAAE,GAAG;IAKxB,WAAW;IA0GX,eAAe;IAMf,eAAe,CAAC,IAAI,EAAE,GAAG;IA2CnB,kBAAkB,CAAC,IAAI,EAAE,GAAG;IA2BlC,wBAAwB,CAAC,IAAI,EAAE,GAAG;IAsBlC,yBAAyB,CAAC,IAAI,EAAE,GAAG;IAmBnC,wBAAwB,CAAC,IAAI,EAAE,GAAG;IAkClC,gCAAgC,CAAC,IAAI,EAAE,GAAG;IAyC1C,cAAc;IAOd,OAAO;IA4CP,MAAM;IA6BN,qBAAqB;IAerB,eAAe,CAAC,GAAG,EAAE,MAAM;IAO3B,UAAU,CAAC,GAAG,EAAE,MAAM;IAOtB,iBAAiB,CAAC,KAAK,EAAE,GAAG;IAI5B,IAAI;IAIJ,KAAK;IAIL,MAAM;IAIN,IAAI,CAAC,QAAQ,EAAE,MAAM;IAIrB,IAAI;IAIJ,QAAQ;IAIR,QAAQ,CAAC,KAAK,EAAE,GAAG;IAOnB,MAAM,CAAC,KAAK,EAAE,WAAW;IAOzB,IAAI,CAAC,IAAI,EAAE,UAAU;IAsCrB,eAAe,CAAC,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAItD,oBAAoB,CAAC,IAAI,EAAE;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC;IA0EzD,6BAA6B;CAG9B;AAED,SAAS,kBAAkB,CAAC"} -------------------------------------------------------------------------------- /dist/lib/JellyfinContext.d.ts: -------------------------------------------------------------------------------- 1 | import winston from 'winston'; 2 | import { PluginConfigKey, PluginConfigValue } from './util/PluginConfig'; 3 | interface DeviceInfo { 4 | name: string; 5 | id: string; 6 | host: string; 7 | } 8 | declare class JellyfinContext { 9 | #private; 10 | constructor(); 11 | set(key: string, value: any): void; 12 | get(key: string, defaultValue: T): T; 13 | delete(key: string): void; 14 | init(pluginContext: any, pluginConfig: any): void; 15 | toast(type: 'success' | 'info' | 'error' | 'warn', message: string, title?: string): void; 16 | getLogger(): winston.Logger; 17 | getDeviceInfo(): DeviceInfo; 18 | hasConfigKey(key: T): boolean; 19 | getConfigValue(key: T): PluginConfigValue; 20 | deleteConfigValue(key: string): void; 21 | setConfigValue(key: T, value: PluginConfigValue): void; 22 | getAlbumArtPlugin(): any; 23 | getMpdPlugin(): any; 24 | getStateMachine(): any; 25 | getPlaylistManager(): any; 26 | reset(): void; 27 | getI18n(key: string, ...formatValues: any[]): string; 28 | get volumioCoreCommand(): any; 29 | } 30 | declare const _default: JellyfinContext; 31 | export default _default; 32 | //# sourceMappingURL=JellyfinContext.d.ts.map -------------------------------------------------------------------------------- /dist/lib/JellyfinContext.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"JellyfinContext.d.ts","sourceRoot":"","sources":["../../src/lib/JellyfinContext.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAwB,eAAe,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE/F,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,cAAM,eAAe;;;IAqBnB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC;IAKvC,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG;IAgB1C,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,SAAa;IAItF,SAAS,IAAI,OAAO,CAAC,MAAM;IAI3B,aAAa,IAAI,UAAU;IAa3B,YAAY,CAAC,CAAC,SAAS,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO;IAIxD,cAAc,CAAC,CAAC,SAAS,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC;IAqBvE,iBAAiB,CAAC,GAAG,EAAE,MAAM;IAI7B,cAAc,CAAC,CAAC,SAAS,eAAe,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC,CAAC;IAK7E,iBAAiB;IAIjB,YAAY,IAAI,GAAG;IAInB,eAAe,IAAI,GAAG;IAItB,kBAAkB,IAAI,GAAG;IAIzB,KAAK;IAeL,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM;IAkDpD,IAAI,kBAAkB,IAAI,GAAG,CAE5B;CACF;;AAED,wBAAqC"} -------------------------------------------------------------------------------- /dist/lib/connection/ConnectionManager.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | import EventEmitter from 'events'; 3 | import { ClientInfo, DeviceInfo } from '@jellyfin/sdk'; 4 | import ServerConnection from './ServerConnection'; 5 | import Server from '../entities/Server'; 6 | export interface PasswordFetch { 7 | (server: Server, username: string): string; 8 | } 9 | export interface JellyfinSdkInitInfo { 10 | clientInfo: ClientInfo; 11 | deviceInfo: DeviceInfo; 12 | } 13 | export default class ConnectionManager extends EventEmitter { 14 | #private; 15 | constructor(sdkInitInfo: JellyfinSdkInitInfo); 16 | getAuthenticatedConnection(server: Server, username: string, passwordFetch: PasswordFetch): Promise; 17 | logoutAll(): Promise; 18 | logout(connection: ServerConnection): Promise; 19 | findConnection(server: Server, username: string, authenticated?: boolean): ServerConnection | null; 20 | } 21 | //# sourceMappingURL=ConnectionManager.d.ts.map -------------------------------------------------------------------------------- /dist/lib/connection/ConnectionManager.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ConnectionManager.d.ts","sourceRoot":"","sources":["../../../src/lib/connection/ConnectionManager.ts"],"names":[],"mappings":";AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,UAAU,EAA2B,MAAM,eAAe,CAAC;AAChF,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAClD,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAKxC,MAAM,WAAW,aAAa;IAC5B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5C;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,UAAU,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,YAAY;;gBAM7C,WAAW,EAAE,mBAAmB;IAOtC,0BAA0B,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,aAAa,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmCrH,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAgB1B,MAAM,CAAC,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DzD,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,UAAQ,GAAG,gBAAgB,GAAG,IAAI;CAIjG"} -------------------------------------------------------------------------------- /dist/lib/connection/ServerConnection.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { AuthenticationResult } from '@jellyfin/sdk/lib/generated-client/models/authentication-result'; 3 | import Server from '../entities/Server'; 4 | interface ServerConnection { 5 | id: string; 6 | username: string; 7 | server: Server; 8 | api: Api; 9 | auth?: AuthenticationResult | null; 10 | } 11 | export default ServerConnection; 12 | //# sourceMappingURL=ServerConnection.d.ts.map -------------------------------------------------------------------------------- /dist/lib/connection/ServerConnection.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ServerConnection.d.ts","sourceRoot":"","sources":["../../../src/lib/connection/ServerConnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,iEAAiE,CAAC;AACvG,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAExC,UAAU,gBAAgB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,GAAG,CAAC;IACT,IAAI,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAAC;CACpC;AAED,eAAe,gBAAgB,CAAC"} -------------------------------------------------------------------------------- /dist/lib/connection/ServerConnection.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=ServerConnection.js.map -------------------------------------------------------------------------------- /dist/lib/connection/ServerConnection.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ServerConnection.js","sourceRoot":"","sources":["../../../src/lib/connection/ServerConnection.ts"],"names":[],"mappings":"","sourcesContent":["import { Api } from '@jellyfin/sdk';\nimport { AuthenticationResult } from '@jellyfin/sdk/lib/generated-client/models/authentication-result';\nimport Server from '../entities/Server';\n\ninterface ServerConnection {\n id: string;\n username: string;\n server: Server;\n api: Api;\n auth?: AuthenticationResult | null;\n}\n\nexport default ServerConnection;\n"]} -------------------------------------------------------------------------------- /dist/lib/connection/ServerPoller.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | import EventEmitter from 'events'; 4 | import { Api, Jellyfin } from '@jellyfin/sdk'; 5 | import AbortController from 'abort-controller'; 6 | import Server from '../entities/Server'; 7 | export interface PollListener { 8 | (event: PollEvent): void; 9 | } 10 | export interface PollEvent { 11 | eventName: 'online' | 'lost'; 12 | server: Server; 13 | api: Api; 14 | } 15 | interface PollTarget { 16 | url: string; 17 | connectionUrl: string; 18 | api: Api; 19 | pollTimer?: NodeJS.Timeout | null; 20 | abortController?: AbortController | null; 21 | lastEvent?: PollEvent; 22 | } 23 | export default class ServerPoller extends EventEmitter { 24 | #private; 25 | constructor(sdk: Jellyfin); 26 | addTarget(url: string | string[]): void; 27 | removeTarget(target: string | PollTarget): void; 28 | clearTargets(): void; 29 | getOnlineServers(): Server[]; 30 | findOnlineServer(url: string): Server | null; 31 | emit(event: 'serverOnline', args: PollEvent): boolean; 32 | emit(event: 'serverLost', args: PollEvent): boolean; 33 | on(event: 'serverOnline' | 'serverLost', listener: PollListener): this; 34 | } 35 | export {}; 36 | //# sourceMappingURL=ServerPoller.d.ts.map -------------------------------------------------------------------------------- /dist/lib/connection/ServerPoller.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ServerPoller.d.ts","sourceRoot":"","sources":["../../../src/lib/connection/ServerPoller.ts"],"names":[],"mappings":";;AAAA,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,QAAQ,EAA2B,MAAM,eAAe,CAAC;AAEvE,OAAO,eAAe,MAAM,kBAAkB,CAAC;AAE/C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAIxC,MAAM,WAAW,YAAY;IAC3B,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,GAAG,CAAC;CACV;AAED,UAAU,UAAU;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,GAAG,CAAC;IACT,SAAS,CAAC,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IAClC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB;AAID,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,YAAY;;gBAKxC,GAAG,EAAE,QAAQ;IAMzB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE;IAmBhC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU;IAkBxC,YAAY;IAIZ,gBAAgB,IAAI,MAAM,EAAE;IAS5B,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IA+D5C,IAAI,CAAC,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO;IACrD,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO;IAKnD,EAAE,CAAC,KAAK,EAAE,cAAc,GAAG,YAAY,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;CAIvE"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/index.d.ts: -------------------------------------------------------------------------------- 1 | import ConnectionManager from '../../connection/ConnectionManager'; 2 | import { ExplodedTrackInfo } from './view-handlers/Explodable'; 3 | import { RenderedPage } from './view-handlers/ViewHandler'; 4 | export default class BrowseController { 5 | #private; 6 | constructor(connectionManager: ConnectionManager); 7 | browseUri(uri: string): Promise; 8 | /** 9 | * Explodable uris: 10 | * - song[@songId=...] 11 | * - songs[@albumId=...] | [ [@playlistId=...| @parentId=...] ] 12 | * - albums[@parentId=...][@genreId=...| @artistId=...| @albumArtistId=...] 13 | * 14 | */ 15 | explodeUri(uri: string): Promise; 16 | } 17 | //# sourceMappingURL=index.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/index.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/browse/index.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,oCAAoC,CAAC;AAGnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,CAAC,OAAO,OAAO,gBAAgB;;gBAIvB,iBAAiB,EAAE,iBAAiB;IAoB1C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOnD;;;;;;OAMG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAU5D"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"AlbumViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/AlbumViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,qBAAqB,EAAE,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAIjF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,QAAQ,GAAG,WAAW,GAAG,KAAK,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,GAAG,CAAC;CAC7B;AAED,cAAM,gBAAiB,SAAQ,qBAAqB,CAAC,SAAS,CAAC;;IAEvD,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAmIrC,SAAS,CAAC,uBAAuB,IAAI,oBAAoB;IAmBnD,iBAAiB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;CAsC3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAA4C"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ArtistViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import FilterableViewHandler, { FilterableViewConfig } from './FilterableViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface ArtistView extends View { 5 | name: 'artists' | 'albumArtists'; 6 | parentId?: string; 7 | search?: string; 8 | collatedSearchResults?: '1'; 9 | } 10 | export default class ArtistViewHandler extends FilterableViewHandler { 11 | browse(): Promise; 12 | protected getFilterableViewConfig(): FilterableViewConfig; 13 | } 14 | //# sourceMappingURL=ArtistViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ArtistViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ArtistViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ArtistViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,qBAAqB,EAAE,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAwB,MAAM,eAAe,CAAC;AAKnE,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,IAAI,EAAE,SAAS,GAAG,cAAc,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,GAAG,CAAC;CAC7B;AAED,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,qBAAqB,CAAC,UAAU,CAAC;IAExE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAoDrC,SAAS,CAAC,uBAAuB,IAAI,oBAAoB;CAa1D"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/CollectionViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface CollectionView extends View { 5 | name: 'collection'; 6 | parentId: string; 7 | itemType?: 'album' | 'artist' | 'playlist' | 'song'; 8 | } 9 | export default class CollectionViewHandler extends BaseViewHandler { 10 | #private; 11 | browse(): Promise; 12 | } 13 | //# sourceMappingURL=CollectionViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/CollectionViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"CollectionViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/CollectionViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAI1B,OAAO,EAAgB,YAAY,EAAwB,MAAM,eAAe,CAAC;AAKjF,MAAM,WAAW,cAAe,SAAQ,IAAI;IAC1C,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;CACrD;AAED,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,eAAe,CAAC,cAAc,CAAC;;IAE1E,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAmGtC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/CollectionsViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface CollectionsView extends View { 5 | name: 'collections'; 6 | } 7 | export default class CollectionsViewHandler extends BaseViewHandler { 8 | browse(): Promise; 9 | } 10 | //# sourceMappingURL=CollectionsViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/CollectionsViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"CollectionsViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/CollectionsViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAwB,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,eAAgB,SAAQ,IAAI;IAC3C,IAAI,EAAE,aAAa,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,OAAO,sBAAuB,SAAQ,eAAe,CAAC,eAAe,CAAC;IAE5E,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAiCtC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/Explodable.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Explodable.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/Explodable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAGzF,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,eAAe,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,KAAK,WAAW,CAAC,CAAC,SAAS,IAAI,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,eAAe,CAAC,CAAC,CAAC,GAAG;IAAE,iBAAiB,EAAE,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;CAAE,CAAC;AAE7H,wBAAgB,UAAU,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK;;mBAI/D,QAAQ,iBAAiB,EAAE,CAAC;mCAkBZ,IAAI,GAAG,QAAQ,iBAAiB,GAAG,IAAI,CAAC;sCA8E3C,IAAI,GAAG,mBAAmB,GAAG,IAAI;QAS/D;;;WAGG;2BACgB,IAAI,GAAG,MAAM,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAI1C"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/FilterSelectionViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface FilterSelectionView extends View { 5 | name: 'filter.az' | 'filter.filter' | 'filter.genre' | 'filter.sort' | 'filter.year'; 6 | filterView: string; 7 | } 8 | export default class FilterSelectionViewHandler extends BaseViewHandler { 9 | #private; 10 | browse(): Promise; 11 | constructPrevUri(): string; 12 | } 13 | //# sourceMappingURL=FilterSelectionViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/FilterSelectionViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FilterSelectionViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/FilterSelectionViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAK3D,MAAM,WAAW,mBAAoB,SAAQ,IAAI;IAC/C,IAAI,EAAE,WAAW,GAAG,eAAe,GAAG,cAAc,GAAG,aAAa,GAAG,aAAa,CAAC;IACrF,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,eAAe,CAAC,mBAAmB,CAAC;;IAEpF,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAgErC,gBAAgB,IAAI,MAAM;CAkE3B"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/FilterableViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import { FilterType } from '../../../model/filter/FilterModel'; 2 | import BaseViewHandler from './BaseViewHandler'; 3 | import View from './View'; 4 | import { RenderedList } from './ViewHandler'; 5 | import { GetItemsParams } from '../../../model/BaseModel'; 6 | export interface FilterableViewConfig { 7 | showFilters: boolean; 8 | saveFiltersKey: string; 9 | filterTypes: FilterType[]; 10 | } 11 | export interface HandleFiltersResult { 12 | lists: RenderedList[]; 13 | modelQueryParams: GetItemsParams; 14 | } 15 | export default abstract class FilterableViewHandler extends BaseViewHandler { 16 | #private; 17 | protected handleFilters(): Promise; 18 | protected abstract getFilterableViewConfig(): FilterableViewConfig; 19 | } 20 | //# sourceMappingURL=FilterableViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/FilterableViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FilterableViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/FilterableViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2B,UAAU,EAAa,MAAM,mCAAmC,CAAC;AACnG,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,gBAAgB,EAAE,cAAc,CAAA;CACjC;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,qBAAqB,CAAC,CAAC,SAAS,IAAI,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;;cAE5E,aAAa,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAmB7D,SAAS,CAAC,QAAQ,CAAC,uBAAuB,IAAI,oBAAoB;CAoNnE"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/FolderViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import FilterableViewHandler, { FilterableViewConfig } from './FilterableViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface FolderView extends View { 5 | name: 'folder'; 6 | parentId: string; 7 | } 8 | export default class FolderViewHandler extends FilterableViewHandler { 9 | browse(): Promise; 10 | protected getFilterableViewConfig(): FilterableViewConfig; 11 | } 12 | //# sourceMappingURL=FolderViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/FolderViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FolderViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/FolderViewHandler.ts"],"names":[],"mappings":"AAGA,OAAO,qBAAqB,EAAE,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAEtF,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAwB,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,qBAAqB,CAAC,UAAU,CAAC;IAExE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAiDrC,SAAS,CAAC,uBAAuB,IAAI,oBAAoB;CAO1D"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/GenreViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface GenreView extends View { 5 | name: 'genres'; 6 | parentId: string; 7 | } 8 | export default class GenreViewHandler extends BaseViewHandler { 9 | browse(): Promise; 10 | } 11 | //# sourceMappingURL=GenreViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/GenreViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GenreViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/GenreViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAwB,MAAM,eAAe,CAAC;AAEjF,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,EAAE,QAAQ,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,eAAe,CAAC,SAAS,CAAC;IAEhE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAkCtC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/LibraryViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | import { ExplodedTrackInfo } from './Explodable'; 5 | export interface LibraryView extends View { 6 | name: 'library'; 7 | parentId: string; 8 | } 9 | export default class LibraryViewHandler extends BaseViewHandler { 10 | #private; 11 | browse(): Promise; 12 | explode(): Promise; 13 | } 14 | //# sourceMappingURL=LibraryViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/LibraryViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"LibraryViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/LibraryViewHandler.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAwB,MAAM,eAAe,CAAC;AAKjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAUjD,MAAM,WAAW,WAAY,SAAQ,IAAI;IACvC,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,eAAe,CAAC,WAAW,CAAC;;IAEpE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAsQ/B,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAY9C"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/PlaylistViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface PlaylistView extends View { 5 | name: 'playlists'; 6 | } 7 | export default class PlaylistViewHandler extends BaseViewHandler { 8 | browse(): Promise; 9 | } 10 | //# sourceMappingURL=PlaylistViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/PlaylistViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"PlaylistViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/PlaylistViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAwB,MAAM,eAAe,CAAC;AAEjF,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,eAAe,CAAC,YAAY,CAAC;IAEtE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAkCtC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface RootView extends View { 5 | name: 'root'; 6 | } 7 | export default class RootViewHandler extends BaseViewHandler { 8 | browse(): Promise; 9 | } 10 | //# sourceMappingURL=RootViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"RootViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/RootViewHandler.ts"],"names":[],"mappings":"AACA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAM7C,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,eAAe,CAAC,QAAQ,CAAC;IAE9D,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CA0CtC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/SongViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SongViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/SongViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,qBAAqB,EAAE,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACtF,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAEnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAK3D,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,qBAAqB,CAAC,EAAE,GAAG,CAAC;CAC7B;AAED,cAAM,eAAgB,SAAQ,qBAAqB,CAAC,QAAQ,CAAC;IAErD,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAkH/B,iBAAiB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAsC1C,SAAS,CAAC,uBAAuB,IAAI,oBAAoB;CAiB1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAED,wBAA2C"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/UserViewViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseViewHandler from './BaseViewHandler'; 2 | import View from './View'; 3 | import { RenderedPage } from './ViewHandler'; 4 | export interface UserViewView extends View { 5 | name: 'userViews'; 6 | serverId: string; 7 | username: string; 8 | } 9 | export default class UserViewViewHandler extends BaseViewHandler { 10 | #private; 11 | browse(): Promise; 12 | } 13 | //# sourceMappingURL=UserViewViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/UserViewViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UserViewViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/UserViewViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAEhD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAwB,MAAM,eAAe,CAAC;AAMjF,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,eAAe,CAAC,YAAY,CAAC;;IAEtE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAyEtC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/View.d.ts: -------------------------------------------------------------------------------- 1 | interface View extends Record { 2 | name: string; 3 | username?: string; 4 | serverId?: string; 5 | parentId?: string; 6 | startIndex?: number; 7 | limit?: number; 8 | fixedView?: string; 9 | saveFilter?: string; 10 | noExplode?: '1'; 11 | } 12 | export default View; 13 | //# sourceMappingURL=View.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/View.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"View.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/View.ts"],"names":[],"mappings":"AAAA,UAAU,IAAK,SAAQ,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,GAAG,CAAC;CACjB;AAED,eAAe,IAAI,CAAC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/View.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=View.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/View.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"View.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/View.ts"],"names":[],"mappings":"","sourcesContent":["interface View extends Record {\n name: string;\n username?: string;\n serverId?: string;\n parentId?: string;\n startIndex?: number;\n limit?: number;\n fixedView?: string;\n saveFilter?: string;\n noExplode?: '1';\n}\n\nexport default View;\n"]} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHandler.d.ts: -------------------------------------------------------------------------------- 1 | import { RenderedHeader, RenderedListItem } from './renderer/BaseRenderer'; 2 | export interface RenderedPage { 3 | navigation?: RenderedPageContents; 4 | } 5 | export interface RenderedPageContents { 6 | prev?: { 7 | uri?: string; 8 | }; 9 | info?: RenderedHeader; 10 | lists?: RenderedList[]; 11 | } 12 | export interface RenderedList { 13 | title?: string; 14 | availableListViews: ('list' | 'grid')[]; 15 | items: RenderedListItem[]; 16 | } 17 | export default abstract class ViewHandler { 18 | abstract browse(): Promise; 19 | abstract explode(): Promise; 20 | } 21 | //# sourceMappingURL=ViewHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3E,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAC;IACF,IAAI,CAAC,EAAE,cAAc,CAAC;IACtB,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxC,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,WAAW;IACvC,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IACxC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;CACjC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHandler.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | class ViewHandler { 4 | } 5 | exports.default = ViewHandler; 6 | //# sourceMappingURL=ViewHandler.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHandler.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandler.ts"],"names":[],"mappings":";;AAoBA,MAA8B,WAAW;CAGxC;AAHD,8BAGC","sourcesContent":["import { RenderedHeader, RenderedListItem } from './renderer/BaseRenderer';\n\nexport interface RenderedPage {\n navigation?: RenderedPageContents;\n}\n\nexport interface RenderedPageContents {\n prev?: {\n uri?: string\n };\n info?: RenderedHeader;\n lists?: RenderedList[];\n}\n\nexport interface RenderedList {\n title?: string;\n availableListViews: ('list' | 'grid')[];\n items: RenderedListItem[];\n}\n\nexport default abstract class ViewHandler {\n abstract browse(): Promise;\n abstract explode(): Promise;\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts: -------------------------------------------------------------------------------- 1 | import ConnectionManager from '../../../connection/ConnectionManager'; 2 | import ServerConnection from '../../../connection/ServerConnection'; 3 | import BaseViewHandler from './BaseViewHandler'; 4 | import View from './View'; 5 | export default class ViewHandlerFactory { 6 | static getHandler(uri: string, connection: ServerConnection): Promise>; 7 | static getHandler(uri: string, connectionManager: ConnectionManager): Promise>; 8 | } 9 | //# sourceMappingURL=ViewHandlerFactory.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ViewHandlerFactory.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,uCAAuC,CAAC;AACtE,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAGpE,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAQhD,OAAO,IAAI,MAAM,QAAQ,CAAC;AA+B1B,MAAM,CAAC,OAAO,OAAO,kBAAkB;WAExB,UAAU,CAAC,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;WAClG,UAAU,CAAC,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAcxH"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHelper.d.ts: -------------------------------------------------------------------------------- 1 | import { AZFilterModelConfig } from '../../../model/filter/AZFilterModel'; 2 | import { FilterFilterModelConfig } from '../../../model/filter/FilterFilterModel'; 3 | import { FilterType } from '../../../model/filter/FilterModel'; 4 | import { GenreFilterModelConfig } from '../../../model/filter/GenreFilterModel'; 5 | import { SortFilterModelConfig } from '../../../model/filter/SortFilterModel'; 6 | import { YearFilterModelConfig } from '../../../model/filter/YearFilterModel'; 7 | import View from './View'; 8 | type FilterModelConfig = AZFilterModelConfig | FilterFilterModelConfig | GenreFilterModelConfig | SortFilterModelConfig | YearFilterModelConfig; 9 | export default class ViewHelper { 10 | #private; 11 | static getViewsFromUri(uri: string): View[]; 12 | static constructUriSegmentFromView(view: V): string; 13 | static getFilterModelConfigFromView(view: View, filterType: FilterType.Year): YearFilterModelConfig | null; 14 | static getFilterModelConfigFromView(view: View, filterType: FilterType.Sort): SortFilterModelConfig | null; 15 | static getFilterModelConfigFromView(view: View, filterType: FilterType.Genre): GenreFilterModelConfig | null; 16 | static getFilterModelConfigFromView(view: View, filterType: FilterType.Filter): FilterFilterModelConfig | null; 17 | static getFilterModelConfigFromView(view: View, filterType: FilterType.AZ): AZFilterModelConfig | null; 18 | static getFilterModelConfigFromView(view: View, filterType: FilterType): FilterModelConfig | null; 19 | } 20 | export {}; 21 | //# sourceMappingURL=ViewHelper.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/ViewHelper.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ViewHelper.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHelper.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,uBAAuB,EAAwB,MAAM,yCAAyC,CAAC;AACxG,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAChF,OAAO,EAAsB,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAClG,OAAO,EAAsB,qBAAqB,EAAE,MAAM,uCAAuC,CAAC;AAElG,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,KAAK,iBAAiB,GAAG,mBAAmB,GAAG,uBAAuB,GACpE,sBAAsB,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAGzE,MAAM,CAAC,OAAO,OAAO,UAAU;;IAE7B,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE;IA4C3C,MAAM,CAAC,2BAA2B,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;IAmD1D,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,GAAG,qBAAqB,GAAG,IAAI;IAC1G,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,GAAG,qBAAqB,GAAG,IAAI;IAC1G,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,GAAG,sBAAsB,GAAG,IAAI;IAC5G,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,uBAAuB,GAAG,IAAI;IAC9G,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,GAAG,mBAAmB,GAAG,IAAI;IACtG,MAAM,CAAC,4BAA4B,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,GAAG,iBAAiB,GAAG,IAAI;CA6GlG"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/AlbumRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import Album from '../../../../entities/Album'; 2 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 3 | export default class AlbumRenderer extends BaseRenderer { 4 | renderToListItem(data: Album): RenderedListItem | null; 5 | renderToHeader(data: Album): RenderedHeader | null; 6 | } 7 | //# sourceMappingURL=AlbumRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/AlbumRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"AlbumRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/AlbumRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,4BAA4B,CAAC;AAG/C,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY,CAAC,KAAK,CAAC;IAE5D,gBAAgB,CAAC,IAAI,EAAE,KAAK,GAAG,gBAAgB,GAAG,IAAI;IAiBtD,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,cAAc,GAAG,IAAI;CAWnD"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/AlbumRenderer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const ViewHelper_1 = __importDefault(require("../ViewHelper")); 7 | const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); 8 | class AlbumRenderer extends BaseRenderer_1.default { 9 | renderToListItem(data) { 10 | const songsView = { 11 | name: 'songs', 12 | albumId: data.id 13 | }; 14 | return { 15 | service: 'jellyfin', 16 | type: 'folder', 17 | title: data.name, 18 | artist: data.albumArtist, 19 | duration: data.duration, 20 | albumart: this.getAlbumArt(data), 21 | uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(songsView)}` 22 | }; 23 | } 24 | renderToHeader(data) { 25 | const header = super.renderToHeader(data) || {}; 26 | header.artist = data.albumArtist; 27 | header.year = data.year; 28 | // Duration does not get converted into time format when shown in header 29 | // (as opposed to list item). So we have to do it ourselves. 30 | header.duration = this.timeFormat(data.duration); 31 | header.genre = this.getStringFromIdNamePair(data.genres); 32 | return header; 33 | } 34 | } 35 | exports.default = AlbumRenderer; 36 | //# sourceMappingURL=AlbumRenderer.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/ArtistRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import Artist from '../../../../entities/Artist'; 2 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 3 | export default class ArtistRenderer extends BaseRenderer { 4 | renderToListItem(data: Artist, options?: { 5 | noParent: boolean; 6 | }): RenderedListItem | null; 7 | renderToHeader(data: Artist): RenderedHeader | null; 8 | } 9 | //# sourceMappingURL=ArtistRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/ArtistRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ArtistRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/ArtistRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,6BAA6B,CAAC;AACjD,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAMhF,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY,CAAC,MAAM,CAAC;IAE9D,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,EAAE,OAAO,CAAA;KAAE,GAAG,gBAAgB,GAAG,IAAI;IA0BxF,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;CAMpD"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/BaseRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import BaseEntity from '../../../../entities/BaseEntity'; 2 | import AlbumArtHandler from '../../../../util/AlbumArtHandler'; 3 | import View from '../View'; 4 | export interface RenderedListItem { 5 | service: 'jellyfin'; 6 | type: 'folder' | 'song' | 'streaming-category' | 'jellyfin-filter' | 'jellyfin-filter-option'; 7 | title: string; 8 | albumart?: string | null; 9 | artist?: string | null; 10 | album?: string | null; 11 | duration?: number | null; 12 | uri: string; 13 | icon?: string; 14 | favorite?: boolean; 15 | } 16 | export interface RenderedHeader { 17 | service: 'jellyfin'; 18 | type: 'album' | 'song'; 19 | uri: string; 20 | albumart: string | null; 21 | album?: string | null; 22 | artist?: string | null; 23 | year?: number | string | null; 24 | duration?: string | null; 25 | genre?: string | null; 26 | } 27 | export default abstract class BaseRenderer { 28 | #private; 29 | constructor(uri: string, currentView: View, previousViews: View[], albumArtHandler: AlbumArtHandler); 30 | abstract renderToListItem(data: T, ...args: any[]): RenderedListItem | null; 31 | renderToHeader(data: T): RenderedHeader | null; 32 | protected getAlbumArt(data: T): string; 33 | get uri(): string; 34 | get currentView(): View; 35 | get previousViews(): View[]; 36 | protected timeFormat(time: number | null): string | null; 37 | getStringFromIdNamePair(data: { 38 | id: string; 39 | name: string; 40 | }[]): string; 41 | } 42 | //# sourceMappingURL=BaseRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/CollectionRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import Collection from '../../../../entities/Collection'; 2 | import BaseRenderer, { RenderedListItem } from './BaseRenderer'; 3 | export default class CollectionRenderer extends BaseRenderer { 4 | renderToListItem(data: Collection): RenderedListItem | null; 5 | } 6 | //# sourceMappingURL=CollectionRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/CollectionRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"CollectionRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/CollectionRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,iCAAiC,CAAC;AAGzD,OAAO,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,YAAY,CAAC,UAAU,CAAC;IAEtE,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,gBAAgB,GAAG,IAAI;CAe5D"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/CollectionRenderer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const ViewHelper_1 = __importDefault(require("../ViewHelper")); 7 | const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); 8 | class CollectionRenderer extends BaseRenderer_1.default { 9 | renderToListItem(data) { 10 | const collectionView = { 11 | name: 'collection', 12 | parentId: data.id 13 | }; 14 | return { 15 | service: 'jellyfin', 16 | type: 'streaming-category', 17 | title: data.name, 18 | artist: String(data.year), 19 | albumart: this.getAlbumArt(data), 20 | uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(collectionView)}` 21 | }; 22 | } 23 | } 24 | exports.default = CollectionRenderer; 25 | //# sourceMappingURL=CollectionRenderer.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/CollectionRenderer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"CollectionRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/CollectionRenderer.ts"],"names":[],"mappings":";;;;;AAEA,+DAAuC;AACvC,kEAAgE;AAEhE,MAAqB,kBAAmB,SAAQ,sBAAwB;IAEtE,gBAAgB,CAAC,IAAgB;QAC/B,MAAM,cAAc,GAAmB;YACrC,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE,IAAI,CAAC,EAAE;SAClB,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,oBAAoB;YAC1B,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACzB,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YAChC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,cAAc,CAAC,EAAE;SAC7E,CAAC;IACJ,CAAC;CACF;AAjBD,qCAiBC","sourcesContent":["import Collection from '../../../../entities/Collection';\nimport { CollectionView } from '../CollectionViewHandler';\nimport ViewHelper from '../ViewHelper';\nimport BaseRenderer, { RenderedListItem } from './BaseRenderer';\n\nexport default class CollectionRenderer extends BaseRenderer {\n\n renderToListItem(data: Collection): RenderedListItem | null {\n const collectionView: CollectionView = {\n name: 'collection',\n parentId: data.id\n };\n\n return {\n service: 'jellyfin',\n type: 'streaming-category',\n title: data.name,\n artist: String(data.year),\n albumart: this.getAlbumArt(data),\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(collectionView)}`\n };\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/FolderRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import BaseRenderer, { RenderedListItem } from './BaseRenderer'; 2 | import Folder from '../../../../entities/Folder'; 3 | export default class FolderRenderer extends BaseRenderer { 4 | renderToListItem(data: Folder): RenderedListItem | null; 5 | } 6 | //# sourceMappingURL=FolderRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/FolderRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FolderRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/FolderRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,MAAsB,MAAM,6BAA6B,CAAC;AAMjE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY,CAAC,MAAM,CAAC;IAE9D,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;CA0BxD"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/FolderRenderer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); 7 | const Folder_1 = require("../../../../entities/Folder"); 8 | const entities_1 = require("../../../../entities"); 9 | const ViewHelper_1 = __importDefault(require("../ViewHelper")); 10 | class FolderRenderer extends BaseRenderer_1.default { 11 | renderToListItem(data) { 12 | let title; 13 | if (data.type === entities_1.EntityType.Folder) { 14 | title = ` 15 |
16 | ${data.name} 17 |
18 | `; 19 | } 20 | else { 21 | title = data.name; 22 | } 23 | const targetView = { 24 | name: data.folderType === Folder_1.FolderType.Collections ? 'collections' : 'folder', 25 | parentId: data.id 26 | }; 27 | return { 28 | service: 'jellyfin', 29 | type: 'streaming-category', 30 | title, 31 | uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(targetView)}`, 32 | albumart: this.getAlbumArt(data) 33 | }; 34 | } 35 | } 36 | exports.default = FolderRenderer; 37 | //# sourceMappingURL=FolderRenderer.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/GenreRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import Genre from '../../../../entities/Genre'; 2 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 3 | export default class GenreRenderer extends BaseRenderer { 4 | renderToListItem(data: Genre): RenderedListItem | null; 5 | renderToHeader(data: Genre): RenderedHeader | null; 6 | } 7 | //# sourceMappingURL=GenreRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/GenreRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GenreRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/GenreRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,4BAA4B,CAAC;AAC/C,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKhF,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY,CAAC,KAAK,CAAC;IAE5D,gBAAgB,CAAC,IAAI,EAAE,KAAK,GAAG,gBAAgB,GAAG,IAAI;IAetD,cAAc,CAAC,IAAI,EAAE,KAAK,GAAG,cAAc,GAAG,IAAI;CAKnD"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/GenreRenderer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); 7 | const JellyfinContext_1 = __importDefault(require("../../../../JellyfinContext")); 8 | const ViewHelper_1 = __importDefault(require("../ViewHelper")); 9 | class GenreRenderer extends BaseRenderer_1.default { 10 | renderToListItem(data) { 11 | const albumView = { 12 | name: 'albums', 13 | parentId: this.currentView.parentId, 14 | genreId: data.id 15 | }; 16 | return { 17 | 'service': 'jellyfin', 18 | 'type': 'folder', 19 | 'title': data.name, 20 | 'albumart': this.getAlbumArt(data), 21 | 'uri': `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(albumView)}` 22 | }; 23 | } 24 | renderToHeader(data) { 25 | const header = super.renderToHeader(data) || {}; 26 | header.artist = JellyfinContext_1.default.getI18n('JELLYFIN_GENRE'); 27 | return header; 28 | } 29 | } 30 | exports.default = GenreRenderer; 31 | //# sourceMappingURL=GenreRenderer.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/PlaylistRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 2 | import Playlist from '../../../../entities/Playlist'; 3 | export default class PlaylistRenderer extends BaseRenderer { 4 | renderToListItem(data: Playlist): RenderedListItem | null; 5 | renderToHeader(data: Playlist): RenderedHeader | null; 6 | } 7 | //# sourceMappingURL=PlaylistRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/PlaylistRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"PlaylistRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/PlaylistRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,QAAQ,MAAM,+BAA+B,CAAC;AAKrD,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,YAAY,CAAC,QAAQ,CAAC;IAElE,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI;IAezD,cAAc,CAAC,IAAI,EAAE,QAAQ,GAAG,cAAc,GAAG,IAAI;CAKtD"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/PlaylistRenderer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); 7 | const JellyfinContext_1 = __importDefault(require("../../../../JellyfinContext")); 8 | const ViewHelper_1 = __importDefault(require("../ViewHelper")); 9 | class PlaylistRenderer extends BaseRenderer_1.default { 10 | renderToListItem(data) { 11 | const songView = { 12 | name: 'songs', 13 | playlistId: data.id 14 | }; 15 | return { 16 | service: 'jellyfin', 17 | type: 'folder', 18 | title: data.name, 19 | albumart: this.getAlbumArt(data), 20 | uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(songView)}` 21 | }; 22 | } 23 | renderToHeader(data) { 24 | const header = super.renderToHeader(data) || {}; 25 | header.artist = JellyfinContext_1.default.getI18n('JELLYFIN_PLAYLIST'); 26 | return header; 27 | } 28 | } 29 | exports.default = PlaylistRenderer; 30 | //# sourceMappingURL=PlaylistRenderer.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/ServerRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import Server from '../../../../entities/Server'; 2 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 3 | export default class ServerRenderer extends BaseRenderer { 6 | renderToListItem(data: Server & { 7 | username: string; 8 | }): RenderedListItem | null; 9 | renderToHeader(): RenderedHeader | null; 10 | } 11 | //# sourceMappingURL=ServerRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/ServerRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ServerRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/ServerRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,6BAA6B,CAAC;AAGjD,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,YAAY,CAAC,MAAM,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;IAErF,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,GAAG,IAAI;IAgB9E,cAAc,IAAI,cAAc,GAAG,IAAI;CAGxC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/ServerRenderer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const ViewHelper_1 = __importDefault(require("../ViewHelper")); 7 | const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); 8 | class ServerRenderer extends BaseRenderer_1.default { 9 | renderToListItem(data) { 10 | const userViewView = { 11 | name: 'userViews', 12 | username: data.username, 13 | serverId: data.id 14 | }; 15 | return { 16 | 'service': 'jellyfin', 17 | 'type': 'streaming-category', 18 | 'title': `${data.username} @ ${data.name}`, 19 | 'uri': `jellyfin/${ViewHelper_1.default.constructUriSegmentFromView(userViewView)}`, 20 | 'albumart': '/albumart?sourceicon=music_service/jellyfin/dist/assets/images/jellyfin.png' 21 | }; 22 | } 23 | renderToHeader() { 24 | return null; 25 | } 26 | } 27 | exports.default = ServerRenderer; 28 | //# sourceMappingURL=ServerRenderer.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/ServerRenderer.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ServerRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/ServerRenderer.ts"],"names":[],"mappings":";;;;;AAEA,+DAAuC;AACvC,kEAAgF;AAEhF,MAAqB,cAAe,SAAQ,sBAA2C;IAErF,gBAAgB,CAAC,IAAmC;QAClD,MAAM,YAAY,GAAiB;YACjC,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,QAAQ,EAAE,IAAI,CAAC,EAAE;SAClB,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,oBAAoB;YAC5B,OAAO,EAAE,GAAG,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,IAAI,EAAE;YAC1C,KAAK,EAAE,YAAY,oBAAU,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE;YACzE,UAAU,EAAE,6EAA6E;SAC1F,CAAC;IACJ,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AArBD,iCAqBC","sourcesContent":["import Server from '../../../../entities/Server';\nimport { UserViewView } from '../UserViewViewHandler';\nimport ViewHelper from '../ViewHelper';\nimport BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer';\n\nexport default class ServerRenderer extends BaseRenderer {\n\n renderToListItem(data: Server & { username: string }): RenderedListItem | null {\n const userViewView: UserViewView = {\n name: 'userViews',\n username: data.username,\n serverId: data.id\n };\n\n return {\n 'service': 'jellyfin',\n 'type': 'streaming-category',\n 'title': `${data.username} @ ${data.name}`,\n 'uri': `jellyfin/${ViewHelper.constructUriSegmentFromView(userViewView)}`,\n 'albumart': '/albumart?sourceicon=music_service/jellyfin/dist/assets/images/jellyfin.png'\n };\n }\n\n renderToHeader(): RenderedHeader | null {\n return null;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/SongRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 2 | import Song from '../../../../entities/Song'; 3 | export default class SongRenderer extends BaseRenderer { 4 | renderToListItem(data: Song): RenderedListItem | null; 5 | renderToHeader(): RenderedHeader | null; 6 | } 7 | //# sourceMappingURL=SongRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/SongRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SongRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/SongRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,IAAI,MAAM,2BAA2B,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,YAAY,CAAC,IAAI,CAAC;IAE1D,gBAAgB,CAAC,IAAI,EAAE,IAAI,GAAG,gBAAgB,GAAG,IAAI;IAmBrD,cAAc,IAAI,cAAc,GAAG,IAAI;CAGxC"} -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/SongRenderer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); 7 | const ViewHelper_1 = __importDefault(require("../ViewHelper")); 8 | class SongRenderer extends BaseRenderer_1.default { 9 | renderToListItem(data) { 10 | const songView = { 11 | name: 'song', 12 | songId: data.id 13 | }; 14 | return { 15 | service: 'jellyfin', 16 | type: 'song', 17 | title: data.name, 18 | artist: this.getStringFromIdNamePair(data.artists), 19 | album: data.album?.name, 20 | duration: data.duration, 21 | uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(songView)}`, 22 | albumart: this.getAlbumArt(data), 23 | favorite: data.favorite 24 | }; 25 | } 26 | renderToHeader() { 27 | return null; 28 | } 29 | } 30 | exports.default = SongRenderer; 31 | //# sourceMappingURL=SongRenderer.js.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/UserViewRenderer.d.ts: -------------------------------------------------------------------------------- 1 | import UserView from '../../../../entities/UserView'; 2 | import BaseRenderer, { RenderedListItem } from './BaseRenderer'; 3 | export default class UserViewRenderer extends BaseRenderer { 4 | renderToListItem(data: UserView): RenderedListItem | null; 5 | } 6 | //# sourceMappingURL=UserViewRenderer.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/browse/view-handlers/renderer/UserViewRenderer.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UserViewRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderer/UserViewRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,QAA0B,MAAM,+BAA+B,CAAC;AAMvE,OAAO,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,YAAY,CAAC,QAAQ,CAAC;IAElE,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,gBAAgB,GAAG,IAAI;CAgD1D"} -------------------------------------------------------------------------------- /dist/lib/controller/play/PlayController.d.ts: -------------------------------------------------------------------------------- 1 | import ConnectionManager from '../../connection/ConnectionManager'; 2 | import ServerConnection from '../../connection/ServerConnection'; 3 | import { Song } from '../../entities'; 4 | import { ExplodedTrackInfo } from '../browse/view-handlers/Explodable'; 5 | export default class PlayController { 6 | #private; 7 | constructor(connectionManager: ConnectionManager); 8 | /** 9 | * Track uri: 10 | * jellyfin/{username}@{serverId}/song@songId={songId} 11 | */ 12 | clearAddPlayTrack(track: ExplodedTrackInfo): Promise; 13 | stop(): any; 14 | pause(): any; 15 | resume(): any; 16 | seek(position: number): any; 17 | next(): any; 18 | previous(): any; 19 | dispose(): void; 20 | prefetch(track: ExplodedTrackInfo): Promise; 21 | getSongFromTrack(track: ExplodedTrackInfo): Promise<{ 22 | song: Song; 23 | connection: ServerConnection; 24 | }>; 25 | } 26 | //# sourceMappingURL=PlayController.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/play/PlayController.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"PlayController.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/play/PlayController.ts"],"names":[],"mappings":"AAKA,OAAO,iBAAiB,MAAM,oCAAoC,CAAC;AACnE,OAAO,gBAAgB,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAGtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAqCvE,MAAM,CAAC,OAAO,OAAO,cAAc;;gBAUrB,iBAAiB,EAAE,iBAAiB;IAsChD;;;OAGG;IACG,iBAAiB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBhE,IAAI;IAMJ,KAAK;IAML,MAAM;IAMN,IAAI,CAAC,QAAQ,EAAE,MAAM;IAMrB,IAAI;IAMJ,QAAQ;IAKR,OAAO;IAOD,QAAQ,CAAC,KAAK,EAAE,iBAAiB;IAsIjC,gBAAgB,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC;QAAC,IAAI,EAAE,IAAI,CAAC;QAAC,UAAU,EAAE,gBAAgB,CAAA;KAAC,CAAC;CAwKtG"} -------------------------------------------------------------------------------- /dist/lib/controller/search/SearchController.d.ts: -------------------------------------------------------------------------------- 1 | import ConnectionManager from '../../connection/ConnectionManager'; 2 | import { RenderedList } from '../browse/view-handlers/ViewHandler'; 3 | export interface SearchQuery { 4 | value: string; 5 | } 6 | export default class SearchController { 7 | #private; 8 | constructor(connectionManager: ConnectionManager); 9 | search(query: SearchQuery): Promise; 10 | } 11 | //# sourceMappingURL=SearchController.d.ts.map -------------------------------------------------------------------------------- /dist/lib/controller/search/SearchController.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/search/SearchController.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAUnE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;;gBAIvB,iBAAiB,EAAE,iBAAiB;IAI1C,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;CAgE1D"} -------------------------------------------------------------------------------- /dist/lib/entities/Album.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | interface Album extends BaseEntity { 4 | type: EntityType.Album; 5 | albumArtist: string | null; 6 | artists: { 7 | id: string; 8 | name: string; 9 | }[]; 10 | duration: number | null; 11 | year: number | null; 12 | genres: { 13 | id: string; 14 | name: string; 15 | }[]; 16 | } 17 | export default Album; 18 | //# sourceMappingURL=Album.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Album.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Album.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Album.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,UAAU,KAAM,SAAQ,UAAU;IAChC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAA;KACb,EAAE,CAAC;IACJ,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAA;KACb,EAAE,CAAC;CACL;AAED,eAAe,KAAK,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Album.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Album.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Album.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Album.js","sourceRoot":"","sources":["../../../src/lib/entities/Album.ts"],"names":[],"mappings":"","sourcesContent":["import { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\ninterface Album extends BaseEntity {\n type: EntityType.Album;\n albumArtist: string | null;\n artists: {\n id: string,\n name: string\n }[];\n duration: number | null;\n year: number | null;\n genres: {\n id: string,\n name: string\n }[];\n}\n\nexport default Album;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/Artist.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | interface Artist extends BaseEntity { 4 | type: EntityType.Artist | EntityType.AlbumArtist; 5 | genres: { 6 | id: string; 7 | name: string; 8 | }[]; 9 | } 10 | export default Artist; 11 | //# sourceMappingURL=Artist.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Artist.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Artist.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Artist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,UAAU,MAAO,SAAQ,UAAU;IACjC,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC;IACjD,MAAM,EAAE;QACN,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAA;KACb,EAAE,CAAC;CACL;AAED,eAAe,MAAM,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Artist.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Artist.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Artist.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Artist.js","sourceRoot":"","sources":["../../../src/lib/entities/Artist.ts"],"names":[],"mappings":"","sourcesContent":["import { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\ninterface Artist extends BaseEntity {\n type: EntityType.Artist | EntityType.AlbumArtist;\n genres: {\n id: string,\n name: string\n }[];\n}\n\nexport default Artist;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/BaseEntity.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | interface BaseEntity { 3 | type: EntityType; 4 | id: string; 5 | name: string; 6 | thumbnail: string | null; 7 | } 8 | export default BaseEntity; 9 | //# sourceMappingURL=BaseEntity.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/BaseEntity.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"BaseEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/BaseEntity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAE/B,UAAU,UAAU;IAClB,IAAI,EAAE,UAAU,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,eAAe,UAAU,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/BaseEntity.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=BaseEntity.js.map -------------------------------------------------------------------------------- /dist/lib/entities/BaseEntity.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"BaseEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/BaseEntity.ts"],"names":[],"mappings":"","sourcesContent":["import { EntityType } from '.';\n\ninterface BaseEntity {\n type: EntityType;\n id: string;\n name: string;\n thumbnail: string | null;\n}\n\nexport default BaseEntity;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/Collection.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | interface Collection extends BaseEntity { 4 | type: EntityType.Collection; 5 | year: number | null; 6 | } 7 | export default Collection; 8 | //# sourceMappingURL=Collection.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Collection.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Collection.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Collection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,UAAU,UAAW,SAAQ,UAAU;IACrC,IAAI,EAAE,UAAU,CAAC,UAAU,CAAC;IAC5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED,eAAe,UAAU,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Collection.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Collection.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Collection.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Collection.js","sourceRoot":"","sources":["../../../src/lib/entities/Collection.ts"],"names":[],"mappings":"","sourcesContent":["import { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\ninterface Collection extends BaseEntity {\n type: EntityType.Collection;\n year: number | null;\n}\n\nexport default Collection;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/Folder.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | export declare enum FolderType { 4 | Collections = "Collections", 5 | Folder = "Folder" 6 | } 7 | interface Folder extends BaseEntity { 8 | type: EntityType.Folder | EntityType.CollectionFolder; 9 | folderType?: FolderType; 10 | } 11 | export default Folder; 12 | //# sourceMappingURL=Folder.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Folder.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Folder.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Folder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,oBAAY,UAAU;IACpB,WAAW,gBAAgB;IAC3B,MAAM,WAAW;CAClB;AAED,UAAU,MAAO,SAAQ,UAAU;IACjC,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,gBAAgB,CAAC;IACtD,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,eAAe,MAAM,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Folder.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.FolderType = void 0; 4 | var FolderType; 5 | (function (FolderType) { 6 | FolderType["Collections"] = "Collections"; 7 | FolderType["Folder"] = "Folder"; 8 | })(FolderType = exports.FolderType || (exports.FolderType = {})); 9 | //# sourceMappingURL=Folder.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Folder.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Folder.js","sourceRoot":"","sources":["../../../src/lib/entities/Folder.ts"],"names":[],"mappings":";;;AAGA,IAAY,UAGX;AAHD,WAAY,UAAU;IACpB,yCAA2B,CAAA;IAC3B,+BAAiB,CAAA;AACnB,CAAC,EAHW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAGrB","sourcesContent":["import { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\nexport enum FolderType {\n Collections = 'Collections',\n Folder = 'Folder'\n}\n\ninterface Folder extends BaseEntity {\n type: EntityType.Folder | EntityType.CollectionFolder;\n folderType?: FolderType;\n}\n\nexport default Folder;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/Genre.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | interface Genre extends BaseEntity { 4 | type: EntityType.Genre; 5 | } 6 | export default Genre; 7 | //# sourceMappingURL=Genre.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Genre.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Genre.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Genre.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,UAAU,KAAM,SAAQ,UAAU;IAChC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC;CACxB;AAED,eAAe,KAAK,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Genre.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Genre.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Genre.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Genre.js","sourceRoot":"","sources":["../../../src/lib/entities/Genre.ts"],"names":[],"mappings":"","sourcesContent":["import { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\ninterface Genre extends BaseEntity {\n type: EntityType.Genre;\n}\n\nexport default Genre;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/Playlist.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | interface Playlist extends BaseEntity { 4 | type: EntityType.Playlist; 5 | } 6 | export default Playlist; 7 | //# sourceMappingURL=Playlist.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Playlist.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Playlist.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Playlist.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,UAAU,QAAS,SAAQ,UAAU;IACnC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;CAC3B;AAED,eAAe,QAAQ,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Playlist.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Playlist.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Playlist.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Playlist.js","sourceRoot":"","sources":["../../../src/lib/entities/Playlist.ts"],"names":[],"mappings":"","sourcesContent":["import { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\ninterface Playlist extends BaseEntity {\n type: EntityType.Playlist;\n}\n\nexport default Playlist;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/Server.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '../entities'; 2 | import BaseEntity from '../entities/BaseEntity'; 3 | interface Server extends BaseEntity { 4 | type: EntityType.Server; 5 | url: string; 6 | connectionUrl: string; 7 | } 8 | export default Server; 9 | //# sourceMappingURL=Server.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Server.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Server.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAEhD,UAAU,MAAO,SAAQ,UAAU;IACjC,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,eAAe,MAAM,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Server.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Server.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Server.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Server.js","sourceRoot":"","sources":["../../../src/lib/entities/Server.ts"],"names":[],"mappings":"","sourcesContent":["import { EntityType } from '../entities';\nimport BaseEntity from '../entities/BaseEntity';\n\ninterface Server extends BaseEntity {\n type: EntityType.Server,\n url: string;\n connectionUrl: string;\n}\n\nexport default Server;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/Song.d.ts: -------------------------------------------------------------------------------- 1 | import { MediaSourceInfo } from '@jellyfin/sdk/lib/generated-client/models'; 2 | import { EntityType } from '.'; 3 | import BaseEntity from './BaseEntity'; 4 | interface Song extends BaseEntity { 5 | type: EntityType.Song; 6 | artists: { 7 | id: string; 8 | name: string; 9 | }[]; 10 | album: { 11 | id: string; 12 | name: string; 13 | thumbnail: string | null; 14 | } | null; 15 | duration: number; 16 | mediaSources?: MediaSourceInfo[]; 17 | favorite: boolean; 18 | } 19 | export default Song; 20 | //# sourceMappingURL=Song.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/Song.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Song.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/Song.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,UAAU,IAAK,SAAQ,UAAU;IAC/B,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC;IACtB,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAA;KACb,EAAE,CAAC;IACJ,KAAK,EAAE;QACL,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,GAAG,IAAI,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,eAAe,EAAE,CAAC;IACjC,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,eAAe,IAAI,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/Song.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Song.js.map -------------------------------------------------------------------------------- /dist/lib/entities/Song.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Song.js","sourceRoot":"","sources":["../../../src/lib/entities/Song.ts"],"names":[],"mappings":"","sourcesContent":["import { MediaSourceInfo } from '@jellyfin/sdk/lib/generated-client/models';\nimport { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\ninterface Song extends BaseEntity {\n type: EntityType.Song;\n artists: {\n id: string,\n name: string\n }[];\n album: {\n id: string;\n name: string;\n thumbnail: string | null;\n } | null;\n duration: number;\n mediaSources?: MediaSourceInfo[];\n favorite: boolean;\n}\n\nexport default Song;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/UserView.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | export declare enum UserViewType { 4 | Collections = "Collections", 5 | Playlists = "Playlists", 6 | Library = "Library", 7 | Folders = "Folder" 8 | } 9 | interface UserView extends BaseEntity { 10 | type: EntityType.UserView; 11 | userViewType?: UserViewType; 12 | } 13 | export default UserView; 14 | //# sourceMappingURL=UserView.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/UserView.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UserView.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/UserView.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC;AAC/B,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,oBAAY,YAAY;IACtB,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,OAAO,WAAW;CACnB;AAED,UAAU,QAAS,SAAQ,UAAU;IACnC,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,eAAe,QAAQ,CAAC"} -------------------------------------------------------------------------------- /dist/lib/entities/UserView.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.UserViewType = void 0; 4 | var UserViewType; 5 | (function (UserViewType) { 6 | UserViewType["Collections"] = "Collections"; 7 | UserViewType["Playlists"] = "Playlists"; 8 | UserViewType["Library"] = "Library"; 9 | UserViewType["Folders"] = "Folder"; 10 | })(UserViewType = exports.UserViewType || (exports.UserViewType = {})); 11 | //# sourceMappingURL=UserView.js.map -------------------------------------------------------------------------------- /dist/lib/entities/UserView.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UserView.js","sourceRoot":"","sources":["../../../src/lib/entities/UserView.ts"],"names":[],"mappings":";;;AAGA,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,2CAA2B,CAAA;IAC3B,uCAAuB,CAAA;IACvB,mCAAmB,CAAA;IACnB,kCAAkB,CAAA;AACpB,CAAC,EALW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAKvB","sourcesContent":["import { EntityType } from '.';\nimport BaseEntity from './BaseEntity';\n\nexport enum UserViewType {\n Collections = 'Collections',\n Playlists = 'Playlists',\n Library = 'Library',\n Folders = 'Folder'\n}\n\ninterface UserView extends BaseEntity {\n type: EntityType.UserView;\n userViewType?: UserViewType;\n}\n\nexport default UserView;\n"]} -------------------------------------------------------------------------------- /dist/lib/entities/index.d.ts: -------------------------------------------------------------------------------- 1 | export { default as Album } from './Album'; 2 | export { default as Artist } from './Artist'; 3 | export { default as Collection } from './Collection'; 4 | export { default as Folder } from './Folder'; 5 | export { default as Genre } from './Genre'; 6 | export { default as Playlist } from './Playlist'; 7 | export { default as Song } from './Song'; 8 | export declare enum EntityType { 9 | Album = "Album", 10 | Artist = "Artist", 11 | AlbumArtist = "AlbumArtist", 12 | Collection = "Collection", 13 | Folder = "Folder", 14 | CollectionFolder = "CollectionFolder", 15 | Genre = "Genre", 16 | Playlist = "Playlist", 17 | Song = "Song", 18 | Server = "Server", 19 | UserView = "UserView", 20 | Unknown = "Unknown" 21 | } 22 | //# sourceMappingURL=index.d.ts.map -------------------------------------------------------------------------------- /dist/lib/entities/index.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEzC,oBAAY,UAAU;IACpB,KAAK,UAAU;IACf,MAAM,WAAW;IACjB,WAAW,gBAAgB;IAC3B,UAAU,eAAe;IACzB,MAAM,WAAW;IACjB,gBAAgB,qBAAqB;IACrC,KAAK,UAAU;IACf,QAAQ,aAAa;IACrB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,QAAQ,aAAa;IACrB,OAAO,YAAY;CACpB"} -------------------------------------------------------------------------------- /dist/lib/entities/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.EntityType = void 0; 4 | var EntityType; 5 | (function (EntityType) { 6 | EntityType["Album"] = "Album"; 7 | EntityType["Artist"] = "Artist"; 8 | EntityType["AlbumArtist"] = "AlbumArtist"; 9 | EntityType["Collection"] = "Collection"; 10 | EntityType["Folder"] = "Folder"; 11 | EntityType["CollectionFolder"] = "CollectionFolder"; 12 | EntityType["Genre"] = "Genre"; 13 | EntityType["Playlist"] = "Playlist"; 14 | EntityType["Song"] = "Song"; 15 | EntityType["Server"] = "Server"; 16 | EntityType["UserView"] = "UserView"; 17 | EntityType["Unknown"] = "Unknown"; 18 | })(EntityType = exports.EntityType || (exports.EntityType = {})); 19 | //# sourceMappingURL=index.js.map -------------------------------------------------------------------------------- /dist/lib/entities/index.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/entities/index.ts"],"names":[],"mappings":";;;AAQA,IAAY,UAaX;AAbD,WAAY,UAAU;IACpB,6BAAe,CAAA;IACf,+BAAiB,CAAA;IACjB,yCAA2B,CAAA;IAC3B,uCAAyB,CAAA;IACzB,+BAAiB,CAAA;IACjB,mDAAqC,CAAA;IACrC,6BAAe,CAAA;IACf,mCAAqB,CAAA;IACrB,2BAAa,CAAA;IACb,+BAAiB,CAAA;IACjB,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;AACrB,CAAC,EAbW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAarB","sourcesContent":["export { default as Album } from './Album';\nexport { default as Artist } from './Artist';\nexport { default as Collection } from './Collection';\nexport { default as Folder } from './Folder';\nexport { default as Genre } from './Genre';\nexport { default as Playlist } from './Playlist';\nexport { default as Song } from './Song';\n\nexport enum EntityType {\n Album = 'Album',\n Artist = 'Artist',\n AlbumArtist = 'AlbumArtist',\n Collection = 'Collection',\n Folder = 'Folder',\n CollectionFolder = 'CollectionFolder',\n Genre = 'Genre',\n Playlist = 'Playlist',\n Song = 'Song',\n Server = 'Server',\n UserView = 'UserView',\n Unknown = 'Unknown'\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/AlbumModel.d.ts: -------------------------------------------------------------------------------- 1 | import Album from '../entities/Album'; 2 | import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel'; 3 | export interface GetSimilarAlbumsParams { 4 | album: Album; 5 | limit?: number; 6 | } 7 | export default class AlbumModel extends BaseModel { 8 | getAlbums(params: GetItemsParams): Promise>; 9 | getAlbum(id: string): Promise; 10 | getSimilarAlbums(params: GetSimilarAlbumsParams): Promise; 11 | } 12 | //# sourceMappingURL=AlbumModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/AlbumModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"AlbumModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/AlbumModel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,SAAS,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGxE,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAE/C,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAKjE,QAAQ,CAAC,EAAE,EAAE,MAAM;IAKb,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;CAczE"} -------------------------------------------------------------------------------- /dist/lib/model/ArtistModel.d.ts: -------------------------------------------------------------------------------- 1 | import Artist from '../entities/Artist'; 2 | import { GetItemsParams, GetItemsResult } from './BaseModel'; 3 | import { default as BaseModel } from './BaseModel'; 4 | export default class ArtistModel extends BaseModel { 5 | getArtists(params: GetItemsParams): Promise>; 6 | getArtist(id: string): Promise; 7 | getAlbumArtists(params: GetItemsParams): Promise>; 8 | getAlbumArtist(id: string): Promise; 9 | } 10 | //# sourceMappingURL=ArtistModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/ArtistModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ArtistModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/ArtistModel.ts"],"names":[],"mappings":"AAGA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAE1C,UAAU,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAQzE,SAAS,CAAC,EAAE,EAAE,MAAM;IAKd,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAQ9E,cAAc,CAAC,EAAE,EAAE,MAAM;CAI1B"} -------------------------------------------------------------------------------- /dist/lib/model/CollectionModel.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '../entities'; 2 | import Album from '../entities/Album'; 3 | import Artist from '../entities/Artist'; 4 | import Collection from '../entities/Collection'; 5 | import Playlist from '../entities/Playlist'; 6 | import Song from '../entities/Song'; 7 | import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel'; 8 | export interface GetCollectionItemsParams extends Omit { 9 | itemType: EntityType.Album | EntityType.Artist | EntityType.Playlist | EntityType.Song; 10 | } 11 | export default class CollectionModel extends BaseModel { 12 | getCollections(params: GetItemsParams): Promise>; 13 | getCollectionItems(params: GetCollectionItemsParams): Promise>; 14 | getCollectionItems(params: GetCollectionItemsParams & { 15 | itemType: EntityType.Song; 16 | }): Promise>; 17 | getCollectionItems(params: GetCollectionItemsParams & { 18 | itemType: EntityType.Playlist; 19 | }): Promise>; 20 | getCollectionItems(params: GetCollectionItemsParams & { 21 | itemType: EntityType.Artist; 22 | }): Promise>; 23 | getCollectionItems(params: GetCollectionItemsParams & { 24 | itemType: EntityType.Album; 25 | }): Promise>; 26 | getCollection(id: string): Promise; 27 | } 28 | //# sourceMappingURL=CollectionModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/CollectionModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"CollectionModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/CollectionModel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC,OAAO,SAAS,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOxE,MAAM,WAAW,wBAAyB,SAAQ,IAAI,CAAC,cAAc,EAAE,WAAW,CAAC;IACjF,QAAQ,EAAE,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC;CACxF;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAS;IAEpD,cAAc,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAW3E,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC/G,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG;QAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,CAAA;KAAC,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACjH,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG;QAAC,QAAQ,EAAE,UAAU,CAAC,QAAQ,CAAA;KAAC,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzH,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG;QAAC,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAA;KAAC,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACrH,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG;QAAC,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAA;KAAC,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAkDnH,aAAa,CAAC,EAAE,EAAE,MAAM;CAIzB"} -------------------------------------------------------------------------------- /dist/lib/model/FolderModel.d.ts: -------------------------------------------------------------------------------- 1 | import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel'; 2 | import { FolderContentType } from './parser/FolderContentParser'; 3 | export default class FolderModel extends BaseModel { 4 | getFolderContents(params: GetItemsParams): Promise>; 5 | getFolder(id: string): Promise; 6 | } 7 | //# sourceMappingURL=FolderModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/FolderModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FolderModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/FolderModel.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACxE,OAA4B,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGtF,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;IAEhD,iBAAiB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,iBAAiB,CAAC,CAAC;IAKrF,SAAS,CAAC,EAAE,EAAE,MAAM;CAIrB"} -------------------------------------------------------------------------------- /dist/lib/model/FolderModel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const BaseModel_1 = __importDefault(require("./BaseModel")); 7 | const FolderContentParser_1 = __importDefault(require("./parser/FolderContentParser")); 8 | const FolderParser_1 = __importDefault(require("./parser/FolderParser")); 9 | class FolderModel extends BaseModel_1.default { 10 | getFolderContents(params) { 11 | const parser = new FolderContentParser_1.default(); 12 | return this.getItemsFromAPI({ ...params, recursive: false }, parser); 13 | } 14 | getFolder(id) { 15 | const parser = new FolderParser_1.default(); 16 | return this.getItemFromApi({ itemId: id }, parser); 17 | } 18 | } 19 | exports.default = FolderModel; 20 | //# sourceMappingURL=FolderModel.js.map -------------------------------------------------------------------------------- /dist/lib/model/FolderModel.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FolderModel.js","sourceRoot":"","sources":["../../../src/lib/model/FolderModel.ts"],"names":[],"mappings":";;;;;AAAA,4DAAwE;AACxE,uFAAsF;AACtF,yEAAiD;AAEjD,MAAqB,WAAY,SAAQ,mBAAS;IAEhD,iBAAiB,CAAC,MAAsB;QACtC,MAAM,MAAM,GAAG,IAAI,6BAAmB,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,eAAe,CAAoB,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1F,CAAC;IAED,SAAS,CAAC,EAAU;QAClB,MAAM,MAAM,GAAG,IAAI,sBAAY,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;CACF;AAXD,8BAWC","sourcesContent":["import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel';\nimport FolderContentParser, { FolderContentType } from './parser/FolderContentParser';\nimport FolderParser from './parser/FolderParser';\n\nexport default class FolderModel extends BaseModel {\n\n getFolderContents(params: GetItemsParams): Promise> {\n const parser = new FolderContentParser();\n return this.getItemsFromAPI({ ...params, recursive: false }, parser);\n }\n\n getFolder(id: string) {\n const parser = new FolderParser();\n return this.getItemFromApi({ itemId: id }, parser);\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/GenreModel.d.ts: -------------------------------------------------------------------------------- 1 | import Genre from '../entities/Genre'; 2 | import { GetItemsParams, GetItemsResult } from './BaseModel'; 3 | import { default as BaseModel } from './BaseModel'; 4 | export default class GenreModel extends BaseModel { 5 | getGenres(params: GetItemsParams): Promise>; 6 | getGenre(id: string): Promise; 7 | } 8 | //# sourceMappingURL=GenreModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/GenreModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GenreModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/GenreModel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,mBAAmB,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;IAEzC,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IAQvE,QAAQ,CAAC,EAAE,EAAE,MAAM;CAIpB"} -------------------------------------------------------------------------------- /dist/lib/model/GenreModel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const genres_api_1 = require("@jellyfin/sdk/lib/utils/api/genres-api"); 7 | const BaseModel_1 = __importDefault(require("./BaseModel")); 8 | const GenreParser_1 = __importDefault(require("./parser/GenreParser")); 9 | class GenreModel extends BaseModel_1.default { 10 | async getGenres(params) { 11 | const parser = new GenreParser_1.default(); 12 | return this.getItemsFromAPI(params, parser, { 13 | getApi: (api) => (0, genres_api_1.getGenresApi)(api), 14 | getItems: 'getGenres' 15 | }); 16 | } 17 | getGenre(id) { 18 | const parser = new GenreParser_1.default(); 19 | return this.getItemFromApi({ itemId: id }, parser); 20 | } 21 | } 22 | exports.default = GenreModel; 23 | //# sourceMappingURL=GenreModel.js.map -------------------------------------------------------------------------------- /dist/lib/model/GenreModel.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GenreModel.js","sourceRoot":"","sources":["../../../src/lib/model/GenreModel.ts"],"names":[],"mappings":";;;;;AACA,uEAAsE;AAGtE,4DAAmD;AACnD,uEAA+C;AAE/C,MAAqB,UAAW,SAAQ,mBAAS;IAE/C,KAAK,CAAC,SAAS,CAAC,MAAsB;QACpC,MAAM,MAAM,GAAG,IAAI,qBAAW,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,eAAe,CAAmB,MAAM,EAAE,MAAM,EAAE;YAC5D,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,yBAAY,EAAC,GAAG,CAAC;YAClC,QAAQ,EAAE,WAAW;SACtB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,MAAM,MAAM,GAAG,IAAI,qBAAW,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;CACF;AAdD,6BAcC","sourcesContent":["import { GenresApi } from '@jellyfin/sdk/lib/generated-client/api/genres-api';\nimport { getGenresApi } from '@jellyfin/sdk/lib/utils/api/genres-api';\nimport Genre from '../entities/Genre';\nimport { GetItemsParams, GetItemsResult } from './BaseModel';\nimport { default as BaseModel } from './BaseModel';\nimport GenreParser from './parser/GenreParser';\n\nexport default class GenreModel extends BaseModel {\n\n async getGenres(params: GetItemsParams): Promise> {\n const parser = new GenreParser();\n return this.getItemsFromAPI(params, parser, {\n getApi: (api) => getGenresApi(api),\n getItems: 'getGenres'\n });\n }\n\n getGenre(id: string) {\n const parser = new GenreParser();\n return this.getItemFromApi({ itemId: id }, parser);\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/PlaylistModel.d.ts: -------------------------------------------------------------------------------- 1 | import Playlist from '../entities/Playlist'; 2 | import { GetItemsParams, GetItemsResult } from './BaseModel'; 3 | import { default as BaseModel } from './BaseModel'; 4 | export default class PlaylistModel extends BaseModel { 5 | getPlaylists(params: GetItemsParams): Promise>; 6 | getPlaylist(id: string): Promise; 7 | } 8 | //# sourceMappingURL=PlaylistModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/PlaylistModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"PlaylistModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/PlaylistModel.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAS;IAE5C,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAK7E,WAAW,CAAC,EAAE,EAAE,MAAM;CAIvB"} -------------------------------------------------------------------------------- /dist/lib/model/PlaylistModel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const entities_1 = require("../entities"); 7 | const BaseModel_1 = __importDefault(require("./BaseModel")); 8 | const PlaylistParser_1 = __importDefault(require("./parser/PlaylistParser")); 9 | class PlaylistModel extends BaseModel_1.default { 10 | async getPlaylists(params) { 11 | const parser = new PlaylistParser_1.default(); 12 | return this.getItemsFromAPI({ ...params, itemTypes: entities_1.EntityType.Playlist }, parser); 13 | } 14 | getPlaylist(id) { 15 | const parser = new PlaylistParser_1.default(); 16 | return this.getItemFromApi({ itemId: id }, parser); 17 | } 18 | } 19 | exports.default = PlaylistModel; 20 | //# sourceMappingURL=PlaylistModel.js.map -------------------------------------------------------------------------------- /dist/lib/model/PlaylistModel.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"PlaylistModel.js","sourceRoot":"","sources":["../../../src/lib/model/PlaylistModel.ts"],"names":[],"mappings":";;;;;AAAA,0CAAyC;AAGzC,4DAAmD;AACnD,6EAAqD;AAErD,MAAqB,aAAc,SAAQ,mBAAS;IAElD,KAAK,CAAC,YAAY,CAAC,MAAsB;QACvC,MAAM,MAAM,GAAG,IAAI,wBAAc,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,eAAe,CAAW,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,qBAAU,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;IAC/F,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,MAAM,MAAM,GAAG,IAAI,wBAAc,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;CACF;AAXD,gCAWC","sourcesContent":["import { EntityType } from '../entities';\nimport Playlist from '../entities/Playlist';\nimport { GetItemsParams, GetItemsResult } from './BaseModel';\nimport { default as BaseModel } from './BaseModel';\nimport PlaylistParser from './parser/PlaylistParser';\n\nexport default class PlaylistModel extends BaseModel {\n\n async getPlaylists(params: GetItemsParams): Promise> {\n const parser = new PlaylistParser();\n return this.getItemsFromAPI({ ...params, itemTypes: EntityType.Playlist }, parser);\n }\n\n getPlaylist(id: string) {\n const parser = new PlaylistParser();\n return this.getItemFromApi({ itemId: id }, parser);\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/SongModel.d.ts: -------------------------------------------------------------------------------- 1 | import Song from '../entities/Song'; 2 | import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel'; 3 | export default class SongModel extends BaseModel { 4 | getSongs(params: GetItemsParams): Promise>; 5 | getSong(id: string): Promise; 6 | getLyrics(id: string): Promise; 7 | } 8 | //# sourceMappingURL=SongModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/SongModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SongModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/SongModel.ts"],"names":[],"mappings":"AAGA,OAAO,IAAI,MAAM,kBAAkB,CAAC;AACpC,OAAO,SAAS,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAIxE,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,SAAS;IAE9C,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAS/D,OAAO,CAAC,EAAE,EAAE,MAAM;IAKZ,SAAS,CAAC,EAAE,EAAE,MAAM;CAM3B"} -------------------------------------------------------------------------------- /dist/lib/model/SongModel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const item_fields_1 = require("@jellyfin/sdk/lib/generated-client/models/item-fields"); 7 | const lyrics_api_1 = require("@jellyfin/sdk/lib/utils/api/lyrics-api"); 8 | const entities_1 = require("../entities"); 9 | const BaseModel_1 = __importDefault(require("./BaseModel")); 10 | const SongParser_1 = __importDefault(require("./parser/SongParser")); 11 | const LyricsParser_1 = __importDefault(require("./parser/LyricsParser")); 12 | class SongModel extends BaseModel_1.default { 13 | getSongs(params) { 14 | const parser = new SongParser_1.default(); 15 | return this.getItemsFromAPI({ 16 | ...params, 17 | itemTypes: entities_1.EntityType.Song, 18 | fields: [item_fields_1.ItemFields.MediaSources] 19 | }, parser); 20 | } 21 | getSong(id) { 22 | const parser = new SongParser_1.default(); 23 | return this.getItemFromApi({ itemId: id }, parser); 24 | } 25 | async getLyrics(id) { 26 | const api = (0, lyrics_api_1.getLyricsApi)(this.connection.api); 27 | const dto = await api.getLyrics({ itemId: id }); 28 | const parser = new LyricsParser_1.default(); 29 | return parser.parseDto(dto.data); 30 | } 31 | } 32 | exports.default = SongModel; 33 | //# sourceMappingURL=SongModel.js.map -------------------------------------------------------------------------------- /dist/lib/model/UserViewModel.d.ts: -------------------------------------------------------------------------------- 1 | import UserView from '../entities/UserView'; 2 | import BaseModel, { GetItemsResult } from './BaseModel'; 3 | export default class UserViewModel extends BaseModel { 4 | getUserViews(): Promise>; 5 | getUserView(id: string): Promise; 6 | } 7 | //# sourceMappingURL=UserViewModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/UserViewModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UserViewModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/UserViewModel.ts"],"names":[],"mappings":"AAGA,OAAO,QAAQ,MAAM,sBAAsB,CAAC;AAC5C,OAAO,SAAS,EAAE,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGxD,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAS;IAElD,YAAY,IAAI,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAQjD,WAAW,CAAC,EAAE,EAAE,MAAM;CAIvB"} -------------------------------------------------------------------------------- /dist/lib/model/UserViewModel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const user_views_api_1 = require("@jellyfin/sdk/lib/utils/api/user-views-api"); 7 | const BaseModel_1 = __importDefault(require("./BaseModel")); 8 | const UserViewParser_1 = __importDefault(require("./parser/UserViewParser")); 9 | class UserViewModel extends BaseModel_1.default { 10 | getUserViews() { 11 | const parser = new UserViewParser_1.default(); 12 | return this.getItemsFromAPI({}, parser, { 13 | getApi: (api) => (0, user_views_api_1.getUserViewsApi)(api), 14 | getItems: 'getUserViews' 15 | }); 16 | } 17 | getUserView(id) { 18 | const parser = new UserViewParser_1.default(); 19 | return this.getItemFromApi({ itemId: id }, parser); 20 | } 21 | } 22 | exports.default = UserViewModel; 23 | //# sourceMappingURL=UserViewModel.js.map -------------------------------------------------------------------------------- /dist/lib/model/UserViewModel.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UserViewModel.js","sourceRoot":"","sources":["../../../src/lib/model/UserViewModel.ts"],"names":[],"mappings":";;;;;AAEA,+EAA6E;AAE7E,4DAAwD;AACxD,6EAAqD;AAErD,MAAqB,aAAc,SAAQ,mBAAS;IAElD,YAAY;QACV,MAAM,MAAM,GAAG,IAAI,wBAAc,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,eAAe,CAAyB,EAAE,EAAE,MAAM,EAAE;YAC9D,MAAM,EAAE,CAAC,GAAQ,EAAE,EAAE,CAAC,IAAA,gCAAe,EAAC,GAAG,CAAC;YAC1C,QAAQ,EAAE,cAAc;SACzB,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,EAAU;QACpB,MAAM,MAAM,GAAG,IAAI,wBAAc,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;IACrD,CAAC;CACF;AAdD,gCAcC","sourcesContent":["import { Api } from '@jellyfin/sdk';\nimport { UserViewsApi } from '@jellyfin/sdk/lib/generated-client/api/user-views-api';\nimport { getUserViewsApi } from '@jellyfin/sdk/lib/utils/api/user-views-api';\nimport UserView from '../entities/UserView';\nimport BaseModel, { GetItemsResult } from './BaseModel';\nimport UserViewParser from './parser/UserViewParser';\n\nexport default class UserViewModel extends BaseModel {\n\n getUserViews(): Promise> {\n const parser = new UserViewParser();\n return this.getItemsFromAPI({}, parser, {\n getApi: (api: Api) => getUserViewsApi(api),\n getItems: 'getUserViews'\n });\n }\n\n getUserView(id: string) {\n const parser = new UserViewParser();\n return this.getItemFromApi({ itemId: id }, parser);\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/filter/AZFilterModel.d.ts: -------------------------------------------------------------------------------- 1 | import BaseModel from '../BaseModel'; 2 | import FilterModel, { Filter } from './FilterModel'; 3 | export interface AZFilterModelConfig { 4 | initialSelection?: { 5 | nameStartsWith?: string; 6 | }; 7 | } 8 | export default class AZFilterModel extends BaseModel implements FilterModel { 9 | getFilter(config?: AZFilterModelConfig): Promise; 10 | getDefaultSelection(): Promise>; 11 | } 12 | //# sourceMappingURL=AZFilterModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/filter/AZFilterModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"AZFilterModel.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/filter/AZFilterModel.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,WAAW,EAAE,EAAE,MAAM,EAAc,MAAM,eAAe,CAAC;AAIhE,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE;QACjB,cAAc,CAAC,EAAE,MAAM,CAAA;KACxB,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAU,YAAW,WAAW;IAEnE,SAAS,CAAC,MAAM,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBxD,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAK1D"} -------------------------------------------------------------------------------- /dist/lib/model/filter/AZFilterModel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const JellyfinContext_1 = __importDefault(require("../../JellyfinContext")); 7 | const BaseModel_1 = __importDefault(require("../BaseModel")); 8 | const FilterModel_1 = require("./FilterModel"); 9 | const AZ = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']; 10 | class AZFilterModel extends BaseModel_1.default { 11 | async getFilter(config) { 12 | const options = AZ.map((c) => ({ 13 | name: c, 14 | value: c, 15 | selected: c === config?.initialSelection?.nameStartsWith 16 | })); 17 | return { 18 | type: FilterModel_1.FilterType.AZ, 19 | title: JellyfinContext_1.default.getI18n('JELLYFIN_FILTER_AZ_TITLE'), 20 | placeholder: JellyfinContext_1.default.getI18n('JELLYFIN_FILTER_AZ_PLACEHOLDER'), 21 | field: 'nameStartsWith', 22 | icon: 'fa fa-font', 23 | resettable: true, 24 | options 25 | }; 26 | } 27 | async getDefaultSelection() { 28 | return { 29 | nameStartsWith: undefined 30 | }; 31 | } 32 | } 33 | exports.default = AZFilterModel; 34 | //# sourceMappingURL=AZFilterModel.js.map -------------------------------------------------------------------------------- /dist/lib/model/filter/FilterFilterModel.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '../../entities'; 2 | import BaseModel from '../BaseModel'; 3 | import FilterModel, { Filter } from './FilterModel'; 4 | export type FilterFilterItemType = EntityType.Album | EntityType.Artist | EntityType.AlbumArtist | EntityType.Song; 5 | export interface FilterFilterModelConfig { 6 | itemType: FilterFilterItemType; 7 | initialSelection?: { 8 | filters?: string[]; 9 | }; 10 | } 11 | export default class FilterFilterModel extends BaseModel implements FilterModel { 12 | getFilter(config?: FilterFilterModelConfig): Promise; 13 | getDefaultSelection(): Promise>; 14 | } 15 | //# sourceMappingURL=FilterFilterModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/filter/FilterFilterModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FilterFilterModel.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/filter/FilterFilterModel.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,WAAW,EAAE,EAAE,MAAM,EAA4B,MAAM,eAAe,CAAC;AAE9E,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,GACnE,UAAU,CAAC,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC;AAE7C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,gBAAgB,CAAC,EAAE;QACjB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KACnB,CAAC;CACH;AAwBD,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,SAAU,YAAW,WAAW;IAEvE,SAAS,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,MAAM,CAAC;IAoC5D,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAK1D"} -------------------------------------------------------------------------------- /dist/lib/model/filter/FilterModel.d.ts: -------------------------------------------------------------------------------- 1 | export declare enum FilterType { 2 | AZ = "AZ", 3 | Genre = "Genre", 4 | Year = "Year", 5 | Filter = "Filter", 6 | Sort = "Sort" 7 | } 8 | export interface Filter { 9 | type: FilterType; 10 | title?: string; 11 | placeholder: string; 12 | field?: string; 13 | icon?: string; 14 | resettable?: boolean; 15 | options?: FilterOption[]; 16 | subfilters?: Subfilter[]; 17 | } 18 | export type Subfilter = Omit; 19 | export interface FilterOption { 20 | name: string; 21 | value: any; 22 | selected?: boolean; 23 | } 24 | export type FilterSelection = Record; 25 | interface FilterModel { 26 | getFilter(config?: any): Promise; 27 | getDefaultSelection(params: any): Promise; 28 | } 29 | export default FilterModel; 30 | //# sourceMappingURL=FilterModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/filter/FilterModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FilterModel.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/filter/FilterModel.ts"],"names":[],"mappings":"AAAA,oBAAY,UAAU;IACpB,EAAE,OAAO;IACT,KAAK,UAAU;IACf,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,IAAI,SAAS;CACd;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;CACzB;AAED,MAAM,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,GAAG,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpE,UAAU,WAAW;IACnB,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,mBAAmB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5D;AAED,eAAe,WAAW,CAAC"} -------------------------------------------------------------------------------- /dist/lib/model/filter/FilterModel.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.FilterType = void 0; 4 | var FilterType; 5 | (function (FilterType) { 6 | FilterType["AZ"] = "AZ"; 7 | FilterType["Genre"] = "Genre"; 8 | FilterType["Year"] = "Year"; 9 | FilterType["Filter"] = "Filter"; 10 | FilterType["Sort"] = "Sort"; 11 | })(FilterType = exports.FilterType || (exports.FilterType = {})); 12 | //# sourceMappingURL=FilterModel.js.map -------------------------------------------------------------------------------- /dist/lib/model/filter/FilterModel.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FilterModel.js","sourceRoot":"","sources":["../../../../src/lib/model/filter/FilterModel.ts"],"names":[],"mappings":";;;AAAA,IAAY,UAMX;AAND,WAAY,UAAU;IACpB,uBAAS,CAAA;IACT,6BAAe,CAAA;IACf,2BAAa,CAAA;IACb,+BAAiB,CAAA;IACjB,2BAAa,CAAA;AACf,CAAC,EANW,UAAU,GAAV,kBAAU,KAAV,kBAAU,QAMrB","sourcesContent":["export enum FilterType {\n AZ = 'AZ',\n Genre = 'Genre',\n Year = 'Year',\n Filter = 'Filter',\n Sort = 'Sort'\n}\n\nexport interface Filter {\n type: FilterType,\n title?: string,\n placeholder: string,\n field?: string,\n icon?: string,\n resettable?: boolean,\n options?: FilterOption[],\n subfilters?: Subfilter[]\n}\n\nexport type Subfilter = Omit;\n\nexport interface FilterOption {\n name: string,\n value: any,\n selected?: boolean\n}\n\nexport type FilterSelection = Record;\n\ninterface FilterModel {\n getFilter(config?: any): Promise;\n getDefaultSelection(params: any): Promise;\n}\n\nexport default FilterModel;\n"]} -------------------------------------------------------------------------------- /dist/lib/model/filter/GenreFilterModel.d.ts: -------------------------------------------------------------------------------- 1 | import BaseModel from '../BaseModel'; 2 | import FilterModel, { Filter } from './FilterModel'; 3 | export interface GenreFilterModelConfig { 4 | parentId: string; 5 | initialSelection?: { 6 | genreIds?: string[]; 7 | }; 8 | } 9 | export default class GenreFilterModel extends BaseModel implements FilterModel { 10 | getFilter(config?: GenreFilterModelConfig): Promise; 11 | getDefaultSelection(): Promise>; 12 | } 13 | //# sourceMappingURL=GenreFilterModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/filter/GenreFilterModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GenreFilterModel.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/filter/GenreFilterModel.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,cAAc,CAAC;AAErC,OAAO,WAAW,EAAE,EAAE,MAAM,EAA4B,MAAM,eAAe,CAAC;AAE9E,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE;QACjB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;KACpB,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,SAAU,YAAW,WAAW;IAEtE,SAAS,CAAC,MAAM,CAAC,EAAE,sBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC;IAwC3D,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAK1D"} -------------------------------------------------------------------------------- /dist/lib/model/filter/SortFilterModel.d.ts: -------------------------------------------------------------------------------- 1 | import { SortOrder } from '@jellyfin/sdk/lib/generated-client/models'; 2 | import { EntityType } from '../../entities'; 3 | import BaseModel from '../BaseModel'; 4 | import FilterModel, { Filter } from './FilterModel'; 5 | export type SortFilterItemType = EntityType.Album | EntityType.Song | EntityType.Folder; 6 | export interface SortFilterModelConfig { 7 | itemType: SortFilterItemType; 8 | initialSelection?: { 9 | sortBy?: string; 10 | sortOrder?: SortOrder; 11 | }; 12 | } 13 | export interface SortFilterSelection { 14 | sortBy: string; 15 | sortOrder: SortOrder; 16 | } 17 | export default class SortFilterModel extends BaseModel implements FilterModel { 18 | #private; 19 | getFilter(config?: SortFilterModelConfig): Promise; 20 | getDefaultSelection(targetType: SortFilterItemType): Promise; 21 | } 22 | //# sourceMappingURL=SortFilterModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/filter/SortFilterModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SortFilterModel.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/filter/SortFilterModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,SAAS,MAAM,cAAc,CAAC;AACrC,OAAO,WAAW,EAAE,EAAE,MAAM,EAAyB,MAAM,eAAe,CAAC;AAE3E,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;AAExF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,gBAAgB,CAAC,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,SAAS,CAAC,EAAE,SAAS,CAAA;KACtB,CAAC;CACH;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAA;CACrB;AAqDD,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAU,YAAW,WAAW;;IAErE,SAAS,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0D1D,mBAAmB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAOxF"} -------------------------------------------------------------------------------- /dist/lib/model/filter/YearFilterModel.d.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '../../entities'; 2 | import BaseModel from '../BaseModel'; 3 | import FilterModel, { Filter } from './FilterModel'; 4 | export type YearFilterItemType = EntityType.Album | EntityType.Song; 5 | export interface YearFilterModelConfig { 6 | parentId: string; 7 | itemType: YearFilterItemType; 8 | initialSelection?: { 9 | years?: string[]; 10 | }; 11 | } 12 | export default class YearFilterModel extends BaseModel implements FilterModel { 13 | getFilter(config?: YearFilterModelConfig): Promise; 14 | getDefaultSelection(): Promise>; 15 | } 16 | //# sourceMappingURL=YearFilterModel.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/filter/YearFilterModel.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"YearFilterModel.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/filter/YearFilterModel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,OAAO,SAA+B,MAAM,cAAc,CAAC;AAC3D,OAAO,WAAW,EAAE,EAAE,MAAM,EAA4B,MAAM,eAAe,CAAC;AAE9E,MAAM,MAAM,kBAAkB,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC;AAEpE,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,gBAAgB,CAAC,EAAE;QACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;KACjB,CAAC;CACH;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,SAAU,YAAW,WAAW;IAErE,SAAS,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IA0C1D,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAK1D"} -------------------------------------------------------------------------------- /dist/lib/model/parser/AlbumParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import Album from '../../entities/Album'; 4 | import BaseParser from './BaseParser'; 5 | export default class AlbumParser extends BaseParser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | } 8 | //# sourceMappingURL=AlbumParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/AlbumParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"AlbumParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/AlbumParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,UAAU,CAAC,KAAK,CAAC;IAElD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;CA4BnE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/AlbumParser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const entities_1 = require("../../entities"); 7 | const BaseParser_1 = __importDefault(require("./BaseParser")); 8 | class AlbumParser extends BaseParser_1.default { 9 | async parseDto(data, api) { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | const artists = data.ArtistItems?.reduce((result, artist) => { 15 | if (artist.Id && artist.Name) { 16 | result.push({ 17 | id: artist.Id, 18 | name: artist.Name 19 | }); 20 | } 21 | return result; 22 | }, []) || []; 23 | const result = { 24 | ...base, 25 | type: entities_1.EntityType.Album, 26 | albumArtist: data.AlbumArtist || null, 27 | artists, 28 | duration: data.RunTimeTicks ? this.ticksToSeconds(data.RunTimeTicks) : null, 29 | year: data.ProductionYear || null, 30 | genres: this.getGenres(data) 31 | }; 32 | return result; 33 | } 34 | } 35 | exports.default = AlbumParser; 36 | //# sourceMappingURL=AlbumParser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/ArtistParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import { EntityType } from '../../entities'; 4 | import Artist from '../../entities/Artist'; 5 | import BaseParser from './BaseParser'; 6 | export default class ArtistParser extends BaseParser { 7 | #private; 8 | constructor(type: EntityType.Artist | EntityType.AlbumArtist); 9 | parseDto(data: BaseItemDto, api: Api): Promise; 10 | } 11 | //# sourceMappingURL=ArtistParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/ArtistParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ArtistParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/ArtistParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AACtF,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU,CAAC,MAAM,CAAC;;gBAI9C,IAAI,EAAE,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,WAAW;IAKtD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAYpE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/ArtistParser.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ArtistParser.js","sourceRoot":"","sources":["../../../../src/lib/model/parser/ArtistParser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAIA,8DAAsC;AAEtC,MAAqB,YAAa,SAAQ,oBAAkB;IAI1D,YAAY,IAAgD;QAC1D,KAAK,EAAE,CAAC;QAHV,qCAAkD;QAIhD,uBAAA,IAAI,sBAAS,IAAI,MAAA,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAiB,EAAE,GAAQ;QACxC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAAC;SACb;QAED,OAAO;YACL,GAAG,IAAI;YACP,IAAI,EAAE,uBAAA,IAAI,0BAAM;YAChB,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAC;IACJ,CAAC;CACF;AArBD,+BAqBC","sourcesContent":["import { Api } from '@jellyfin/sdk';\nimport { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';\nimport { EntityType } from '../../entities';\nimport Artist from '../../entities/Artist';\nimport BaseParser from './BaseParser';\n\nexport default class ArtistParser extends BaseParser {\n\n #type: EntityType.Artist | EntityType.AlbumArtist;\n\n constructor(type: EntityType.Artist | EntityType.AlbumArtist) {\n super();\n this.#type = type;\n }\n\n async parseDto(data: BaseItemDto, api: Api): Promise {\n const base = await super.parseDto(data, api);\n if (!base) {\n return null;\n }\n\n return {\n ...base,\n type: this.#type,\n genres: this.getGenres(data)\n };\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/parser/BaseParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import Parser from './Parser'; 4 | import BaseEntity from '../../entities/BaseEntity'; 5 | export default abstract class BaseParser implements Parser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | getThumbnailUrl(data: BaseItemDto, api: Api): Promise; 8 | protected ticksToSeconds(ticks: number): number; 9 | protected getGenres(data: BaseItemDto): { 10 | id: string; 11 | name: string; 12 | }[]; 13 | } 14 | //# sourceMappingURL=BaseParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/BaseParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"BaseParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/BaseParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,UAAU,MAAM,2BAA2B,CAAC;AAGnD,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,UAAU,CAAC,CAAC,SAAS,UAAU,CAAE,YAAW,MAAM,CAAC,UAAU,CAAC;IAEpF,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,UAAU,GAAG,IAAI,CAAC;IAerE,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY1E,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM;IAOtC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;CAMvE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/BaseParser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const image_type_1 = require("@jellyfin/sdk/lib/generated-client/models/image-type"); 4 | const entities_1 = require("../../entities"); 5 | class BaseParser { 6 | async parseDto(data, api) { 7 | if (!data.Id || !data.Name) { 8 | return null; 9 | } 10 | const result = { 11 | type: entities_1.EntityType.Unknown, 12 | id: data.Id, 13 | name: data.Name, 14 | thumbnail: await this.getThumbnailUrl(data, api) 15 | }; 16 | return result; 17 | } 18 | async getThumbnailUrl(data, api) { 19 | if (!data.Id || !data.ImageTags?.Primary) { 20 | return null; 21 | } 22 | return api.getItemImageUrl(data.Id, image_type_1.ImageType.Primary, { 23 | maxWidth: 500, 24 | maxHeight: 500, 25 | quality: 90 26 | }) || null; 27 | } 28 | ticksToSeconds(ticks) { 29 | if (ticks) { 30 | return Math.floor(ticks / 10000000); 31 | } 32 | return 0; 33 | } 34 | getGenres(data) { 35 | return data.GenreItems?.map((genre) => ({ 36 | id: genre.Id, 37 | name: genre.Name 38 | })).filter((genre) => genre.id && genre.name) || []; 39 | } 40 | } 41 | exports.default = BaseParser; 42 | //# sourceMappingURL=BaseParser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/CollectionParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import Collection from '../../entities/Collection'; 4 | import BaseParser from './BaseParser'; 5 | export default class CollectionParser extends BaseParser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | } 8 | //# sourceMappingURL=CollectionParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/CollectionParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"CollectionParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/CollectionParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,UAAU,MAAM,2BAA2B,CAAC;AACnD,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,UAAU,CAAC,UAAU,CAAC;IAE5D,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAcxE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/CollectionParser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const entities_1 = require("../../entities"); 7 | const BaseParser_1 = __importDefault(require("./BaseParser")); 8 | class CollectionParser extends BaseParser_1.default { 9 | async parseDto(data, api) { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | const result = { 15 | ...base, 16 | type: entities_1.EntityType.Collection, 17 | year: data.ProductionYear || null 18 | }; 19 | return result; 20 | } 21 | } 22 | exports.default = CollectionParser; 23 | //# sourceMappingURL=CollectionParser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/CollectionParser.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"CollectionParser.js","sourceRoot":"","sources":["../../../../src/lib/model/parser/CollectionParser.ts"],"names":[],"mappings":";;;;;AAEA,6CAA4C;AAE5C,8DAAsC;AAEtC,MAAqB,gBAAiB,SAAQ,oBAAsB;IAElE,KAAK,CAAC,QAAQ,CAAC,IAAiB,EAAE,GAAQ;QACxC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAe;YACzB,GAAG,IAAI;YACP,IAAI,EAAE,qBAAU,CAAC,UAAU;YAC3B,IAAI,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;SAClC,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAhBD,mCAgBC","sourcesContent":["import { Api } from '@jellyfin/sdk';\nimport { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';\nimport { EntityType } from '../../entities';\nimport Collection from '../../entities/Collection';\nimport BaseParser from './BaseParser';\n\nexport default class CollectionParser extends BaseParser {\n\n async parseDto(data: BaseItemDto, api: Api): Promise {\n const base = await super.parseDto(data, api);\n if (!base) {\n return null;\n }\n\n const result: Collection = {\n ...base,\n type: EntityType.Collection,\n year: data.ProductionYear || null\n };\n\n return result;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/parser/FolderContentParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind'; 4 | import Album from '../../entities/Album'; 5 | import Artist from '../../entities/Artist'; 6 | import Folder from '../../entities/Folder'; 7 | import BaseParser from './BaseParser'; 8 | import Parser from './Parser'; 9 | export type FolderContentType = Artist | Album | Folder; 10 | export default class FolderContentParser extends BaseParser { 11 | #private; 12 | constructor(); 13 | getParser(dtoType: BaseItemKind): Parser | null; 14 | parseDto(data: BaseItemDto, api: Api): Promise; 15 | } 16 | //# sourceMappingURL=FolderContentParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/FolderContentParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FolderContentParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/FolderContentParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AACtF,OAAO,EAAE,YAAY,EAAE,MAAM,0DAA0D,CAAC;AAExF,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAC3C,OAAO,MAAM,MAAM,uBAAuB,CAAC;AAG3C,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,MAAM,MAAM,iBAAiB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAExD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,UAAU,CAAC,iBAAiB,CAAC;;;IAQ5E,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC,GAAG,IAAI;IAoB5D,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAO/E"} -------------------------------------------------------------------------------- /dist/lib/model/parser/FolderParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import Folder from '../../entities/Folder'; 4 | import BaseParser from './BaseParser'; 5 | export default class FolderParser extends BaseParser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | } 8 | //# sourceMappingURL=FolderParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/FolderParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"FolderParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/FolderParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,MAAsB,MAAM,uBAAuB,CAAC;AAC3D,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,UAAU,CAAC,MAAM,CAAC;IAEpD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAqBpE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/FolderParser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const models_1 = require("@jellyfin/sdk/lib/generated-client/models"); 7 | const entities_1 = require("../../entities"); 8 | const Folder_1 = require("../../entities/Folder"); 9 | const BaseParser_1 = __importDefault(require("./BaseParser")); 10 | class FolderParser extends BaseParser_1.default { 11 | async parseDto(data, api) { 12 | const base = await super.parseDto(data, api); 13 | if (!base || (data.Type !== models_1.BaseItemKind.Folder && 14 | data.Type !== models_1.BaseItemKind.CollectionFolder && data.Type !== models_1.BaseItemKind.UserView)) { 15 | return null; 16 | } 17 | const result = { 18 | ...base, 19 | type: data.Type === models_1.BaseItemKind.CollectionFolder ? entities_1.EntityType.CollectionFolder : entities_1.EntityType.Folder 20 | }; 21 | if (data.Type === models_1.BaseItemKind.CollectionFolder && data.CollectionType === 'boxsets') { 22 | result.folderType = Folder_1.FolderType.Collections; 23 | } 24 | else { 25 | result.folderType = Folder_1.FolderType.Folder; 26 | } 27 | return result; 28 | } 29 | } 30 | exports.default = FolderParser; 31 | //# sourceMappingURL=FolderParser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/GenreParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import Genre from '../../entities/Genre'; 4 | import BaseParser from './BaseParser'; 5 | export default class GenreParser extends BaseParser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | } 8 | //# sourceMappingURL=GenreParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/GenreParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GenreParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/GenreParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,UAAU,CAAC,KAAK,CAAC;IAElD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;CAanE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/GenreParser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const entities_1 = require("../../entities"); 7 | const BaseParser_1 = __importDefault(require("./BaseParser")); 8 | class GenreParser extends BaseParser_1.default { 9 | async parseDto(data, api) { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | const result = { 15 | ...base, 16 | type: entities_1.EntityType.Genre 17 | }; 18 | return result; 19 | } 20 | } 21 | exports.default = GenreParser; 22 | //# sourceMappingURL=GenreParser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/GenreParser.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"GenreParser.js","sourceRoot":"","sources":["../../../../src/lib/model/parser/GenreParser.ts"],"names":[],"mappings":";;;;;AAEA,6CAA4C;AAE5C,8DAAsC;AAEtC,MAAqB,WAAY,SAAQ,oBAAiB;IAExD,KAAK,CAAC,QAAQ,CAAC,IAAiB,EAAE,GAAQ;QACxC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAU;YACpB,GAAG,IAAI;YACP,IAAI,EAAE,qBAAU,CAAC,KAAK;SACvB,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAfD,8BAeC","sourcesContent":["import { Api } from '@jellyfin/sdk';\nimport { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';\nimport { EntityType } from '../../entities';\nimport Genre from '../../entities/Genre';\nimport BaseParser from './BaseParser';\n\nexport default class GenreParser extends BaseParser {\n\n async parseDto(data: BaseItemDto, api: Api): Promise {\n const base = await super.parseDto(data, api);\n if (!base) {\n return null;\n }\n\n const result: Genre = {\n ...base,\n type: EntityType.Genre\n };\n\n return result;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/parser/LyricsParser.d.ts: -------------------------------------------------------------------------------- 1 | import { LyricDto } from '@jellyfin/sdk/lib/generated-client/models/lyric-dto'; 2 | import { MetadataLyrics } from 'now-playing-common'; 3 | export default class LyricsParser { 4 | parseDto(data: LyricDto): Promise; 5 | } 6 | //# sourceMappingURL=LyricsParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/LyricsParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"LyricsParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/LyricsParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,qDAAqD,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,YAAY;IAEzB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CAuC/D"} -------------------------------------------------------------------------------- /dist/lib/model/parser/LyricsParser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | class LyricsParser { 4 | async parseDto(data) { 5 | /** 6 | * LyricDto supposedly has `Metadata.IsSynced` property but 7 | * `Metadata` is empty (as of v10.9.6). We need to test by 8 | * looping through each line of lyrics. 9 | */ 10 | if (!data.Lyrics) { 11 | return null; 12 | } 13 | const isSynced = data.Lyrics.every((line) => line.Start !== undefined); 14 | if (isSynced) { 15 | const lines = data.Lyrics.map((line) => ({ 16 | text: line.Text || '', 17 | // Convert to milliseconds 18 | start: line.Start ? line.Start / 10000 : 0 19 | })) || []; 20 | if (lines.length > 0) { 21 | return { 22 | type: 'synced', 23 | lines 24 | }; 25 | } 26 | } 27 | else { 28 | const lines = data.Lyrics?.reduce((result, line) => { 29 | if (line.Text !== undefined) { 30 | result.push(line.Text); 31 | } 32 | return result; 33 | }, []) || []; 34 | if (lines.length > 0) { 35 | return { 36 | type: 'plain', 37 | lines 38 | }; 39 | } 40 | } 41 | return null; 42 | } 43 | } 44 | exports.default = LyricsParser; 45 | //# sourceMappingURL=LyricsParser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/Parser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | interface Parser { 4 | parseDto(data: BaseItemDto, api: Api): Promise; 5 | } 6 | export default Parser; 7 | //# sourceMappingURL=Parser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/Parser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Parser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/Parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,UAAU,MAAM,CAAC,CAAC;IAChB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;CAC1D;AAED,eAAe,MAAM,CAAC"} -------------------------------------------------------------------------------- /dist/lib/model/parser/Parser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Parser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/Parser.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Parser.js","sourceRoot":"","sources":["../../../../src/lib/model/parser/Parser.ts"],"names":[],"mappings":"","sourcesContent":["import { Api } from '@jellyfin/sdk';\nimport { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';\n\ninterface Parser {\n parseDto(data: BaseItemDto, api: Api): Promise;\n}\n\nexport default Parser;\n"]} -------------------------------------------------------------------------------- /dist/lib/model/parser/PlaylistParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import Playlist from '../../entities/Playlist'; 4 | import BaseParser from './BaseParser'; 5 | export default class PlaylistParser extends BaseParser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | } 8 | //# sourceMappingURL=PlaylistParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/PlaylistParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"PlaylistParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/PlaylistParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CAAC,QAAQ,CAAC;IAExD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;CAatE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/PlaylistParser.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __importDefault = (this && this.__importDefault) || function (mod) { 3 | return (mod && mod.__esModule) ? mod : { "default": mod }; 4 | }; 5 | Object.defineProperty(exports, "__esModule", { value: true }); 6 | const entities_1 = require("../../entities"); 7 | const BaseParser_1 = __importDefault(require("./BaseParser")); 8 | class PlaylistParser extends BaseParser_1.default { 9 | async parseDto(data, api) { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | const result = { 15 | ...base, 16 | type: entities_1.EntityType.Playlist 17 | }; 18 | return result; 19 | } 20 | } 21 | exports.default = PlaylistParser; 22 | //# sourceMappingURL=PlaylistParser.js.map -------------------------------------------------------------------------------- /dist/lib/model/parser/PlaylistParser.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"PlaylistParser.js","sourceRoot":"","sources":["../../../../src/lib/model/parser/PlaylistParser.ts"],"names":[],"mappings":";;;;;AAEA,6CAA4C;AAE5C,8DAAsC;AAEtC,MAAqB,cAAe,SAAQ,oBAAoB;IAE9D,KAAK,CAAC,QAAQ,CAAC,IAAiB,EAAE,GAAQ;QACxC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,EAAE;YACT,OAAO,IAAI,CAAC;SACb;QAED,MAAM,MAAM,GAAa;YACvB,GAAG,IAAI;YACP,IAAI,EAAE,qBAAU,CAAC,QAAQ;SAC1B,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAfD,iCAeC","sourcesContent":["import { Api } from '@jellyfin/sdk';\nimport { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto';\nimport { EntityType } from '../../entities';\nimport Playlist from '../../entities/Playlist';\nimport BaseParser from './BaseParser';\n\nexport default class PlaylistParser extends BaseParser {\n\n async parseDto(data: BaseItemDto, api: Api): Promise {\n const base = await super.parseDto(data, api);\n if (!base) {\n return null;\n }\n\n const result: Playlist = {\n ...base,\n type: EntityType.Playlist\n };\n\n return result;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/model/parser/SongParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import Song from '../../entities/Song'; 4 | import BaseParser from './BaseParser'; 5 | export default class SongParser extends BaseParser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | } 8 | //# sourceMappingURL=SongParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/SongParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SongParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/SongParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,IAAI,MAAM,qBAAqB,CAAC;AACvC,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,UAAU,CAAC,IAAI,CAAC;IAEhD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;CA+ClE"} -------------------------------------------------------------------------------- /dist/lib/model/parser/UserViewParser.d.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import UserView from '../../entities/UserView'; 4 | import BaseParser from './BaseParser'; 5 | export default class UserViewParser extends BaseParser { 6 | parseDto(data: BaseItemDto, api: Api): Promise; 7 | } 8 | //# sourceMappingURL=UserViewParser.d.ts.map -------------------------------------------------------------------------------- /dist/lib/model/parser/UserViewParser.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UserViewParser.d.ts","sourceRoot":"","sources":["../../../../src/lib/model/parser/UserViewParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,EAAE,WAAW,EAAE,MAAM,yDAAyD,CAAC;AAEtF,OAAO,QAA0B,MAAM,yBAAyB,CAAC;AACjE,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,UAAU,CAAC,QAAQ,CAAC;IAExD,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;CA6BtE"} -------------------------------------------------------------------------------- /dist/lib/util/AlbumArtHandler.d.ts: -------------------------------------------------------------------------------- 1 | import BaseEntity from '../entities/BaseEntity'; 2 | export default class AlbumArtHandler { 3 | #private; 4 | constructor(); 5 | getAlbumArtUri(item: T): string; 6 | } 7 | //# sourceMappingURL=AlbumArtHandler.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/AlbumArtHandler.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"AlbumArtHandler.d.ts","sourceRoot":"","sources":["../../../src/lib/util/AlbumArtHandler.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAShD,MAAM,CAAC,OAAO,OAAO,eAAe;;;IAQlC,cAAc,CAAC,CAAC,SAAS,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,MAAM;CAgFtD"} -------------------------------------------------------------------------------- /dist/lib/util/JellyfinNowPlayingMetadataProvider.d.ts: -------------------------------------------------------------------------------- 1 | import { MetadataAlbumInfo, MetadataArtistInfo, MetadataSongInfo, NowPlayingMetadataProvider } from 'now-playing-common'; 2 | import ConnectionManager from '../connection/ConnectionManager'; 3 | export default class JellyfinNowPlayingMetadataProvider implements NowPlayingMetadataProvider { 4 | #private; 5 | version: '1.0.0'; 6 | constructor(connectionManager: ConnectionManager); 7 | getSongInfo(songTitle: string, _albumTitle?: string, _artistName?: string, uri?: string): Promise; 8 | getAlbumInfo(): Promise; 9 | getArtistInfo(): Promise; 10 | } 11 | //# sourceMappingURL=JellyfinNowPlayingMetadataProvider.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/JellyfinNowPlayingMetadataProvider.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"JellyfinNowPlayingMetadataProvider.d.ts","sourceRoot":"","sources":["../../../src/lib/util/JellyfinNowPlayingMetadataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,gBAAgB,EAAkB,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAEzI,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAKhE,MAAM,CAAC,OAAO,OAAO,kCAAmC,YAAW,0BAA0B;;IAE3F,OAAO,EAAE,OAAO,CAAC;gBAIL,iBAAiB,EAAE,iBAAiB;IAK1C,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAqC1H,YAAY,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAIjD,aAAa,IAAI,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC;CAI1D"} -------------------------------------------------------------------------------- /dist/lib/util/ServerHelper.d.ts: -------------------------------------------------------------------------------- 1 | import ConnectionManager from '../connection/ConnectionManager'; 2 | import ServerConnection from '../connection/ServerConnection'; 3 | import View from '../controller/browse/view-handlers/View'; 4 | import Server from '../entities/Server'; 5 | export interface ServerConfEntry { 6 | url: string; 7 | username: string; 8 | password: string; 9 | } 10 | export default class ServerHelper { 11 | static getServersFromConfig(): ServerConfEntry[]; 12 | static fetchPasswordFromConfig(server: Server, username: string): string; 13 | static hasServerConfig(username: string, host: string): boolean; 14 | static getConnectionUrl(url: string): string; 15 | static getOnlineServerByIdAndUsername(id: string, username: string): Server | null; 16 | static generateConnectionId(username: string, serverId: string): string; 17 | static generateConnectionId(username: string, server: Server): string; 18 | static getConnectionByView(view: View, src: ServerConnection | ConnectionManager): Promise; 19 | } 20 | //# sourceMappingURL=ServerHelper.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/ServerHelper.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"ServerHelper.d.ts","sourceRoot":"","sources":["../../../src/lib/util/ServerHelper.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,IAAI,MAAM,yCAAyC,CAAC;AAE3D,OAAO,MAAM,MAAM,oBAAoB,CAAC;AAIxC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,YAAY;IAE/B,MAAM,CAAC,oBAAoB,IAAI,eAAe,EAAE;IAIhD,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAOxE,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO;IAQ/D,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAa5C,MAAM,CAAC,8BAA8B,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAalF,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IACvE,MAAM,CAAC,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;WAWxD,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,gBAAgB,GAAG,iBAAiB;CAsCvF"} -------------------------------------------------------------------------------- /dist/lib/util/SongHelper.d.ts: -------------------------------------------------------------------------------- 1 | import ConnectionManager from '../connection/ConnectionManager'; 2 | import ServerConnection from '../connection/ServerConnection'; 3 | import { Song } from '../entities'; 4 | export interface SetSongFavoriteResult { 5 | songId: string; 6 | canonicalUri: string | null; 7 | favorite: boolean; 8 | } 9 | export default class SongHelper { 10 | static setFavoriteByUri(uri: string, favorite: boolean, connectionManager: ConnectionManager): Promise; 11 | static getCanonicalUri(songTarget: Song | string, connection: ServerConnection | null): string | null; 12 | } 13 | //# sourceMappingURL=SongHelper.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/SongHelper.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"SongHelper.d.ts","sourceRoot":"","sources":["../../../src/lib/util/SongHelper.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAChE,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAI9D,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGnC,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,UAAU;WAEhB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IA0BnI,MAAM,CAAC,eAAe,CAAC,UAAU,EAAE,IAAI,GAAG,MAAM,EAAE,UAAU,EAAE,gBAAgB,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;CAatG"} -------------------------------------------------------------------------------- /dist/lib/util/StopWatch.d.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Note: this is not a general-purpose utility class, but one made specifically for 3 | * keeping track of the seek position in MPD 'stop' events handled by PlayController. 4 | */ 5 | export default class StopWatch { 6 | #private; 7 | constructor(); 8 | start(startElapsedMS?: number): this; 9 | stop(): this; 10 | getElapsed(): number; 11 | } 12 | //# sourceMappingURL=StopWatch.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/StopWatch.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"StopWatch.d.ts","sourceRoot":"","sources":["../../../src/lib/util/StopWatch.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,OAAO,OAAO,SAAS;;;IAW5B,KAAK,CAAC,cAAc,SAAI;IAOxB,IAAI;IAQJ,UAAU;CAYX"} -------------------------------------------------------------------------------- /dist/lib/util/Type.d.ts: -------------------------------------------------------------------------------- 1 | export type ValueOf = T[keyof T]; 2 | //# sourceMappingURL=Type.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/Type.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Type.d.ts","sourceRoot":"","sources":["../../../src/lib/util/Type.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC"} -------------------------------------------------------------------------------- /dist/lib/util/Type.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | //# sourceMappingURL=Type.js.map -------------------------------------------------------------------------------- /dist/lib/util/Type.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"Type.js","sourceRoot":"","sources":["../../../src/lib/util/Type.ts"],"names":[],"mappings":"","sourcesContent":["// Used for converting Object values to string literal types:\n// https://dev.to/multimo/how-to-build-typescript-string-literal-types-from-objects-values-361l\nexport type ValueOf = T[keyof T];\n"]} -------------------------------------------------------------------------------- /dist/lib/util/UI.d.ts: -------------------------------------------------------------------------------- 1 | export default class UI { 2 | static supportsEnhancedTitles(): boolean; 3 | static isManifestUI(): boolean; 4 | static createLink(data: { 5 | text: string; 6 | uri: string; 7 | }): string; 8 | } 9 | //# sourceMappingURL=UI.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/UI.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UI.d.ts","sourceRoot":"","sources":["../../../src/lib/util/UI.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,OAAO,OAAO,EAAE;IACrB,MAAM,CAAC,sBAAsB,IAAI,OAAO;IAIxC,MAAM,CAAC,YAAY,IAAI,OAAO;IAM9B,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;CAI/D"} -------------------------------------------------------------------------------- /dist/lib/util/UI.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | const fs_1 = require("fs"); 4 | class UI { 5 | static supportsEnhancedTitles() { 6 | return !this.isManifestUI(); 7 | } 8 | static isManifestUI() { 9 | const volumioManifestUIDir = '/volumio/http/www4'; 10 | const volumioManifestUIDisabledFile = '/data/disableManifestUI'; 11 | return (0, fs_1.existsSync)(volumioManifestUIDir) && !(0, fs_1.existsSync)(volumioManifestUIDisabledFile); 12 | } 13 | static createLink(data) { 14 | const onclick = `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${data.uri}'})`; 15 | return `${data.text}`; 16 | } 17 | } 18 | exports.default = UI; 19 | //# sourceMappingURL=UI.js.map -------------------------------------------------------------------------------- /dist/lib/util/UI.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"UI.js","sourceRoot":"","sources":["../../../src/lib/util/UI.ts"],"names":[],"mappings":";;AAAA,2BAAgC;AAEhC,MAAqB,EAAE;IACrB,MAAM,CAAC,sBAAsB;QAC3B,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;QAClD,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;QAChE,OAAO,IAAA,eAAU,EAAC,oBAAoB,CAAC,IAAI,CAAC,IAAA,eAAU,EAAC,6BAA6B,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,IAAmC;QACnD,MAAM,OAAO,GAAG,sEAAsE,IAAI,CAAC,GAAG,KAAK,CAAC;QACpG,OAAO,wBAAwB,OAAO,KAAK,IAAI,CAAC,IAAI,MAAM,CAAC;IAC7D,CAAC;CACF;AAfD,qBAeC","sourcesContent":["import { existsSync } from 'fs';\n\nexport default class UI {\n static supportsEnhancedTitles(): boolean {\n return !this.isManifestUI();\n }\n\n static isManifestUI(): boolean {\n const volumioManifestUIDir = '/volumio/http/www4';\n const volumioManifestUIDisabledFile = '/data/disableManifestUI';\n return existsSync(volumioManifestUIDir) && !existsSync(volumioManifestUIDisabledFile);\n }\n\n static createLink(data: { text: string, uri: string }): string {\n const onclick = `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${data.uri}'})`;\n return `${data.text}`;\n }\n}\n"]} -------------------------------------------------------------------------------- /dist/lib/util/index.d.ts: -------------------------------------------------------------------------------- 1 | export declare function jsPromiseToKew(promise: Promise): any; 2 | export declare function kewToJSPromise(promise: any): Promise; 3 | export declare function objectAssignIfExists>(target: T, source: Record, props: string[]): T; 4 | //# sourceMappingURL=index.d.ts.map -------------------------------------------------------------------------------- /dist/lib/util/index.d.ts.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/util/index.ts"],"names":[],"mappings":"AAIA,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAWzD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAczD;AAED,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAQ9H"} -------------------------------------------------------------------------------- /dist/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "type": "commonjs" 3 | } 4 | -------------------------------------------------------------------------------- /fixup.sh: -------------------------------------------------------------------------------- 1 | cat >dist/package.json < 2 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | icon-transparent 19 | 20 | 21 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/assets/images/playlist.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/src/assets/images/playlist.png -------------------------------------------------------------------------------- /src/assets/images/song.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/src/assets/images/song.png -------------------------------------------------------------------------------- /src/config.json: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/patrickkfkan/volumio-jellyfin/59757711bbaf12f969673d8a69378205f7ba754d/src/config.json -------------------------------------------------------------------------------- /src/lib/connection/ServerConnection.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { AuthenticationResult } from '@jellyfin/sdk/lib/generated-client/models/authentication-result'; 3 | import Server from '../entities/Server'; 4 | 5 | interface ServerConnection { 6 | id: string; 7 | username: string; 8 | server: Server; 9 | api: Api; 10 | auth?: AuthenticationResult | null; 11 | } 12 | 13 | export default ServerConnection; 14 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/View.ts: -------------------------------------------------------------------------------- 1 | interface View extends Record { 2 | name: string; 3 | username?: string; 4 | serverId?: string; 5 | parentId?: string; 6 | startIndex?: number; 7 | limit?: number; 8 | fixedView?: string; 9 | saveFilter?: string; 10 | noExplode?: '1'; 11 | } 12 | 13 | export default View; 14 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/ViewHandler.ts: -------------------------------------------------------------------------------- 1 | import { RenderedHeader, RenderedListItem } from './renderer/BaseRenderer'; 2 | 3 | export interface RenderedPage { 4 | navigation?: RenderedPageContents; 5 | } 6 | 7 | export interface RenderedPageContents { 8 | prev?: { 9 | uri?: string 10 | }; 11 | info?: RenderedHeader; 12 | lists?: RenderedList[]; 13 | } 14 | 15 | export interface RenderedList { 16 | title?: string; 17 | availableListViews: ('list' | 'grid')[]; 18 | items: RenderedListItem[]; 19 | } 20 | 21 | export default abstract class ViewHandler { 22 | abstract browse(): Promise; 23 | abstract explode(): Promise; 24 | } 25 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/AlbumRenderer.ts: -------------------------------------------------------------------------------- 1 | import Album from '../../../../entities/Album'; 2 | import { SongView } from '../SongViewHandler'; 3 | import ViewHelper from '../ViewHelper'; 4 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 5 | 6 | export default class AlbumRenderer extends BaseRenderer { 7 | 8 | renderToListItem(data: Album): RenderedListItem | null { 9 | const songsView: SongView = { 10 | name: 'songs', 11 | albumId: data.id 12 | }; 13 | 14 | return { 15 | service: 'jellyfin', 16 | type: 'folder', 17 | title: data.name, 18 | artist: data.albumArtist, 19 | duration: data.duration, 20 | albumart: this.getAlbumArt(data), 21 | uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(songsView)}` 22 | }; 23 | } 24 | 25 | renderToHeader(data: Album): RenderedHeader | null { 26 | const header = super.renderToHeader(data) || {} as RenderedHeader; 27 | header.artist = data.albumArtist; 28 | header.year = data.year; 29 | // Duration does not get converted into time format when shown in header 30 | // (as opposed to list item). So we have to do it ourselves. 31 | header.duration = this.timeFormat(data.duration); 32 | header.genre = this.getStringFromIdNamePair(data.genres); 33 | 34 | return header; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/ArtistRenderer.ts: -------------------------------------------------------------------------------- 1 | import Artist from '../../../../entities/Artist'; 2 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 3 | import jellyfin from '../../../../JellyfinContext'; 4 | import { EntityType } from '../../../../entities'; 5 | import { AlbumView } from '../AlbumViewHandler'; 6 | import ViewHelper from '../ViewHelper'; 7 | 8 | export default class ArtistRenderer extends BaseRenderer { 9 | 10 | renderToListItem(data: Artist, options?: { noParent: boolean }): RenderedListItem | null { 11 | const albumView: AlbumView = { 12 | name: 'albums' 13 | }; 14 | 15 | const parentId = options?.noParent ? null : this.currentView.parentId; 16 | if (parentId) { 17 | albumView.parentId = parentId; 18 | } 19 | 20 | if (data.type === EntityType.Artist) { 21 | albumView.artistId = data.id; 22 | } 23 | else { 24 | albumView.albumArtistId = data.id; 25 | } 26 | 27 | return { 28 | service: 'jellyfin', 29 | type: 'folder', 30 | title: data.name, 31 | albumart: this.getAlbumArt(data), 32 | uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(albumView)}` 33 | }; 34 | } 35 | 36 | renderToHeader(data: Artist): RenderedHeader | null { 37 | const header = super.renderToHeader(data) || {} as RenderedHeader; 38 | header.artist = jellyfin.getI18n('JELLYFIN_ARTIST'); 39 | header.year = this.getStringFromIdNamePair(data.genres); 40 | return header; 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/CollectionRenderer.ts: -------------------------------------------------------------------------------- 1 | import Collection from '../../../../entities/Collection'; 2 | import { CollectionView } from '../CollectionViewHandler'; 3 | import ViewHelper from '../ViewHelper'; 4 | import BaseRenderer, { RenderedListItem } from './BaseRenderer'; 5 | 6 | export default class CollectionRenderer extends BaseRenderer { 7 | 8 | renderToListItem(data: Collection): RenderedListItem | null { 9 | const collectionView: CollectionView = { 10 | name: 'collection', 11 | parentId: data.id 12 | }; 13 | 14 | return { 15 | service: 'jellyfin', 16 | type: 'streaming-category', 17 | title: data.name, 18 | artist: String(data.year), 19 | albumart: this.getAlbumArt(data), 20 | uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(collectionView)}` 21 | }; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/FolderRenderer.ts: -------------------------------------------------------------------------------- 1 | import BaseRenderer, { RenderedListItem } from './BaseRenderer'; 2 | import Folder, { FolderType } from '../../../../entities/Folder'; 3 | import { EntityType } from '../../../../entities'; 4 | import ViewHelper from '../ViewHelper'; 5 | import { CollectionsView } from '../CollectionsViewHandler'; 6 | import { FolderView } from '../FolderViewHandler'; 7 | 8 | export default class FolderRenderer extends BaseRenderer { 9 | 10 | renderToListItem(data: Folder): RenderedListItem | null { 11 | let title; 12 | if (data.type === EntityType.Folder) { 13 | title = ` 14 |
15 | ${data.name} 16 |
17 | `; 18 | } 19 | else { 20 | title = data.name; 21 | } 22 | 23 | const targetView: CollectionsView | FolderView = { 24 | name: data.folderType === FolderType.Collections ? 'collections' : 'folder', 25 | parentId: data.id 26 | }; 27 | 28 | return { 29 | service: 'jellyfin', 30 | type: 'streaming-category', 31 | title, 32 | uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(targetView)}`, 33 | albumart: this.getAlbumArt(data) 34 | }; 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/GenreRenderer.ts: -------------------------------------------------------------------------------- 1 | import Genre from '../../../../entities/Genre'; 2 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 3 | import jellyfin from '../../../../JellyfinContext'; 4 | import { AlbumView } from '../AlbumViewHandler'; 5 | import ViewHelper from '../ViewHelper'; 6 | 7 | export default class GenreRenderer extends BaseRenderer { 8 | 9 | renderToListItem(data: Genre): RenderedListItem | null { 10 | const albumView: AlbumView = { 11 | name: 'albums', 12 | parentId: this.currentView.parentId, 13 | genreId: data.id 14 | }; 15 | return { 16 | 'service': 'jellyfin', 17 | 'type': 'folder', 18 | 'title': data.name, 19 | 'albumart': this.getAlbumArt(data), 20 | 'uri': `${this.uri}/${ViewHelper.constructUriSegmentFromView(albumView)}` 21 | }; 22 | } 23 | 24 | renderToHeader(data: Genre): RenderedHeader | null { 25 | const header = super.renderToHeader(data) || {} as RenderedHeader; 26 | header.artist = jellyfin.getI18n('JELLYFIN_GENRE'); 27 | return header; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/PlaylistRenderer.ts: -------------------------------------------------------------------------------- 1 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 2 | import Playlist from '../../../../entities/Playlist'; 3 | import jellyfin from '../../../../JellyfinContext'; 4 | import { SongView } from '../SongViewHandler'; 5 | import ViewHelper from '../ViewHelper'; 6 | 7 | export default class PlaylistRenderer extends BaseRenderer { 8 | 9 | renderToListItem(data: Playlist): RenderedListItem | null { 10 | const songView: SongView = { 11 | name: 'songs', 12 | playlistId: data.id 13 | }; 14 | 15 | return { 16 | service: 'jellyfin', 17 | type: 'folder', 18 | title: data.name, 19 | albumart: this.getAlbumArt(data), 20 | uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(songView)}` 21 | }; 22 | } 23 | 24 | renderToHeader(data: Playlist): RenderedHeader | null { 25 | const header = super.renderToHeader(data) || {} as RenderedHeader; 26 | header.artist = jellyfin.getI18n('JELLYFIN_PLAYLIST'); 27 | return header; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/ServerRenderer.ts: -------------------------------------------------------------------------------- 1 | import Server from '../../../../entities/Server'; 2 | import { UserViewView } from '../UserViewViewHandler'; 3 | import ViewHelper from '../ViewHelper'; 4 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 5 | 6 | export default class ServerRenderer extends BaseRenderer { 7 | 8 | renderToListItem(data: Server & { username: string }): RenderedListItem | null { 9 | const userViewView: UserViewView = { 10 | name: 'userViews', 11 | username: data.username, 12 | serverId: data.id 13 | }; 14 | 15 | return { 16 | 'service': 'jellyfin', 17 | 'type': 'streaming-category', 18 | 'title': `${data.username} @ ${data.name}`, 19 | 'uri': `jellyfin/${ViewHelper.constructUriSegmentFromView(userViewView)}`, 20 | 'albumart': '/albumart?sourceicon=music_service/jellyfin/dist/assets/images/jellyfin.png' 21 | }; 22 | } 23 | 24 | renderToHeader(): RenderedHeader | null { 25 | return null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/lib/controller/browse/view-handlers/renderer/SongRenderer.ts: -------------------------------------------------------------------------------- 1 | import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; 2 | import Song from '../../../../entities/Song'; 3 | import { SongView } from '../SongViewHandler'; 4 | import ViewHelper from '../ViewHelper'; 5 | 6 | export default class SongRenderer extends BaseRenderer { 7 | 8 | renderToListItem(data: Song): RenderedListItem | null { 9 | const songView: SongView = { 10 | name: 'song', 11 | songId: data.id 12 | }; 13 | 14 | return { 15 | service: 'jellyfin', 16 | type: 'song', 17 | title: data.name, 18 | artist: this.getStringFromIdNamePair(data.artists), 19 | album: data.album?.name, 20 | duration: data.duration, 21 | uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(songView)}`, 22 | albumart: this.getAlbumArt(data), 23 | favorite: data.favorite 24 | }; 25 | } 26 | 27 | renderToHeader(): RenderedHeader | null { 28 | return null; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/lib/entities/Album.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | 4 | interface Album extends BaseEntity { 5 | type: EntityType.Album; 6 | albumArtist: string | null; 7 | artists: { 8 | id: string, 9 | name: string 10 | }[]; 11 | duration: number | null; 12 | year: number | null; 13 | genres: { 14 | id: string, 15 | name: string 16 | }[]; 17 | } 18 | 19 | export default Album; 20 | -------------------------------------------------------------------------------- /src/lib/entities/Artist.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | 4 | interface Artist extends BaseEntity { 5 | type: EntityType.Artist | EntityType.AlbumArtist; 6 | genres: { 7 | id: string, 8 | name: string 9 | }[]; 10 | } 11 | 12 | export default Artist; 13 | -------------------------------------------------------------------------------- /src/lib/entities/BaseEntity.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | 3 | interface BaseEntity { 4 | type: EntityType; 5 | id: string; 6 | name: string; 7 | thumbnail: string | null; 8 | } 9 | 10 | export default BaseEntity; 11 | -------------------------------------------------------------------------------- /src/lib/entities/Collection.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | 4 | interface Collection extends BaseEntity { 5 | type: EntityType.Collection; 6 | year: number | null; 7 | } 8 | 9 | export default Collection; 10 | -------------------------------------------------------------------------------- /src/lib/entities/Folder.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | 4 | export enum FolderType { 5 | Collections = 'Collections', 6 | Folder = 'Folder' 7 | } 8 | 9 | interface Folder extends BaseEntity { 10 | type: EntityType.Folder | EntityType.CollectionFolder; 11 | folderType?: FolderType; 12 | } 13 | 14 | export default Folder; 15 | -------------------------------------------------------------------------------- /src/lib/entities/Genre.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | 4 | interface Genre extends BaseEntity { 5 | type: EntityType.Genre; 6 | } 7 | 8 | export default Genre; 9 | -------------------------------------------------------------------------------- /src/lib/entities/Playlist.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | 4 | interface Playlist extends BaseEntity { 5 | type: EntityType.Playlist; 6 | } 7 | 8 | export default Playlist; 9 | -------------------------------------------------------------------------------- /src/lib/entities/Server.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '../entities'; 2 | import BaseEntity from '../entities/BaseEntity'; 3 | 4 | interface Server extends BaseEntity { 5 | type: EntityType.Server, 6 | url: string; 7 | connectionUrl: string; 8 | } 9 | 10 | export default Server; 11 | -------------------------------------------------------------------------------- /src/lib/entities/Song.ts: -------------------------------------------------------------------------------- 1 | import { MediaSourceInfo } from '@jellyfin/sdk/lib/generated-client/models'; 2 | import { EntityType } from '.'; 3 | import BaseEntity from './BaseEntity'; 4 | 5 | interface Song extends BaseEntity { 6 | type: EntityType.Song; 7 | artists: { 8 | id: string, 9 | name: string 10 | }[]; 11 | album: { 12 | id: string; 13 | name: string; 14 | thumbnail: string | null; 15 | } | null; 16 | duration: number; 17 | mediaSources?: MediaSourceInfo[]; 18 | favorite: boolean; 19 | } 20 | 21 | export default Song; 22 | -------------------------------------------------------------------------------- /src/lib/entities/UserView.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '.'; 2 | import BaseEntity from './BaseEntity'; 3 | 4 | export enum UserViewType { 5 | Collections = 'Collections', 6 | Playlists = 'Playlists', 7 | Library = 'Library', 8 | Folders = 'Folder' 9 | } 10 | 11 | interface UserView extends BaseEntity { 12 | type: EntityType.UserView; 13 | userViewType?: UserViewType; 14 | } 15 | 16 | export default UserView; 17 | -------------------------------------------------------------------------------- /src/lib/entities/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Album } from './Album'; 2 | export { default as Artist } from './Artist'; 3 | export { default as Collection } from './Collection'; 4 | export { default as Folder } from './Folder'; 5 | export { default as Genre } from './Genre'; 6 | export { default as Playlist } from './Playlist'; 7 | export { default as Song } from './Song'; 8 | 9 | export enum EntityType { 10 | Album = 'Album', 11 | Artist = 'Artist', 12 | AlbumArtist = 'AlbumArtist', 13 | Collection = 'Collection', 14 | Folder = 'Folder', 15 | CollectionFolder = 'CollectionFolder', 16 | Genre = 'Genre', 17 | Playlist = 'Playlist', 18 | Song = 'Song', 19 | Server = 'Server', 20 | UserView = 'UserView', 21 | Unknown = 'Unknown' 22 | } 23 | -------------------------------------------------------------------------------- /src/lib/model/AlbumModel.ts: -------------------------------------------------------------------------------- 1 | import { getLibraryApi } from '@jellyfin/sdk/lib/utils/api/library-api'; 2 | import { EntityType } from '../entities'; 3 | import Album from '../entities/Album'; 4 | import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel'; 5 | import AlbumParser from './parser/AlbumParser'; 6 | 7 | export interface GetSimilarAlbumsParams { 8 | album: Album, 9 | limit?: number 10 | } 11 | 12 | export default class AlbumModel extends BaseModel { 13 | 14 | getAlbums(params: GetItemsParams): Promise> { 15 | const parser = new AlbumParser(); 16 | return this.getItemsFromAPI({ ...params, itemTypes: EntityType.Album }, parser); 17 | } 18 | 19 | getAlbum(id: string) { 20 | const parser = new AlbumParser(); 21 | return this.getItemFromApi({ itemId: id }, parser); 22 | } 23 | 24 | async getSimilarAlbums(params: GetSimilarAlbumsParams): Promise { 25 | if (!this.connection.auth?.User?.Id) { 26 | throw Error('No auth'); 27 | } 28 | const parser = new AlbumParser(); 29 | const libraryApi = getLibraryApi(this.connection.api); 30 | const response = await libraryApi.getSimilarAlbums({ 31 | itemId: params.album.id, 32 | userId: this.connection.auth.User.Id, 33 | excludeArtistIds: params.album.artists.map((artist) => artist.id), 34 | limit: params.limit || 12 35 | }); 36 | return this.parseItemDtos(response.data.Items || [], parser); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/lib/model/ArtistModel.ts: -------------------------------------------------------------------------------- 1 | import { ArtistsApi } from '@jellyfin/sdk/lib/generated-client/api/artists-api'; 2 | import { getArtistsApi } from '@jellyfin/sdk/lib/utils/api/artists-api'; 3 | import { EntityType } from '../entities'; 4 | import Artist from '../entities/Artist'; 5 | import { GetItemsParams, GetItemsResult } from './BaseModel'; 6 | import { default as BaseModel } from './BaseModel'; 7 | import ArtistParser from './parser/ArtistParser'; 8 | 9 | export default class ArtistModel extends BaseModel { 10 | 11 | async getArtists(params: GetItemsParams): Promise> { 12 | const parser = new ArtistParser(EntityType.Artist); 13 | return this.getItemsFromAPI(params, parser, { 14 | getApi: (api) => getArtistsApi(api), 15 | getItems: 'getArtists' 16 | }); 17 | } 18 | 19 | getArtist(id: string) { 20 | const parser = new ArtistParser(EntityType.Artist); 21 | return this.getItemFromApi({ itemId: id }, parser); 22 | } 23 | 24 | async getAlbumArtists(params: GetItemsParams): Promise> { 25 | const parser = new ArtistParser(EntityType.AlbumArtist); 26 | return this.getItemsFromAPI(params, parser, { 27 | getApi: (api) => getArtistsApi(api), 28 | getItems: 'getAlbumArtists' 29 | }); 30 | } 31 | 32 | getAlbumArtist(id: string) { 33 | const parser = new ArtistParser(EntityType.AlbumArtist); 34 | return this.getItemFromApi({ itemId: id }, parser); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/lib/model/FolderModel.ts: -------------------------------------------------------------------------------- 1 | import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel'; 2 | import FolderContentParser, { FolderContentType } from './parser/FolderContentParser'; 3 | import FolderParser from './parser/FolderParser'; 4 | 5 | export default class FolderModel extends BaseModel { 6 | 7 | getFolderContents(params: GetItemsParams): Promise> { 8 | const parser = new FolderContentParser(); 9 | return this.getItemsFromAPI({ ...params, recursive: false }, parser); 10 | } 11 | 12 | getFolder(id: string) { 13 | const parser = new FolderParser(); 14 | return this.getItemFromApi({ itemId: id }, parser); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/lib/model/GenreModel.ts: -------------------------------------------------------------------------------- 1 | import { GenresApi } from '@jellyfin/sdk/lib/generated-client/api/genres-api'; 2 | import { getGenresApi } from '@jellyfin/sdk/lib/utils/api/genres-api'; 3 | import Genre from '../entities/Genre'; 4 | import { GetItemsParams, GetItemsResult } from './BaseModel'; 5 | import { default as BaseModel } from './BaseModel'; 6 | import GenreParser from './parser/GenreParser'; 7 | 8 | export default class GenreModel extends BaseModel { 9 | 10 | async getGenres(params: GetItemsParams): Promise> { 11 | const parser = new GenreParser(); 12 | return this.getItemsFromAPI(params, parser, { 13 | getApi: (api) => getGenresApi(api), 14 | getItems: 'getGenres' 15 | }); 16 | } 17 | 18 | getGenre(id: string) { 19 | const parser = new GenreParser(); 20 | return this.getItemFromApi({ itemId: id }, parser); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/lib/model/PlaylistModel.ts: -------------------------------------------------------------------------------- 1 | import { EntityType } from '../entities'; 2 | import Playlist from '../entities/Playlist'; 3 | import { GetItemsParams, GetItemsResult } from './BaseModel'; 4 | import { default as BaseModel } from './BaseModel'; 5 | import PlaylistParser from './parser/PlaylistParser'; 6 | 7 | export default class PlaylistModel extends BaseModel { 8 | 9 | async getPlaylists(params: GetItemsParams): Promise> { 10 | const parser = new PlaylistParser(); 11 | return this.getItemsFromAPI({ ...params, itemTypes: EntityType.Playlist }, parser); 12 | } 13 | 14 | getPlaylist(id: string) { 15 | const parser = new PlaylistParser(); 16 | return this.getItemFromApi({ itemId: id }, parser); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/lib/model/SongModel.ts: -------------------------------------------------------------------------------- 1 | import { ItemFields } from '@jellyfin/sdk/lib/generated-client/models/item-fields'; 2 | import { getLyricsApi } from '@jellyfin/sdk/lib/utils/api/lyrics-api'; 3 | import { EntityType } from '../entities'; 4 | import Song from '../entities/Song'; 5 | import BaseModel, { GetItemsParams, GetItemsResult } from './BaseModel'; 6 | import SongParser from './parser/SongParser'; 7 | import LyricsParser from './parser/LyricsParser'; 8 | 9 | export default class SongModel extends BaseModel { 10 | 11 | getSongs(params: GetItemsParams): Promise> { 12 | const parser = new SongParser(); 13 | return this.getItemsFromAPI({ 14 | ...params, 15 | itemTypes: EntityType.Song, 16 | fields: [ ItemFields.MediaSources ] 17 | }, parser); 18 | } 19 | 20 | getSong(id: string) { 21 | const parser = new SongParser(); 22 | return this.getItemFromApi({ itemId: id }, parser); 23 | } 24 | 25 | async getLyrics(id: string) { 26 | const api = getLyricsApi(this.connection.api); 27 | const dto = await api.getLyrics({ itemId: id }); 28 | const parser = new LyricsParser(); 29 | return parser.parseDto(dto.data); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/lib/model/UserViewModel.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { UserViewsApi } from '@jellyfin/sdk/lib/generated-client/api/user-views-api'; 3 | import { getUserViewsApi } from '@jellyfin/sdk/lib/utils/api/user-views-api'; 4 | import UserView from '../entities/UserView'; 5 | import BaseModel, { GetItemsResult } from './BaseModel'; 6 | import UserViewParser from './parser/UserViewParser'; 7 | 8 | export default class UserViewModel extends BaseModel { 9 | 10 | getUserViews(): Promise> { 11 | const parser = new UserViewParser(); 12 | return this.getItemsFromAPI({}, parser, { 13 | getApi: (api: Api) => getUserViewsApi(api), 14 | getItems: 'getUserViews' 15 | }); 16 | } 17 | 18 | getUserView(id: string) { 19 | const parser = new UserViewParser(); 20 | return this.getItemFromApi({ itemId: id }, parser); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/lib/model/filter/AZFilterModel.ts: -------------------------------------------------------------------------------- 1 | import jellyfin from '../../JellyfinContext'; 2 | import BaseModel from '../BaseModel'; 3 | import FilterModel, { Filter, FilterType } from './FilterModel'; 4 | 5 | const AZ = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ]; 6 | 7 | export interface AZFilterModelConfig { 8 | initialSelection?: { 9 | nameStartsWith?: string 10 | }; 11 | } 12 | 13 | export default class AZFilterModel extends BaseModel implements FilterModel { 14 | 15 | async getFilter(config?: AZFilterModelConfig): Promise { 16 | const options = AZ.map((c) => ({ 17 | name: c, 18 | value: c, 19 | selected: c === config?.initialSelection?.nameStartsWith 20 | })); 21 | 22 | return { 23 | type: FilterType.AZ, 24 | title: jellyfin.getI18n('JELLYFIN_FILTER_AZ_TITLE'), 25 | placeholder: jellyfin.getI18n('JELLYFIN_FILTER_AZ_PLACEHOLDER'), 26 | field: 'nameStartsWith', 27 | icon: 'fa fa-font', 28 | resettable: true, 29 | options 30 | }; 31 | } 32 | 33 | async getDefaultSelection(): Promise> { 34 | return { 35 | nameStartsWith: undefined 36 | }; 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/lib/model/filter/FilterModel.ts: -------------------------------------------------------------------------------- 1 | export enum FilterType { 2 | AZ = 'AZ', 3 | Genre = 'Genre', 4 | Year = 'Year', 5 | Filter = 'Filter', 6 | Sort = 'Sort' 7 | } 8 | 9 | export interface Filter { 10 | type: FilterType, 11 | title?: string, 12 | placeholder: string, 13 | field?: string, 14 | icon?: string, 15 | resettable?: boolean, 16 | options?: FilterOption[], 17 | subfilters?: Subfilter[] 18 | } 19 | 20 | export type Subfilter = Omit; 21 | 22 | export interface FilterOption { 23 | name: string, 24 | value: any, 25 | selected?: boolean 26 | } 27 | 28 | export type FilterSelection = Record; 29 | 30 | interface FilterModel { 31 | getFilter(config?: any): Promise; 32 | getDefaultSelection(params: any): Promise; 33 | } 34 | 35 | export default FilterModel; 36 | -------------------------------------------------------------------------------- /src/lib/model/parser/AlbumParser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import { EntityType } from '../../entities'; 4 | import Album from '../../entities/Album'; 5 | import BaseParser from './BaseParser'; 6 | 7 | export default class AlbumParser extends BaseParser { 8 | 9 | async parseDto(data: BaseItemDto, api: Api): Promise { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | 15 | const artists = data.ArtistItems?.reduce((result, artist) => { 16 | if (artist.Id && artist.Name) { 17 | result.push({ 18 | id: artist.Id, 19 | name: artist.Name 20 | }); 21 | } 22 | return result; 23 | }, []) || []; 24 | 25 | const result: Album = { 26 | ...base, 27 | type: EntityType.Album, 28 | albumArtist: data.AlbumArtist || null, 29 | artists, 30 | duration: data.RunTimeTicks ? this.ticksToSeconds(data.RunTimeTicks) : null, 31 | year: data.ProductionYear || null, 32 | genres: this.getGenres(data) 33 | }; 34 | 35 | return result; 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/lib/model/parser/ArtistParser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import { EntityType } from '../../entities'; 4 | import Artist from '../../entities/Artist'; 5 | import BaseParser from './BaseParser'; 6 | 7 | export default class ArtistParser extends BaseParser { 8 | 9 | #type: EntityType.Artist | EntityType.AlbumArtist; 10 | 11 | constructor(type: EntityType.Artist | EntityType.AlbumArtist) { 12 | super(); 13 | this.#type = type; 14 | } 15 | 16 | async parseDto(data: BaseItemDto, api: Api): Promise { 17 | const base = await super.parseDto(data, api); 18 | if (!base) { 19 | return null; 20 | } 21 | 22 | return { 23 | ...base, 24 | type: this.#type, 25 | genres: this.getGenres(data) 26 | }; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/lib/model/parser/CollectionParser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import { EntityType } from '../../entities'; 4 | import Collection from '../../entities/Collection'; 5 | import BaseParser from './BaseParser'; 6 | 7 | export default class CollectionParser extends BaseParser { 8 | 9 | async parseDto(data: BaseItemDto, api: Api): Promise { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | 15 | const result: Collection = { 16 | ...base, 17 | type: EntityType.Collection, 18 | year: data.ProductionYear || null 19 | }; 20 | 21 | return result; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/lib/model/parser/FolderParser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models'; 3 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 4 | import { EntityType } from '../../entities'; 5 | import Folder, { FolderType } from '../../entities/Folder'; 6 | import BaseParser from './BaseParser'; 7 | 8 | export default class FolderParser extends BaseParser { 9 | 10 | async parseDto(data: BaseItemDto, api: Api): Promise { 11 | const base = await super.parseDto(data, api); 12 | if (!base || (data.Type !== BaseItemKind.Folder && 13 | data.Type !== BaseItemKind.CollectionFolder && data.Type !== BaseItemKind.UserView)) { 14 | return null; 15 | } 16 | 17 | const result: Folder = { 18 | ...base, 19 | type: data.Type === BaseItemKind.CollectionFolder ? EntityType.CollectionFolder : EntityType.Folder 20 | }; 21 | 22 | if (data.Type === BaseItemKind.CollectionFolder && data.CollectionType === 'boxsets') { 23 | result.folderType = FolderType.Collections; 24 | } 25 | else { 26 | result.folderType = FolderType.Folder; 27 | } 28 | 29 | return result; 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/lib/model/parser/GenreParser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import { EntityType } from '../../entities'; 4 | import Genre from '../../entities/Genre'; 5 | import BaseParser from './BaseParser'; 6 | 7 | export default class GenreParser extends BaseParser { 8 | 9 | async parseDto(data: BaseItemDto, api: Api): Promise { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | 15 | const result: Genre = { 16 | ...base, 17 | type: EntityType.Genre 18 | }; 19 | 20 | return result; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/lib/model/parser/LyricsParser.ts: -------------------------------------------------------------------------------- 1 | import { LyricDto } from '@jellyfin/sdk/lib/generated-client/models/lyric-dto'; 2 | import { MetadataLyrics } from 'now-playing-common'; 3 | 4 | export default class LyricsParser { 5 | 6 | async parseDto(data: LyricDto): Promise { 7 | /** 8 | * LyricDto supposedly has `Metadata.IsSynced` property but 9 | * `Metadata` is empty (as of v10.9.6). We need to test by 10 | * looping through each line of lyrics. 11 | */ 12 | if (!data.Lyrics) { 13 | return null; 14 | } 15 | const isSynced = data.Lyrics.every((line) => line.Start !== undefined); 16 | if (isSynced) { 17 | const lines = data.Lyrics.map((line) => ({ 18 | text: line.Text || '', 19 | // Convert to milliseconds 20 | start: line.Start ? line.Start / 10000 : 0 21 | })) || []; 22 | if (lines.length > 0) { 23 | return { 24 | type: 'synced', 25 | lines 26 | }; 27 | } 28 | } 29 | else { 30 | const lines = data.Lyrics?.reduce((result, line) => { 31 | if (line.Text !== undefined) { 32 | result.push(line.Text); 33 | } 34 | return result; 35 | }, []) || []; 36 | if (lines.length > 0) { 37 | return { 38 | type: 'plain', 39 | lines 40 | }; 41 | } 42 | } 43 | return null; 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /src/lib/model/parser/Parser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | 4 | interface Parser { 5 | parseDto(data: BaseItemDto, api: Api): Promise; 6 | } 7 | 8 | export default Parser; 9 | -------------------------------------------------------------------------------- /src/lib/model/parser/PlaylistParser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 3 | import { EntityType } from '../../entities'; 4 | import Playlist from '../../entities/Playlist'; 5 | import BaseParser from './BaseParser'; 6 | 7 | export default class PlaylistParser extends BaseParser { 8 | 9 | async parseDto(data: BaseItemDto, api: Api): Promise { 10 | const base = await super.parseDto(data, api); 11 | if (!base) { 12 | return null; 13 | } 14 | 15 | const result: Playlist = { 16 | ...base, 17 | type: EntityType.Playlist 18 | }; 19 | 20 | return result; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/lib/model/parser/UserViewParser.ts: -------------------------------------------------------------------------------- 1 | import { Api } from '@jellyfin/sdk'; 2 | import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models'; 3 | import { BaseItemDto } from '@jellyfin/sdk/lib/generated-client/models/base-item-dto'; 4 | import { EntityType } from '../../entities'; 5 | import UserView, { UserViewType } from '../../entities/UserView'; 6 | import BaseParser from './BaseParser'; 7 | 8 | export default class UserViewParser extends BaseParser { 9 | 10 | async parseDto(data: BaseItemDto, api: Api): Promise { 11 | const base = await super.parseDto(data, api); 12 | if (!base) { 13 | return null; 14 | } 15 | 16 | const result: UserView = { 17 | ...base, 18 | type: EntityType.UserView 19 | }; 20 | 21 | if (data.Type === BaseItemKind.CollectionFolder && data.CollectionType === 'boxsets') { 22 | result.userViewType = UserViewType.Collections; 23 | } 24 | else if (data.Type === BaseItemKind.UserView && data.CollectionType === 'playlists') { 25 | result.userViewType = UserViewType.Playlists; 26 | } 27 | else if (data.Type === BaseItemKind.CollectionFolder && data.CollectionType === 'music') { 28 | result.userViewType = UserViewType.Library; 29 | } 30 | else if (data.Type === BaseItemKind.UserView && data.CollectionType === 'folders') { 31 | result.userViewType = UserViewType.Folders; 32 | } 33 | else { 34 | return null; 35 | } 36 | 37 | return result; 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/lib/util/StopWatch.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Note: this is not a general-purpose utility class, but one made specifically for 3 | * keeping track of the seek position in MPD 'stop' events handled by PlayController. 4 | */ 5 | 6 | export default class StopWatch { 7 | #startTimestamp: number; 8 | #stopTimestamp: number; 9 | #startElapsedMS: number; 10 | #status: 'running' | 'stopped'; 11 | 12 | constructor() { 13 | this.#status = 'stopped'; 14 | this.#startTimestamp = this.#stopTimestamp = this.#getCurrentTimestamp(); 15 | } 16 | 17 | start(startElapsedMS = 0) { 18 | this.#startTimestamp = this.#stopTimestamp = this.#getCurrentTimestamp(); 19 | this.#startElapsedMS = startElapsedMS; 20 | this.#status = 'running'; 21 | return this; 22 | } 23 | 24 | stop() { 25 | if (this.#status !== 'stopped') { 26 | this.#stopTimestamp = this.#getCurrentTimestamp(); 27 | this.#status = 'stopped'; 28 | } 29 | return this; 30 | } 31 | 32 | getElapsed() { 33 | if (this.#status === 'stopped') { 34 | return this.#stopTimestamp - this.#startTimestamp + this.#startElapsedMS; 35 | } 36 | 37 | // Status: 'running' 38 | return this.#getCurrentTimestamp() - this.#startTimestamp + this.#startElapsedMS; 39 | } 40 | 41 | #getCurrentTimestamp() { 42 | return new Date().getTime(); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /src/lib/util/Type.ts: -------------------------------------------------------------------------------- 1 | // Used for converting Object values to string literal types: 2 | // https://dev.to/multimo/how-to-build-typescript-string-literal-types-from-objects-values-361l 3 | export type ValueOf = T[keyof T]; 4 | -------------------------------------------------------------------------------- /src/lib/util/UI.ts: -------------------------------------------------------------------------------- 1 | import { existsSync } from 'fs'; 2 | 3 | export default class UI { 4 | static supportsEnhancedTitles(): boolean { 5 | return !this.isManifestUI(); 6 | } 7 | 8 | static isManifestUI(): boolean { 9 | const volumioManifestUIDir = '/volumio/http/www4'; 10 | const volumioManifestUIDisabledFile = '/data/disableManifestUI'; 11 | return existsSync(volumioManifestUIDir) && !existsSync(volumioManifestUIDisabledFile); 12 | } 13 | 14 | static createLink(data: { text: string, uri: string }): string { 15 | const onclick = `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${data.uri}'})`; 16 | return `${data.text}`; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/lib/util/index.ts: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/ban-ts-comment 2 | // @ts-ignore 3 | import libQ from 'kew'; 4 | 5 | export function jsPromiseToKew(promise: Promise): any { 6 | const defer = libQ.defer(); 7 | 8 | promise.then((result) => { 9 | defer.resolve(result); 10 | }) 11 | .catch((error) => { 12 | defer.reject(error); 13 | }); 14 | 15 | return defer.promise; 16 | } 17 | 18 | export function kewToJSPromise(promise: any): Promise { 19 | // Guard against a JS promise from being passed to this function. 20 | if (typeof promise.catch === 'function' && typeof promise.fail === undefined) { 21 | // JS promise - return as is 22 | return promise; 23 | } 24 | return new Promise((resolve, reject) => { 25 | promise.then((result: any) => { 26 | resolve(result); 27 | }) 28 | .fail((error: any) => { 29 | reject(error); 30 | }); 31 | }); 32 | } 33 | 34 | export function objectAssignIfExists>(target: T, source: Record, props: string[]): T { 35 | props.forEach((prop) => { 36 | if (source[prop] !== undefined) { 37 | Reflect.set(target, prop, source[prop]); 38 | } 39 | }); 40 | 41 | return target; 42 | } 43 | -------------------------------------------------------------------------------- /src/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["./**/*.ts"], 3 | "compilerOptions": { 4 | "rootDir": ".", 5 | "target": "es2020", 6 | "module": "commonjs", 7 | "outDir": "../dist/", 8 | "declaration": true, 9 | "declarationMap": true, 10 | "esModuleInterop": true, 11 | "moduleResolution": "node", 12 | "sourceMap": true, 13 | "inlineSources": true, 14 | "strict": true, 15 | "strictPropertyInitialization": false, 16 | "resolveJsonModule": true 17 | }, 18 | "references": [ 19 | { "path": "../" } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "rootDir": ".", 4 | "outDir": ".", 5 | "resolveJsonModule": true, 6 | "composite": true 7 | }, 8 | "files": [ 9 | "package.json" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /uninstall.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "Jellyfin plugin uninstalled" 3 | --------------------------------------------------------------------------------