From 198957bcae62e7b2c5c29ac51d3cd5b6e0bd99f0 Mon Sep 17 00:00:00 2001 From: Mungai Njoroge Date: Fri, 13 Jan 2023 20:01:52 +0300 Subject: [PATCH] Move server code to this repo (#95) move server code to this repo --- .browserslistrc | 3 - .eslintrc.js | 11 - .gitignore | 23 +- README.md | 93 +- alice.spec | 44 + .../Global/controls.scss => app/__init__.py | 0 app/api/__init__.py | 30 + app/api/album.py | 151 + app/api/artist.py | 323 ++ app/api/favorites.py | 210 + app/api/folder.py | 32 + app/api/playlist.py | 226 + app/api/search.py | 218 + app/api/track.py | 33 + app/db/__init__.py | 214 + app/db/sqlite/__init__.py | 47 + app/db/sqlite/albums.py | 125 + app/db/sqlite/artists.py | 36 + app/db/sqlite/favorite.py | 77 + app/db/sqlite/playlists.py | 179 + app/db/sqlite/queries.py | 65 + app/db/sqlite/tracks.py | 142 + app/db/sqlite/utils.py | 93 + app/db/store.py | 459 ++ app/functions.py | 40 + app/imgserver/__init__.py | 114 + app/lib/__init__.py | 3 + app/lib/albumslib.py | 3 + app/lib/artistlib.py | 130 + app/lib/colorlib.py | 94 + app/lib/folderslib.py | 47 + app/lib/playlistlib.py | 115 + app/lib/populate.py | 100 + app/lib/searchlib.py | 125 + app/lib/taglib.py | 159 + app/lib/trackslib.py | 19 + app/lib/watchdogg.py | 172 + app/logger.py | 49 + app/models.py | 206 + app/serializer.py | 55 + app/settings.py | 103 + app/setup/__init__.py | 128 + app/utils.py | 226 + assets/album.svg | 8 + assets/artist.webp | Bin 0 -> 3956 bytes assets/default.webp | Bin 0 -> 1898 bytes assets/playlist.svg | 13 + index.html | 21 - manage.py | 183 + manage.spec | 44 + package.json | 39 - poetry.lock | 1135 +++++ public/img/icons/android-chrome-192x192.png | Bin 10961 -> 0 bytes public/img/icons/android-chrome-512x512.png | Bin 39338 -> 0 bytes public/img/icons/apple-touch-icon.png | Bin 9776 -> 0 bytes public/img/icons/favicon-16x16.png | Bin 591 -> 0 bytes public/img/icons/favicon-32x32.png | Bin 1244 -> 0 bytes public/img/icons/favicon.ico | Bin 15406 -> 0 bytes public/robots.txt | 2 - pyinstaller.config.ini | 3 + pyproject.toml | 34 + rd-me-banner.png | Bin 0 -> 33860 bytes requirements.txt | 30 + roadmap.md | 39 + src/App.vue | 120 - src/assets/googlesans.ttf | Bin 109128 -> 0 bytes src/assets/icons/a.svg | 1 - src/assets/icons/add-to-queue.svg | 4 - src/assets/icons/add_to_queue.svg | 3 - src/assets/icons/album.svg | 3 - src/assets/icons/arrow.svg | 3 - src/assets/icons/artist.svg | 3 - src/assets/icons/cancel.svg | 3 - src/assets/icons/clock.svg | 4 - src/assets/icons/delete.svg | 3 - src/assets/icons/expand.svg | 3 - src/assets/icons/file.svg | 6 - src/assets/icons/folder-1.svg | 3 - src/assets/icons/folder.fill.svg | 3 - src/assets/icons/folder.svg | 3 - src/assets/icons/grid.svg | 6 - src/assets/icons/heart.fill.svg | 3 - src/assets/icons/heart.svg | 3 - src/assets/icons/home.svg | 3 - src/assets/icons/info.svg | 4 - src/assets/icons/logo-small-white-bg.svg | 1 - src/assets/icons/logo-small.svg | 3 - src/assets/icons/more.svg | 5 - src/assets/icons/next.svg | 3 - src/assets/icons/pause.svg | 3 - src/assets/icons/pin.svg | 3 - src/assets/icons/play-next.svg | 4 - src/assets/icons/play.svg | 3 - src/assets/icons/playing.gif | Bin 5613 -> 0 bytes src/assets/icons/playing.webp | Bin 2076 -> 0 bytes src/assets/icons/playlist-1.svg | 1 - src/assets/icons/playlist.svg | 3 - src/assets/icons/plus.svg | 3 - src/assets/icons/previous.svg | 3 - src/assets/icons/queue.svg | 1 - src/assets/icons/repeat-one.svg | 4 - src/assets/icons/repeat.svg | 3 - src/assets/icons/right-arrow.svg | 3 - src/assets/icons/sdcard.svg | 3 - src/assets/icons/search.svg | 3 - src/assets/icons/settings.svg | 3 - src/assets/icons/shuffle.svg | 3 - src/assets/icons/symlink.svg | 12 - src/assets/icons/tag.svg | 3 - src/assets/icons/toast/check.svg | 6 - src/assets/icons/toast/error.svg | 6 - src/assets/icons/toast/info.svg | 6 - src/assets/icons/toast/ok.svg | 6 - src/assets/icons/toast/working.svg | 6 - src/assets/images/folder.webp | Bin 50466 -> 0 bytes src/assets/images/folderbg.svg | 98 - src/assets/images/folderbg.webp | Bin 19128 -> 0 bytes .../images/icons/android-chrome-192x192.png | Bin 10961 -> 0 bytes .../images/icons/android-chrome-512x512.png | Bin 39338 -> 0 bytes src/assets/images/icons/apple-touch-icon.png | Bin 9776 -> 0 bytes src/assets/images/icons/favicon-16x16.png | Bin 591 -> 0 bytes src/assets/images/icons/favicon-32x32.png | Bin 1244 -> 0 bytes src/assets/images/icons/favicon.ico | Bin 15406 -> 0 bytes src/assets/images/logo.webp | Bin 107184 -> 0 bytes src/assets/logo.svg | 4 - src/assets/scss/BottomBar/BottomBar.scss | 64 - src/assets/scss/Global/album-grid.scss | 12 - src/assets/scss/Global/app-grid.scss | 139 - src/assets/scss/Global/basic.scss | 150 - src/assets/scss/Global/index.scss | 47 - src/assets/scss/Global/inputs.scss | 10 - src/assets/scss/Global/scrollbars.scss | 23 - src/assets/scss/Global/search-tabheaders.scss | 33 - src/assets/scss/Global/state.scss | 18 - src/assets/scss/Global/variants.scss | 29 - src/assets/scss/ProgressBar.scss | 72 - src/assets/scss/_mixins.scss | 36 - src/assets/scss/_variables.scss | 56 - src/assets/scss/index.scss | 15 - src/assets/scss/moz.scss | 40 - src/assets/sf-compact.woff | Bin 126084 -> 0 bytes src/components/AlbumView/AlbumBio.vue | 113 - src/components/AlbumView/AlbumDiscBar.vue | 32 - src/components/AlbumView/ArtistAlbums.vue | 61 - src/components/AlbumView/GenreBanner.vue | 70 - src/components/AlbumView/Header.vue | 263 -- src/components/AlbumsExplorer/AlbumList.vue | 218 - src/components/AlbumsExplorer/TopAlbums.vue | 164 - .../ArtistView/ArtistAlbumsFetcher.vue | 18 - src/components/ArtistView/Header.vue | 158 - src/components/ArtistView/TopTracks.vue | 52 - .../ArtistsExplorer/ArtistsList.vue | 126 - src/components/ArtistsExplorer/TopArtists.vue | 160 - src/components/BottomBar.vue | 253 - src/components/ContextMenu.vue | 91 - src/components/Contextmenu/ContextItem.vue | 205 - src/components/FolderView/FolderItem.vue | 62 - src/components/FolderView/FolderList.vue | 46 - src/components/HomePage.vue | 3 - src/components/LeftSidebar/NP/HotKeys.vue | 49 - src/components/LeftSidebar/NP/Progress.vue | 30 - src/components/LeftSidebar/NP/SongCard.vue | 61 - src/components/LeftSidebar/NP/otherKeys.vue | 31 - src/components/LeftSidebar/Navigation.vue | 129 - src/components/LeftSidebar/NowPlayingImg.vue | 17 - src/components/LeftSidebar/index.vue | 20 - src/components/Logo.vue | 24 - src/components/Notification.vue | 93 - src/components/PlaylistView/ArtistsList.vue | 47 - src/components/PlaylistView/Header.vue | 163 - src/components/PlaylistsList/PlaylistCard.vue | 82 - src/components/RightSideBar/Home/Main.vue | 18 - .../RightSideBar/Home/Recommendation.vue | 66 - src/components/RightSideBar/Main.vue | 66 - src/components/RightSideBar/Queue.vue | 81 - .../RightSideBar/Queue/QueueActions.vue | 46 - src/components/RightSideBar/Queue/upNext.vue | 65 - .../RightSideBar/Search/ArtistGrid.vue | 61 - .../RightSideBar/Search/LoadMore.vue | 36 - src/components/RightSideBar/Search/Main.vue | 59 - src/components/RightSideBar/Search/Tab.vue | 39 - .../RightSideBar/Search/TabsWrapper.vue | 60 - .../RightSideBar/Search/TracksGrid.vue | 70 - src/components/RightSideBar/SearchInput.vue | 113 - src/components/RightSideBar/Tabs.vue | 75 - src/components/SearchPage/FetchMore.vue | 12 - .../SettingsView/Components/Select.vue | 52 - .../SettingsView/Components/Switch.vue | 41 - src/components/SettingsView/Content.vue | 26 - src/components/SettingsView/Group.vue | 96 - src/components/SettingsView/Nav.vue | 49 - src/components/WelcomeModal.vue | 63 - src/components/modal.vue | 107 - src/components/modals/ConfirmModal.vue | 32 - src/components/modals/NewPlaylist.vue | 105 - src/components/modals/updatePlaylist.vue | 206 - src/components/nav/NavBar.vue | 123 - src/components/nav/NavButtons.vue | 48 - .../nav/Titles/ArtistDiscographyTitle.vue | 118 - src/components/nav/Titles/Folder.vue | 135 - src/components/nav/Titles/PlaylistsTitle.vue | 27 - src/components/nav/Titles/QueueTitle.vue | 154 - src/components/nav/Titles/SearchTitle.vue | 57 - src/components/nav/Titles/SettingsTitle.vue | 18 - src/components/nav/Titles/SimpleNav.vue | 9 - src/components/shared/AlbumCard.vue | 144 - src/components/shared/ArtistCard.vue | 56 - src/components/shared/ArtistName.vue | 54 - src/components/shared/HeartSvg.vue | 43 - src/components/shared/Loader.vue | 42 - src/components/shared/MasterFlag.vue | 15 - src/components/shared/NavSearchInput.vue | 130 - src/components/shared/Option.vue | 32 - src/components/shared/PlayBtn.vue | 51 - src/components/shared/PlayBtnRect.vue | 40 - src/components/shared/SeeAll.vue | 23 - src/components/shared/SongItem.vue | 298 -- src/components/shared/SongList.vue | 36 - src/components/shared/TrackItem.vue | 197 - src/composables/colors/album.ts | 64 - src/composables/context.ts | 35 - src/composables/enums.ts | 61 - src/composables/favoriteHandler.ts | 31 - src/composables/fetch/album.ts | 100 - src/composables/fetch/artists.ts | 62 - src/composables/fetch/favorite.ts | 99 - src/composables/fetch/folders.ts | 30 - src/composables/fetch/playlists.ts | 196 - src/composables/fetch/searchMusic.ts | 83 - src/composables/fetch/useAxios.ts | 40 - src/composables/mediaNotification.ts | 66 - src/composables/normalizeContextMenu.ts | 44 - src/composables/perks.ts | 24 - src/composables/state.ts | 11 - src/composables/useBreakpoints.ts | 11 - src/composables/useKeyboard.ts | 86 - src/composables/usePlayFrom.ts | 111 - src/composables/useWaitForScroll.ts | 41 - src/config.ts | 89 - src/contexts/playlist.ts | 28 - src/contexts/track_context.ts | 184 - src/directives/vTooltip.ts | 20 - src/interfaces.ts | 147 - src/interfaces/settings.ts | 27 - src/main.ts | 35 - src/router/index.ts | 10 - src/router/routes.ts | 199 - src/settings/enums.ts | 6 - .../general/context-children-show-mode.ts | 28 - src/settings/general/extend-width.ts | 17 - src/settings/general/index.ts | 26 - src/settings/general/now-playing.ts | 16 - src/settings/general/sidebar.ts | 16 - src/settings/index.ts | 3 - src/settings/strings.ts | 40 - src/stores/content-width.ts | 37 - src/stores/context.ts | 72 - src/stores/fromFolder.ts | 1 - src/stores/loader.ts | 37 - src/stores/modal.ts | 51 - src/stores/nav.ts | 26 - src/stores/notification.ts | 29 - src/stores/pages/album.ts | 155 - src/stores/pages/artist.ts | 60 - src/stores/pages/artistDiscog.ts | 67 - src/stores/pages/folder.ts | 53 - src/stores/pages/playlist.ts | 86 - src/stores/pages/playlists.ts | 28 - src/stores/queue.ts | 378 -- src/stores/search.ts | 255 - src/stores/settings/index.ts | 61 - src/stores/tabs.ts | 34 - src/svg.d.ts | 4 - src/utils/index.ts | 21 - src/utils/useCreateSubPaths.ts | 52 - src/utils/useCreateTrackProps.ts | 8 - src/utils/useFocusElem.ts | 23 - src/utils/useFormatSeconds.ts | 49 - src/utils/useFuse.ts | 17 - src/utils/useLocalStorage.ts | 25 - src/utils/usePutCommas.ts | 18 - src/utils/useVisibility.ts | 21 - src/views/AlbumView/index.vue | 149 - src/views/AlbumsExplorer.vue | 25 - src/views/AlbumsGrid.vue | 30 - src/views/ArtistTracks.vue | 73 - src/views/ArtistView/Main.vue | 184 - src/views/ArtistView/index.ts | 3 - src/views/ArtistsExplorer.vue | 25 - src/views/FavoriteAlbums.vue | 25 - src/views/FavoriteArtists.vue | 25 - src/views/FavoriteTracks.vue | 23 - src/views/Favorites.vue | 91 - src/views/FolderView.vue | 116 - src/views/HomeView.vue | 14 - src/views/NotFound.vue | 12 - src/views/PlaylistList.vue | 30 - src/views/PlaylistView/index.vue | 86 - src/views/QueueView.vue | 39 - src/views/SearchView.vue | 42 - src/views/SearchView/albums.vue | 24 - src/views/SearchView/artists.vue | 16 - src/views/SearchView/folders.vue | 11 - src/views/SearchView/index.ts | 3 - src/views/SearchView/main.vue | 150 - src/views/SearchView/tracks.vue | 80 - src/views/SettingsView.vue | 12 - src/vite-env.d.ts | 7 - start.sh | 27 + swing.spec | 44 + todo | 24 - todo.md | 20 - tsconfig.json | 24 - tsconfig.node.json | 9 - v1-pre-alpha.release.md | 11 - vite.config.ts | 21 - wsgi.py | 5 + yarn.lock | 4081 ----------------- 318 files changed, 6259 insertions(+), 16797 deletions(-) delete mode 100644 .browserslistrc delete mode 100644 .eslintrc.js create mode 100644 alice.spec rename src/assets/scss/Global/controls.scss => app/__init__.py (100%) create mode 100644 app/api/__init__.py create mode 100644 app/api/album.py create mode 100644 app/api/artist.py create mode 100644 app/api/favorites.py create mode 100644 app/api/folder.py create mode 100644 app/api/playlist.py create mode 100644 app/api/search.py create mode 100644 app/api/track.py create mode 100644 app/db/__init__.py create mode 100644 app/db/sqlite/__init__.py create mode 100644 app/db/sqlite/albums.py create mode 100644 app/db/sqlite/artists.py create mode 100644 app/db/sqlite/favorite.py create mode 100644 app/db/sqlite/playlists.py create mode 100644 app/db/sqlite/queries.py create mode 100644 app/db/sqlite/tracks.py create mode 100644 app/db/sqlite/utils.py create mode 100644 app/db/store.py create mode 100644 app/functions.py create mode 100644 app/imgserver/__init__.py create mode 100644 app/lib/__init__.py create mode 100644 app/lib/albumslib.py create mode 100644 app/lib/artistlib.py create mode 100644 app/lib/colorlib.py create mode 100644 app/lib/folderslib.py create mode 100644 app/lib/playlistlib.py create mode 100644 app/lib/populate.py create mode 100644 app/lib/searchlib.py create mode 100644 app/lib/taglib.py create mode 100644 app/lib/trackslib.py create mode 100644 app/lib/watchdogg.py create mode 100644 app/logger.py create mode 100644 app/models.py create mode 100644 app/serializer.py create mode 100644 app/settings.py create mode 100644 app/setup/__init__.py create mode 100644 app/utils.py create mode 100644 assets/album.svg create mode 100644 assets/artist.webp create mode 100644 assets/default.webp create mode 100644 assets/playlist.svg delete mode 100644 index.html create mode 100644 manage.py create mode 100644 manage.spec delete mode 100644 package.json create mode 100644 poetry.lock delete mode 100644 public/img/icons/android-chrome-192x192.png delete mode 100644 public/img/icons/android-chrome-512x512.png delete mode 100644 public/img/icons/apple-touch-icon.png delete mode 100644 public/img/icons/favicon-16x16.png delete mode 100644 public/img/icons/favicon-32x32.png delete mode 100644 public/img/icons/favicon.ico delete mode 100644 public/robots.txt create mode 100644 pyinstaller.config.ini create mode 100644 pyproject.toml create mode 100644 rd-me-banner.png create mode 100644 requirements.txt create mode 100644 roadmap.md delete mode 100644 src/App.vue delete mode 100644 src/assets/googlesans.ttf delete mode 100644 src/assets/icons/a.svg delete mode 100644 src/assets/icons/add-to-queue.svg delete mode 100644 src/assets/icons/add_to_queue.svg delete mode 100644 src/assets/icons/album.svg delete mode 100644 src/assets/icons/arrow.svg delete mode 100644 src/assets/icons/artist.svg delete mode 100644 src/assets/icons/cancel.svg delete mode 100644 src/assets/icons/clock.svg delete mode 100644 src/assets/icons/delete.svg delete mode 100644 src/assets/icons/expand.svg delete mode 100644 src/assets/icons/file.svg delete mode 100644 src/assets/icons/folder-1.svg delete mode 100644 src/assets/icons/folder.fill.svg delete mode 100644 src/assets/icons/folder.svg delete mode 100644 src/assets/icons/grid.svg delete mode 100644 src/assets/icons/heart.fill.svg delete mode 100644 src/assets/icons/heart.svg delete mode 100644 src/assets/icons/home.svg delete mode 100644 src/assets/icons/info.svg delete mode 100644 src/assets/icons/logo-small-white-bg.svg delete mode 100644 src/assets/icons/logo-small.svg delete mode 100644 src/assets/icons/more.svg delete mode 100644 src/assets/icons/next.svg delete mode 100644 src/assets/icons/pause.svg delete mode 100644 src/assets/icons/pin.svg delete mode 100644 src/assets/icons/play-next.svg delete mode 100644 src/assets/icons/play.svg delete mode 100644 src/assets/icons/playing.gif delete mode 100644 src/assets/icons/playing.webp delete mode 100644 src/assets/icons/playlist-1.svg delete mode 100644 src/assets/icons/playlist.svg delete mode 100644 src/assets/icons/plus.svg delete mode 100644 src/assets/icons/previous.svg delete mode 100644 src/assets/icons/queue.svg delete mode 100644 src/assets/icons/repeat-one.svg delete mode 100644 src/assets/icons/repeat.svg delete mode 100644 src/assets/icons/right-arrow.svg delete mode 100644 src/assets/icons/sdcard.svg delete mode 100644 src/assets/icons/search.svg delete mode 100644 src/assets/icons/settings.svg delete mode 100644 src/assets/icons/shuffle.svg delete mode 100644 src/assets/icons/symlink.svg delete mode 100644 src/assets/icons/tag.svg delete mode 100644 src/assets/icons/toast/check.svg delete mode 100644 src/assets/icons/toast/error.svg delete mode 100644 src/assets/icons/toast/info.svg delete mode 100644 src/assets/icons/toast/ok.svg delete mode 100644 src/assets/icons/toast/working.svg delete mode 100644 src/assets/images/folder.webp delete mode 100644 src/assets/images/folderbg.svg delete mode 100644 src/assets/images/folderbg.webp delete mode 100644 src/assets/images/icons/android-chrome-192x192.png delete mode 100644 src/assets/images/icons/android-chrome-512x512.png delete mode 100644 src/assets/images/icons/apple-touch-icon.png delete mode 100644 src/assets/images/icons/favicon-16x16.png delete mode 100644 src/assets/images/icons/favicon-32x32.png delete mode 100644 src/assets/images/icons/favicon.ico delete mode 100644 src/assets/images/logo.webp delete mode 100644 src/assets/logo.svg delete mode 100644 src/assets/scss/BottomBar/BottomBar.scss delete mode 100644 src/assets/scss/Global/album-grid.scss delete mode 100644 src/assets/scss/Global/app-grid.scss delete mode 100644 src/assets/scss/Global/basic.scss delete mode 100644 src/assets/scss/Global/index.scss delete mode 100644 src/assets/scss/Global/inputs.scss delete mode 100644 src/assets/scss/Global/scrollbars.scss delete mode 100644 src/assets/scss/Global/search-tabheaders.scss delete mode 100644 src/assets/scss/Global/state.scss delete mode 100644 src/assets/scss/Global/variants.scss delete mode 100644 src/assets/scss/ProgressBar.scss delete mode 100644 src/assets/scss/_mixins.scss delete mode 100644 src/assets/scss/_variables.scss delete mode 100644 src/assets/scss/index.scss delete mode 100644 src/assets/scss/moz.scss delete mode 100644 src/assets/sf-compact.woff delete mode 100644 src/components/AlbumView/AlbumBio.vue delete mode 100644 src/components/AlbumView/AlbumDiscBar.vue delete mode 100644 src/components/AlbumView/ArtistAlbums.vue delete mode 100644 src/components/AlbumView/GenreBanner.vue delete mode 100644 src/components/AlbumView/Header.vue delete mode 100644 src/components/AlbumsExplorer/AlbumList.vue delete mode 100644 src/components/AlbumsExplorer/TopAlbums.vue delete mode 100644 src/components/ArtistView/ArtistAlbumsFetcher.vue delete mode 100644 src/components/ArtistView/Header.vue delete mode 100644 src/components/ArtistView/TopTracks.vue delete mode 100644 src/components/ArtistsExplorer/ArtistsList.vue delete mode 100644 src/components/ArtistsExplorer/TopArtists.vue delete mode 100644 src/components/BottomBar.vue delete mode 100644 src/components/ContextMenu.vue delete mode 100644 src/components/Contextmenu/ContextItem.vue delete mode 100644 src/components/FolderView/FolderItem.vue delete mode 100644 src/components/FolderView/FolderList.vue delete mode 100644 src/components/HomePage.vue delete mode 100644 src/components/LeftSidebar/NP/HotKeys.vue delete mode 100644 src/components/LeftSidebar/NP/Progress.vue delete mode 100644 src/components/LeftSidebar/NP/SongCard.vue delete mode 100644 src/components/LeftSidebar/NP/otherKeys.vue delete mode 100644 src/components/LeftSidebar/Navigation.vue delete mode 100644 src/components/LeftSidebar/NowPlayingImg.vue delete mode 100644 src/components/LeftSidebar/index.vue delete mode 100644 src/components/Logo.vue delete mode 100644 src/components/Notification.vue delete mode 100644 src/components/PlaylistView/ArtistsList.vue delete mode 100644 src/components/PlaylistView/Header.vue delete mode 100644 src/components/PlaylistsList/PlaylistCard.vue delete mode 100644 src/components/RightSideBar/Home/Main.vue delete mode 100644 src/components/RightSideBar/Home/Recommendation.vue delete mode 100644 src/components/RightSideBar/Main.vue delete mode 100644 src/components/RightSideBar/Queue.vue delete mode 100644 src/components/RightSideBar/Queue/QueueActions.vue delete mode 100644 src/components/RightSideBar/Queue/upNext.vue delete mode 100644 src/components/RightSideBar/Search/ArtistGrid.vue delete mode 100644 src/components/RightSideBar/Search/LoadMore.vue delete mode 100644 src/components/RightSideBar/Search/Main.vue delete mode 100644 src/components/RightSideBar/Search/Tab.vue delete mode 100644 src/components/RightSideBar/Search/TabsWrapper.vue delete mode 100644 src/components/RightSideBar/Search/TracksGrid.vue delete mode 100644 src/components/RightSideBar/SearchInput.vue delete mode 100644 src/components/RightSideBar/Tabs.vue delete mode 100644 src/components/SearchPage/FetchMore.vue delete mode 100644 src/components/SettingsView/Components/Select.vue delete mode 100644 src/components/SettingsView/Components/Switch.vue delete mode 100644 src/components/SettingsView/Content.vue delete mode 100644 src/components/SettingsView/Group.vue delete mode 100644 src/components/SettingsView/Nav.vue delete mode 100644 src/components/WelcomeModal.vue delete mode 100644 src/components/modal.vue delete mode 100644 src/components/modals/ConfirmModal.vue delete mode 100644 src/components/modals/NewPlaylist.vue delete mode 100644 src/components/modals/updatePlaylist.vue delete mode 100644 src/components/nav/NavBar.vue delete mode 100644 src/components/nav/NavButtons.vue delete mode 100644 src/components/nav/Titles/ArtistDiscographyTitle.vue delete mode 100644 src/components/nav/Titles/Folder.vue delete mode 100644 src/components/nav/Titles/PlaylistsTitle.vue delete mode 100644 src/components/nav/Titles/QueueTitle.vue delete mode 100644 src/components/nav/Titles/SearchTitle.vue delete mode 100644 src/components/nav/Titles/SettingsTitle.vue delete mode 100644 src/components/nav/Titles/SimpleNav.vue delete mode 100644 src/components/shared/AlbumCard.vue delete mode 100644 src/components/shared/ArtistCard.vue delete mode 100644 src/components/shared/ArtistName.vue delete mode 100644 src/components/shared/HeartSvg.vue delete mode 100644 src/components/shared/Loader.vue delete mode 100644 src/components/shared/MasterFlag.vue delete mode 100644 src/components/shared/NavSearchInput.vue delete mode 100644 src/components/shared/Option.vue delete mode 100644 src/components/shared/PlayBtn.vue delete mode 100644 src/components/shared/PlayBtnRect.vue delete mode 100644 src/components/shared/SeeAll.vue delete mode 100644 src/components/shared/SongItem.vue delete mode 100644 src/components/shared/SongList.vue delete mode 100644 src/components/shared/TrackItem.vue delete mode 100644 src/composables/colors/album.ts delete mode 100644 src/composables/context.ts delete mode 100644 src/composables/enums.ts delete mode 100644 src/composables/favoriteHandler.ts delete mode 100644 src/composables/fetch/album.ts delete mode 100644 src/composables/fetch/artists.ts delete mode 100644 src/composables/fetch/favorite.ts delete mode 100644 src/composables/fetch/folders.ts delete mode 100644 src/composables/fetch/playlists.ts delete mode 100644 src/composables/fetch/searchMusic.ts delete mode 100644 src/composables/fetch/useAxios.ts delete mode 100644 src/composables/mediaNotification.ts delete mode 100644 src/composables/normalizeContextMenu.ts delete mode 100644 src/composables/perks.ts delete mode 100644 src/composables/state.ts delete mode 100644 src/composables/useBreakpoints.ts delete mode 100644 src/composables/useKeyboard.ts delete mode 100644 src/composables/usePlayFrom.ts delete mode 100644 src/composables/useWaitForScroll.ts delete mode 100644 src/config.ts delete mode 100644 src/contexts/playlist.ts delete mode 100644 src/contexts/track_context.ts delete mode 100644 src/directives/vTooltip.ts delete mode 100644 src/interfaces.ts delete mode 100644 src/interfaces/settings.ts delete mode 100644 src/main.ts delete mode 100644 src/router/index.ts delete mode 100644 src/router/routes.ts delete mode 100644 src/settings/enums.ts delete mode 100644 src/settings/general/context-children-show-mode.ts delete mode 100644 src/settings/general/extend-width.ts delete mode 100644 src/settings/general/index.ts delete mode 100644 src/settings/general/now-playing.ts delete mode 100644 src/settings/general/sidebar.ts delete mode 100644 src/settings/index.ts delete mode 100644 src/settings/strings.ts delete mode 100644 src/stores/content-width.ts delete mode 100644 src/stores/context.ts delete mode 100644 src/stores/fromFolder.ts delete mode 100644 src/stores/loader.ts delete mode 100644 src/stores/modal.ts delete mode 100644 src/stores/nav.ts delete mode 100644 src/stores/notification.ts delete mode 100644 src/stores/pages/album.ts delete mode 100644 src/stores/pages/artist.ts delete mode 100644 src/stores/pages/artistDiscog.ts delete mode 100644 src/stores/pages/folder.ts delete mode 100644 src/stores/pages/playlist.ts delete mode 100644 src/stores/pages/playlists.ts delete mode 100644 src/stores/queue.ts delete mode 100644 src/stores/search.ts delete mode 100644 src/stores/settings/index.ts delete mode 100644 src/stores/tabs.ts delete mode 100644 src/svg.d.ts delete mode 100644 src/utils/index.ts delete mode 100644 src/utils/useCreateSubPaths.ts delete mode 100644 src/utils/useCreateTrackProps.ts delete mode 100644 src/utils/useFocusElem.ts delete mode 100644 src/utils/useFormatSeconds.ts delete mode 100644 src/utils/useFuse.ts delete mode 100644 src/utils/useLocalStorage.ts delete mode 100644 src/utils/usePutCommas.ts delete mode 100644 src/utils/useVisibility.ts delete mode 100644 src/views/AlbumView/index.vue delete mode 100644 src/views/AlbumsExplorer.vue delete mode 100644 src/views/AlbumsGrid.vue delete mode 100644 src/views/ArtistTracks.vue delete mode 100644 src/views/ArtistView/Main.vue delete mode 100644 src/views/ArtistView/index.ts delete mode 100644 src/views/ArtistsExplorer.vue delete mode 100644 src/views/FavoriteAlbums.vue delete mode 100644 src/views/FavoriteArtists.vue delete mode 100644 src/views/FavoriteTracks.vue delete mode 100644 src/views/Favorites.vue delete mode 100644 src/views/FolderView.vue delete mode 100644 src/views/HomeView.vue delete mode 100644 src/views/NotFound.vue delete mode 100644 src/views/PlaylistList.vue delete mode 100644 src/views/PlaylistView/index.vue delete mode 100644 src/views/QueueView.vue delete mode 100644 src/views/SearchView.vue delete mode 100644 src/views/SearchView/albums.vue delete mode 100644 src/views/SearchView/artists.vue delete mode 100644 src/views/SearchView/folders.vue delete mode 100644 src/views/SearchView/index.ts delete mode 100644 src/views/SearchView/main.vue delete mode 100644 src/views/SearchView/tracks.vue delete mode 100644 src/views/SettingsView.vue delete mode 100644 src/vite-env.d.ts create mode 100755 start.sh create mode 100644 swing.spec delete mode 100644 todo delete mode 100644 todo.md delete mode 100644 tsconfig.json delete mode 100644 tsconfig.node.json delete mode 100644 v1-pre-alpha.release.md delete mode 100644 vite.config.ts create mode 100644 wsgi.py delete mode 100644 yarn.lock diff --git a/.browserslistrc b/.browserslistrc deleted file mode 100644 index 214388f..0000000 --- a/.browserslistrc +++ /dev/null @@ -1,3 +0,0 @@ -> 1% -last 2 versions -not dead diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index bb9ee2f..0000000 --- a/.eslintrc.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - root: true, - env: { - es2021: true, - }, - extends: ["plugin:vue/vue3-essential", "eslint:recommended"], - rules: { - "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", - "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", - }, -}; diff --git a/.gitignore b/.gitignore index 3d5d1e7..f87f9f0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,18 +1,7 @@ -.DS_Store -node_modules -/dist -.yarn* - - # local env files .env.local .env.*.local -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* # Editor directories and files .idea @@ -23,4 +12,14 @@ pnpm-debug.log* *.sln *.sw? -__pycache__ \ No newline at end of file +__pycache__ +.hypothesis +sqllib.py +encoderx.py +tests +.pytest_cache + +# pyinstaller files +dist +build +client \ No newline at end of file diff --git a/README.md b/README.md index 6b51fa9..b1ffffc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,94 @@ -### Swing music client -This repo contains the client code for the swing music player. Documentation coming soon ... +![SWING MUSIC PLAYER BANNER IMAGE](./rd-me-banner.png) --- + +### Make listening to your local music fun again. + +`Swing` is a music player for local audio files that is built with both visual coolness and functionality in mind. Just run the app and enjoy your music library in a web browser. + +> Note: This project is in the early stages of development. Many features are missing but will be added with time. + +The app is currently only available on linux. (I don't have access to a Windows machine for building and testing purposes and my machine is not strong enough to support Windows in VM). + +### Setup + +Download the latest release from the [release page](#) and extract it in your machine. Then execute the extracted file in a terminal. + +```bash +./swing +``` + +The file will start the app at by default. See the setup option section on how to change the host and port. + +### Setup options + +``` +Usage: swing [options] + +Options: + --host: Set the host + --port: Set the port + --help, -h: Show this help message + --version, -v: Show the version +``` + +### Development + +This project is broken down into 2. The client and the server. The client comprises of the user interface code. This part is written in Typescript, Vue 3 and SCSS. To setup the client, checkout the [swing client repo ](#) on GitHub. + +The second part of this project is the server. This is the main part of the app that runs on your machine, interacts with audio files and send data to the client. It's written in Python 3. + +The following instructions will guide you on how to setup the **server**. + +--- + +The project uses [Python poetry](https://python-poetry.org) as the dependency manager. Follow the instructions in [their docs](https://python-poetry.org/docs/) to install it in your machine. + +> It is assumed that you have `Python 3.10` or newer installed in your machine. This project uses duck typing features so older version of Python will not work. If you don't have Python installed in your machine, get it from the [python website](https://www.python.org/downloads/). + +Clone this repo locally in your machine. Then install the project dependencies and start the app. + +```sh +git clone <$> + +cd swing-core + +# install dependencies using poetry +poetry install + +# start the app +poetry run python manage.py +``` + +### Contributing + +If you want to contribute to this project, feel free to open an issue or a pull request on Github. Your contributions are highly valued and appreciated. Feature suggestions, bug reports and code contribution are welcome. + +### License + +This software is provided to you with terms stated in the MIT License. Read the full text in the `LICENSE` file located at the root of this repository. + +### A brain dump ... + +I started working on this project on dec 2021. Why? I like listening and exploring music and I like it more when I can enjoy it (like really really). I'd been searching for cute music players for linux that allow me to manage my ever growing music library. Some of the main features I was looking for were: + +- A simple, lively and beautiful user interface (main reason) +- Creating automated daily mixes based on my listening activity. +- Ability to move files around without breaking my playlists and mixes. +- Something that can bring together all the audio files scattered all over my disks into a single place. +- Browsing related artists and albums. +- Reading artists and albums biographies. +- Web browser based user interface. +- a lot more ... but I can't remember them at the moment + +I've been working to make sure that most (if not all) of the features listed above are built. Some of them are done, but most are not even touched yet. A lot of work is needed and I know that it will take a lot of time to build and perfect them. + +I've been keeping a small 🤥 list of a few cool features that I'd like to see implemented in the project. You can check it out in [this notion page](https://rhetorical-othnielia-565.notion.site/Cool-features-1a0cd5b797904da687bec441e7c7aa19). https://rhetorical-othnielia-565.notion.site/Cool-features-1a0cd5b797904da687bec441e7c7aa19 + +I have been working on this project solo, so it’s very hard to push things fast. The app is written in Python for the backend and Vue3 for the client. If you have knowledge in any or both of this areas, feel free to contribute to the project. We’ll be excited to have you. Your help is highly appreciated. + +_The backend is basically a bunch of Python classes and functions. The client just sends API request and displays it._ + +--- + **[MIT License](https://opensource.org/licenses/MIT) | Copyright (c) 2023 Mungai Njoroge** diff --git a/alice.spec b/alice.spec new file mode 100644 index 0000000..5a0fc6f --- /dev/null +++ b/alice.spec @@ -0,0 +1,44 @@ +# -*- mode: python ; coding: utf-8 -*- + + +block_cipher = None + + +a = Analysis( + ['manage.py'], + pathex=[], + binaries=[], + datas=[('assets', 'assets'), ('client', 'client'), ('pyinstaller.config.ini', '.')], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False, +) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='swing', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/src/assets/scss/Global/controls.scss b/app/__init__.py similarity index 100% rename from src/assets/scss/Global/controls.scss rename to app/__init__.py diff --git a/app/api/__init__.py b/app/api/__init__.py new file mode 100644 index 0000000..5e7a5c7 --- /dev/null +++ b/app/api/__init__.py @@ -0,0 +1,30 @@ +""" +This module combines all API blueprints into a single Flask app instance. +""" + +from flask import Flask +from flask_cors import CORS + +from app.api import album, artist, favorites, folder, playlist, search, track +from app.imgserver import imgbp as imgserver + + +def create_api(): + """ + Creates the Flask instance, registers modules and registers all the API blueprints. + """ + app = Flask(__name__, static_url_path="") + CORS(app) + + with app.app_context(): + + app.register_blueprint(album.albumbp) + app.register_blueprint(artist.artistbp) + app.register_blueprint(track.trackbp) + app.register_blueprint(search.searchbp) + app.register_blueprint(folder.folderbp) + app.register_blueprint(playlist.playlistbp) + app.register_blueprint(favorites.favbp) + app.register_blueprint(imgserver) + + return app diff --git a/app/api/album.py b/app/api/album.py new file mode 100644 index 0000000..46ca817 --- /dev/null +++ b/app/api/album.py @@ -0,0 +1,151 @@ +""" +Contains all the album routes. +""" + +from dataclasses import asdict + +from flask import Blueprint, request + +from app import utils +from app.db.sqlite.albums import SQLiteAlbumMethods as adb +from app.db.sqlite.favorite import SQLiteFavoriteMethods as favdb +from app.db.store import Store +from app.models import FavType, Track + + +get_album_by_id = adb.get_album_by_id +get_albums_by_albumartist = adb.get_albums_by_albumartist +check_is_fav = favdb.check_is_favorite + +albumbp = Blueprint("album", __name__, url_prefix="") + + +@albumbp.route("/album", methods=["POST"]) +def get_album(): + """Returns all the tracks in the given album.""" + + data = request.get_json() + error_msg = {"msg": "No hash provided"} + + if data is None: + return error_msg, 400 + + try: + albumhash = data["hash"] + except KeyError: + return error_msg, 400 + + error_msg = {"error": "Album not created yet."} + album = Store.get_album_by_hash(albumhash) + + if album is None: + return error_msg, 204 + + tracks = Store.get_tracks_by_albumhash(albumhash) + + if tracks is None: + return error_msg, 404 + + if len(tracks) == 0: + return error_msg, 204 + + def get_album_genres(tracks: list[Track]): + genres = set() + + for track in tracks: + if track.genre is not None: + genres.update(track.genre) + + return list(genres) + + album.genres = get_album_genres(tracks) + tracks = utils.remove_duplicates(tracks) + + album.count = len(tracks) + + for track in tracks: + if track.date != "Unknown": + album.date = track.date + break + + try: + album.duration = sum((t.duration for t in tracks)) + except AttributeError: + album.duration = 0 + + if ( + album.count == 1 + and tracks[0].title == album.title + # and tracks[0].track == 1 + # and tracks[0].disc == 1 + ): + album.is_single = True + else: + album.check_type() + + album.is_favorite = check_is_fav(albumhash, FavType.album) + + return {"tracks": tracks, "info": album} + + +@albumbp.route("/album//tracks", methods=["GET"]) +def get_album_tracks(albumhash: str): + """ + Returns all the tracks in the given album. + """ + tracks = Store.get_tracks_by_albumhash(albumhash) + tracks = [asdict(t) for t in tracks] + + for t in tracks: + track = str(t["track"]).zfill(3) + t["pos"] = int(f"{t['disc']}{track}") + + tracks = sorted(tracks, key=lambda t: t["pos"]) + + return {"tracks": tracks} + + +@albumbp.route("/album/from-artist", methods=["POST"]) +def get_artist_albums(): + data = request.get_json() + + if data is None: + return {"msg": "No albumartist provided"} + + albumartists: str = data["albumartists"] # type: ignore + limit: int = data.get("limit") + exclude: str = data.get("exclude") + + albumartists: list[str] = albumartists.split(",") # type: ignore + + albums = [ + { + "artisthash": a, + "albums": Store.get_albums_by_albumartist(a, limit, exclude=exclude), + } + for a in albumartists + ] + + albums = [a for a in albums if len(a["albums"]) > 0] + + return {"data": albums} + + +# @album_bp.route("/album/bio", methods=["POST"]) +# def get_album_bio(): +# """Returns the album bio for the given album.""" +# data = request.get_json() +# album_hash = data["hash"] +# err_msg = {"bio": "No bio found"} + +# album = instances.album_instance.find_album_by_hash(album_hash) + +# if album is None: +# return err_msg, 404 + +# bio = FetchAlbumBio(album["title"], album["artist"])() + +# if bio is None: +# return err_msg, 404 + +# return {"bio": bio} diff --git a/app/api/artist.py b/app/api/artist.py new file mode 100644 index 0000000..19c664c --- /dev/null +++ b/app/api/artist.py @@ -0,0 +1,323 @@ +""" +Contains all the artist(s) routes. +""" +from collections import deque + +from flask import Blueprint, request + +from app.db.store import Store +from app.models import Album, FavType, Track +from app.utils import remove_duplicates +from app.db.sqlite.favorite import SQLiteFavoriteMethods as favdb + +artistbp = Blueprint("artist", __name__, url_prefix="/") + + +class CacheEntry: + """ + The cache entry class for the artists cache. + """ + + def __init__( + self, artisthash: str, albumhashes: set[str], tracks: list[Track] + ) -> None: + self.albums: list[Album] = [] + self.tracks: list[Track] = [] + + self.artisthash: str = artisthash + self.albumhashes: set[str] = albumhashes + + if len(tracks) > 0: + self.tracks: list[Track] = tracks + + self.type_checked = False + self.albums_fetched = False + + +class ArtistsCache: + """ + Holds artist page cache. + """ + + artists: deque[CacheEntry] = deque(maxlen=6) + + @classmethod + def get_albums_by_artisthash(cls, artisthash: str): + """ + Returns the cached albums for the given artisthash. + """ + for (index, albums) in enumerate(cls.artists): + if albums.artisthash == artisthash: + return (albums.albums, index) + + return ([], -1) + + @classmethod + def albums_cached(cls, artisthash: str) -> bool: + """ + Returns True if the artist is in the cache. + """ + for entry in cls.artists: + if entry.artisthash == artisthash and len(entry.albums) > 0: + return True + + return False + + @classmethod + def albums_fetched(cls, artisthash: str): + """ + Checks if the albums have been fetched for the given artisthash. + """ + for entry in cls.artists: + if entry.artisthash == artisthash: + return entry.albums_fetched + + @classmethod + def tracks_cached(cls, artisthash: str) -> bool: + """ + Checks if the tracks have been cached for the given artisthash. + """ + for entry in cls.artists: + if entry.artisthash == artisthash and len(entry.tracks) > 0: + return True + + return False + + @classmethod + def add_entry(cls, artisthash: str, albumhashes: set[str], tracks: list[Track]): + """ + Adds a new entry to the cache. + """ + cls.artists.append(CacheEntry(artisthash, albumhashes, tracks)) + + @classmethod + def get_tracks(cls, artisthash: str): + """ + Returns the cached tracks for the given artisthash. + """ + entry = [a for a in cls.artists if a.artisthash == artisthash][0] + return entry.tracks + + @classmethod + def get_albums(cls, artisthash: str): + """ + Returns the cached albums for the given artisthash. + """ + entry = [a for a in cls.artists if a.artisthash == artisthash][0] + + albums = [Store.get_album_by_hash(h) for h in entry.albumhashes] + entry.albums = [album for album in albums if album is not None] + + store_albums = Store.get_albums_by_artisthash(artisthash) + + all_albums_hash = "-".join([a.albumhash for a in entry.albums]) + + for album in store_albums: + if album.albumhash not in all_albums_hash: + entry.albums.append(album) + + entry.albums_fetched = True + + @classmethod + def process_album_type(cls, artisthash: str): + """ + Checks the cached albums type for the given artisthash. + """ + entry = [a for a in cls.artists if a.artisthash == artisthash][0] + + for album in entry.albums: + album.check_type() + + album_tracks = Store.get_tracks_by_albumhash(album.albumhash) + album_tracks = remove_duplicates(album_tracks) + + album.check_is_single(album_tracks) + + entry.type_checked = True + + +def add_albums_to_cache(artisthash: str): + """ + Fetches albums and adds them to the cache. + """ + tracks = Store.get_tracks_by_artist(artisthash) + + if len(tracks) == 0: + return False + + albumhashes = set(t.albumhash for t in tracks) + ArtistsCache.add_entry(artisthash, albumhashes, []) + + return True + + +# ======================================================= +# ===================== ROUTES ========================== +# ======================================================= + + +@artistbp.route("/artist/", methods=["GET"]) +def get_artist(artisthash: str): + """ + Get artist data. + """ + limit = request.args.get("limit") + + if limit is None: + limit = 6 + + limit = int(limit) + + artist = Store.get_artist_by_hash(artisthash) + + if artist is None: + return {"error": "Artist not found"}, 404 + + tracks_cached = ArtistsCache.tracks_cached(artisthash) + + if tracks_cached: + tracks = ArtistsCache.get_tracks(artisthash) + else: + tracks = Store.get_tracks_by_artist(artisthash) + albumhashes = set(t.albumhash for t in tracks) + hashes_from_albums = set( + a.albumhash for a in Store.get_albums_by_artisthash(artisthash) + ) + + albumhashes = albumhashes.union(hashes_from_albums) + ArtistsCache.add_entry(artisthash, albumhashes, tracks) + + tcount = len(tracks) + acount = Store.count_albums_by_artisthash(artisthash) + + if acount == 0 and tcount < 10: + limit = tcount + + artist.trackcount = tcount + artist.albumcount = acount + + artist.duration = sum(t.duration for t in tracks) + + artist.is_favorite = favdb.check_is_favorite(artisthash, FavType.artist) + + return {"artist": artist, "tracks": tracks[:limit]} + + +@artistbp.route("/artist//albums", methods=["GET"]) +def get_artist_albums(artisthash: str): + limit = request.args.get("limit") + + if limit is None: + limit = 6 + + return_all = request.args.get("all") + + limit = int(limit) + + all_albums = [] + is_cached = ArtistsCache.albums_cached(artisthash) + + if not is_cached: + add_albums_to_cache(artisthash) + + albums_fetched = ArtistsCache.albums_fetched(artisthash) + + if not albums_fetched: + ArtistsCache.get_albums(artisthash) + + all_albums, index = ArtistsCache.get_albums_by_artisthash(artisthash) + + if not ArtistsCache.artists[index].type_checked: + ArtistsCache.process_album_type(artisthash) + + singles = [a for a in all_albums if a.is_single] + eps = [a for a in all_albums if a.is_EP] + + def remove_EPs_and_singles(albums: list[Album]): + albums = [a for a in albums if not a.is_EP] + albums = [a for a in albums if not a.is_single] + return albums + + albums = filter(lambda a: artisthash in a.albumartisthash, all_albums) + albums = list(albums) + albums = remove_EPs_and_singles(albums) + + appearances = filter(lambda a: artisthash not in a.albumartisthash, all_albums) + appearances = list(appearances) + + appearances = remove_EPs_and_singles(appearances) + + artist = Store.get_artist_by_hash(artisthash) + + if return_all is not None: + limit = len(all_albums) + + return { + "artistname": artist.name, + "albums": albums[:limit], + "singles": singles[:limit], + "eps": eps[:limit], + "appearances": appearances[:limit], + } + + +@artistbp.route("/artist//tracks", methods=["GET"]) +def get_artist_tracks(artisthash: str): + """ + Returns all artists by a given artist. + """ + tracks = Store.get_tracks_by_artist(artisthash) + + return {"tracks": tracks} + # artist = Store.get_artist_by_hash(artisthash) + # if artist is None: + # return {"error": "Artist not found"}, 404 + + # return {"albums": albums[:limit]} + + +# @artist_bp.route("/artist/") +# @cache.cached() +# def get_artist_data(artist: str): +# """Returns the artist's data, tracks and albums""" +# artist = urllib.parse.unquote(artist) +# artist_obj = instances.artist_instance.get_artists_by_name(artist) + +# def get_artist_tracks(): +# songs = instances.tracks_instance.find_songs_by_artist(artist) + +# return songs + +# artist_songs = get_artist_tracks() +# songs = utils.remove_duplicates(artist_songs) + +# def get_artist_albums(): +# artist_albums = [] +# albums_with_count = [] + +# albums = instances.tracks_instance.find_songs_by_albumartist(artist) + +# for song in albums: +# if song["album"] not in artist_albums: +# artist_albums.append(song["album"]) + +# for album in artist_albums: +# count = 0 +# length = 0 + +# for song in artist_songs: +# if song["album"] == album: +# count = count + 1 +# length = length + song["length"] + +# album_ = {"title": album, "count": count, "length": length} + +# albums_with_count.append(album_) + +# return albums_with_count + +# return { +# "artist": artist_obj, +# "songs": songs, +# "albums": get_artist_albums() +# } diff --git a/app/api/favorites.py b/app/api/favorites.py new file mode 100644 index 0000000..8ab7087 --- /dev/null +++ b/app/api/favorites.py @@ -0,0 +1,210 @@ +from flask import Blueprint, request +from app.db.sqlite.favorite import SQLiteFavoriteMethods as favdb +from app.db.store import Store +from app.models import FavType +from app.utils import UseBisection + +favbp = Blueprint("favorite", __name__, url_prefix="/") + + +def remove_none(items: list): + return [i for i in items if i is not None] + + +@favbp.route("/favorite/add", methods=["POST"]) +def add_favorite(): + """ + Adds a favorite to the database. + """ + data = request.get_json() + + if data is None: + return {"error": "No data provided"}, 400 + + itemhash = data.get("hash") + itemtype = data.get("type") + + favdb.insert_one_favorite(itemtype, itemhash) + + if itemtype == FavType.track: + Store.add_fav_track(itemhash) + + return {"msg": "Added to favorites"} + + +@favbp.route("/favorite/remove", methods=["POST"]) +def remove_favorite(): + """ + Removes a favorite from the database. + """ + data = request.get_json() + + if data is None: + return {"error": "No data provided"}, 400 + + itemhash = data.get("hash") + itemtype = data.get("type") + + favdb.delete_favorite(itemtype, itemhash) + + if itemtype == FavType.track: + Store.remove_fav_track(itemhash) + + return {"msg": "Removed from favorites"} + + +@favbp.route("/albums/favorite") +def get_favorite_albums(): + limit = request.args.get("limit") + + if limit is None: + limit = 6 + + limit = int(limit) + + albums = favdb.get_fav_albums() + albumhashes = [a[1] for a in albums] + albumhashes.reverse() + + src_albums = sorted(Store.albums, key=lambda x: x.albumhash) + + fav_albums = UseBisection(src_albums, "albumhash", albumhashes)() + fav_albums = remove_none(fav_albums) + + if limit == 0: + limit = len(albums) + + return {"albums": fav_albums[:limit]} + + +@favbp.route("/tracks/favorite") +def get_favorite_tracks(): + limit = request.args.get("limit") + + if limit is None: + limit = 6 + + limit = int(limit) + + tracks = favdb.get_fav_tracks() + trackhashes = [t[1] for t in tracks] + trackhashes.reverse() + src_tracks = sorted(Store.tracks, key=lambda x: x.trackhash) + + tracks = UseBisection(src_tracks, "trackhash", trackhashes)() + tracks = remove_none(tracks) + + if limit == 0: + limit = len(tracks) + + return {"tracks": tracks[:limit]} + + +@favbp.route("/artists/favorite") +def get_favorite_artists(): + limit = request.args.get("limit") + + if limit is None: + limit = 6 + + limit = int(limit) + + artists = favdb.get_fav_artists() + artisthashes = [a[1] for a in artists] + artisthashes.reverse() + + src_artists = sorted(Store.artists, key=lambda x: x.artisthash) + + artists = UseBisection(src_artists, "artisthash", artisthashes)() + artists = remove_none(artists) + + if limit == 0: + limit = len(artists) + + return {"artists": artists[:limit]} + + +@favbp.route("/favorites") +def get_all_favorites(): + """ + Returns all the favorites in the database. + """ + track_limit = request.args.get("track_limit") + album_limit = request.args.get("album_limit") + artist_limit = request.args.get("artist_limit") + + if track_limit is None: + track_limit = 6 + + if album_limit is None: + album_limit = 6 + + if artist_limit is None: + artist_limit = 6 + + track_limit = int(track_limit) + album_limit = int(album_limit) + artist_limit = int(artist_limit) + + favs = favdb.get_all() + favs.reverse() + + tracks = [] + albums = [] + artists = [] + + for fav in favs: + if ( + len(tracks) >= track_limit + and len(albums) >= album_limit + and len(artists) >= artist_limit + ): + break + + if fav[2] == FavType.track: + tracks.append(fav[1]) + elif fav[2] == FavType.album: + albums.append(fav[1]) + elif fav[2] == FavType.artist: + artists.append(fav[1]) + + src_tracks = sorted(Store.tracks, key=lambda x: x.trackhash) + src_albums = sorted(Store.albums, key=lambda x: x.albumhash) + src_artists = sorted(Store.artists, key=lambda x: x.artisthash) + + tracks = tracks[:track_limit] + albums = albums[:album_limit] + artists = artists[:artist_limit] + + tracks = UseBisection(src_tracks, "trackhash", tracks)() + albums = UseBisection(src_albums, "albumhash", albums)() + artists = UseBisection(src_artists, "artisthash", artists)() + + tracks = remove_none(tracks) + albums = remove_none(albums) + artists = remove_none(artists) + + return { + "tracks": tracks, + "albums": albums, + "artists": artists, + } + + +@favbp.route("/favorites/check") +def check_favorite(): + """ + Checks if a favorite exists in the database. + """ + itemhash = request.args.get("hash") + itemtype = request.args.get("type") + + if itemhash is None: + return {"error": "No hash provided"}, 400 + + if itemtype is None: + return {"error": "No type provided"}, 400 + + exists = favdb.check_is_favorite(itemhash, itemtype) + + return {"is_favorite": exists} diff --git a/app/api/folder.py b/app/api/folder.py new file mode 100644 index 0000000..88ac6cb --- /dev/null +++ b/app/api/folder.py @@ -0,0 +1,32 @@ +""" +Contains all the folder routes. +""" +from flask import Blueprint, request + +from app import settings +from app.lib.folderslib import GetFilesAndDirs + +folderbp = Blueprint("folder", __name__, url_prefix="/") + + +@folderbp.route("/folder", methods=["POST"]) +def get_folder_tree(): + """ + Returns a list of all the folders and tracks in the given folder. + """ + data = request.get_json() + + if data is not None: + req_dir: str = data["folder"] + else: + req_dir = settings.HOME_DIR + + if req_dir == "$home": + req_dir = settings.HOME_DIR + + tracks, folders = GetFilesAndDirs(req_dir)() + + return { + "tracks": tracks, + "folders": sorted(folders, key=lambda i: i.name), + } diff --git a/app/api/playlist.py b/app/api/playlist.py new file mode 100644 index 0000000..c24579b --- /dev/null +++ b/app/api/playlist.py @@ -0,0 +1,226 @@ +""" +All playlist-related routes. +""" +import json +from datetime import datetime + +from flask import Blueprint, request +from PIL import UnidentifiedImageError + +from app import models, serializer +from app.db.sqlite.playlists import SQLitePlaylistMethods +from app.db.store import Store +from app.lib import playlistlib +from app.utils import create_new_date, remove_duplicates + +playlistbp = Blueprint("playlist", __name__, url_prefix="/") + +PL = SQLitePlaylistMethods + +insert_one_playlist = PL.insert_one_playlist +get_playlist_by_name = PL.get_playlist_by_name +count_playlist_by_name = PL.count_playlist_by_name +get_all_playlists = PL.get_all_playlists +get_playlist_by_id = PL.get_playlist_by_id +tracks_to_playlist = PL.add_tracks_to_playlist +add_artist_to_playlist = PL.add_artist_to_playlist +update_playlist = PL.update_playlist +delete_playlist = PL.delete_playlist + +# get_tracks_by_trackhashes = SQLiteTrackMethods.get_tracks_by_trackhashes + + +@playlistbp.route("/playlists", methods=["GET"]) +def send_all_playlists(): + """ + Gets all the playlists. + """ + playlists = get_all_playlists() + playlists = list(playlists) + + playlists.sort( + key=lambda p: datetime.strptime(p.last_updated, "%Y-%m-%d %H:%M:%S"), + reverse=True, + ) + + return {"data": playlists} + + +@playlistbp.route("/playlist/new", methods=["POST"]) +def create_playlist(): + """ + Creates a new playlist. Accepts POST method with a JSON body. + """ + data = request.get_json() + + if data is None: + return {"error": "Playlist name not provided"}, 400 + + existing_playlist_count = count_playlist_by_name(data["name"]) + + if existing_playlist_count > 0: + return {"error": "Playlist already exists"}, 409 + + playlist = { + "artisthashes": json.dumps([]), + "banner_pos": 50, + "has_gif": 0, + "image": None, + "last_updated": create_new_date(), + "name": data["name"], + "trackhashes": json.dumps([]), + } + + playlist = insert_one_playlist(playlist) + + if playlist is None: + return {"error": "Playlist could not be created"}, 500 + + return {"playlist": playlist}, 201 + + +@playlistbp.route("/playlist//add", methods=["POST"]) +def add_track_to_playlist(playlist_id: str): + """ + Takes a playlist ID and a track hash, and adds the track to the playlist + """ + data = request.get_json() + + if data is None: + return {"error": "Track hash not provided"}, 400 + + trackhash = data["track"] + + insert_count = tracks_to_playlist(int(playlist_id), [trackhash]) + + if insert_count == 0: + return {"error": "Track already exists in playlist"}, 409 + + add_artist_to_playlist(int(playlist_id), trackhash) + + return {"msg": "Done"}, 200 + + +@playlistbp.route("/playlist/") +def get_playlist(playlistid: str): + """ + Gets a playlist by id, and if it exists, it gets all the tracks in the playlist and returns them. + """ + playlist = get_playlist_by_id(int(playlistid)) + + if playlist is None: + return {"msg": "Playlist not found"}, 404 + + tracks = Store.get_tracks_by_trackhashes(list(playlist.trackhashes)) + tracks = remove_duplicates(tracks) + + duration = sum(t.duration for t in tracks) + playlist.last_updated = serializer.date_string_to_time_passed(playlist.last_updated) + + playlist.duration = duration + + return {"info": playlist, "tracks": tracks} + + +@playlistbp.route("/playlist//update", methods=["PUT"]) +def update_playlist_info(playlistid: str): + if playlistid is None: + return {"error": "Playlist ID not provided"}, 400 + + db_playlist = get_playlist_by_id(int(playlistid)) + + if db_playlist is None: + return {"error": "Playlist not found"}, 404 + + image = None + + if "image" in request.files: + image = request.files["image"] + + data = request.form + + playlist = { + "id": int(playlistid), + "artisthashes": json.dumps([]), + "banner_pos": db_playlist.banner_pos, + "has_gif": 0, + "image": db_playlist.image, + "last_updated": create_new_date(), + "name": str(data.get("name")).strip(), + "trackhashes": json.dumps([]), + } + + if image: + try: + playlist["image"] = playlistlib.save_p_image(image, playlistid) + + if image.content_type == "image/gif": + playlist["has_gif"] = 1 + + # reset banner position to center. + playlist["banner_pos"] = 50 + PL.update_banner_pos(int(playlistid), 50) + + except UnidentifiedImageError: + return {"error": "Failed: Invalid image"}, 400 + + p_tuple = (*playlist.values(),) + print("banner pos:", playlist["banner_pos"]) + + update_playlist(int(playlistid), playlist) + + playlist = models.Playlist(*p_tuple) + playlist.last_updated = serializer.date_string_to_time_passed(playlist.last_updated) + + return { + "data": playlist, + } + + +# @playlist_bp.route("/playlist/artists", methods=["POST"]) +# def get_playlist_artists(): +# data = request.get_json() + +# pid = data["pid"] +# artists = playlistlib.GetPlaylistArtists(pid)() + +# return {"data": artists} + + +@playlistbp.route("/playlist/delete", methods=["POST"]) +def remove_playlist(): + """ + Deletes a playlist by ID. + """ + message = {"error": "Playlist ID not provided"} + data = request.get_json() + + if data is None: + return message, 400 + + try: + pid = data["pid"] + except KeyError: + return message, 400 + + delete_playlist(pid) + + return {"msg": "Done"}, 200 + + +@playlistbp.route("/playlist//set-image-pos", methods=["POST"]) +def update_image_position(pid: int): + data = request.get_json() + message = {"msg": "No data provided"} + + if data is None: + return message, 400 + + try: + pos = data["pos"] + except KeyError: + return message, 400 + + PL.update_banner_pos(pid, pos) + + return {"msg": "Image position saved"}, 200 diff --git a/app/api/search.py b/app/api/search.py new file mode 100644 index 0000000..92463d1 --- /dev/null +++ b/app/api/search.py @@ -0,0 +1,218 @@ +""" +Contains all the search routes. +""" + +from flask import Blueprint, request + +from app import models, utils +from app.db.store import Store +from app.lib import searchlib + +searchbp = Blueprint("search", __name__, url_prefix="/") + + +SEARCH_COUNT = 12 +"""The max amount of items to return per request""" + + +class SearchResults: + """ + Holds all the search results. + """ + + query: str = "" + tracks: list[models.Track] = [] + albums: list[models.Album] = [] + playlists: list[models.Playlist] = [] + artists: list[models.Artist] = [] + + +class DoSearch: + """Class containing the methods that perform searching.""" + + def __init__(self, query: str) -> None: + """ + :param :str:`query`: the search query. + """ + self.tracks: list[models.Track] = [] + self.query = query + SearchResults.query = query + + def search_tracks(self): + """Calls :class:`SearchTracks` which returns the tracks that fuzzily match + the search terms. Then adds them to the `SearchResults` store. + """ + self.tracks = Store.tracks + tracks = searchlib.SearchTracks(self.tracks, self.query)() + + if len(tracks) == 0: + return [] + + tracks = utils.remove_duplicates(tracks) + SearchResults.tracks = tracks + + return tracks + + def search_artists(self): + """Calls :class:`SearchArtists` which returns the artists that fuzzily match + the search term. Then adds them to the `SearchResults` store. + """ + # self.artists = utils.Get.get_all_artists() + artists = [a.name for a in Store.artists] + artists = searchlib.SearchArtists(artists, self.query)() + SearchResults.artists = artists + + return artists + + def search_albums(self): + """Calls :class:`SearchAlbums` which returns the albums that fuzzily match + the search term. Then adds them to the `SearchResults` store. + """ + # albums = utils.Get.get_all_albums() + albums = Store.albums + albums = searchlib.SearchAlbums(albums, self.query)() + SearchResults.albums = albums + + return albums + + # def search_playlists(self): + # """Calls :class:`SearchPlaylists` which returns the playlists that fuzzily match + # the search term. Then adds them to the `SearchResults` store. + # """ + # playlists = utils.Get.get_all_playlists() + # playlists = [serializer.Playlist(playlist) for playlist in playlists] + + # playlists = searchlib.SearchPlaylists(playlists, self.query)() + # SearchResults.playlists = playlists + + # return playlists + + def search_all(self): + """Calls all the search methods.""" + self.search_tracks() + self.search_albums() + self.search_artists() + # self.search_playlists() + + +@searchbp.route("/search/tracks", methods=["GET"]) +def search_tracks(): + """ + Searches for tracks that match the search query. + """ + + query = request.args.get("q") + if not query: + return {"error": "No query provided"}, 400 + + tracks = DoSearch(query).search_tracks() + + return { + "tracks": tracks[:SEARCH_COUNT], + "more": len(tracks) > SEARCH_COUNT, + } + + +@searchbp.route("/search/albums", methods=["GET"]) +def search_albums(): + """ + Searches for albums. + """ + + query = request.args.get("q") + if not query: + return {"error": "No query provided"}, 400 + + tracks = DoSearch(query).search_albums() + + return { + "albums": tracks[:SEARCH_COUNT], + "more": len(tracks) > SEARCH_COUNT, + } + + +@searchbp.route("/search/artists", methods=["GET"]) +def search_artists(): + """ + Searches for artists. + """ + + query = request.args.get("q") + if not query: + return {"error": "No query provided"}, 400 + + artists = DoSearch(query).search_artists() + + return { + "artists": artists[:SEARCH_COUNT], + "more": len(artists) > SEARCH_COUNT, + } + + +# @searchbp.route("/search/playlists", methods=["GET"]) +# def search_playlists(): +# """ +# Searches for playlists. +# """ + +# query = request.args.get("q") +# if not query: +# return {"error": "No query provided"}, 400 + +# playlists = DoSearch(query).search_playlists() + +# return { +# "playlists": playlists[:SEARCH_COUNT], +# "more": len(playlists) > SEARCH_COUNT, +# } + + +@searchbp.route("/search/top", methods=["GET"]) +def get_top_results(): + """ + Returns the top results for the search query. + """ + + query = request.args.get("q") + if not query: + return {"error": "No query provided"}, 400 + + DoSearch(query).search_all() + + max = 2 + return { + "tracks": SearchResults.tracks[:max], + "albums": SearchResults.albums[:max], + "artists": SearchResults.artists[:max], + "playlists": SearchResults.playlists[:max], + } + + +@searchbp.route("/search/loadmore") +def search_load_more(): + """ + Returns more songs, albums or artists from a search query. + """ + s_type = request.args.get("type") + index = int(request.args.get("index") or 0) + + if s_type == "tracks": + t = SearchResults.tracks + return { + "tracks": t[index : index + SEARCH_COUNT], + "more": len(t) > index + SEARCH_COUNT, + } + + elif s_type == "albums": + a = SearchResults.albums + return { + "albums": a[index : index + SEARCH_COUNT], + "more": len(a) > index + SEARCH_COUNT, + } + + elif s_type == "artists": + a = SearchResults.artists + return { + "artists": a[index : index + SEARCH_COUNT], + "more": len(a) > index + SEARCH_COUNT, + } diff --git a/app/api/track.py b/app/api/track.py new file mode 100644 index 0000000..9262cfe --- /dev/null +++ b/app/api/track.py @@ -0,0 +1,33 @@ +""" +Contains all the track routes. +""" +from flask import Blueprint, send_file +from app.db.store import Store + +trackbp = Blueprint("track", __name__, url_prefix="/") + + +@trackbp.route("/file/") +def send_track_file(trackhash: str): + """ + Returns an audio file that matches the passed id to the client. + Falls back to track hash if id is not found. + """ + msg = {"msg": "File Not Found"} + if trackhash is None: + return msg, 404 + + try: + track = Store.get_tracks_by_trackhashes([trackhash])[0] + except IndexError: + track = None + + if track is None: + return msg, 404 + + audio_type = track.filepath.rsplit(".", maxsplit=1)[-1] + + try: + return send_file(track.filepath, mimetype=f"audio/{audio_type}") + except FileNotFoundError: + return msg, 404 diff --git a/app/db/__init__.py b/app/db/__init__.py new file mode 100644 index 0000000..e6216ae --- /dev/null +++ b/app/db/__init__.py @@ -0,0 +1,214 @@ +class AlbumMethods: + """ + Lists all the methods that can be found in the Albums class. + """ + + def insert_album(): + """ + Inserts a new album object into the database. + """ + pass + + def get_all_albums(): + """ + Returns all the albums in the database. + """ + pass + + def get_album_by_id(): + """ + Returns a single album matching the passed id. + """ + pass + + def get_album_by_name(): + """ + Returns a single album matching the passed name. + """ + pass + + def get_album_by_artist(): + """ + Returns a single album matching the passed artist name. + """ + pass + + +class ArtistMethods: + """ + Lists all the methods that can be found in the Artists class. + """ + + def insert_artist(): + """ + Inserts a new artist object into the database. + """ + pass + + def get_all_artists(): + """ + Returns all the artists in the database. + """ + pass + + def get_artist_by_id(): + """ + Returns an artist matching the mongo Id. + """ + pass + + def get_artists_by_name(): + """ + Returns all the artists matching the query. + """ + pass + + +class PlaylistMethods: + """ + Lists all the methods that can be found in the Playlists class. + """ + + def insert_playlist(): + """ + Inserts a new playlist object into the database. + """ + pass + + def get_all_playlists(): + """ + Returns all the playlists in the database. + """ + pass + + def get_playlist_by_id(): + """ + Returns a single playlist matching the id in the query params. + """ + pass + + def add_track_to_playlist(): + """ + Adds a track to a playlist. + """ + pass + + def get_playlist_by_name(): + """ + Returns a single playlist matching the name in the query params. + """ + pass + + def update_playlist(): + """ + Updates a playlist. + """ + pass + + +class TrackMethods: + """ + Lists all the methods that can be found in the Tracks class. + """ + + def insert_one_track(): + """ + Inserts a new track object into the database. + """ + pass + + def drop_db(): + """ + Drops the entire database. + """ + pass + + def get_all_tracks(): + """ + Returns all the tracks in the database. + """ + pass + + def get_track_by_id(): + """ + Returns a single track matching the id in the query params. + """ + pass + + def get_track_by_album(): + """ + Returns a single track matching the album in the query params. + """ + pass + + def search_tracks_by_album(): + """ + Returns all the tracks matching the albums in the query params (using regex). + """ + pass + + def search_tracks_by_artist(): + """ + Returns all the tracks matching the artists in the query params. + """ + pass + + def find_track_by_title(): + """ + Finds all the tracks matching the title in the query params. + """ + pass + + def find_tracks_by_album(): + """ + Finds all the tracks matching the album in the query params. + """ + pass + + def find_tracks_by_folder(): + """ + Finds all the tracks matching the folder in the query params. + """ + pass + + def find_tracks_by_artist(): + """ + Finds all the tracks matching the artist in the query params. + """ + pass + + def find_tracks_by_albumartist(): + """ + Finds all the tracks matching the album artist in the query params. + """ + pass + + def get_track_by_path(): + """ + Returns a single track matching the path in the query params. + """ + pass + + def remove_track_by_path(): + """ + Removes a track from the database. Returns a boolean indicating success or failure of the operation. + """ + pass + + def remove_track_by_id(): + """ + Removes a track from the database. Returns a boolean indicating success or failure of the operation. + """ + pass + + def find_tracks_by_albumhash(): + """ + Returns all the tracks matching the passed hash. + """ + pass + + def get_dir_t_count(): + """ + Returns a list of all the tracks matching the path in the query params. + """ + pass diff --git a/app/db/sqlite/__init__.py b/app/db/sqlite/__init__.py new file mode 100644 index 0000000..96f374a --- /dev/null +++ b/app/db/sqlite/__init__.py @@ -0,0 +1,47 @@ +""" +This module contains the functions to interact with the SQLite database. +""" + +import sqlite3 +from pathlib import Path +from sqlite3 import Connection as SqlConn + +from app.settings import APP_DB_PATH + + +def create_connection(db_file: str) -> SqlConn: + """ + Creates a connection to the specified database. + """ + conn = sqlite3.connect(db_file) + return conn + + +def get_sqlite_conn(): + """ + It opens a connection to the database + :return: A connection to the database. + """ + return create_connection(APP_DB_PATH) + + +def create_tables(conn: SqlConn, sql_query: str): + """ + Executes the specifiend SQL file to create database tables. + """ + # with open(sql_query, "r", encoding="utf-8") as sql_file: + conn.executescript(sql_query) + + +def setup_search_db(): + """ + Creates the search database. + """ + db = sqlite3.connect(":memory:") + sql_file = "queries/fts5.sql" + + current_path = Path(__file__).parent.resolve() + sql_path = current_path.joinpath(sql_file) + + with open(sql_path, "r", encoding="utf-8") as sql_file: + db.executescript(sql_file.read()) diff --git a/app/db/sqlite/albums.py b/app/db/sqlite/albums.py new file mode 100644 index 0000000..c016bba --- /dev/null +++ b/app/db/sqlite/albums.py @@ -0,0 +1,125 @@ +from sqlite3 import Cursor + +from app.db import AlbumMethods + +from .utils import SQLiteManager, tuple_to_album, tuples_to_albums + + +class SQLiteAlbumMethods(AlbumMethods): + @classmethod + def insert_one_album(cls, cur: Cursor, albumhash: str, colors: str): + """ + Inserts one album into the database + """ + + sql = """INSERT INTO albums( + albumhash, + colors + ) VALUES(?,?) + """ + + cur.execute(sql, (albumhash, colors)) + + return cur.lastrowid + + # @classmethod + # def insert_many_albums(cls, albums: list[dict]): + # """ + # Takes a generator of albums, and inserts them into the database + + # Parameters + # ---------- + # albums : Generator + # Generator + # """ + # with SQLiteManager() as cur: + # for album in albums: + # cls.insert_one_album(cur, album["albumhash"], album["colors"]) + + @classmethod + def get_all_albums(cls): + with SQLiteManager() as cur: + cur.execute("SELECT * FROM albums") + albums = cur.fetchall() + + if albums is not None: + return albums + + return [] + + # @staticmethod + # def get_album_by_id(album_id: int): + # conn = get_sqlite_conn() + # cur = conn.cursor() + + # cur.execute("SELECT * FROM albums WHERE id=?", (album_id,)) + # album = cur.fetchone() + + # conn.close() + + # if album is None: + # return None + + # return tuple_to_album(album) + + @staticmethod + def get_album_by_hash(album_hash: str): + with SQLiteManager() as cur: + cur.execute("SELECT * FROM albums WHERE albumhash=?", (album_hash,)) + album = cur.fetchone() + + if album is not None: + return tuple_to_album(album) + + return None + + @classmethod + def get_albums_by_hashes(cls, album_hashes: list): + """ + Gets all the albums with the specified hashes. Returns a generator of albums or an empty list. + """ + with SQLiteManager() as cur: + hashes = ",".join("?" * len(album_hashes)) + cur.execute( + f"SELECT * FROM albums WHERE albumhash IN ({hashes})", album_hashes + ) + albums = cur.fetchall() + + if albums is not None: + return tuples_to_albums(albums) + + return [] + + # @staticmethod + # def update_album_colors(album_hash: str, colors: list[str]): + # sql = "UPDATE albums SET colors=? WHERE albumhash=?" + + # colors_str = json.dumps(colors) + + # with SQLiteManager() as cur: + # cur.execute(sql, (colors_str, album_hash)) + + @staticmethod + def get_albums_by_albumartist(albumartist: str): + with SQLiteManager() as cur: + cur.execute("SELECT * FROM albums WHERE albumartist=?", (albumartist,)) + albums = cur.fetchall() + + if albums is not None: + return tuples_to_albums(albums) + + return [] + + @staticmethod + def get_all_albums_raw(): + """ + Returns all the albums in the database, as a list of tuples. + """ + with SQLiteManager() as cur: + cur.execute("SELECT * FROM albums") + albums = cur.fetchall() + + if albums is not None: + return albums + + return [] diff --git a/app/db/sqlite/artists.py b/app/db/sqlite/artists.py new file mode 100644 index 0000000..822bb75 --- /dev/null +++ b/app/db/sqlite/artists.py @@ -0,0 +1,36 @@ +""" +Contains methods for reading and writing to the sqlite artists database. +""" + +import json +from .utils import SQLiteManager + + +class SQLiteArtistMethods: + @classmethod + def insert_one_artist(cls, artisthash: str, colors: str | list[str]): + """ + Inserts a single artist into the database. + """ + sql = """INSERT INTO artists( + artisthash, + colors + ) VALUES(?,?) + """ + colors = json.dumps(colors) + + with SQLiteManager() as cur: + cur.execute(sql, (artisthash, colors)) + + @classmethod + def get_all_artists(cls): + """ + Get all artists from the database and return a generator of Artist objects + """ + sql = """SELECT * FROM artists""" + + with SQLiteManager() as cur: + cur.execute(sql) + + for artist in cur.fetchall(): + yield artist diff --git a/app/db/sqlite/favorite.py b/app/db/sqlite/favorite.py new file mode 100644 index 0000000..4db97b9 --- /dev/null +++ b/app/db/sqlite/favorite.py @@ -0,0 +1,77 @@ +from app.models import FavType +from .utils import SQLiteManager + + +class SQLiteFavoriteMethods: + """THis class contains methods for interacting with the favorites table.""" + + @classmethod + def insert_one_favorite(cls, fav_type: str, fav_hash: str): + """ + Inserts a single favorite into the database. + """ + sql = """INSERT INTO favorites(type, hash) VALUES(?,?)""" + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (fav_type, fav_hash)) + + @classmethod + def get_all(cls) -> list[tuple]: + """ + Returns a list of all favorites. + """ + sql = """SELECT * FROM favorites""" + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql) + return cur.fetchall() + + @classmethod + def get_favorites(cls, fav_type: str) -> list[tuple]: + """ + Returns a list of favorite tracks. + """ + sql = """SELECT * FROM favorites WHERE type = ?""" + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (fav_type,)) + return cur.fetchall() + + @classmethod + def get_fav_tracks(cls) -> list[tuple]: + """ + Returns a list of favorite tracks. + """ + return cls.get_favorites(FavType.track) + + @classmethod + def get_fav_albums(cls) -> list[tuple]: + """ + Returns a list of favorite albums. + """ + return cls.get_favorites(FavType.album) + + @classmethod + def get_fav_artists(cls) -> list[tuple]: + """ + Returns a list of favorite artists. + """ + return cls.get_favorites(FavType.artist) + + @classmethod + def delete_favorite(cls, fav_type: str, fav_hash: str): + """ + Deletes a favorite from the database. + """ + sql = """DELETE FROM favorites WHERE hash = ? AND type = ?""" + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (fav_hash, fav_type)) + + @classmethod + def check_is_favorite(cls, itemhash: str, fav_type: str): + """ + Checks if an item is favorited. + """ + sql = """SELECT * FROM favorites WHERE hash = ? AND type = ?""" + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (itemhash, fav_type)) + items = cur.fetchall() + return len(items) > 0 diff --git a/app/db/sqlite/playlists.py b/app/db/sqlite/playlists.py new file mode 100644 index 0000000..9abe515 --- /dev/null +++ b/app/db/sqlite/playlists.py @@ -0,0 +1,179 @@ +import json +from collections import OrderedDict + +from app.db.sqlite.tracks import SQLiteTrackMethods +from app.db.sqlite.utils import SQLiteManager, tuple_to_playlist, tuples_to_playlists +from app.models import Artist +from app.utils import background + + +class SQLitePlaylistMethods: + """ + This class contains methods for interacting with the playlists table. + """ + + @staticmethod + def insert_one_playlist(playlist: dict): + sql = """INSERT INTO playlists( + artisthashes, + banner_pos, + has_gif, + image, + last_updated, + name, + trackhashes + ) VALUES(?,?,?,?,?,?,?) + """ + + playlist = OrderedDict(sorted(playlist.items())) + params = (*playlist.values(),) + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, params) + pid = cur.lastrowid + params = (pid, *params) + + return tuple_to_playlist(params) + + @staticmethod + def get_playlist_by_name(name: str): + sql = "SELECT * FROM playlists WHERE name = ?" + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (name,)) + + data = cur.fetchone() + + if data is not None: + return tuple_to_playlist(data) + + return None + + @staticmethod + def count_playlist_by_name(name: str): + sql = "SELECT COUNT(*) FROM playlists WHERE name = ?" + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (name,)) + + data = cur.fetchone() + + return int(data[0]) + + @staticmethod + def get_all_playlists(): + with SQLiteManager(userdata_db=True) as cur: + cur.execute("SELECT * FROM playlists") + playlists = cur.fetchall() + + if playlists is not None: + return tuples_to_playlists(playlists) + + return [] + + @staticmethod + def get_playlist_by_id(playlist_id: int): + sql = "SELECT * FROM playlists WHERE id = ?" + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (playlist_id,)) + + data = cur.fetchone() + + if data is not None: + return tuple_to_playlist(data) + + return None + + # FIXME: Extract the "add_track_to_playlist" method to use it for both the artisthash and trackhash lists. + + @staticmethod + def add_item_to_json_list(playlist_id: int, field: str, items: list[str]): + """ + Adds a string item to a json dumped list using a playlist id and field name. Takes the playlist ID, a field name, an item to add to the field, and an error to raise if the item is already in the field. + + Parameters + ---------- + playlist_id : int + The ID of the playlist to add the item to. + field : str + The field in the database that you want to add the item to. + item : str + The item to add to the list. + error : Exception + The error to raise if the item is already in the list. + + Returns + ------- + A list of strings. + + """ + sql = f"SELECT {field} FROM playlists WHERE id = ?" + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (playlist_id,)) + data = cur.fetchone() + + if data is not None: + db_items: list[str] = json.loads(data[0]) + + for item in items: + if item in db_items: + items.remove(item) + + db_items.extend(items) + + sql = f"UPDATE playlists SET {field} = ? WHERE id = ?" + cur.execute(sql, (json.dumps(db_items), playlist_id)) + return len(items) + + @classmethod + def add_tracks_to_playlist(cls, playlist_id: int, trackhashes: list[str]): + return cls.add_item_to_json_list(playlist_id, "trackhashes", trackhashes) + + @classmethod + @background + def add_artist_to_playlist(cls, playlist_id: int, trackhash: str): + track = SQLiteTrackMethods.get_track_by_trackhash(trackhash) + if track is None: + return + + artists: list[Artist] = track.artist # type: ignore + artisthashes = [a.artisthash for a in artists] + + cls.add_item_to_json_list(playlist_id, "artisthashes", artisthashes) + + @staticmethod + def update_playlist(playlist_id: int, playlist: dict): + sql = """UPDATE playlists SET + has_gif = ?, + image = ?, + last_updated = ?, + name = ? + WHERE id = ? + """ + + del playlist["id"] + del playlist["trackhashes"] + del playlist["artisthashes"] + del playlist['banner_pos'] + + playlist = OrderedDict(sorted(playlist.items())) + params = (*playlist.values(), playlist_id) + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, params) + + @staticmethod + def delete_playlist(pid: str): + sql = "DELETE FROM playlists WHERE id = ?" + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (pid,)) + + @staticmethod + def update_banner_pos(playlistid: int, pos: int): + sql = """UPDATE playlists SET banner_pos = ? WHERE id = ?""" + + with SQLiteManager(userdata_db=True) as cur: + cur.execute(sql, (pos, playlistid)) diff --git a/app/db/sqlite/queries.py b/app/db/sqlite/queries.py new file mode 100644 index 0000000..003784a --- /dev/null +++ b/app/db/sqlite/queries.py @@ -0,0 +1,65 @@ +""" +This file contains the SQL queries to create the database tables. +""" + + +CREATE_USERDATA_TABLES = """ +CREATE TABLE IF NOT EXISTS playlists ( + id integer PRIMARY KEY, + artisthashes text, + banner_pos integer NOT NULL, + has_gif integer, + image text, + last_updated text not null, + name text not null, + trackhashes text +); + +CREATE TABLE IF NOT EXISTS favorites ( + id integer PRIMARY KEY, + hash text not null, + type text not null +); +""" + +CREATE_APPDB_TABLES = """ +CREATE TABLE IF NOT EXISTS tracks ( + id integer PRIMARY KEY, + album text NOT NULL, + albumartist text NOT NULL, + albumhash text NOT NULL, + artist text NOT NULL, + bitrate integer NOT NULL, + copyright text, + date text NOT NULL, + disc integer NOT NULL, + duration integer NOT NULL, + filepath text NOT NULL, + folder text NOT NULL, + genre text, + title text NOT NULL, + track integer NOT NULL, + trackhash text NOT NULL +); + +CREATE TABLE IF NOT EXISTS albums ( + id integer PRIMARY KEY, + albumhash text NOT NULL, + colors text NOT NULL +); + + + +CREATE TABLE IF NOT EXISTS artists ( + id integer PRIMARY KEY, + artisthash text NOT NULL, + colors text, + bio text +); + +CREATE TABLE IF NOT EXISTS folders ( + id integer PRIMARY KEY, + path text NOT NULL, + trackcount integer NOT NULL +); +""" diff --git a/app/db/sqlite/tracks.py b/app/db/sqlite/tracks.py new file mode 100644 index 0000000..d83961c --- /dev/null +++ b/app/db/sqlite/tracks.py @@ -0,0 +1,142 @@ +""" +Contains the SQLiteTrackMethods class which contains methods for +interacting with the tracks table. +""" + + +from sqlite3 import Cursor + +from app.db.sqlite.utils import tuple_to_track, tuples_to_tracks + +from .utils import SQLiteManager + + +class SQLiteTrackMethods: + """ + This class contains all methods for interacting with the tracks table. + """ + + @classmethod + def insert_one_track(cls, track: dict, cur: Cursor): + """ + Inserts a single track into the database. + """ + sql = """INSERT INTO tracks( + album, + albumartist, + albumhash, + artist, + bitrate, + copyright, + date, + disc, + duration, + filepath, + folder, + genre, + title, + track, + trackhash + ) VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) + """ + + cur.execute( + sql, + ( + track["album"], + track["albumartist"], + track["albumhash"], + track["artist"], + track["bitrate"], + track["copyright"], + track["date"], + track["disc"], + track["duration"], + track["filepath"], + track["folder"], + track["genre"], + track["title"], + track["track"], + track["trackhash"], + ), + ) + + @classmethod + def insert_many_tracks(cls, tracks: list[dict]): + """ + Inserts a list of tracks into the database. + """ + with SQLiteManager() as cur: + for track in tracks: + cls.insert_one_track(track, cur) + + @staticmethod + def get_all_tracks(): + """ + Get all tracks from the database and return a generator of Track objects + or an empty list. + """ + with SQLiteManager() as cur: + cur.execute("SELECT * FROM tracks") + rows = cur.fetchall() + + if rows is not None: + return tuples_to_tracks(rows) + + return [] + + @staticmethod + def get_track_by_trackhash(trackhash: str): + """ + Gets a track using its trackhash. Returns a Track object or None. + """ + with SQLiteManager() as cur: + cur.execute("SELECT * FROM tracks WHERE trackhash=?", (trackhash,)) + row = cur.fetchone() + + if row is not None: + return tuple_to_track(row) + + return None + + @staticmethod + def get_tracks_by_trackhashes(hashes: list[str]): + """ + Gets all tracks in a list of trackhashes. + Returns a generator of Track objects or an empty list. + """ + + sql = "SELECT * FROM tracks WHERE trackhash IN ({})".format( + ",".join("?" * len(hashes)) + ) + + with SQLiteManager() as cur: + cur.execute(sql, hashes) + rows = cur.fetchall() + + if rows is not None: + return tuples_to_tracks(rows) + + return [] + + @staticmethod + def remove_track_by_filepath(filepath: str): + """ + Removes a track from the database using its filepath. + """ + with SQLiteManager() as cur: + cur.execute("DELETE FROM tracks WHERE filepath=?", (filepath,)) + + @staticmethod + def track_exists(filepath: str): + """ + Checks if a track exists in the database using its filepath. + """ + with SQLiteManager() as cur: + cur.execute("SELECT * FROM tracks WHERE filepath=?", (filepath,)) + row = cur.fetchone() + + if row is not None: + return True + + return False diff --git a/app/db/sqlite/utils.py b/app/db/sqlite/utils.py new file mode 100644 index 0000000..6e51120 --- /dev/null +++ b/app/db/sqlite/utils.py @@ -0,0 +1,93 @@ +""" +Helper functions for use with the SQLite database. +""" + +import sqlite3 +from sqlite3 import Connection, Cursor + +from app.models import Album, Playlist, Track +from app.settings import APP_DB_PATH, USERDATA_DB_PATH + + +def tuple_to_track(track: tuple): + """ + Takes a tuple and returns a Track object + """ + return Track(*track[1:]) # rowid is removed from the tuple + + +def tuples_to_tracks(tracks: list[tuple]): + """ + Takes a list of tuples and returns a generator that yields a Track object for each tuple + """ + for track in tracks: + yield tuple_to_track(track) + + +def tuple_to_album(album: tuple): + """ + Takes a tuple and returns an Album object + """ + return Album(*album[1:]) # rowid is removed from the tuple + + +def tuples_to_albums(albums: list[tuple]): + """ + Takes a list of tuples and returns a generator that yields an album object for each tuple + """ + for album in albums: + yield tuple_to_album(album) + + +def tuple_to_playlist(playlist: tuple): + """ + Takes a tuple and returns a Playlist object + """ + return Playlist(*playlist) + + +def tuples_to_playlists(playlists: list[tuple]): + """ + Takes a list of tuples and returns a list of Playlist objects + """ + for playlist in playlists: + yield tuple_to_playlist(playlist) + + +class SQLiteManager: + """ + This is a context manager that handles the connection and cursor + for you. It also commits and closes the connection when you're done. + """ + + def __init__(self, conn: Connection | None = None, userdata_db=False) -> None: + """ + When a connection is passed in, don't close the connection, because it's + a connection to the search database [in memory db]. + """ + self.conn: Connection | None = conn + self.CLOSE_CONN = True + self.userdata_db = userdata_db + + if conn: + self.conn = conn + self.CLOSE_CONN = False + + def __enter__(self) -> Cursor: + if self.conn is not None: + return self.conn.cursor() + + db_path = APP_DB_PATH + + if self.userdata_db: + db_path = USERDATA_DB_PATH + + self.conn = sqlite3.connect(db_path) + return self.conn.cursor() + + def __exit__(self, exc_type, exc_value, exc_traceback): + if self.conn: + self.conn.commit() + + if self.CLOSE_CONN: + self.conn.close() diff --git a/app/db/store.py b/app/db/store.py new file mode 100644 index 0000000..13d7ea0 --- /dev/null +++ b/app/db/store.py @@ -0,0 +1,459 @@ +""" +In memory store. +""" +import json +import random +from pathlib import Path + +from tqdm import tqdm + +from app.db.sqlite.albums import SQLiteAlbumMethods as aldb +from app.db.sqlite.artists import SQLiteArtistMethods as ardb +from app.db.sqlite.favorite import SQLiteFavoriteMethods as favdb +from app.db.sqlite.tracks import SQLiteTrackMethods as tdb +from app.models import Album, Artist, Folder, Track +from app.utils import ( + UseBisection, + create_folder_hash, + get_all_artists, + remove_duplicates, +) + + +class Store: + """ + This class holds all tracks in memory and provides methods for + interacting with them. + """ + + tracks: list[Track] = [] + folders: list[Folder] = [] + albums: list[Album] = [] + artists: list[Artist] = [] + + @classmethod + def load_all_tracks(cls): + """ + Loads all tracks from the database into the store. + """ + + cls.tracks = list(tdb.get_all_tracks()) + + fav_hashes = favdb.get_fav_tracks() + fav_hashes = [t[1] for t in fav_hashes] + + for track in tqdm(cls.tracks, desc="Loading tracks"): + if track.trackhash in fav_hashes: + track.is_favorite = True + + @classmethod + def add_track(cls, track: Track): + """ + Adds a single track to the store. + """ + + cls.tracks.append(track) + + @classmethod + def add_tracks(cls, tracks: list[Track]): + """ + Adds multiple tracks to the store. + """ + + cls.tracks.extend(tracks) + + @classmethod + def get_tracks_by_trackhashes(cls, trackhashes: list[str]) -> list[Track]: + """ + Returns a list of tracks by their hashes. + """ + + tracks = [] + + for trackhash in trackhashes: + for track in cls.tracks: + if track.trackhash == trackhash: + tracks.append(track) + + return tracks + + @classmethod + def remove_track_by_filepath(cls, filepath: str): + """ + Removes a track from the store by its filepath. + """ + + for track in cls.tracks: + if track.filepath == filepath: + cls.tracks.remove(track) + break + + @classmethod + def count_tracks_by_hash(cls, trackhash: str) -> int: + """ + Counts the number of tracks with a specific hash. + """ + + count = 0 + + for track in cls.tracks: + if track.trackhash == trackhash: + count += 1 + + return count + + # ==================================================== + # =================== FAVORITES ====================== + # ==================================================== + + @classmethod + def add_fav_track(cls, trackhash: str): + """ + Adds a track to the favorites. + """ + + for track in cls.tracks: + if track.trackhash == trackhash: + track.is_favorite = True + + @classmethod + def remove_fav_track(cls, trackhash: str): + """ + Removes a track from the favorites. + """ + + for track in cls.tracks: + if track.trackhash == trackhash: + track.is_favorite = False + + # ==================================================== + # ==================== FOLDERS ======================= + # ==================================================== + + @classmethod + def check_has_tracks(cls, path: str): # type: ignore + """ + Checks if a folder has tracks. + """ + path_hashes = "".join(f.path_hash for f in cls.folders) + path_hash = create_folder_hash(*Path(path).parts[1:]) + + return path_hash in path_hashes + + @classmethod + def is_empty_folder(cls, path: str): + """ + Checks if a folder has tracks using tracks in the store. + """ + + all_folders = set(track.folder for track in cls.tracks) + folder_hashes = "".join( + create_folder_hash(*Path(f).parts[1:]) for f in all_folders + ) + + path_hash = create_folder_hash(*Path(path).parts[1:]) + return path_hash in folder_hashes + + @staticmethod + def create_folder(path: str) -> Folder: + """ + Creates a folder object from a path. + """ + folder = Path(path) + + return Folder( + name=folder.name, + path=str(folder), + is_sym=folder.is_symlink(), + has_tracks=True, + path_hash=create_folder_hash(*folder.parts[1:]), + ) + + @classmethod + def add_folder(cls, path: str): + """ + Adds a folder to the store. + """ + + if cls.check_has_tracks(path): + return + + folder = cls.create_folder(path) + cls.folders.append(folder) + + @classmethod + def remove_folder(cls, path: str): + """ + Removes a folder from the store. + """ + + for folder in cls.folders: + if folder.path == path: + cls.folders.remove(folder) + break + + @classmethod + def process_folders(cls): + """ + Creates a list of folders from the tracks in the store. + """ + all_folders = [track.folder for track in cls.tracks] + all_folders = set(all_folders) + + all_folders = [ + folder for folder in all_folders if not cls.check_has_tracks(folder) + ] + + all_folders = [Path(f) for f in all_folders] + all_folders = [f for f in all_folders if f.exists()] + + for path in tqdm(all_folders, desc="Processing folders"): + folder = cls.create_folder(str(path)) + + cls.folders.append(folder) + + @classmethod + def get_folder(cls, path: str): # type: ignore + """ + Returns a folder object by its path. + """ + folders = sorted(cls.folders, key=lambda x: x.path) + folder = UseBisection(folders, "path", [path])()[0] + + if folder is not None: + return folder + + has_tracks = cls.check_has_tracks(path) + + if not has_tracks: + return None + + folder = cls.create_folder(path) + cls.folders.append(folder) + return folder + + @classmethod + def get_tracks_by_filepaths(cls, paths: list[str]) -> list[Track]: + """ + Returns all tracks matching the given paths. + """ + tracks = sorted(cls.tracks, key=lambda x: x.filepath) + tracks = UseBisection(tracks, "filepath", paths)() + return [track for track in tracks if track is not None] + + @classmethod + def get_tracks_by_albumhash(cls, album_hash: str) -> list[Track]: + """ + Returns all tracks matching the given album hash. + """ + return [t for t in cls.tracks if t.albumhash == album_hash] + + @classmethod + def get_tracks_by_artist(cls, artisthash: str) -> list[Track]: + """ + Returns all tracks matching the given artist. Duplicate tracks are removed. + """ + tracks = [t for t in cls.tracks if artisthash in t.artist_hashes] + return remove_duplicates(tracks) + + # ==================================================== + # ==================== ALBUMS ======================== + # ==================================================== + + @staticmethod + def create_album(track: Track): + """ + Creates album object from a track + """ + return Album( + albumhash=track.albumhash, + albumartists=track.albumartist, # type: ignore + title=track.album, + ) + + @classmethod + def load_albums(cls): + """ + Loads all albums from the database into the store. + """ + + albumhashes = set(t.albumhash for t in cls.tracks) + + for albumhash in tqdm(albumhashes, desc="Loading albums"): + for track in cls.tracks: + if track.albumhash == albumhash: + cls.albums.append(cls.create_album(track)) + break + + db_albums: list[tuple] = aldb.get_all_albums() + + for album in tqdm(db_albums, desc="Mapping album colors"): + albumhash = album[1] + colors = json.loads(album[2]) + + for al in cls.albums: + if al.albumhash == albumhash: + al.set_colors(colors) + break + + @classmethod + def add_album(cls, album: Album): + """ + Adds an album to the store. + """ + cls.albums.append(album) + + @classmethod + def add_albums(cls, albums: list[Album]): + """ + Adds multiple albums to the store. + """ + cls.albums.extend(albums) + + @classmethod + def get_albums_by_albumartist( + cls, artisthash: str, limit: int, exclude: str + ) -> list[Album]: + """ + Returns N albums by the given albumartist, excluding the specified album. + """ + + albums = [album for album in cls.albums if artisthash in album.albumartisthash] + + albums = [album for album in albums if album.albumhash != exclude] + + if len(albums) > limit: + random.shuffle(albums) + + # TODO: Merge this with `cls.get_albums_by_artisthash()` + return albums[:limit] + + @classmethod + def get_album_by_hash(cls, albumhash: str) -> Album | None: + """ + Returns an album by its hash. + """ + try: + return [a for a in cls.albums if a.albumhash == albumhash][0] + except IndexError: + return None + + @classmethod + def get_albums_by_artisthash(cls, artisthash: str) -> list[Album]: + """ + Returns all albums by the given artist. + """ + return [album for album in cls.albums if artisthash in album.albumartisthash] + + @classmethod + def count_albums_by_artisthash(cls, artisthash: str): + """ + Count albums for the given artisthash. + """ + albumartists = [a.albumartists for a in cls.albums] + artisthashes = [] + + for artist in albumartists: + artisthashes.extend([a.artisthash for a in artist]) # type: ignore + + master_string = "-".join(artisthashes) + + return master_string.count(artisthash) + + @classmethod + def album_exists(cls, albumhash: str) -> bool: + """ + Checks if an album exists. + """ + return albumhash in "-".join([a.albumhash for a in cls.albums]) + + @classmethod + def remove_album_by_hash(cls, albumhash: str): + """ + Removes an album from the store. + """ + cls.albums = [a for a in cls.albums if a.albumhash != albumhash] + + # ==================================================== + # ==================== ARTISTS ======================= + # ==================================================== + + @classmethod + def load_artists(cls): + """ + Loads all artists from the database into the store. + """ + cls.artists = get_all_artists(cls.tracks, cls.albums) + + db_artists: list[tuple] = list(ardb.get_all_artists()) + + for art in tqdm(db_artists, desc="Loading artists"): + cls.map_artist_color(art) + + @classmethod + def map_artist_color(cls, artist_tuple: tuple): + """ + Maps a color to the corresponding artist. + """ + + artisthash = artist_tuple[1] + color = json.loads(artist_tuple[2]) + + for artist in cls.artists: + if artist.artisthash == artisthash: + artist.colors = color + break + + @classmethod + def add_artist(cls, artist: Artist): + """ + Adds an artist to the store. + """ + cls.artists.append(artist) + + @classmethod + def add_artists(cls, artists: list[Artist]): + """ + Adds multiple artists to the store. + """ + for artist in artists: + if artist not in cls.artists: + cls.artists.append(artist) + + @classmethod + def get_artist_by_hash(cls, artisthash: str) -> Artist: + """ + Returns an artist by its hash. + """ + artists = sorted(cls.artists, key=lambda x: x.artisthash) + artist = UseBisection(artists, "artisthash", [artisthash])()[0] + return artist + + @classmethod + def artist_exists(cls, artisthash: str) -> bool: + """ + Checks if an artist exists. + """ + return artisthash in "-".join([a.artisthash for a in cls.artists]) + + @classmethod + def artist_has_tracks(cls, artisthash: str) -> bool: + """ + Checks if an artist has tracks. + """ + artists: set[str] = set() + + for track in cls.tracks: + artists.update(track.artist_hashes) + album_artists: list[str] = [a.artisthash for a in track.albumartist] + artists.update(album_artists) + + master_hash = "-".join(artists) + return artisthash in master_hash + + @classmethod + def remove_artist_by_hash(cls, artisthash: str): + """ + Removes an artist from the store. + """ + cls.artists = [a for a in cls.artists if a.artisthash != artisthash] diff --git a/app/functions.py b/app/functions.py new file mode 100644 index 0000000..52e458b --- /dev/null +++ b/app/functions.py @@ -0,0 +1,40 @@ +""" +This module contains functions for the server +""" +import time +from requests import ConnectionError as RequestConnectionError +from requests import ReadTimeout + +from app import utils +from app.lib.artistlib import CheckArtistImages +from app.lib.colorlib import ProcessAlbumColors, ProcessArtistColors +from app.lib.populate import Populate, ProcessTrackThumbnails +from app.lib.trackslib import validate_tracks +from app.logger import log + + +@utils.background +def run_periodic_checks(): + """ + Checks for new songs every N minutes. + """ + # ValidateAlbumThumbs() + # ValidatePlaylistThumbs() + validate_tracks() + + while True: + + Populate() + ProcessTrackThumbnails() + ProcessAlbumColors() + ProcessArtistColors() + + if utils.Ping()(): + try: + CheckArtistImages() + except (RequestConnectionError, ReadTimeout): + log.error( + "Internet connection lost. Downloading artist images stopped." + ) + + time.sleep(300) diff --git a/app/imgserver/__init__.py b/app/imgserver/__init__.py new file mode 100644 index 0000000..228ac36 --- /dev/null +++ b/app/imgserver/__init__.py @@ -0,0 +1,114 @@ +import os +from pathlib import Path + +from flask import Blueprint, request, send_from_directory + +imgbp = Blueprint("imgserver", __name__, url_prefix="/img") +SUPPORTED_IMAGES = (".jpg", ".png", ".webp", ".jpeg") + +HOME = os.path.expanduser("~") + +APP_DIR = Path(HOME) / ".swing" +IMG_PATH = APP_DIR / "images" +ASSETS_PATH = APP_DIR / "assets" + +THUMB_PATH = IMG_PATH / "thumbnails" +LG_THUMB_PATH = THUMB_PATH / "large" +SM_THUMB_PATH = THUMB_PATH / "small" + +ARTIST_PATH = IMG_PATH / "artists" +ARTIST_LG_PATH = ARTIST_PATH / "large" +ARTIST_SM_PATH = ARTIST_PATH / "small" + +PLAYLIST_PATH = IMG_PATH / "playlists" + + +@imgbp.route("/") +def hello(): + return "

Image Server

" + + +def send_fallback_img(filename: str = "default.webp"): + img = ASSETS_PATH / filename + + if not img.exists(): + return "", 404 + + return send_from_directory(ASSETS_PATH, filename) + + +@imgbp.route("/t/") +def send_lg_thumbnail(imgpath: str): + fpath = LG_THUMB_PATH / imgpath + + if fpath.exists(): + return send_from_directory(LG_THUMB_PATH, imgpath) + + return send_fallback_img() + + +@imgbp.route("/t/s/") +def send_sm_thumbnail(imgpath: str): + fpath = SM_THUMB_PATH / imgpath + + if fpath.exists(): + return send_from_directory(SM_THUMB_PATH, imgpath) + + return send_fallback_img() + + +@imgbp.route("/a/") +def send_lg_artist_image(imgpath: str): + fpath = ARTIST_LG_PATH / imgpath + + if fpath.exists(): + return send_from_directory(ARTIST_LG_PATH, imgpath) + + return send_fallback_img("artist.webp") + + +@imgbp.route("/a/s/") +def send_sm_artist_image(imgpath: str): + fpath = ARTIST_SM_PATH / imgpath + + if fpath.exists(): + return send_from_directory(ARTIST_SM_PATH, imgpath) + + return send_fallback_img("artist.webp") + + +@imgbp.route("/p/") +def send_playlist_image(imgpath: str): + fpath = PLAYLIST_PATH / imgpath + + if fpath.exists(): + return send_from_directory(PLAYLIST_PATH, imgpath) + + return send_fallback_img("playlist.svg") + + +# @app.route("/raw") +# @app.route("/raw/") +# def send_from_filepath(imgpath: str = ""): +# imgpath = "/" + imgpath +# filename = path.basename(imgpath) + +# def verify_is_image(): +# _, ext = path.splitext(filename) +# return ext in SUPPORTED_IMAGES + +# verified = verify_is_image() + +# if not verified: +# return imgpath, 404 + +# exists = path.exists(imgpath) + +# if verified and exists: +# return send_from_directory(path.dirname(imgpath), filename) + +# return imgpath, 404 + + +# def serve_imgs(): +# app.run(threaded=True, port=1971, host="0.0.0.0", debug=True) diff --git a/app/lib/__init__.py b/app/lib/__init__.py new file mode 100644 index 0000000..d1f9259 --- /dev/null +++ b/app/lib/__init__.py @@ -0,0 +1,3 @@ +""" +This module contains all the data processing and non-API libraries +""" \ No newline at end of file diff --git a/app/lib/albumslib.py b/app/lib/albumslib.py new file mode 100644 index 0000000..e154c93 --- /dev/null +++ b/app/lib/albumslib.py @@ -0,0 +1,3 @@ +""" +Contains methods relating to albums. +""" \ No newline at end of file diff --git a/app/lib/artistlib.py b/app/lib/artistlib.py new file mode 100644 index 0000000..77f7835 --- /dev/null +++ b/app/lib/artistlib.py @@ -0,0 +1,130 @@ +from concurrent.futures import ThreadPoolExecutor +from pathlib import Path +from io import BytesIO +from PIL import Image +import requests +import urllib + +from tqdm import tqdm +from requests.exceptions import ConnectionError as ReqConnError, ReadTimeout + +from app import settings +from app.models import Artist +from app.db.store import Store +from app.utils import create_hash + + +def get_artist_image_link(artist: str): + """ + Returns an artist image url. + """ + + try: + query = urllib.parse.quote(artist) # type: ignore + + url = f"https://api.deezer.com/search/artist?q={query}" + response = requests.get(url, timeout=30) + data = response.json() + + for res in data["data"]: + res_hash = create_hash(res["name"], decode=True) + artist_hash = create_hash(artist, decode=True) + + if res_hash == artist_hash: + return res["picture_big"] + + return None + except (ReqConnError, ReadTimeout, IndexError, KeyError): + return None + + +class DownloadImage: + def __init__(self, url: str, name: str) -> None: + sm_path = Path(settings.ARTIST_IMG_SM_PATH) / name + lg_path = Path(settings.ARTIST_IMG_LG_PATH) / name + + img = self.download(url) + + if img is not None: + self.save_img(img, sm_path, lg_path) + + @staticmethod + def download(url: str) -> Image.Image | None: + """ + Downloads the image from the url. + """ + return Image.open(BytesIO(requests.get(url, timeout=10).content)) + + @staticmethod + def save_img(img: Image.Image, sm_path: Path, lg_path: Path): + """ + Saves the image to the destinations. + """ + img.save(lg_path, format="webp") + + sm_size = settings.SM_ARTIST_IMG_SIZE + img.resize((sm_size, sm_size), Image.ANTIALIAS).save(sm_path, format="webp") + + +class CheckArtistImages: + def __init__(self): + with ThreadPoolExecutor() as pool: + list( + tqdm( + pool.map(self.download_image, Store.artists), + total=len(Store.artists), + desc="Downloading artist images", + ) + ) + + @staticmethod + def download_image(artist: Artist): + """ + Checks if an artist image exists and downloads it if not. + + :param artistname: The artist name + """ + img_path = Path(settings.ARTIST_IMG_SM_PATH) / f"{artist.artisthash}.webp" + + if img_path.exists(): + return + + url = get_artist_image_link(artist.name) + + if url is not None: + return DownloadImage(url, name=f"{artist.artisthash}.webp") + + +# def fetch_album_bio(title: str, albumartist: str) -> str | None: +# """ +# Returns the album bio for a given album. +# """ +# last_fm_url = "http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key={}&artist={}&album={}&format=json".format( +# settings.LAST_FM_API_KEY, albumartist, title +# ) + +# try: +# response = requests.get(last_fm_url) +# data = response.json() +# except: +# return None + +# try: +# bio = data["album"]["wiki"]["summary"].split(' list[str]: + """Extracts 2 of the most dominant colors from an image.""" + try: + colors = sorted(colorgram.extract(image, 1), key=lambda c: c.hsl.h) + except OSError: + return [] + + formatted_colors = [] + + for color in colors: + color = f"rgb({color.rgb.r}, {color.rgb.g}, {color.rgb.b})" + formatted_colors.append(color) + + return formatted_colors + + +class ProcessAlbumColors: + """ + Extracts the most dominant color from the album art and saves it to the database. + """ + + def __init__(self) -> None: + + with SQLiteManager() as cur: + for album in tqdm(Store.albums, desc="Processing album colors"): + if len(album.colors) == 0: + colors = self.process_color(album) + + if colors is None: + continue + + album.set_colors(colors) + + color_str = json.dumps(colors) + db.insert_one_album(cur, album.albumhash, color_str) + + @staticmethod + def process_color(album: Album): + path = Path(settings.SM_THUMB_PATH) / album.image + + if not path.exists(): + return + + colors = get_image_colors(str(path)) + return colors + + +class ProcessArtistColors: + """ + Extracts the most dominant color from the artist art and saves it to the database. + """ + + def __init__(self) -> None: + all_artists = Store.artists + + if all_artists is None: + return + + for artist in tqdm(all_artists, desc="Processing artist colors"): + if len(artist.colors) == 0: + self.process_color(artist) + + @staticmethod + def process_color(artist: Artist): + path = Path(settings.ARTIST_IMG_SM_PATH) / artist.image + + if not path.exists(): + return + + colors = get_image_colors(str(path)) + + if len(colors) > 0: + adb.insert_one_artist(artisthash=artist.artisthash, colors=colors) + Store.map_artist_color((0, artist.artisthash, json.dumps(colors))) + + # TODO: Load album and artist colors into the store. diff --git a/app/lib/folderslib.py b/app/lib/folderslib.py new file mode 100644 index 0000000..547ac75 --- /dev/null +++ b/app/lib/folderslib.py @@ -0,0 +1,47 @@ +import os +import pathlib +from concurrent.futures import ThreadPoolExecutor + +from app.db.store import Store +from app.models import Folder, Track +from app.settings import SUPPORTED_FILES + + +class GetFilesAndDirs: + """ + Get files and folders from a directory. + """ + + def __init__(self, path: str) -> None: + self.path = path + + def __call__(self) -> tuple[list[Track], list[Folder]]: + try: + entries = os.scandir(self.path) + except FileNotFoundError: + return ([], []) + + dirs, files = [], [] + + for entry in entries: + ext = os.path.splitext(entry.name)[1].lower() + + if entry.is_dir() and not entry.name.startswith("."): + dirs.append(entry.path) + elif entry.is_file() and ext in SUPPORTED_FILES: + files.append(entry.path) + + # sort files by modified time + files.sort( + key=lambda f: os.path.getmtime(f) # pylint: disable=unnecessary-lambda + ) + + tracks = Store.get_tracks_by_filepaths(files) + + with ThreadPoolExecutor() as pool: + iterable = pool.map(Store.get_folder, dirs) + folders = [i for i in iterable if i is not None] + + folders = filter(lambda f: f.has_tracks, folders) + + return (tracks, folders) # type: ignore diff --git a/app/lib/playlistlib.py b/app/lib/playlistlib.py new file mode 100644 index 0000000..6043abb --- /dev/null +++ b/app/lib/playlistlib.py @@ -0,0 +1,115 @@ +""" +This library contains all the functions related to playlists. +""" +import os +import random +import string +from datetime import datetime +from typing import Any + +from PIL import Image, ImageSequence + +from app import settings +from app.logger import log + + +def create_thumbnail(image: Any, img_path: str) -> str: + """ + Creates a 250 x 250 thumbnail from a playlist image + """ + thumb_path = "thumb_" + img_path + full_thumb_path = os.path.join(settings.APP_DIR, "images", "playlists", thumb_path) + + aspect_ratio = image.width / image.height + + new_w = round(250 * aspect_ratio) + + thumb = image.resize((new_w, 250), Image.ANTIALIAS) + thumb.save(full_thumb_path, "webp") + + return thumb_path + + +def create_gif_thumbnail(image: Any, img_path: str): + """ + Creates a 250 x 250 thumbnail from a playlist image + """ + thumb_path = "thumb_" + img_path + full_thumb_path = os.path.join(settings.APP_DIR, "images", "playlists", thumb_path) + + frames = [] + + for frame in ImageSequence.Iterator(image): + aspect_ratio = frame.width / frame.height + + new_w = round(250 * aspect_ratio) + + thumb = frame.resize((new_w, 250), Image.ANTIALIAS) + frames.append(thumb) + + frames[0].save(full_thumb_path, save_all=True, append_images=frames[1:]) + + return thumb_path + + +def save_p_image(file, pid: str): + """ + Saves the image of a playlist to the database. + """ + img = Image.open(file) + + random_str = "".join(random.choices(string.ascii_letters + string.digits, k=5)) + + img_path = pid + str(random_str) + ".webp" + + full_img_path = os.path.join(settings.APP_DIR, "images", "playlists", img_path) + + if file.content_type == "image/gif": + frames = [] + + for frame in ImageSequence.Iterator(img): + frames.append(frame.copy()) + + frames[0].save(full_img_path, save_all=True, append_images=frames[1:]) + create_gif_thumbnail(img, img_path=img_path) + + return img_path + + img.save(full_img_path, "webp") + create_thumbnail(img, img_path=img_path) + + return img_path + + +class ValidatePlaylistThumbs: + """ + Removes all unused images in the images/playlists folder. + """ + + def __init__(self) -> None: + images = [] + playlists = Get.get_all_playlists() + + log.info("Validating playlist thumbnails") + for playlist in playlists: + if playlist.image: + img_path = playlist.image.split("/")[-1] + thumb_path = playlist.thumb.split("/")[-1] + + images.append(img_path) + images.append(thumb_path) + + p_path = os.path.join(settings.APP_DIR, "images", "playlists") + + for image in os.listdir(p_path): + if image not in images: + os.remove(os.path.join(p_path, image)) + + log.info("Validating playlist thumbnails ... ✅") + + +def create_new_date(): + return datetime.now() + + +# TODO: Fix ValidatePlaylistThumbs diff --git a/app/lib/populate.py b/app/lib/populate.py new file mode 100644 index 0000000..d542075 --- /dev/null +++ b/app/lib/populate.py @@ -0,0 +1,100 @@ +from concurrent.futures import ThreadPoolExecutor +from tqdm import tqdm + +from app import settings +from app.db.sqlite.tracks import SQLiteTrackMethods +from app.db.store import Store + +from app.lib.taglib import extract_thumb, get_tags +from app.logger import log +from app.models import Album, Artist, Track +from app.utils import run_fast_scandir + +get_all_tracks = SQLiteTrackMethods.get_all_tracks +insert_many_tracks = SQLiteTrackMethods.insert_many_tracks + + +class Populate: + """ + Populates the database with all songs in the music directory + + checks if the song is in the database, if not, it adds it + also checks if the album art exists in the image path, if not tries to extract it. + """ + + def __init__(self) -> None: + + tracks = get_all_tracks() + tracks = list(tracks) + + files = run_fast_scandir(settings.HOME_DIR, full=True)[1] + + untagged = self.filter_untagged(tracks, files) + + if len(untagged) == 0: + log.info("All clear, no unread files.") + return + + self.tag_untagged(untagged) + + @staticmethod + def filter_untagged(tracks: list[Track], files: list[str]): + tagged_files = [t.filepath for t in tracks] + return set(files) - set(tagged_files) + + @staticmethod + def tag_untagged(untagged: set[str]): + log.info("Found %s new tracks", len(untagged)) + tagged_tracks: list[dict] = [] + tagged_count = 0 + + for file in tqdm(untagged, desc="Reading files"): + tags = get_tags(file) + + if tags is not None: + tagged_tracks.append(tags) + track = Track(**tags) + + Store.add_track(track) + Store.add_folder(track.folder) + + if not Store.album_exists(track.albumhash): + Store.add_album(Store.create_album(track)) + + for artist in track.artist: + if not Store.artist_exists(artist.artisthash): + Store.add_artist(Artist(artist.name)) + + for artist in track.albumartist: + if not Store.artist_exists(artist.artisthash): + Store.add_artist(Artist(artist.name)) + + tagged_count += 1 + else: + log.warning("Could not read file: %s", file) + + if len(tagged_tracks) > 0: + insert_many_tracks(tagged_tracks) + + log.info("Added %s/%s tracks", tagged_count, len(untagged)) + + +def get_image(album: Album): + for track in Store.tracks: + if track.albumhash == album.albumhash: + extract_thumb(track.filepath, track.image) + break + + +class ProcessTrackThumbnails: + def __init__(self) -> None: + with ThreadPoolExecutor(max_workers=4) as pool: + results = list( + tqdm( + pool.map(get_image, Store.albums), + total=len(Store.albums), + desc="Extracting track images", + ) + ) + + results = [r for r in results] diff --git a/app/lib/searchlib.py b/app/lib/searchlib.py new file mode 100644 index 0000000..b77c125 --- /dev/null +++ b/app/lib/searchlib.py @@ -0,0 +1,125 @@ +""" +This library contains all the functions related to the search functionality. +""" +from typing import List + +from rapidfuzz import fuzz, process + +from app import models + +ratio = fuzz.ratio +wratio = fuzz.WRatio + + +class Cutoff: + """ + Holds all the default cutoff values. + """ + + tracks: int = 60 + albums: int = 60 + artists: int = 60 + playlists: int = 60 + + +class Limit: + """ + Holds all the default limit values. + """ + + tracks: int = 50 + albums: int = 50 + artists: int = 50 + playlists: int = 50 + + +class SearchTracks: + def __init__(self, tracks: List[models.Track], query: str) -> None: + self.query = query + self.tracks = tracks + + def __call__(self) -> List[models.Track]: + """ + Gets all songs with a given title. + """ + + tracks = [track.title for track in self.tracks] + results = process.extract( + self.query, + tracks, + scorer=fuzz.WRatio, + score_cutoff=Cutoff.tracks, + limit=Limit.tracks, + ) + + return [self.tracks[i[2]] for i in results] + + +class SearchArtists: + def __init__(self, artists: list[str], query: str) -> None: + self.query = query + self.artists = artists + + def __call__(self) -> list: + """ + Gets all artists with a given name. + """ + + results = process.extract( + self.query, + self.artists, + scorer=fuzz.WRatio, + score_cutoff=Cutoff.artists, + limit=Limit.artists, + ) + + artists = [a[0] for a in results] + return [models.Artist(a) for a in artists] + + +class SearchAlbums: + def __init__(self, albums: List[models.Album], query: str) -> None: + self.query = query + self.albums = albums + + def __call__(self) -> List[models.Album]: + """ + Gets all albums with a given title. + """ + + albums = [a.title.lower() for a in self.albums] + + results = process.extract( + self.query, + albums, + scorer=fuzz.WRatio, + score_cutoff=Cutoff.albums, + limit=Limit.albums, + ) + + return [self.albums[i[2]] for i in results] + + # get all artists that matched the query + # for get all albums from the artists + # get all albums that matched the query + # return [**artist_albums **albums] + + # recheck next and previous artist on play next or add to playlist + + +class SearchPlaylists: + def __init__(self, playlists: List[models.Playlist], query: str) -> None: + self.playlists = playlists + self.query = query + + def __call__(self) -> List[models.Playlist]: + playlists = [p.name for p in self.playlists] + results = process.extract( + self.query, + playlists, + scorer=fuzz.WRatio, + score_cutoff=Cutoff.playlists, + limit=Limit.playlists, + ) + + return [self.playlists[i[2]] for i in results] diff --git a/app/lib/taglib.py b/app/lib/taglib.py new file mode 100644 index 0000000..5d975d2 --- /dev/null +++ b/app/lib/taglib.py @@ -0,0 +1,159 @@ +import os +import datetime +from io import BytesIO + +from tinytag import TinyTag +from PIL import Image, UnidentifiedImageError + +from app import settings +from app.utils import create_hash + + + +def parse_album_art(filepath: str): + """ + Returns the album art for a given audio file. + """ + + try: + tags = TinyTag.get(filepath, image=True) + return tags.get_image() + except: # pylint: disable=bare-except + return None + + +def extract_thumb(filepath: str, webp_path: str) -> bool: + """ + Extracts the thumbnail from an audio file. Returns the path to the thumbnail. + """ + img_path = os.path.join(settings.LG_THUMBS_PATH, webp_path) + sm_img_path = os.path.join(settings.SM_THUMB_PATH, webp_path) + + tsize = settings.THUMB_SIZE + sm_tsize = settings.SM_THUMB_SIZE + + def save_image(img: Image.Image): + img.resize((sm_tsize, sm_tsize), Image.ANTIALIAS).save(sm_img_path, "webp") + img.resize((tsize, tsize), Image.ANTIALIAS).save(img_path, "webp") + + if os.path.exists(img_path): + img_size = os.path.getsize(img_path) + + if img_size > 0: + return True + + album_art = parse_album_art(filepath) + + if album_art is not None: + try: + img = Image.open(BytesIO(album_art)) + except (UnidentifiedImageError, OSError): + return False + + try: + save_image(img) + except OSError: + try: + png = img.convert("RGB") + save_image(png) + except: # pylint: disable=bare-except + return False + + return True + return False + + +def extract_date(date_str: str | None) -> int: + current_year = datetime.date.today().today().year + + if date_str is None: + return current_year + + try: + return int(date_str.split("-")[0]) + except: # pylint: disable=bare-except + return current_year + + +def get_tags(filepath: str): + filetype = filepath.split(".")[-1] + filename = (filepath.split("/")[-1]).replace(f".{filetype}", "") + + try: + tags = TinyTag.get(filepath) + except: # pylint: disable=bare-except + return None + + no_albumartist: bool = (tags.albumartist == "") or (tags.albumartist is None) + no_artist: bool = (tags.artist == "") or (tags.artist is None) + + if no_albumartist and not no_artist: + tags.albumartist = tags.artist + + if no_artist and not no_albumartist: + tags.artist = tags.albumartist + + to_filename = ["title", "album"] + for tag in to_filename: + p = getattr(tags, tag) + if p == "" or p is None: + setattr(tags, tag, filename) + + to_check = ["album", "artist", "year", "albumartist"] + for prop in to_check: + p = getattr(tags, prop) + if (p is None) or (p == ""): + setattr(tags, prop, "Unknown") + + to_round = ["bitrate", "duration"] + for prop in to_round: + try: + setattr(tags, prop, round(getattr(tags, prop))) + except TypeError: + setattr(tags, prop, 0) + + to_int = ["track", "disc"] + for prop in to_int: + try: + setattr(tags, prop, int(getattr(tags, prop))) + except (ValueError, TypeError): + setattr(tags, prop, 1) + + try: + tags.copyright = tags.extra["copyright"] + except KeyError: + tags.copyright = None + + tags.albumhash = create_hash(tags.album, tags.albumartist) + tags.trackhash = create_hash(tags.artist, tags.album, tags.title) + tags.image = f"{tags.albumhash}.webp" + tags.folder = os.path.dirname(filepath) + + tags.date = extract_date(tags.year) + tags.filepath = filepath + tags.filetype = filetype + + tags = tags.__dict__ + + # delete all tag properties that start with _ (tinytag internals) + for tag in list(tags): + if tag.startswith("_"): + del tags[tag] + + to_delete = [ + "filesize", + "audio_offset", + "channels", + "comment", + "composer", + "disc_total", + "extra", + "samplerate", + "track_total", + "year", + ] + + for tag in to_delete: + del tags[tag] + + return tags diff --git a/app/lib/trackslib.py b/app/lib/trackslib.py new file mode 100644 index 0000000..faa166b --- /dev/null +++ b/app/lib/trackslib.py @@ -0,0 +1,19 @@ +""" +This library contains all the functions related to tracks. +""" +import os + +from tqdm import tqdm + +from app.db.store import Store +from app.db.sqlite.tracks import SQLiteTrackMethods as tdb + + +def validate_tracks() -> None: + """ + Gets all songs under the ~/ directory. + """ + for track in tqdm(Store.tracks, desc="Removing deleted tracks"): + if not os.path.exists(track.filepath): + Store.tracks.remove(track) + tdb.remove_track_by_filepath(track.filepath) diff --git a/app/lib/watchdogg.py b/app/lib/watchdogg.py new file mode 100644 index 0000000..276f6ba --- /dev/null +++ b/app/lib/watchdogg.py @@ -0,0 +1,172 @@ +""" +This library contains the classes and functions related to the watchdog file watcher. +""" +import os +import time + +from watchdog.events import PatternMatchingEventHandler +from watchdog.observers import Observer + +from app.db.sqlite.tracks import SQLiteManager +from app.db.sqlite.tracks import SQLiteTrackMethods as db +from app.db.store import Store +from app.lib.taglib import get_tags +from app.logger import log +from app.models import Artist, Track + + +class Watcher: + """ + Contains the methods for initializing and starting watchdog. + """ + + home_dir = os.path.expanduser("~") + dirs = [home_dir] + observers: list[Observer] = [] + + def __init__(self): + self.observer = Observer() + + def run(self): + event_handler = Handler() + + for dir_ in self.dirs: + self.observer.schedule( + event_handler, os.path.realpath(dir_), recursive=True + ) + self.observers.append(self.observer) + + try: + self.observer.start() + except OSError: + log.error("Could not start watchdog.") + return + + try: + while True: + time.sleep(1) + except KeyboardInterrupt: + for obsv in self.observers: + obsv.unschedule_all() + obsv.stop() + + for obsv in self.observers: + obsv.join() + + +def add_track(filepath: str) -> None: + """ + Processes the audio tags for a given file ands add them to the database and store. + + Then creates the folder, album and artist objects for the added track and adds them to the store. + """ + tags = get_tags(filepath) + + if tags is None: + return + + with SQLiteManager() as cur: + db.remove_track_by_filepath(tags["filepath"]) + db.insert_one_track(tags, cur) + + track = Track(**tags) + Store().add_track(track) + + Store.add_folder(track.folder) + + if not Store.album_exists(track.albumhash): + album = Store.create_album(track) + Store.add_album(album) + + artists: list[Artist] = track.artist + track.albumartist # type: ignore + + for artist in artists: + if not Store.artist_exists(artist.artisthash): + Store.add_artist(Artist(artist.name)) + + +def remove_track(filepath: str) -> None: + """ + Removes a track from the music dict. + """ + try: + track = Store.get_tracks_by_filepaths([filepath])[0] + except IndexError: + return + + db.remove_track_by_filepath(filepath) + Store.remove_track_by_filepath(filepath) + + empty_album = Store.count_tracks_by_hash(track.albumhash) > 0 + + if empty_album: + Store.remove_album_by_hash(track.albumhash) + + artists: list[Artist] = track.artist + track.albumartist # type: ignore + + for artist in artists: + empty_artist = not Store.artist_has_tracks(artist.artisthash) + + if empty_artist: + Store.remove_artist_by_hash(artist.artisthash) + + empty_folder = Store.is_empty_folder(track.folder) + + if empty_folder: + Store.remove_folder(track.folder) + + +class Handler(PatternMatchingEventHandler): + files_to_process = [] + + def __init__(self): + log.info("✅ started watchdog") + PatternMatchingEventHandler.__init__( + self, + patterns=["*.flac", "*.mp3"], + ignore_directories=True, + case_sensitive=False, + ) + + def on_created(self, event): + """ + Fired when a supported file is created. + """ + self.files_to_process.append(event.src_path) + + def on_deleted(self, event): + """ + Fired when a delete event occurs on a supported file. + """ + + remove_track(event.src_path) + + def on_moved(self, event): + """ + Fired when a move event occurs on a supported file. + """ + trash = "share/Trash" + + if trash in event.dest_path: + remove_track(event.src_path) + + elif trash in event.src_path: + add_track(event.dest_path) + + elif trash not in event.dest_path and trash not in event.src_path: + add_track(event.dest_path) + remove_track(event.src_path) + + def on_closed(self, event): + """ + Fired when a created file is closed. + """ + try: + self.files_to_process.remove(event.src_path) + if os.path.getsize(event.src_path) > 0: + add_track(event.src_path) + except ValueError: + pass + + +# watcher = Watcher() diff --git a/app/logger.py b/app/logger.py new file mode 100644 index 0000000..aec7263 --- /dev/null +++ b/app/logger.py @@ -0,0 +1,49 @@ +""" +Logger module +""" + +import logging + + +class CustomFormatter(logging.Formatter): + """ + Custom log formatter + """ + + grey = "\x1b[38;20m" + yellow = "\x1b[33;20m" + red = "\x1b[31;20m" + bold_red = "\x1b[31;1m" + reset = "\x1b[0m" + # format = ( + # "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)" + # ) + format_ = "[%(asctime)s]@%(name)s • %(message)s" + + FORMATS = { + logging.DEBUG: grey + format_ + reset, + logging.INFO: grey + format_ + reset, + logging.WARNING: yellow + format_ + reset, + logging.ERROR: red + format_ + reset, + logging.CRITICAL: bold_red + format_ + reset, + } + + def format(self, record): + log_fmt = self.FORMATS.get(record.levelno) + formatter = logging.Formatter(log_fmt, "%H:%M:%S") + return formatter.format(record) + + +log = logging.getLogger("swing") +log.propagate = False +log.setLevel(logging.DEBUG) + +# create console handler with a higher log level +handler = logging.StreamHandler() +handler.setLevel(logging.DEBUG) + +handler.setFormatter(CustomFormatter()) +log.addHandler(handler) + + +# copied from: https://stackoverflow.com/a/56944256: diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..650ad8f --- /dev/null +++ b/app/models.py @@ -0,0 +1,206 @@ +""" +Contains all the models for objects generation and typing. +""" +import dataclasses +import json +from dataclasses import dataclass + +from app import utils + + +@dataclass(slots=True) +class Artist: + """ + Artist class + """ + + name: str + artisthash: str = "" + image: str = "" + trackcount: int = 0 + albumcount: int = 0 + duration: int = 0 + colors: list[str] = dataclasses.field(default_factory=list) + is_favorite: bool = False + + def __post_init__(self): + self.artisthash = utils.create_hash(self.name, decode=True) + self.image = self.artisthash + ".webp" + self.colors = json.loads(str(self.colors)) + + +@dataclass(slots=True) +class Track: + """ + Track class + """ + + album: str + albumartist: str | list[Artist] + albumhash: str + artist: str | list[Artist] + bitrate: int + copyright: str + date: str + disc: int + duration: int + filepath: str + folder: str + genre: str | list[str] + title: str + track: int + trackhash: str + + filetype: str = "" + image: str = "" + artist_hashes: list[str] = dataclasses.field(default_factory=list) + is_favorite: bool = False + + def __post_init__(self): + if self.artist is not None: + artist_str = str(self.artist).split(", ") + self.artist_hashes = [utils.create_hash(a, decode=True) for a in artist_str] + + self.artist = [Artist(a) for a in artist_str] + + albumartists = str(self.albumartist).split(", ") + self.albumartist = [Artist(a) for a in albumartists] + + self.filetype = self.filepath.rsplit(".", maxsplit=1)[-1] + self.image = self.albumhash + ".webp" + + if self.genre is not None: + self.genre = str(self.genre).replace("/", ", ") + self.genre = str(self.genre).lower().split(", ") + + +@dataclass +class Album: + """ + Creates an album object + """ + + albumhash: str + title: str + albumartists: list[Artist] + + albumartisthash: str = "" + image: str = "" + count: int = 0 + duration: int = 0 + colors: list[str] = dataclasses.field(default_factory=list) + date: str = "" + + is_soundtrack: bool = False + is_compilation: bool = False + is_single: bool = False + is_EP: bool = False + is_favorite: bool = False + genres: list[str] = dataclasses.field(default_factory=list) + + def __post_init__(self): + self.image = self.albumhash + ".webp" + self.albumartisthash = "-".join(a.artisthash for a in self.albumartists) + + def set_colors(self, colors: list[str]): + self.colors = colors + + def check_type(self): + """ + Runs all the checks to determine the type of album. + """ + self.is_soundtrack = self.check_is_soundtrack() + if self.is_soundtrack: + return + + self.is_compilation = self.check_is_compilation() + if self.is_compilation: + return + + self.is_EP = self.check_is_EP() + + def check_is_soundtrack(self) -> bool: + """ + Checks if the album is a soundtrack. + """ + keywords = ["motion picture", "soundtrack"] + for keyword in keywords: + if keyword in self.title.lower(): + return True + + return False + + def check_is_compilation(self) -> bool: + """ + Checks if the album is a compilation. + """ + artists = [a.name for a in self.albumartists] # type: ignore + artists = "".join(artists).lower() + + return "various artists" in artists + + def check_is_EP(self) -> bool: + """ + Checks if the album is an EP. + """ + return self.title.strip().endswith(" EP") + + def check_is_single(self, tracks: list[Track]): + """ + Checks if the album is a single. + """ + if ( + len(tracks) == 1 + and tracks[0].title == self.title + and tracks[0].track == 1 + and tracks[0].disc == 1 + ): + self.is_single = True + + +@dataclass +class Playlist: + """Creates playlist objects""" + + id: int + artisthashes: str | list[str] + banner_pos: int + has_gif: str | bool + image: str + last_updated: str + name: str + trackhashes: str | list[str] + + thumb: str = "" + count: int = 0 + duration: int = 0 + + def __post_init__(self): + self.trackhashes = json.loads(str(self.trackhashes)) + self.artisthashes = json.loads(str(self.artisthashes)) + + self.count = len(self.trackhashes) + self.has_gif = bool(int(self.has_gif)) + + if self.image is not None: + self.thumb = "thumb_" + self.image + else: + self.image = "None" + self.thumb = "None" + + +@dataclass +class Folder: + name: str + path: str + has_tracks: bool + is_sym: bool = False + path_hash: str = "" + + +class FavType: + """Favorite types enum""" + + track = "track" + album = "album" + artist = "artist" diff --git a/app/serializer.py b/app/serializer.py new file mode 100644 index 0000000..66ac624 --- /dev/null +++ b/app/serializer.py @@ -0,0 +1,55 @@ +from datetime import datetime + + +def date_string_to_time_passed(prev_date: str) -> str: + """ + Converts a date string to time passed. eg. 2 minutes ago, 1 hour ago, yesterday, 2 days ago, 2 weeks ago, etc. + """ + + now = datetime.now() + then = datetime.strptime(prev_date, "%Y-%m-%d %H:%M:%S") + + diff = now - then + days = diff.days + + if days < 0: + return "in the future" + + if days == 0: + seconds = diff.seconds + + if seconds < 15: + return "now" + + if seconds < 60: + return str(seconds) + " seconds ago" + + if seconds < 3600: + return str(seconds // 60) + " minutes ago" + + return str(seconds // 3600) + " hours ago" + + if days == 1: + return "yesterday" + + if days < 7: + return str(days) + " days ago" + + if days < 30: + if days < 14: + return "1 week ago" + + return str(days // 7) + " weeks ago" + if days < 365: + if days < 60: + return "1 month ago" + + return str(days // 30) + " months ago" + if days > 365: + if days < 730: + return "1 year ago" + + return str(days // 365) + " years ago" + + return "I honestly don't know" + diff --git a/app/settings.py b/app/settings.py new file mode 100644 index 0000000..3307368 --- /dev/null +++ b/app/settings.py @@ -0,0 +1,103 @@ +""" +Contains default configs +""" +import multiprocessing +import os + +APP_VERSION = "Swing v0.0.1.alpha" + +# paths +CONFIG_FOLDER = ".swing" +HOME_DIR = os.path.expanduser("~") + +APP_DIR = os.path.join(HOME_DIR, CONFIG_FOLDER) +IMG_PATH = os.path.join(APP_DIR, "images") + +ARTIST_IMG_PATH = os.path.join(IMG_PATH, "artists") +ARTIST_IMG_SM_PATH = os.path.join(ARTIST_IMG_PATH, "small") +ARTIST_IMG_LG_PATH = os.path.join(ARTIST_IMG_PATH, "large") + +THUMBS_PATH = os.path.join(IMG_PATH, "thumbnails") +SM_THUMB_PATH = os.path.join(THUMBS_PATH, "small") +LG_THUMBS_PATH = os.path.join(THUMBS_PATH, "large") + + +# TEST_DIR = "/home/cwilvx/Downloads/Telegram Desktop" +# TEST_DIR = "/mnt/dfc48e0f-103b-426e-9bf9-f25d3743bc96/Music/Chill/Wolftyla Radio" +# HOME_DIR = TEST_DIR + +# URLS +IMG_BASE_URI = "http://127.0.0.1:8900/images/" +IMG_ARTIST_URI = IMG_BASE_URI + "artists/" +IMG_THUMB_URI = IMG_BASE_URI + "thumbnails/" +IMG_PLAYLIST_URI = IMG_BASE_URI + "playlists/" + +# defaults +DEFAULT_ARTIST_IMG = IMG_ARTIST_URI + "0.webp" + +LAST_FM_API_KEY = "762db7a44a9e6fb5585661f5f2bdf23a" + +CPU_COUNT = multiprocessing.cpu_count() + +THUMB_SIZE = 400 +SM_THUMB_SIZE = 64 +SM_ARTIST_IMG_SIZE = 64 +""" +The size of extracted images in pixels +""" + +LOGGER_ENABLE: bool = True + +FILES = ["flac", "mp3", "wav", "m4a"] +SUPPORTED_FILES = tuple(f".{file}" for file in FILES) + +SUPPORTED_IMAGES = (".jpg", ".png", ".webp", ".jpeg") + +SUPPORTED_DIR_IMAGES = [ + "folder", + "cover", + "album", + "front", +] + +# ===== DB ========= +USE_MONGO = False + + +# ===== SQLite ===== +APP_DB_NAME = "swing.db" +USER_DATA_DB_NAME = "userdata.db" +APP_DB_PATH = os.path.join(APP_DIR, APP_DB_NAME) +USERDATA_DB_PATH = os.path.join(APP_DIR, USER_DATA_DB_NAME) + + +# ===== Store ===== +USE_STORE = True + +HELP_MESSAGE = """ +Usage: swing [options] + +Options: + --build: Build the application + --host: Set the host + --port: Set the port + --help, -h: Show this help message + --version, -v: Show the version +""" + + +class TCOLOR: + """ + Terminal colors + """ + + HEADER = "\033[95m" + OKBLUE = "\033[94m" + OKCYAN = "\033[96m" + OKGREEN = "\033[92m" + WARNING = "\033[93m" + FAIL = "\033[91m" + ENDC = "\033[0m" + BOLD = "\033[1m" + UNDERLINE = "\033[4m" + # credits: https://stackoverflow.com/a/287944 diff --git a/app/setup/__init__.py b/app/setup/__init__.py new file mode 100644 index 0000000..9e3c9ff --- /dev/null +++ b/app/setup/__init__.py @@ -0,0 +1,128 @@ +""" +Contains the functions to prepare the server for use. +""" +import os +import shutil +from configparser import ConfigParser + +from app import settings +from app.db.sqlite import create_connection, create_tables, queries +from app.db.store import Store +from app.settings import APP_DB_PATH, USERDATA_DB_PATH +from app.utils import get_home_res_path + + +config = ConfigParser() + +config_path = get_home_res_path("pyinstaller.config.ini") +config.read(config_path) + + +try: + IS_BUILD = config["DEFAULT"]["BUILD"] == "True" +except KeyError: + # If the key doesn't exist, it means that the app is being executed in dev mode. + IS_BUILD = False + + +class CopyFiles: + """Copies assets to the app directory.""" + + def __init__(self) -> None: + assets_dir = "assets" + + if IS_BUILD: + assets_dir = get_home_res_path("assets") + + files = [ + { + "src": assets_dir, + "dest": os.path.join(settings.APP_DIR, "assets"), + "is_dir": True, + } + ] + + for entry in files: + src = os.path.join(os.getcwd(), entry["src"]) + + if entry["is_dir"]: + shutil.copytree( + src, + entry["dest"], + ignore=shutil.ignore_patterns( + "*.pyc", + ), + copy_function=shutil.copy2, + dirs_exist_ok=True, + ) + break + + shutil.copy2(src, entry["dest"]) + + +def create_config_dir() -> None: + """ + Creates the config directory if it doesn't exist. + """ + + home_dir = os.path.expanduser("~") + config_folder = os.path.join(home_dir, settings.CONFIG_FOLDER) + + thumb_path = os.path.join("images", "thumbnails") + small_thumb_path = os.path.join(thumb_path, "small") + large_thumb_path = os.path.join(thumb_path, "large") + + artist_img_path = os.path.join("images", "artists") + small_artist_img_path = os.path.join(artist_img_path, "small") + large_artist_img_path = os.path.join(artist_img_path, "large") + + playlist_img_path = os.path.join("images", "playlists") + + dirs = [ + "", # creates the config folder + "images", + thumb_path, + small_thumb_path, + large_thumb_path, + artist_img_path, + small_artist_img_path, + large_artist_img_path, + playlist_img_path, + ] + + for _dir in dirs: + path = os.path.join(config_folder, _dir) + exists = os.path.exists(path) + + if not exists: + os.makedirs(path) + os.chmod(path, 0o755) + + CopyFiles() + + +def setup_sqlite(): + """ + Create Sqlite databases and tables. + """ + # if os.path.exists(DB_PATH): + # os.remove(DB_PATH) + + app_db_conn = create_connection(APP_DB_PATH) + playlist_db_conn = create_connection(USERDATA_DB_PATH) + + create_tables(app_db_conn, queries.CREATE_APPDB_TABLES) + create_tables(playlist_db_conn, queries.CREATE_USERDATA_TABLES) + + app_db_conn.close() + playlist_db_conn.close() + + Store.load_all_tracks() + Store.process_folders() + Store.load_albums() + Store.load_artists() + + +def run_setup(): + create_config_dir() + setup_sqlite() diff --git a/app/utils.py b/app/utils.py new file mode 100644 index 0000000..1f518b0 --- /dev/null +++ b/app/utils.py @@ -0,0 +1,226 @@ +""" +This module contains mini functions for the server. +""" +import os +import hashlib +from pathlib import Path +import threading +from datetime import datetime +from unidecode import unidecode +import requests + +from app import models +from app.settings import SUPPORTED_FILES + +CWD = Path(__file__).parent.resolve() + + +def background(func): + """ + a threading decorator + use @background above the function you want to run in the background + """ + + def background_func(*a, **kw): + threading.Thread(target=func, args=a, kwargs=kw).start() + + return background_func + + +def run_fast_scandir(__dir: str, full=False) -> tuple[list[str], list[str]]: + """ + Scans a directory for files with a specific extension. Returns a list of files and folders in the directory. + """ + + subfolders = [] + files = [] + + for f in os.scandir(__dir): + if f.is_dir() and not f.name.startswith("."): + subfolders.append(f.path) + if f.is_file(): + ext = os.path.splitext(f.name)[1].lower() + if ext in SUPPORTED_FILES: + files.append(f.path) + + if full or len(files) == 0: + for _dir in list(subfolders): + sf, f = run_fast_scandir(_dir, full=True) + subfolders.extend(sf) + files.extend(f) + + return subfolders, files + + +def remove_duplicates(tracks: list[models.Track]) -> list[models.Track]: + """ + Removes duplicate tracks from a list of tracks. + """ + hashes = [] + + for track in tracks: + if track.trackhash not in hashes: + hashes.append(track.trackhash) + + tracks = sorted(tracks, key=lambda x: x.trackhash) + tracks = UseBisection(tracks, "trackhash", hashes)() + + return [t for t in tracks if t is not None] + + +def create_hash(*args: str, decode=False, limit=7) -> str: + """ + Creates a simple hash for an album + """ + string = "".join(args) + + if decode: + string = unidecode(string) + + string = string.lower().strip().replace(" ", "") + string = "".join(t for t in string if t.isalnum()) + string = string.encode("utf-8") + string = hashlib.sha256(string).hexdigest() + return string[-limit:] + + +def create_folder_hash(*args: str, limit=7) -> str: + """ + Creates a simple hash for an album + """ + strings = [s.lower().strip().replace(" ", "") for s in args] + + strings = ["".join([t for t in s if t.isalnum()]) for s in strings] + strings = [s.encode("utf-8") for s in strings] + strings = [hashlib.sha256(s).hexdigest()[-limit:] for s in strings] + return "".join(strings) + + +def create_new_date(): + """ + It creates a new date and time string in the format of "YYYY-MM-DD HH:MM:SS" + :return: A string of the current date and time. + """ + now = datetime.now() + return now.strftime("%Y-%m-%d %H:%M:%S") + + +class UseBisection: + """ + Uses bisection to find a list of items in another list. + + returns a list of found items with `None` items being not found + items. + """ + + def __init__(self, source: list, search_from: str, queries: list[str]) -> None: + self.source_list = source + self.queries_list = queries + self.attr = search_from + + def find(self, query: str): + left = 0 + right = len(self.source_list) - 1 + + while left <= right: + mid = (left + right) // 2 + if self.source_list[mid].__getattribute__(self.attr) == query: + return self.source_list[mid] + elif self.source_list[mid].__getattribute__(self.attr) > query: + right = mid - 1 + else: + left = mid + 1 + + return None + + def __call__(self) -> list: + if len(self.source_list) == 0: + return [None] + + return [self.find(query) for query in self.queries_list] + + +class Ping: + """ + Checks if there is a connection to the internet by pinging google.com + """ + + @staticmethod + def __call__() -> bool: + try: + requests.get("https://google.com", timeout=10) + return True + except (requests.exceptions.ConnectionError, requests.Timeout): + return False + + +def get_artists_from_tracks(tracks: list[models.Track]) -> set[str]: + """ + Extracts all artists from a list of tracks. Returns a list of Artists. + """ + artists = set() + + master_artist_list = [[x.name for x in t.artist] for t in tracks] # type: ignore + artists = artists.union(*master_artist_list) + + return artists + + +def get_albumartists(albums: list[models.Album]) -> set[str]: + artists = set() + + # master_artist_list = [a.albumartists for a in albums] + for album in albums: + albumartists = [a.name for a in album.albumartists] # type: ignore + + artists.update(albumartists) + + # return [models.Artist(a) for a in artists] + return artists + + +def get_all_artists( + tracks: list[models.Track], albums: list[models.Album] +) -> list[models.Artist]: + artists_from_tracks = get_artists_from_tracks(tracks) + artist_from_albums = get_albumartists(albums) + + artists = list(artists_from_tracks.union(artist_from_albums)) + artists = sorted(artists) + + lower_artists = set(a.lower().strip() for a in artists) + indices = [[ar.lower().strip() for ar in artists].index(a) for a in lower_artists] + artists = [artists[i] for i in indices] + + return [models.Artist(a) for a in artists] + + +def bisection_search_string(strings: list[str], target: str) -> str | None: + """ + Finds a string in a list of strings using bisection search. + """ + if not strings: + return None + + strings = sorted(strings) + + left = 0 + right = len(strings) - 1 + while left <= right: + middle = (left + right) // 2 + if strings[middle] == target: + return strings[middle] + + if strings[middle] < target: + left = middle + 1 + else: + right = middle - 1 + + return None + + +def get_home_res_path(filename: str): + """ + Returns a path to resources in the home directory of this project. Used to resolve resources in builds. + """ + return (CWD / ".." / filename).resolve() diff --git a/assets/album.svg b/assets/album.svg new file mode 100644 index 0000000..18da473 --- /dev/null +++ b/assets/album.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/assets/artist.webp b/assets/artist.webp new file mode 100644 index 0000000000000000000000000000000000000000..e9a360f9f4cd7354c8204cdbf90d28488eafb16c GIT binary patch literal 3956 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 literal 0 HcmV?d00001 diff --git a/assets/playlist.svg b/assets/playlist.svg new file mode 100644 index 0000000..bb5a971 --- /dev/null +++ b/assets/playlist.svg @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/index.html b/index.html deleted file mode 100644 index 91414af..0000000 --- a/index.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - Alice - - - -
- - - - diff --git a/manage.py b/manage.py new file mode 100644 index 0000000..e8efa46 --- /dev/null +++ b/manage.py @@ -0,0 +1,183 @@ +""" +This file is used to run the application. +""" +import logging +import os +import sys +from configparser import ConfigParser + +import PyInstaller.__main__ as bundler + +from app.api import create_api +from app.functions import run_periodic_checks +from app.lib.watchdogg import Watcher as WatchDog +from app.settings import APP_VERSION, HELP_MESSAGE, TCOLOR +from app.setup import run_setup +from app.utils import background, get_home_res_path + +werkzeug = logging.getLogger("werkzeug") +werkzeug.setLevel(logging.ERROR) + + +class Variables: + FLASK_PORT = 1970 + FLASK_HOST = "localhost" + + +app = create_api() +app.static_folder = get_home_res_path("client") + +config = ConfigParser() +config.read("pyinstaller.config.ini") + + +@app.route("/") +def serve_client_files(path): + """ + Serves the static files in the client folder. + """ + return app.send_static_file(path) + + +@app.route("/") +def serve_client(): + """ + Serves the index.html file at client/index.html. + """ + return app.send_static_file("index.html") + + +ARGS = sys.argv[1:] + + +class ArgsEnum: + """ + Enumerates the possible file arguments. + """ + + build = "--build" + port = "--port" + host = "--host" + help = ["--help", "-h"] + version = ["--version", "-v"] + + +class HandleArgs: + def __init__(self) -> None: + self.handle_build() + self.handle_host() + self.handle_port() + self.handle_help() + self.handle_version() + + @staticmethod + def handle_build(): + """ + Runs Pyinstaller. + """ + if ArgsEnum.build in ARGS: + with open("pyinstaller.config.ini", "w", encoding="utf-8") as file: + config["DEFAULT"]["BUILD"] = "True" + config.write(file) + + bundler.run( + [ + "manage.py", + "--onefile", + "--name", + "swing", + "--clean", + "--add-data=assets:assets", + "--add-data=client:client", + "--add-data=pyinstaller.config.ini:.", + "-y", + ] + ) + + with open("pyinstaller.config.ini", "w", encoding="utf-8") as file: + config["DEFAULT"]["BUILD"] = "False" + config.write(file) + + sys.exit(0) + + @staticmethod + def handle_port(): + if ArgsEnum.port in ARGS: + index = ARGS.index(ArgsEnum.port) + try: + port = ARGS[index + 1] + except IndexError: + print("ERROR: Port not specified") + sys.exit(0) + + try: + Variables.FLASK_PORT = int(port) # type: ignore + except ValueError: + print("ERROR: Port should be a number") + sys.exit(0) + + @staticmethod + def handle_host(): + if ArgsEnum.host in ARGS: + index = ARGS.index(ArgsEnum.host) + + try: + host = ARGS[index + 1] + except IndexError: + print("ERROR: Host not specified") + sys.exit(0) + + Variables.FLASK_HOST = host # type: ignore + + @staticmethod + def handle_help(): + if any((a in ARGS for a in ArgsEnum.help)): + print(HELP_MESSAGE) + sys.exit(0) + + @staticmethod + def handle_version(): + if any((a in ARGS for a in ArgsEnum.version)): + print(APP_VERSION) + sys.exit(0) + + +@background +def run_bg_checks() -> None: + run_setup() + run_periodic_checks() + + +@background +def start_watchdog(): + WatchDog().run() + + +def log_info(): + lines = " -------------------------------------" + os.system("cls" if os.name == "nt" else "echo -e \\\\033c") + print(lines) + print(f" {TCOLOR.HEADER}{APP_VERSION} {TCOLOR.ENDC}") + print( + f" Started app on: {TCOLOR.OKGREEN}http://{Variables.FLASK_HOST}:{Variables.FLASK_PORT}{TCOLOR.ENDC}" + ) + print(lines) + print("\n") + + +if __name__ == "__main__": + HandleArgs() + log_info() + run_bg_checks() + start_watchdog() + app.run( + debug=True, + threaded=True, + host=Variables.FLASK_HOST, + port=Variables.FLASK_PORT, + use_reloader=False, + ) + +# TODO: Find out how to print in color: red for errors, etc. +# TODO: Find a way to verify the host string +# TODO: Organize code in this file: move args to new file, etc. \ No newline at end of file diff --git a/manage.spec b/manage.spec new file mode 100644 index 0000000..69183a7 --- /dev/null +++ b/manage.spec @@ -0,0 +1,44 @@ +# -*- mode: python ; coding: utf-8 -*- + + +block_cipher = None + + +a = Analysis( + ['manage.py'], + pathex=[], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + hooksconfig={}, + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False, +) +pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher) + +exe = EXE( + pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='manage', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=True, + disable_windowed_traceback=False, + argv_emulation=False, + target_arch=None, + codesign_identity=None, + entitlements_file=None, +) diff --git a/package.json b/package.json deleted file mode 100644 index 2b7363a..0000000 --- a/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "swing_music_client", - "version": "0.1.0.alpha", - "private": true, - "scripts": { - "dev": "vite", - "serve": "vite preview", - "build": "vite build --emptyOutDir --outDir ../swing-core/client", - "lint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src" - }, - "dependencies": { - "@formkit/auto-animate": "^1.0.0-beta.3", - "@popperjs/core": "^2.11.6", - "@vueuse/components": "^9.2.0", - "@vueuse/core": "^8.5.0", - "@vueuse/integrations": "^9.2.0", - "axios": "^0.26.1", - "fuse.js": "^6.6.2", - "pinia": "^2.0.17", - "pinia-plugin-persistedstate": "^2.1.1", - "sass": "^1.56.1", - "sass-loader": "^13.2.0", - "vite-svg-loader": "^3.4.0", - "vue": "^3.2.37", - "vue-debounce": "^3.0.2", - "vue-router": "^4.1.3", - "vue-template-compiler": "^2.0.0", - "vue-virtual-scroller": "^2.0.0-alpha.1", - "webpack": "^5.74.0" - }, - "devDependencies": { - "@vitejs/plugin-vue": "^3.2.0", - "eslint": "^8.7.0", - "eslint-plugin-vue": "^8.3.0", - "vite": "^3.0.4", - "vue-svg-loader": "^0.16.0" - }, - "packageManager": "yarn@3.1.1" -} diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..a21d58c --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1135 @@ +[[package]] +name = "altgraph" +version = "0.17.3" +description = "Python graph (network) package" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "astroid" +version = "2.12.12" +description = "An abstract syntax tree for Python with inference support." +category = "main" +optional = false +python-versions = ">=3.7.2" + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] + +[[package]] +name = "attrs" +version = "22.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit", "cloudpickle"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "zope.interface", "cloudpickle"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "mypy (>=0.900,!=0.940)", "pytest-mypy-plugins", "cloudpickle"] + +[[package]] +name = "black" +version = "22.6.0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2022.5.18.1" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "charset-normalizer" +version = "2.0.12" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.5.0" + +[package.extras] +unicode_backport = ["unicodedata2"] + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" + +[[package]] +name = "colorgram.py" +version = "1.2.0" +description = "A Python module for extracting colors from images. Get a palette of any picture!" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +pillow = ">=3.3.1" + +[[package]] +name = "dill" +version = "0.3.6" +description = "serialize all of python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "exceptiongroup" +version = "1.0.0rc9" +description = "Backport of PEP 654 (exception groups)" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "flask" +version = "2.1.2" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +click = ">=8.0" +itsdangerous = ">=2.0" +Jinja2 = ">=3.0" +Werkzeug = ">=2.0" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flask-cors" +version = "3.0.10" +description = "A Flask extension adding a decorator for CORS support" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +Flask = ">=0.9" +Six = "*" + +[[package]] +name = "future" +version = "0.18.2" +description = "Clean single-source support for Python 3 and 2" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "gunicorn" +version = "20.1.0" +description = "WSGI HTTP Server for UNIX" +category = "main" +optional = false +python-versions = ">=3.5" + +[package.extras] +eventlet = ["eventlet (>=0.24.1)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] +tornado = ["tornado (>=0.2)"] + +[[package]] +name = "hypothesis" +version = "6.56.3" +description = "A library for property-based testing" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=19.2.0" +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +sortedcontainers = ">=2.1.0,<3.0.0" + +[package.extras] +all = ["black (>=19.10b0)", "click (>=7.0)", "django (>=3.2)", "dpcontracts (>=0.4)", "lark-parser (>=0.6.5)", "libcst (>=0.3.16)", "numpy (>=1.9.0)", "pandas (>=1.0)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "importlib-metadata (>=3.6)", "backports.zoneinfo (>=0.2.1)", "tzdata (>=2022.5)"] +cli = ["click (>=7.0)", "black (>=19.10b0)", "rich (>=9.0.0)"] +codemods = ["libcst (>=0.3.16)"] +dateutil = ["python-dateutil (>=1.4)"] +django = ["django (>=3.2)"] +dpcontracts = ["dpcontracts (>=0.4)"] +ghostwriter = ["black (>=19.10b0)"] +lark = ["lark-parser (>=0.6.5)"] +numpy = ["numpy (>=1.9.0)"] +pandas = ["pandas (>=1.0)"] +pytest = ["pytest (>=4.6)"] +pytz = ["pytz (>=2014.1)"] +redis = ["redis (>=3.0.0)"] +zoneinfo = ["backports.zoneinfo (>=0.2.1)", "tzdata (>=2022.5)"] + +[[package]] +name = "idna" +version = "3.3" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "iniconfig" +version = "1.1.1" +description = "iniconfig: brain-dead simple config-ini parsing" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "isort" +version = "5.10.1" +description = "A Python utility / library to sort Python imports." +category = "main" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "lazy-object-proxy" +version = "1.8.0" +description = "A fast and thorough lazy object proxy." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "macholib" +version = "1.16.2" +description = "Mach-O header analysis and editing" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +altgraph = ">=0.17" + +[[package]] +name = "markupsafe" +version = "2.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "packaging" +version = "21.3" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "pefile" +version = "2022.5.30" +description = "Python PE parsing module" +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.dependencies] +future = "*" + +[[package]] +name = "pillow" +version = "9.2.0" +description = "Python Imaging Library (Fork)" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +tests = ["pytest-timeout", "pytest-cov", "pytest", "pyroma", "packaging", "olefile", "markdown2", "defusedxml", "coverage", "check-manifest"] +docs = ["sphinxext-opengraph", "sphinx-removed-in", "sphinx-issues (>=3.0.1)", "sphinx-copybutton", "sphinx (>=2.4)", "olefile", "furo"] + +[[package]] +name = "platformdirs" +version = "2.5.2" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)", "sphinx (>=4)"] +test = ["appdirs (==1.4.4)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)", "pytest (>=6)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +testing = ["pytest-benchmark", "pytest"] +dev = ["tox", "pre-commit"] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pyinstaller" +version = "5.7.0" +description = "PyInstaller bundles a Python application and all its dependencies into a single package." +category = "main" +optional = false +python-versions = "<3.12,>=3.7" + +[package.dependencies] +altgraph = "*" +macholib = {version = ">=1.8", markers = "sys_platform == \"darwin\""} +pefile = {version = ">=2022.5.30", markers = "sys_platform == \"win32\""} +pyinstaller-hooks-contrib = ">=2021.4" +pywin32-ctypes = {version = ">=0.2.0", markers = "sys_platform == \"win32\""} + +[package.extras] +encryption = ["tinyaes (>=1.0.0)"] +hook_testing = ["pytest (>=2.7.3)", "execnet (>=1.5.0)", "psutil"] + +[[package]] +name = "pyinstaller-hooks-contrib" +version = "2022.14" +description = "Community maintained hooks for PyInstaller" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "pylint" +version = "2.15.5" +description = "python code static checker" +category = "main" +optional = false +python-versions = ">=3.7.2" + +[package.dependencies] +astroid = ">=2.12.12,<=2.14.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = ">=0.2" +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pyparsing" +version = "3.0.9" +description = "pyparsing module - Classes and methods to define and execute parsing grammars" +category = "main" +optional = false +python-versions = ">=3.6.8" + +[package.extras] +diagrams = ["railroad-diagrams", "jinja2"] + +[[package]] +name = "pytest" +version = "7.1.3" +description = "pytest: simple powerful testing with Python" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +tomli = ">=1.0.0" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.0" +description = "" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "rapidfuzz" +version = "2.13.7" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +full = ["numpy"] + +[[package]] +name = "requests" +version = "2.27.1" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} +idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "tinytag" +version = "1.8.1" +description = "Read music meta data and length of MP3, OGG, OPUS, MP4, M4A, FLAC, WMA and Wave files" +category = "main" +optional = false +python-versions = ">=2.7" + +[package.extras] +tests = ["pytest", "pytest-cov", "flake8"] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +category = "main" +optional = false +python-versions = ">=3.7" + +[[package]] +name = "tomlkit" +version = "0.11.6" +description = "Style preserving TOML library" +category = "main" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "tqdm" +version = "4.64.0" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "unidecode" +version = "1.3.6" +description = "ASCII transliterations of Unicode text" +category = "main" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "urllib3" +version = "1.26.9" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +brotli = ["brotlicffi (>=0.8.0)", "brotli (>=1.0.9)", "brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "watchdog" +version = "2.2.0" +description = "Filesystem events monitoring" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "werkzeug" +version = "2.1.2" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=3.7" + +[package.extras] +watchdog = ["watchdog"] + +[[package]] +name = "wrapt" +version = "1.14.1" +description = "Module for decorators, wrappers and monkey patching." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[metadata] +lock-version = "1.1" +python-versions = ">=3.10" +content-hash = "950730e47c15dd241301184fe9a8ff302d7f4411589d5d0b27067cdf0a7d46f5" + +[metadata.files] +altgraph = [ + {file = "altgraph-0.17.3-py2.py3-none-any.whl", hash = "sha256:c8ac1ca6772207179ed8003ce7687757c04b0b71536f81e2ac5755c6226458fe"}, + {file = "altgraph-0.17.3.tar.gz", hash = "sha256:ad33358114df7c9416cdb8fa1eaa5852166c505118717021c6a8c7c7abbd03dd"}, +] +astroid = [ + {file = "astroid-2.12.12-py3-none-any.whl", hash = "sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f"}, + {file = "astroid-2.12.12.tar.gz", hash = "sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83"}, +] +attrs = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] +black = [ + {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, + {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, + {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, + {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, + {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, + {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, + {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, + {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, + {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, + {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, + {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, + {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, + {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, + {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, + {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, + {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, + {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, + {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, + {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, + {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, + {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, +] +certifi = [ + {file = "certifi-2022.5.18.1-py3-none-any.whl", hash = "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a"}, + {file = "certifi-2022.5.18.1.tar.gz", hash = "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7"}, +] +charset-normalizer = [ + {file = "charset-normalizer-2.0.12.tar.gz", hash = "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597"}, + {file = "charset_normalizer-2.0.12-py3-none-any.whl", hash = "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df"}, +] +click = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] +colorama = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] +"colorgram.py" = [ + {file = "colorgram.py-1.2.0-py2.py3-none-any.whl", hash = "sha256:e990769fa6df7261a450c7d5bef3a1a062f09ba1214bff67b4d6f02970a1a27b"}, + {file = "colorgram.py-1.2.0.tar.gz", hash = "sha256:e77766a5f9de7207bdef8f1c22a702cbf09630eae3bc46a450b9d9f12a7bfdbf"}, +] +dill = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] +exceptiongroup = [ + {file = "exceptiongroup-1.0.0rc9-py3-none-any.whl", hash = "sha256:2e3c3fc1538a094aab74fad52d6c33fc94de3dfee3ee01f187c0e0c72aec5337"}, + {file = "exceptiongroup-1.0.0rc9.tar.gz", hash = "sha256:9086a4a21ef9b31c72181c77c040a074ba0889ee56a7b289ff0afb0d97655f96"}, +] +flask = [ + {file = "Flask-2.1.2-py3-none-any.whl", hash = "sha256:fad5b446feb0d6db6aec0c3184d16a8c1f6c3e464b511649c8918a9be100b4fe"}, + {file = "Flask-2.1.2.tar.gz", hash = "sha256:315ded2ddf8a6281567edb27393010fe3406188bafbfe65a3339d5787d89e477"}, +] +flask-cors = [ + {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, + {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, +] +future = [ + {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, +] +gunicorn = [ + {file = "gunicorn-20.1.0-py3-none-any.whl", hash = "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e"}, + {file = "gunicorn-20.1.0.tar.gz", hash = "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8"}, +] +hypothesis = [ + {file = "hypothesis-6.56.3-py3-none-any.whl", hash = "sha256:802d236d03dbd54e0e1c55c0daa2ec41aeaadc87a4dcbb41421b78bf3f7a7789"}, + {file = "hypothesis-6.56.3.tar.gz", hash = "sha256:15dae5d993339aefa57e00f5cb5a5817ff300eeb661d96d1c9d094eb62b04c9a"}, +] +idna = [ + {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, + {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, +] +iniconfig = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] +isort = [ + {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, + {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, +] +itsdangerous = [ + {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, + {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, +] +jinja2 = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] +lazy-object-proxy = [ + {file = "lazy-object-proxy-1.8.0.tar.gz", hash = "sha256:c219a00245af0f6fa4e95901ed28044544f50152840c5b6a3e7b2568db34d156"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4fd031589121ad46e293629b39604031d354043bb5cdf83da4e93c2d7f3389fe"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:b70d6e7a332eb0217e7872a73926ad4fdc14f846e85ad6749ad111084e76df25"}, + {file = "lazy_object_proxy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:eb329f8d8145379bf5dbe722182410fe8863d186e51bf034d2075eb8d85ee25b"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4e2d9f764f1befd8bdc97673261b8bb888764dfdbd7a4d8f55e4fbcabb8c3fb7"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:e20bfa6db17a39c706d24f82df8352488d2943a3b7ce7d4c22579cb89ca8896e"}, + {file = "lazy_object_proxy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:14010b49a2f56ec4943b6cf925f597b534ee2fe1f0738c84b3bce0c1a11ff10d"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6850e4aeca6d0df35bb06e05c8b934ff7c533734eb51d0ceb2d63696f1e6030c"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:5b51d6f3bfeb289dfd4e95de2ecd464cd51982fe6f00e2be1d0bf94864d58acd"}, + {file = "lazy_object_proxy-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:6f593f26c470a379cf7f5bc6db6b5f1722353e7bf937b8d0d0b3fba911998858"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c1c7c0433154bb7c54185714c6929acc0ba04ee1b167314a779b9025517eada"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:d176f392dbbdaacccf15919c77f526edf11a34aece58b55ab58539807b85436f"}, + {file = "lazy_object_proxy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:afcaa24e48bb23b3be31e329deb3f1858f1f1df86aea3d70cb5c8578bfe5261c"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:71d9ae8a82203511a6f60ca5a1b9f8ad201cac0fc75038b2dc5fa519589c9288"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:8f6ce2118a90efa7f62dd38c7dbfffd42f468b180287b748626293bf12ed468f"}, + {file = "lazy_object_proxy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:eac3a9a5ef13b332c059772fd40b4b1c3d45a3a2b05e33a361dee48e54a4dad0"}, + {file = "lazy_object_proxy-1.8.0-pp37-pypy37_pp73-any.whl", hash = "sha256:ae032743794fba4d171b5b67310d69176287b5bf82a21f588282406a79498891"}, + {file = "lazy_object_proxy-1.8.0-pp38-pypy38_pp73-any.whl", hash = "sha256:7e1561626c49cb394268edd00501b289053a652ed762c58e1081224c8d881cec"}, + {file = "lazy_object_proxy-1.8.0-pp39-pypy39_pp73-any.whl", hash = "sha256:ce58b2b3734c73e68f0e30e4e725264d4d6be95818ec0a0be4bb6bf9a7e79aa8"}, +] +macholib = [ + {file = "macholib-1.16.2-py2.py3-none-any.whl", hash = "sha256:44c40f2cd7d6726af8fa6fe22549178d3a4dfecc35a9cd15ea916d9c83a688e0"}, + {file = "macholib-1.16.2.tar.gz", hash = "sha256:557bbfa1bb255c20e9abafe7ed6cd8046b48d9525db2f9b77d3122a63a2a8bf8"}, +] +markupsafe = [ + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, + {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, + {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, + {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, + {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, + {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, +] +mccabe = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +packaging = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +pefile = [ + {file = "pefile-2022.5.30.tar.gz", hash = "sha256:a5488a3dd1fd021ce33f969780b88fe0f7eebb76eb20996d7318f307612a045b"}, +] +pillow = [ + {file = "Pillow-9.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a9c9bc489f8ab30906d7a85afac4b4944a572a7432e00698a7239f44a44e6efb"}, + {file = "Pillow-9.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:510cef4a3f401c246cfd8227b300828715dd055463cdca6176c2e4036df8bd4f"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7888310f6214f19ab2b6df90f3f06afa3df7ef7355fc025e78a3044737fab1f5"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831e648102c82f152e14c1a0938689dbb22480c548c8d4b8b248b3e50967b88c"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cc1d2451e8a3b4bfdb9caf745b58e6c7a77d2e469159b0d527a4554d73694d1"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:136659638f61a251e8ed3b331fc6ccd124590eeff539de57c5f80ef3a9594e58"}, + {file = "Pillow-9.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6e8c66f70fb539301e064f6478d7453e820d8a2c631da948a23384865cd95544"}, + {file = "Pillow-9.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:37ff6b522a26d0538b753f0b4e8e164fdada12db6c6f00f62145d732d8a3152e"}, + {file = "Pillow-9.2.0-cp310-cp310-win32.whl", hash = "sha256:c79698d4cd9318d9481d89a77e2d3fcaeff5486be641e60a4b49f3d2ecca4e28"}, + {file = "Pillow-9.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:254164c57bab4b459f14c64e93df11eff5ded575192c294a0c49270f22c5d93d"}, + {file = "Pillow-9.2.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:408673ed75594933714482501fe97e055a42996087eeca7e5d06e33218d05aa8"}, + {file = "Pillow-9.2.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:727dd1389bc5cb9827cbd1f9d40d2c2a1a0c9b32dd2261db522d22a604a6eec9"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50dff9cc21826d2977ef2d2a205504034e3a4563ca6f5db739b0d1026658e004"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb6259196a589123d755380b65127ddc60f4c64b21fc3bb46ce3a6ea663659b0"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b0554af24df2bf96618dac71ddada02420f946be943b181108cac55a7a2dcd4"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:15928f824870535c85dbf949c09d6ae7d3d6ac2d6efec80f3227f73eefba741c"}, + {file = "Pillow-9.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:bdd0de2d64688ecae88dd8935012c4a72681e5df632af903a1dca8c5e7aa871a"}, + {file = "Pillow-9.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d5b87da55a08acb586bad5c3aa3b86505f559b84f39035b233d5bf844b0834b1"}, + {file = "Pillow-9.2.0-cp311-cp311-win32.whl", hash = "sha256:b6d5e92df2b77665e07ddb2e4dbd6d644b78e4c0d2e9272a852627cdba0d75cf"}, + {file = "Pillow-9.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6bf088c1ce160f50ea40764f825ec9b72ed9da25346216b91361eef8ad1b8f8c"}, + {file = "Pillow-9.2.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:2c58b24e3a63efd22554c676d81b0e57f80e0a7d3a5874a7e14ce90ec40d3069"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef7592281f7c174d3d6cbfbb7ee5984a671fcd77e3fc78e973d492e9bf0eb3f"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dcd7b9c7139dc8258d164b55696ecd16c04607f1cc33ba7af86613881ffe4ac8"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a138441e95562b3c078746a22f8fca8ff1c22c014f856278bdbdd89ca36cff1b"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:93689632949aff41199090eff5474f3990b6823404e45d66a5d44304e9cdc467"}, + {file = "Pillow-9.2.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:f3fac744f9b540148fa7715a435d2283b71f68bfb6d4aae24482a890aed18b59"}, + {file = "Pillow-9.2.0-cp37-cp37m-win32.whl", hash = "sha256:fa768eff5f9f958270b081bb33581b4b569faabf8774726b283edb06617101dc"}, + {file = "Pillow-9.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:69bd1a15d7ba3694631e00df8de65a8cb031911ca11f44929c97fe05eb9b6c1d"}, + {file = "Pillow-9.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:030e3460861488e249731c3e7ab59b07c7853838ff3b8e16aac9561bb345da14"}, + {file = "Pillow-9.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:74a04183e6e64930b667d321524e3c5361094bb4af9083db5c301db64cd341f3"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d33a11f601213dcd5718109c09a52c2a1c893e7461f0be2d6febc2879ec2402"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fd6f5e3c0e4697fa7eb45b6e93996299f3feee73a3175fa451f49a74d092b9f"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a647c0d4478b995c5e54615a2e5360ccedd2f85e70ab57fbe817ca613d5e63b8"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:4134d3f1ba5f15027ff5c04296f13328fecd46921424084516bdb1b2548e66ff"}, + {file = "Pillow-9.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:bc431b065722a5ad1dfb4df354fb9333b7a582a5ee39a90e6ffff688d72f27a1"}, + {file = "Pillow-9.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1536ad017a9f789430fb6b8be8bf99d2f214c76502becc196c6f2d9a75b01b76"}, + {file = "Pillow-9.2.0-cp38-cp38-win32.whl", hash = "sha256:2ad0d4df0f5ef2247e27fc790d5c9b5a0af8ade9ba340db4a73bb1a4a3e5fb4f"}, + {file = "Pillow-9.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ec52c351b35ca269cb1f8069d610fc45c5bd38c3e91f9ab4cbbf0aebc136d9c8"}, + {file = "Pillow-9.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ed2c4ef2451de908c90436d6e8092e13a43992f1860275b4d8082667fbb2ffc"}, + {file = "Pillow-9.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ad2f835e0ad81d1689f1b7e3fbac7b01bb8777d5a985c8962bedee0cc6d43da"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea98f633d45f7e815db648fd7ff0f19e328302ac36427343e4432c84432e7ff4"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7761afe0126d046974a01e030ae7529ed0ca6a196de3ec6937c11df0df1bc91c"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a54614049a18a2d6fe156e68e188da02a046a4a93cf24f373bffd977e943421"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:5aed7dde98403cd91d86a1115c78d8145c83078e864c1de1064f52e6feb61b20"}, + {file = "Pillow-9.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:13b725463f32df1bfeacbf3dd197fb358ae8ebcd8c5548faa75126ea425ccb60"}, + {file = "Pillow-9.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:808add66ea764ed97d44dda1ac4f2cfec4c1867d9efb16a33d158be79f32b8a4"}, + {file = "Pillow-9.2.0-cp39-cp39-win32.whl", hash = "sha256:337a74fd2f291c607d220c793a8135273c4c2ab001b03e601c36766005f36885"}, + {file = "Pillow-9.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:fac2d65901fb0fdf20363fbd345c01958a742f2dc62a8dd4495af66e3ff502a4"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-macosx_10_10_x86_64.whl", hash = "sha256:ad2277b185ebce47a63f4dc6302e30f05762b688f8dc3de55dbae4651872cdf3"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c7b502bc34f6e32ba022b4a209638f9e097d7a9098104ae420eb8186217ebbb"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d1f14f5f691f55e1b47f824ca4fdcb4b19b4323fe43cc7bb105988cad7496be"}, + {file = "Pillow-9.2.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:dfe4c1fedfde4e2fbc009d5ad420647f7730d719786388b7de0999bf32c0d9fd"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:f07f1f00e22b231dd3d9b9208692042e29792d6bd4f6639415d2f23158a80013"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1802f34298f5ba11d55e5bb09c31997dc0c6aed919658dfdf0198a2fe75d5490"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17d4cafe22f050b46d983b71c707162d63d796a1235cdf8b9d7a112e97b15bac"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96b5e6874431df16aee0c1ba237574cb6dff1dcb173798faa6a9d8b399a05d0e"}, + {file = "Pillow-9.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:0030fdbd926fb85844b8b92e2f9449ba89607231d3dd597a21ae72dc7fe26927"}, + {file = "Pillow-9.2.0.tar.gz", hash = "sha256:75e636fd3e0fb872693f23ccb8a5ff2cd578801251f3a4f6854c6a5d437d3c04"}, +] +platformdirs = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] +pluggy = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] +py = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] +pyinstaller = [ + {file = "pyinstaller-5.7.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:b967ae71ab7b05e18608dbb4518da5afa54f0835927cb7a5ce52ab8fffed03b6"}, + {file = "pyinstaller-5.7.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:3180b9bf22263380adc5e2ee051b7c21463292877215bbe70c9155dc76f4b966"}, + {file = "pyinstaller-5.7.0-py3-none-manylinux2014_i686.whl", hash = "sha256:0f80e2403e76630ad3392c71f09c1a4284e8d8a8a99fb55ff3a0aba0e06300ed"}, + {file = "pyinstaller-5.7.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:2c1dd9d11cfc48bab61eeb06de69a3d1ad742bbb2ef14716965ca0333dd43a5b"}, + {file = "pyinstaller-5.7.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:dfc12e92fe10ae645dd0dd1fcfa4cd7677b2e96119e3cd4980d742e09bb78925"}, + {file = "pyinstaller-5.7.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f35f06d48faea0ad738429c009941059beebaa306e9d9ead95f1df4b441de2aa"}, + {file = "pyinstaller-5.7.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:28a8a0da656493aa32d9665e2f6f84775da0f23174859ed8facaa4226fe77a17"}, + {file = "pyinstaller-5.7.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:1ac3f09b838710c43e34b0a7ad003bd168a754b0b786c561b47baf1af9104354"}, + {file = "pyinstaller-5.7.0-py3-none-win32.whl", hash = "sha256:9cdb8ee8622ee8d2c6cd67f001b610019d4371a8bf3f7850562640ce786894d7"}, + {file = "pyinstaller-5.7.0-py3-none-win_amd64.whl", hash = "sha256:9b47c10fbefac6f6493266f8b1689109b2b14efa9142dbd2cd7549226a4568b7"}, + {file = "pyinstaller-5.7.0-py3-none-win_arm64.whl", hash = "sha256:3e51e18a16dec0414079762843cf892a5d70749ad56ca7b3c7b5f8367dc50b1e"}, + {file = "pyinstaller-5.7.0.tar.gz", hash = "sha256:0e5953937d35f0b37543cc6915dacaf3239bcbdf3fd3ecbb7866645468a16775"}, +] +pyinstaller-hooks-contrib = [ + {file = "pyinstaller-hooks-contrib-2022.14.tar.gz", hash = "sha256:5ae8da3a92cf20e37b3e00604d0c3468896e7d746e5c1449473597a724331b0b"}, + {file = "pyinstaller_hooks_contrib-2022.14-py2.py3-none-any.whl", hash = "sha256:1a125838a22d7b35a18993c6e56d3c5cc3ad7da00954f95bc5606523939203f2"}, +] +pylint = [ + {file = "pylint-2.15.5-py3-none-any.whl", hash = "sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004"}, + {file = "pylint-2.15.5.tar.gz", hash = "sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df"}, +] +pyparsing = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] +pytest = [ + {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, + {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, +] +pywin32-ctypes = [ + {file = "pywin32-ctypes-0.2.0.tar.gz", hash = "sha256:24ffc3b341d457d48e8922352130cf2644024a4ff09762a2261fd34c36ee5942"}, + {file = "pywin32_ctypes-0.2.0-py2.py3-none-any.whl", hash = "sha256:9dc2d991b3479cc2df15930958b674a48a227d5361d413827a4cfd0b5876fc98"}, +] +rapidfuzz = [ + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b75dd0928ce8e216f88660ab3d5c5ffe990f4dd682fd1709dba29d5dafdde6de"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:24d3fea10680d085fd0a4d76e581bfb2b1074e66e78fd5964d4559e1fcd2a2d4"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8109e0324d21993d5b2d111742bf5958f3516bf8c59f297c5d1cc25a2342eb66"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f705652360d520c2de52bee11100c92f59b3e3daca308ebb150cbc58aecdad"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7496e8779905b02abc0ab4ba2a848e802ab99a6e20756ffc967a0de4900bd3da"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:24eb6b843492bdc63c79ee4b2f104059b7a2201fef17f25177f585d3be03405a"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:467c1505362823a5af12b10234cb1c4771ccf124c00e3fc9a43696512bd52293"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53dcae85956853b787c27c1cb06f18bb450e22cf57a4ad3444cf03b8ff31724a"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:46b9b8aa09998bc48dd800854e8d9b74bc534d7922c1d6e1bbf783e7fa6ac29c"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:1fbad8fb28d98980f5bff33c7842efef0315d42f0cd59082108482a7e6b61410"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:43fb8cb030f888c3f076d40d428ed5eb4331f5dd6cf1796cfa39c67bf0f0fc1e"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:b6bad92de071cbffa2acd4239c1779f66851b60ffbbda0e4f4e8a2e9b17e7eef"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d00df2e4a81ffa56a6b1ec4d2bc29afdcb7f565e0b8cd3092fece2290c4c7a79"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-win32.whl", hash = "sha256:2c836f0f2d33d4614c3fbaf9a1eb5407c0fe23f8876f47fd15b90f78daa64c34"}, + {file = "rapidfuzz-2.13.7-cp310-cp310-win_amd64.whl", hash = "sha256:c36fd260084bb636b9400bb92016c6bd81fd80e59ed47f2466f85eda1fc9f782"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b34e8c0e492949ecdd5da46a1cfc856a342e2f0389b379b1a45a3cdcd3176a6e"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:875d51b3497439a72e2d76183e1cb5468f3f979ab2ddfc1d1f7dde3b1ecfb42f"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ae33a72336059213996fe4baca4e0e4860913905c2efb7c991eab33b95a98a0a"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5585189b3d90d81ccd62d4f18530d5ac8972021f0aaaa1ffc6af387ff1dce75"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42085d4b154a8232767de8296ac39c8af5bccee6b823b0507de35f51c9cbc2d7"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:585206112c294e335d84de5d5f179c0f932837752d7420e3de21db7fdc476278"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f891b98f8bc6c9d521785816085e9657212621e93f223917fb8e32f318b2957e"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08590905a95ccfa43f4df353dcc5d28c15d70664299c64abcad8721d89adce4f"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b5dd713a1734574c2850c566ac4286594bacbc2d60b9170b795bee4b68656625"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:988f8f6abfba7ee79449f8b50687c174733b079521c3cc121d65ad2d38831846"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b3210869161a864f3831635bb13d24f4708c0aa7208ef5baac1ac4d46e9b4208"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f6fe570e20e293eb50491ae14ddeef71a6a7e5f59d7e791393ffa99b13f1f8c2"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6120f2995f5154057454c5de99d86b4ef3b38397899b5da1265467e8980b2f60"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-win32.whl", hash = "sha256:b20141fa6cee041917801de0bab503447196d372d4c7ee9a03721b0a8edf5337"}, + {file = "rapidfuzz-2.13.7-cp311-cp311-win_amd64.whl", hash = "sha256:ec55a81ac2b0f41b8d6fb29aad16e55417036c7563bad5568686931aa4ff08f7"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7d005e058d86f2a968a8d28ca6f2052fab1f124a39035aa0523261d6baf21e1f"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fe59a0c21a032024edb0c8e43f5dee5623fef0b65a1e3c1281836d9ce199af3b"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfc04f7647c29fb48da7a04082c34cdb16f878d3c6d098d62d5715c0ad3000c"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68a89bb06d5a331511961f4d3fa7606f8e21237467ba9997cae6f67a1c2c2b9e"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:effe182767d102cb65dfbbf74192237dbd22d4191928d59415aa7d7c861d8c88"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25b4cedf2aa19fb7212894ce5f5219010cce611b60350e9a0a4d492122e7b351"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3a9bd02e1679c0fd2ecf69b72d0652dbe2a9844eaf04a36ddf4adfbd70010e95"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5e2b3d020219baa75f82a4e24b7c8adcb598c62f0e54e763c39361a9e5bad510"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:cf62dacb3f9234f3fddd74e178e6d25c68f2067fde765f1d95f87b1381248f58"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:fa263135b892686e11d5b84f6a1892523123a00b7e5882eff4fbdabb38667347"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fa4c598ed77f74ec973247ca776341200b0f93ec3883e34c222907ce72cb92a4"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-win32.whl", hash = "sha256:c2523f8180ebd9796c18d809e9a19075a1060b1a170fde3799e83db940c1b6d5"}, + {file = "rapidfuzz-2.13.7-cp37-cp37m-win_amd64.whl", hash = "sha256:5ada0a14c67452358c1ee52ad14b80517a87b944897aaec3e875279371a9cb96"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ca8a23097c1f50e0fdb4de9e427537ca122a18df2eead06ed39c3a0bef6d9d3a"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9be02162af0376d64b840f2fc8ee3366794fc149f1e06d095a6a1d42447d97c5"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af4f7c3c904ca709493eb66ca9080b44190c38e9ecb3b48b96d38825d5672559"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f50d1227e6e2a0e3ae1fb1c9a2e1c59577d3051af72c7cab2bcc430cb5e18da"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c71d9d512b76f05fa00282227c2ae884abb60e09f08b5ca3132b7e7431ac7f0d"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b52ac2626945cd21a2487aeefed794c14ee31514c8ae69b7599170418211e6f6"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca00fafd2756bc9649bf80f1cf72c647dce38635f0695d7ce804bc0f759aa756"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d248a109699ce9992304e79c1f8735c82cc4c1386cd8e27027329c0549f248a2"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c88adbcb933f6b8612f6c593384bf824e562bb35fc8a0f55fac690ab5b3486e5"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8601a66fbfc0052bb7860d2eacd303fcde3c14e87fdde409eceff516d659e77"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:27be9c63215d302ede7d654142a2e21f0d34ea6acba512a4ae4cfd52bbaa5b59"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3dcffe1f3cbda0dc32133a2ae2255526561ca594f15f9644384549037b355245"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8450d15f7765482e86ef9be2ad1a05683cd826f59ad236ef7b9fb606464a56aa"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-win32.whl", hash = "sha256:460853983ab88f873173e27cc601c5276d469388e6ad6e08c4fd57b2a86f1064"}, + {file = "rapidfuzz-2.13.7-cp38-cp38-win_amd64.whl", hash = "sha256:424f82c35dbe4f83bdc3b490d7d696a1dc6423b3d911460f5493b7ffae999fd2"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c3fbe449d869ea4d0909fc9d862007fb39a584fb0b73349a6aab336f0d90eaed"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:16080c05a63d6042643ae9b6cfec1aefd3e61cef53d0abe0df3069b9d4b72077"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dbcf5371ea704759fcce772c66a07647751d1f5dbdec7818331c9b31ae996c77"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:114810491efb25464016fd554fdf1e20d390309cecef62587494fc474d4b926f"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a84ab9ac9a823e7e93b4414f86344052a5f3e23b23aa365cda01393ad895bd"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81642a24798851b118f82884205fc1bd9ff70b655c04018c467824b6ecc1fabc"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3741cb0bf9794783028e8b0cf23dab917fa5e37a6093b94c4c2f805f8e36b9f"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:759a3361711586a29bc753d3d1bdb862983bd9b9f37fbd7f6216c24f7c972554"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1333fb3d603d6b1040e365dca4892ba72c7e896df77a54eae27dc07db90906e3"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:916bc2e6cf492c77ad6deb7bcd088f0ce9c607aaeabc543edeb703e1fbc43e31"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:23524635840500ce6f4d25005c9529a97621689c85d2f727c52eed1782839a6a"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:ebe303cd9839af69dd1f7942acaa80b1ba90bacef2e7ded9347fbed4f1654672"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe56659ccadbee97908132135de4b875543353351e0c92e736b7c57aee298b5a"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-win32.whl", hash = "sha256:3f11a7eff7bc6301cd6a5d43f309e22a815af07e1f08eeb2182892fca04c86cb"}, + {file = "rapidfuzz-2.13.7-cp39-cp39-win_amd64.whl", hash = "sha256:e8914dad106dacb0775718e54bf15e528055c4e92fb2677842996f2d52da5069"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f7930adf84301797c3f09c94b9c5a9ed90a9e8b8ed19b41d2384937e0f9f5bd"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c31022d9970177f6affc6d5dd757ed22e44a10890212032fabab903fdee3bfe7"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f42b82f268689f429def9ecfb86fa65ceea0eaf3fed408b570fe113311bf5ce7"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b477b43ced896301665183a5e0faec0f5aea2373005648da8bdcb3c4b73f280"}, + {file = "rapidfuzz-2.13.7-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d63def9bbc6b35aef4d76dc740301a4185867e8870cbb8719ec9de672212fca8"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c66546e30addb04a16cd864f10f5821272a1bfe6462ee5605613b4f1cb6f7b48"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f799d1d6c33d81e983d3682571cc7d993ae7ff772c19b3aabb767039c33f6d1e"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d82f20c0060ffdaadaf642b88ab0aa52365b56dffae812e188e5bdb998043588"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:042644133244bfa7b20de635d500eb9f46af7097f3d90b1724f94866f17cb55e"}, + {file = "rapidfuzz-2.13.7-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:75c45dcd595f8178412367e302fd022860ea025dc4a78b197b35428081ed33d5"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3d8b081988d0a49c486e4e845a547565fee7c6e7ad8be57ff29c3d7c14c6894c"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:16ffad751f43ab61001187b3fb4a9447ec2d1aedeff7c5bac86d3b95f9980cc3"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020858dd89b60ce38811cd6e37875c4c3c8d7fcd8bc20a0ad2ed1f464b34dc4e"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda1e2f66bb4ba7261a0f4c2d052d5d909798fca557cbff68f8a79a87d66a18f"}, + {file = "rapidfuzz-2.13.7-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b6389c50d8d214c9cd11a77f6d501529cb23279a9c9cafe519a3a4b503b5f72a"}, + {file = "rapidfuzz-2.13.7.tar.gz", hash = "sha256:8d3e252d4127c79b4d7c2ae47271636cbaca905c8bb46d80c7930ab906cf4b5c"}, +] +requests = [ + {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, + {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +sortedcontainers = [ + {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, + {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, +] +tinytag = [ + {file = "tinytag-1.8.1.tar.gz", hash = "sha256:363ab3107831a5598b68aaa061aba915fb1c7b4254d770232e65d5db8487636d"}, +] +tomli = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] +tomlkit = [ + {file = "tomlkit-0.11.6-py3-none-any.whl", hash = "sha256:07de26b0d8cfc18f871aec595fda24d95b08fef89d147caa861939f37230bf4b"}, + {file = "tomlkit-0.11.6.tar.gz", hash = "sha256:71b952e5721688937fb02cf9d354dbcf0785066149d2855e44531ebdd2b65d73"}, +] +tqdm = [ + {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, + {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, +] +unidecode = [ + {file = "Unidecode-1.3.6-py3-none-any.whl", hash = "sha256:547d7c479e4f377b430dd91ac1275d593308dce0fc464fb2ab7d41f82ec653be"}, + {file = "Unidecode-1.3.6.tar.gz", hash = "sha256:fed09cf0be8cf415b391642c2a5addfc72194407caee4f98719e40ec2a72b830"}, +] +urllib3 = [ + {file = "urllib3-1.26.9-py2.py3-none-any.whl", hash = "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14"}, + {file = "urllib3-1.26.9.tar.gz", hash = "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e"}, +] +watchdog = [ + {file = "watchdog-2.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed91c3ccfc23398e7aa9715abf679d5c163394b8cad994f34f156d57a7c163dc"}, + {file = "watchdog-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:76a2743402b794629a955d96ea2e240bd0e903aa26e02e93cd2d57b33900962b"}, + {file = "watchdog-2.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:920a4bda7daa47545c3201a3292e99300ba81ca26b7569575bd086c865889090"}, + {file = "watchdog-2.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ceaa9268d81205876bedb1069f9feab3eccddd4b90d9a45d06a0df592a04cae9"}, + {file = "watchdog-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1893d425ef4fb4f129ee8ef72226836619c2950dd0559bba022b0818c63a7b60"}, + {file = "watchdog-2.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e99c1713e4436d2563f5828c8910e5ff25abd6ce999e75f15c15d81d41980b6"}, + {file = "watchdog-2.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a5bd9e8656d07cae89ac464ee4bcb6f1b9cecbedc3bf1334683bed3d5afd39ba"}, + {file = "watchdog-2.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a048865c828389cb06c0bebf8a883cec3ae58ad3e366bcc38c61d8455a3138f"}, + {file = "watchdog-2.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e722755d995035dd32177a9c633d158f2ec604f2a358b545bba5bed53ab25bca"}, + {file = "watchdog-2.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:af4b5c7ba60206759a1d99811b5938ca666ea9562a1052b410637bb96ff97512"}, + {file = "watchdog-2.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:619d63fa5be69f89ff3a93e165e602c08ed8da402ca42b99cd59a8ec115673e1"}, + {file = "watchdog-2.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f2b0665c57358ce9786f06f5475bc083fea9d81ecc0efa4733fd0c320940a37"}, + {file = "watchdog-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:441024df19253bb108d3a8a5de7a186003d68564084576fecf7333a441271ef7"}, + {file = "watchdog-2.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a410dd4d0adcc86b4c71d1317ba2ea2c92babaf5b83321e4bde2514525544d5"}, + {file = "watchdog-2.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28704c71afdb79c3f215c90231e41c52b056ea880b6be6cee035c6149d658ed1"}, + {file = "watchdog-2.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2ac0bd7c206bb6df78ef9e8ad27cc1346f2b41b1fef610395607319cdab89bc1"}, + {file = "watchdog-2.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:27e49268735b3c27310883012ab3bd86ea0a96dcab90fe3feb682472e30c90f3"}, + {file = "watchdog-2.2.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:2af1a29fd14fc0a87fb6ed762d3e1ae5694dcde22372eebba50e9e5be47af03c"}, + {file = "watchdog-2.2.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:c7bd98813d34bfa9b464cf8122e7d4bec0a5a427399094d2c17dd5f70d59bc61"}, + {file = "watchdog-2.2.0-py3-none-manylinux2014_i686.whl", hash = "sha256:56fb3f40fc3deecf6e518303c7533f5e2a722e377b12507f6de891583f1b48aa"}, + {file = "watchdog-2.2.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:74535e955359d79d126885e642d3683616e6d9ab3aae0e7dcccd043bd5a3ff4f"}, + {file = "watchdog-2.2.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:cf05e6ff677b9655c6e9511d02e9cc55e730c4e430b7a54af9c28912294605a4"}, + {file = "watchdog-2.2.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:d6ae890798a3560688b441ef086bb66e87af6b400a92749a18b856a134fc0318"}, + {file = "watchdog-2.2.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:e5aed2a700a18c194c39c266900d41f3db0c1ebe6b8a0834b9995c835d2ca66e"}, + {file = "watchdog-2.2.0-py3-none-win32.whl", hash = "sha256:d0fb5f2b513556c2abb578c1066f5f467d729f2eb689bc2db0739daf81c6bb7e"}, + {file = "watchdog-2.2.0-py3-none-win_amd64.whl", hash = "sha256:1f8eca9d294a4f194ce9df0d97d19b5598f310950d3ac3dd6e8d25ae456d4c8a"}, + {file = "watchdog-2.2.0-py3-none-win_ia64.whl", hash = "sha256:ad0150536469fa4b693531e497ffe220d5b6cd76ad2eda474a5e641ee204bbb6"}, + {file = "watchdog-2.2.0.tar.gz", hash = "sha256:83cf8bc60d9c613b66a4c018051873d6273d9e45d040eed06d6a96241bd8ec01"}, +] +werkzeug = [ + {file = "Werkzeug-2.1.2-py3-none-any.whl", hash = "sha256:72a4b735692dd3135217911cbeaa1be5fa3f62bffb8745c5215420a03dc55255"}, + {file = "Werkzeug-2.1.2.tar.gz", hash = "sha256:1ce08e8093ed67d638d63879fd1ba3735817f7a80de3674d293f5984f25fb6e6"}, +] +wrapt = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] diff --git a/public/img/icons/android-chrome-192x192.png b/public/img/icons/android-chrome-192x192.png deleted file mode 100644 index 7f2351150e36d56db8b077a112a9461d68ded408..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10961 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 diff --git a/public/img/icons/android-chrome-512x512.png b/public/img/icons/android-chrome-512x512.png deleted file mode 100644 index 6a53405cc5f3faba61331b3ab3075487f0d93004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39338 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 E0H_@Gr2qf` diff --git a/public/img/icons/apple-touch-icon.png b/public/img/icons/apple-touch-icon.png deleted file mode 100644 index ecd3bb07983f40c65c16ff16691db1ce5aa69b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9776 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 diff --git a/public/img/icons/favicon-32x32.png b/public/img/icons/favicon-32x32.png deleted file mode 100644 index 1e1e0693dc1321c8d2b6a07a1a039b41ed4b3c88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1244 zcmV<21S9*2P)Px(mPtfGR9HvFmuqZPMHGO)*=`?O>hAUd)fT$cg%Z?YKx~YZD*6LOi5iWl)gM4X zVggFqLP0G;6l+?9O27npNC=6MDC!SV6HpUh*eF#V2K%(BDGe=b-!0wUUNg75_1?XA zA2FJqU%PW2^Ua+(XU+&>6h%>-z%t+gU_Rgi>$85z#CZMacuo zfoA|)H2Z*l82AXN6hbsa@(Bx|C`vN01K0q>$2f7QnHP8us1QO7nZ+;#P!wf0a1yxv zUrrqAb_sYw2+l>KR7dRHM#kD5*Uv5W!@Jwg{s)3TA)oU#^)SCcEeRg6d zRqhfT)|+$?Z6h75Z+r{CGNv030g$>~LWolNLj?$=+C}YY-`2X1pZn#Ix#Zbg>~z0^ z&5|@>aJ2JtKE7IOaJbKTH=A-+X~$)D+#ypm2yhr!skL~w{U~QVXCv zVO8zIZQJ7+53(lfsnA$Qgb=Glpu%;878$t`xuR%N=v+wIjFnh~h2qNfS>=hLKUZy*IQa3Xxo0{2Mu!=ad zSVa=xAh0@AtDsQQRK*`dtuaBokhz?b-Deo^j~BdTOA`6^c@$?oNvhQzF2*4V@CzV| zk3qV;*C}hNrpxPz31V5=VjfN}Bqh#NvVY(hOw`&r>2bgY9(4%3fjjb(v7#;!>jT}7P7A4x+fSVIC*gb1Ac56yFYxNMCrlIuc@%3}8^9z3JJFoth zsVRd#lvcopou9>k0ELc)Y<3y4Jm{;Yp=lwKd;N0b+sF$>E7^(DI51~BhdMst)9%wz zA!KG8p8Fs~Gl8rr=Hn~60kj;ge z$Sf&quBPM0Rf9UFmMj1v+i|riJwMQZ$JeJ`qiI$L?&KLHh{(@_Zm)++gUtp2nE|&= zam(@WO=-|;QrmJ3#N<6pG!T>bG}CV4q&-eUPtyPOJpUVxoYaCn7$1ZH0000GL;YU5@P?W)r6iI%ZOou1>uF>=6}-lHDc6(!#mR|n2I>fw(X zUpxQ517`&5Dt%RYruQFq9qohk)ImbSXr*|l^t&F~7wgxH{jINyQ$2^p6xyf(Y1s!7 z-e`KpL;GIa8{$~}fSu32(Ll~g{Fmd$u~qsqEpFZ-$M6c;t@7RDXUze}{9)Z!8#f7# z2Vs0BfjPBO@^H@|i(by(IOb-1qFLhPjB{8xm-;7rME67oSvuyg#)Epuwy=@`SjIZ` z+$XILC{uHieXGWo-?Fdty1DqKoyh}!14#RnEkMr&z{S8K;ALPBaN0tCGmmAgLlc)1 z0IxfM#lSIORA61w!0KiOpuH8i6*vjZ6i7=Rx2B^7>fa752j&XM>-H!*px!;e?pz7h z_>kv4K{}wE?Uu4@hD*ey{*!`suVJK8OeUS{R^w}b_Dyz68q(=lKT@IUkhifPkk9e9 z`+R%D2HQ5#?yN2UvA77nelRrEFE&^I#zCWO+wP`9os2R(^8tCBCpNg{lh=yU`vmu5 zH;he>if3w98D*31&8BDFBwO`yKq1$dW1hd(_@t5Fq0YA*yl79kkEphqQrdeLP?o(m z@y)gBfVWy+G4iC(pup`zm}E2WUF=l`C}tlZpLWe-TQ2l{W|Xh?sgw`0%~;2+$7$^Q z2B1u3Q$5A>t#rRf@!VX!RM!2V&FjOcI(kZ

Hzo;csOuMoOD)1kP!W!($ac70XM$ zCEH40?r7J0k=ji?ikhA?^0qS7UJ_JCmL)L9dne-JqxQX!ozg{br|Fxz4o?jR@mBj- zP#wF>&j&Nfeyn1#uzX^h-tf_bJno^PP&ItT=);+0uPJ*_G>_GX@^KJbN(#C5R_w%627cOK{ZW$YJe0A+Iy7@-&I=6999h$Nf3{Iz8V z&H)XgXQB%}YG}7ort+CQ@@Ze5uPcZw`|q9ah)2qQXxHZ)C~kg13{LfVcxxF&_@)i; zz%`7yyMO)u?{D1+`lMJ_@e>ct(={v57ml-qE{n2__V-BFyB=O9`9;mo;VhXtmu{;1 zwULJF)&SD}T6=(J|Ji%}MI$d=hnE{R;@rfoECr@LoAuvs+pVhTsoZ}o`JVlEhvA&5 z%YL?YjY!Nmx2=ylXd6@KSv}p;{Jbug-&ES(e=Qxh>Xo*mZ8{JA`}f#`hNcGe>hilS z(IkBoy)M69{txRq{0~chp#P+%2gpK%g|Xk$x&xrmd1jR!D3Hvty{ z7Xj}B76Oj|Yk)MQ+`x$ZW**B}hjmFq+M7I#XE_5hZwB5ATo3#hNaL3TMg`U-4Qa`P zyl$RlwIzGV$pdoTwg7Kz()g1hkOz5@XWneI0et5HZv(Cc1|D2co(+&UWl+|x%- zXDm>k{Z6{TGa$-851FSlUm0|vPy*jk z@$*Zohp*~B)QyxIV{dNVee|bJ)a^FEaX=Yu zug69P=}%e9(T4N=$3f~39f=nEzSX3!JMVb6r~k>Ex~(nNi8* znOU9Jbq0)g@Q%)XSE%UxQr_qK0CmjM+kpS{XNrC5%em+$N98l7*pGV#H!$Y&3hpL3 zMyhU<^g{m$H!J-=b+!E^eA9oT4`Kw~jfcrxU-2`+*p3bpxJPB|Vnu0sx>HuoaH-D9 z{Y_o(#3)Zo9%IuZ;+@vlBFA;z{I=Aui(-?h^FrVvAbs%w zNQzpFXV4gMFW{Wzdi??6Jz2#5_TJ*hKw=UIrhH53@TDa3sk$9E;} z%=G($hsz$2?;Q?Dj4%4Ng?;4Od;RpH&g#tPSI3h-Iz22ZhW;atbsrE1JN_izZrvf@ zs4%9>eT?y4Ki$Ie+4l#rpX;$pj{?q&Li|1A%!>Yx_MWn6XZT(v>Rp0gI~beg+mAGW zx;u?t8pN#1yT*#4%VKru{TcT=eGuNO4jW>pA?i@~%$!K6`;6e;kj`C(sqeScKZ>_r zO(Cipi>Z4mNN+3-&TL6E;BI}XV;!6H3(9-4`nP!F<8XI_g*r=Be8!m@@{cx>Z;v)r zncoEj>8r}PR;fGR*<}GLwv-kN-esk82c>k@Q_i`v!HejLjEA2(bN-~Yeg`M}#LEp& zr0tLCy06CGRt_7?wVx$W_sI5>wtrVsWF`(|;144oK z?NRQ|l%A%PKE}5C$K_kU*YVzi`yJmQeA4-ryx$GE(=_Qw-6Q!AXZt?IdG~>gZ9Loa zamQce8;O;r-*NEa*`NUaAK!JPaYwHFhfx2G_kp|*HT7wfJl@^&J!mqS6rc5c66lxG z|KT|~0x18DK4_r-%rjJ`wvv7Q=a!e`e5X#Qdyj}!W&XY??do2<`5kxNp&Htw{O8c~ zOVd~_{7vVWN9lLg+1|L(aaVt-|6ieg(uT?<>fNeAZJEWh)_S0fX(0_fKk|KBRDD%F z_Tvk6kBE`!At_M(&^I={2T*iONvplhQ>1#@fVKl! zcS(BUC)A$+S?2gv`;B+@x}K(Q+K>8C`(376efgj7(!=5@hWH_AedAY_{%OY#^)|5I z=}(6N&nSF5PrqNM*S`(=b1=i=hiS!cb$Q%>&h;IO?9*_sn>wU*f8-hm&Lz%0uQ5dCECFRvCS^yyH&S}LQ}DFwqVnJWIi2;VA}$}_2oi>dgGiW9I*o%u+^vq#qJ)2-K+|G(^k Hs6FsMy})4S diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index eb05362..0000000 --- a/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: diff --git a/pyinstaller.config.ini b/pyinstaller.config.ini new file mode 100644 index 0000000..9981586 --- /dev/null +++ b/pyinstaller.config.ini @@ -0,0 +1,3 @@ +[DEFAULT] +build = False + diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..9b1c7da --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,34 @@ +[tool.poetry] +name = "Swing music player" +version = "0.1.0" +description = "" +authors = ["geoffrey45 "] + +[tool.poetry.dependencies] +python = ">=3.10" +Flask = "^2.0.2" +Flask-Cors = "^3.0.10" +requests = "^2.27.1" +watchdog = "^2.2.0" +gunicorn = "^20.1.0" +Pillow = "^9.0.1" +"colorgram.py" = "^1.2.0" +tqdm = "^4.64.0" +rapidfuzz = "^2.13.7" +tinytag = "^1.8.1" +hypothesis = "^6.56.3" +pytest = "^7.1.3" +pylint = "^2.15.5" +Unidecode = "^1.3.6" +pyinstaller = "^5.7.0" + +[tool.poetry.dev-dependencies] +black = {version = "^22.6.0", allow-prereleases = true} + +[build-system] +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" + +[pytest] +console_output_style = "classic" +testpaths = "tests" diff --git a/rd-me-banner.png b/rd-me-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..3fa931f7778912d7f863b9af462573896b29ab7c GIT binary patch literal 33860 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 um!R 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 F{vVg%jF +- [ ] Removing song duplicates from queries +- [ ] Add support for WAV files +- [ ] Compress thumbnails + +# Features + + +## Needed features + +- [ ] Adding songs to queue + +- [ ] Add keyboard shortcuts +- [ ] Adjust volume +- [ ] Add listening statistics for all songs +- [ ] Extract color from artist image [for use with artist card gradient] +- [ ] Adding songs to favorites +- [ ] Playing song radio + +## Future features + +- [ ] Toggle shuffle +- [ ] Toggle repeat +- [ ] Suggest similar artists +- [ ] Getting artist info +- [ ] Create a Python script to build, bundle and serve the app +- [ ] Getting extra song info (probably from genius) +- [ ] Getting lyrics +- [ ] Sorting songs +- [ ] Suggest undiscorvered artists, albums and songs +- [ ] Remember last played song +- [ ] Add next and previous song transition and progress bar reset animations +- [ ] Add playlist to folder +- [ ] Add functionality to 'Listen now' button +- [ ] Paginated requests for songs +- [ ] Package app as installable PWA diff --git a/src/App.vue b/src/App.vue deleted file mode 100644 index 3cc7a14..0000000 --- a/src/App.vue +++ /dev/null @@ -1,120 +0,0 @@ - - - - - diff --git a/src/assets/googlesans.ttf b/src/assets/googlesans.ttf deleted file mode 100644 index e2c69c3fb94651237de80e67a69d458c55b45649..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109128 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 B-RJ-S diff --git a/src/assets/icons/a.svg b/src/assets/icons/a.svg deleted file mode 100644 index e8edc7e..0000000 --- a/src/assets/icons/a.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/assets/icons/add-to-queue.svg b/src/assets/icons/add-to-queue.svg deleted file mode 100644 index 20ca7dd..0000000 --- a/src/assets/icons/add-to-queue.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/assets/icons/add_to_queue.svg b/src/assets/icons/add_to_queue.svg deleted file mode 100644 index 67a7b53..0000000 --- a/src/assets/icons/add_to_queue.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/album.svg b/src/assets/icons/album.svg deleted file mode 100644 index 5f52fc7..0000000 --- a/src/assets/icons/album.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/arrow.svg b/src/assets/icons/arrow.svg deleted file mode 100644 index 65b600c..0000000 --- a/src/assets/icons/arrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/artist.svg b/src/assets/icons/artist.svg deleted file mode 100644 index 1ac9f0d..0000000 --- a/src/assets/icons/artist.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/cancel.svg b/src/assets/icons/cancel.svg deleted file mode 100644 index ad2e5d3..0000000 --- a/src/assets/icons/cancel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/clock.svg b/src/assets/icons/clock.svg deleted file mode 100644 index 8369a22..0000000 --- a/src/assets/icons/clock.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/assets/icons/delete.svg b/src/assets/icons/delete.svg deleted file mode 100644 index 2fc7289..0000000 --- a/src/assets/icons/delete.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/expand.svg b/src/assets/icons/expand.svg deleted file mode 100644 index 1434d41..0000000 --- a/src/assets/icons/expand.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/file.svg b/src/assets/icons/file.svg deleted file mode 100644 index 4a2a516..0000000 --- a/src/assets/icons/file.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/icons/folder-1.svg b/src/assets/icons/folder-1.svg deleted file mode 100644 index dfea337..0000000 --- a/src/assets/icons/folder-1.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/folder.fill.svg b/src/assets/icons/folder.fill.svg deleted file mode 100644 index e37dc4c..0000000 --- a/src/assets/icons/folder.fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/folder.svg b/src/assets/icons/folder.svg deleted file mode 100644 index 8827d6c..0000000 --- a/src/assets/icons/folder.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/grid.svg b/src/assets/icons/grid.svg deleted file mode 100644 index af9ee1e..0000000 --- a/src/assets/icons/grid.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/icons/heart.fill.svg b/src/assets/icons/heart.fill.svg deleted file mode 100644 index cd52039..0000000 --- a/src/assets/icons/heart.fill.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/heart.svg b/src/assets/icons/heart.svg deleted file mode 100644 index b189bf7..0000000 --- a/src/assets/icons/heart.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/home.svg b/src/assets/icons/home.svg deleted file mode 100644 index d1186bb..0000000 --- a/src/assets/icons/home.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/info.svg b/src/assets/icons/info.svg deleted file mode 100644 index 8c62247..0000000 --- a/src/assets/icons/info.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/assets/icons/logo-small-white-bg.svg b/src/assets/icons/logo-small-white-bg.svg deleted file mode 100644 index 47fa273..0000000 --- a/src/assets/icons/logo-small-white-bg.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/icons/logo-small.svg b/src/assets/icons/logo-small.svg deleted file mode 100644 index 3a17182..0000000 --- a/src/assets/icons/logo-small.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/more.svg b/src/assets/icons/more.svg deleted file mode 100644 index 32cf28b..0000000 --- a/src/assets/icons/more.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/src/assets/icons/next.svg b/src/assets/icons/next.svg deleted file mode 100644 index f1c9d48..0000000 --- a/src/assets/icons/next.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/pause.svg b/src/assets/icons/pause.svg deleted file mode 100644 index efd0485..0000000 --- a/src/assets/icons/pause.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/pin.svg b/src/assets/icons/pin.svg deleted file mode 100644 index 818e36e..0000000 --- a/src/assets/icons/pin.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/play-next.svg b/src/assets/icons/play-next.svg deleted file mode 100644 index 99c1387..0000000 --- a/src/assets/icons/play-next.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/assets/icons/play.svg b/src/assets/icons/play.svg deleted file mode 100644 index ba1a89c..0000000 --- a/src/assets/icons/play.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/playing.gif b/src/assets/icons/playing.gif deleted file mode 100644 index e49caf86d717eb8f1f4b1b9ec39f020bf9556d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5613 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 diff --git a/src/assets/icons/playing.webp b/src/assets/icons/playing.webp deleted file mode 100644 index 9d1923eff163dcfa7cdf1be9762bb8008b01621d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2076 zcmdUw`#;l*1I9nogv{)Wq_8c_t#w72HkX9WrL42L-$Ft$F}Z}wWlk=$jgiY-QWzaf zC=OCdAwv%3u5iq4DMTv1ou9sc!+BoM^V9Rw^Ljn6*ZTs|!a`mW036KE*xB0|IPL)e z0QM^mpnq*@V@H_V4FI4b0ATu`%H5bepJu>IdldKpKia@0f8YmA=Lb#>HU#GJxy{(w zmYk*Q?&(KWH2~bsjqQyeJ07DTlJ@kwWoM($J)yRpn*!u^cb8kGW_shpJDDTRIq5RU zs8$|1w?ny&E-mMrA}qLC_jK+;&f4Uiuc1L1>8u3C;%=)MzB4UAW|cUHzpso*kGLOg zZP2Uc|1<3Elhy)oA-spEuji_{=DpDYd2RXkR9J7NydmYIpZ}HbyW*%8uys`F> zT;+4#jh(B7bH=?l5yGbCweF_p>_1m0aPMdi9oQ1zpvu?o#vg`7QHG%kBV&=(z4&j4 zk@%Bk`K5*SNEg4Gw#dh{=K*!pnD?%_%h@H4%REzz)7KHF zErUQ|S9JSG{G_pR)dZK|CjT&{n9xe9Xa0Slu2BfbyEefC?HN$YoA)+!s?bY9rJ!ht znt`mJf9jo>Jsqp{7xsRIs#4^};>pGJWBDD?M`Zr8c9eh`ZkTRzyOh zKH*O$m$1L`Z3IJN9oEe!7cVXngDX7Hp>VeIW39S;?;1o$$P!7j9Jo_Rnm1P$P%8xp z20tnyPtAc_OyCYUbM1%8n-zwQ%G4BeO)A9Wg68f{>(M8?)6Cdb!<6|Ig;VR=W^Uy= z7uO-kCSDpu@qv}GkL#z>FIW*}HkRSKZ?<|a!ikfOUHB>DiHCGlz`JiB#_jw(ikeL1 zI~6h_Yg0T^A9*N#@44K0yzD^S{MOpt-ht`f z89T+(kfFIGU4OMH?q#v>-tzNoncJJXeWI=-H$z-cjvy~5mkb)ve#9KQw)v{$XMQUH ztCQg}SQeuk!jsy1J$C{VSg`YJxXXJogJ>Dv`eE~n@EqK-nHE4a zl0SQsp=BCPxR7Uk!UATSBHWWJ>4hPFy~<7!2k~f~s6Q-;zAs6RZtDF!c13N8dXuxf zS*VT(?G}?9ThdkA8 zuDRWq4HN@_s^z6qnfMcMLV5&{{pQNll(lVJX{7(y4UbaeVL5_1;OQ>Ex-Dzmyf3C$ zs$C2au9LU2KfQGKI#aS&?5X5|r*ltt>IV|g790=;B$BGYA{=J58GC|BF4(Qg5dBvc zr`Gpc-q%^iwg&$$d+Z@_$w7B)x-_n9{@&nzg2T{|t?3CTQjuYxbf-nU<6A7WT#jYA z4%bq)6-7Mm0aF!qS~{-PB2r@@WtHGyYH}*x_vnGLXh9?f*t%XT21|+6@ALV=4d_ zq~i#31R1di#kT1CYN{wLpaw4GAM_#oqLPW!(yqy?`AMzASlO7`5X5(%8T{AI*Eg0k em>Z*-2R}8OGy8AVQEkBX&V*#`-CyMYzy1g5IpOI5 diff --git a/src/assets/icons/playlist-1.svg b/src/assets/icons/playlist-1.svg deleted file mode 100644 index 723ba82..0000000 --- a/src/assets/icons/playlist-1.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/icons/playlist.svg b/src/assets/icons/playlist.svg deleted file mode 100644 index e29bd4d..0000000 --- a/src/assets/icons/playlist.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/plus.svg b/src/assets/icons/plus.svg deleted file mode 100644 index 412c608..0000000 --- a/src/assets/icons/plus.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/previous.svg b/src/assets/icons/previous.svg deleted file mode 100644 index a63081c..0000000 --- a/src/assets/icons/previous.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/queue.svg b/src/assets/icons/queue.svg deleted file mode 100644 index db5b63d..0000000 --- a/src/assets/icons/queue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/assets/icons/repeat-one.svg b/src/assets/icons/repeat-one.svg deleted file mode 100644 index 23708f1..0000000 --- a/src/assets/icons/repeat-one.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/assets/icons/repeat.svg b/src/assets/icons/repeat.svg deleted file mode 100644 index 6f08054..0000000 --- a/src/assets/icons/repeat.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/right-arrow.svg b/src/assets/icons/right-arrow.svg deleted file mode 100644 index b23b235..0000000 --- a/src/assets/icons/right-arrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/sdcard.svg b/src/assets/icons/sdcard.svg deleted file mode 100644 index 0a86328..0000000 --- a/src/assets/icons/sdcard.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/search.svg b/src/assets/icons/search.svg deleted file mode 100644 index 124fe83..0000000 --- a/src/assets/icons/search.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/settings.svg b/src/assets/icons/settings.svg deleted file mode 100644 index 5d7f667..0000000 --- a/src/assets/icons/settings.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/shuffle.svg b/src/assets/icons/shuffle.svg deleted file mode 100644 index 47d2851..0000000 --- a/src/assets/icons/shuffle.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/symlink.svg b/src/assets/icons/symlink.svg deleted file mode 100644 index 2bf800c..0000000 --- a/src/assets/icons/symlink.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/src/assets/icons/tag.svg b/src/assets/icons/tag.svg deleted file mode 100644 index 5bdb1cf..0000000 --- a/src/assets/icons/tag.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/src/assets/icons/toast/check.svg b/src/assets/icons/toast/check.svg deleted file mode 100644 index 65575a3..0000000 --- a/src/assets/icons/toast/check.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/icons/toast/error.svg b/src/assets/icons/toast/error.svg deleted file mode 100644 index a5061e8..0000000 --- a/src/assets/icons/toast/error.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/icons/toast/info.svg b/src/assets/icons/toast/info.svg deleted file mode 100644 index 36fc150..0000000 --- a/src/assets/icons/toast/info.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/icons/toast/ok.svg b/src/assets/icons/toast/ok.svg deleted file mode 100644 index 0304ea1..0000000 --- a/src/assets/icons/toast/ok.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/icons/toast/working.svg b/src/assets/icons/toast/working.svg deleted file mode 100644 index 1c40de8..0000000 --- a/src/assets/icons/toast/working.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/assets/images/folder.webp b/src/assets/images/folder.webp deleted file mode 100644 index 158c1c6bc46bca975da30fab62ee040884bb7dfd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50466 zcmYIvW02-txNX}ur{6ZFZQC}dZQHgrZQHhO+nly-p8n3My7yQ1pHwQzvsad)C?P6} zGXw;rCL$=WD$fo;_*vU=LSz9`0U-i`^DuT>mZCTbQUUk1~KtCeCb5g#)UVEP3*Uo4D zer4`_I({e3NzF{$=6rujaaSMIrMtVw?7Z@@z3{!-9(?;Q?0;`}KJQe3c6#c5x?kWo zSx$qlkZ}@J=?J&<^?bf1y@-APD*wX&Bw*a4`8c+826pMW4RLwTcKt4W$kLhn{ys~% z&ILkEhxjzV?&0xZyv2JwnHc<|X#4-xjw=N?LS`u=fROUk7FJG9d}>cJ!X-tk)KC?P zdPC}-9WLec2jgQ^;_NQ0VcopS^#r3$3c~UR3!Op(wVwsMH=*c>4VdEsoC~*cEofV9 zR)Nl%{`#iz9>@7yO4xCYsP>pd=l{Pd_g&voaMWCex#p%&d2>^ngFkr>kq)epKmFy_ zN^93;T!G?xsk2>|O77w7JKli&MxYtydVV&s{$`!z*(uUu=i?byU;P#&F))LPiRM9M z2s9q1SQoZ!u^sqQU@4OHmD)I&BI{*8z8Wzv14HQ$Uxrb&%7P7Gt2Jn{;cw|87Rv0;c2O|8Dpy>Ho_E;BZu}kL0EMBjRRxZQ# zTPqUsv=q8~ok-!#Uw(N$-PNFKz*b+E#V*Gfnvs6Z*+;W1ZfLtpLmMBLrr^hf2WUeh z@6wT z!30$KK)}+TxT!S^{TJON7Q^Q_*ZZIQ>13{)I zG1}k_%co_8)BJkX0?_+a096WIv7$PI>D%)H&sV_o?x+<=z7|w`kGg#O%~aAh%^Rey`GSxLvBzobj;(aPF>j z%t~kv$Ub~3ab0u@Fy!|HiH9Sq4pC6*6>u(bX=#SQAog!9=g=^$LTSe~tyoep_`H>@ zSRz=O?pwF=c`UHxC`9H>ghuASF+n6NQ!zV!eRPDPnmLZBi?x3eTkXEdFx(C};E)f_ zdwYWf@TJob*PB{HRoL?FM+s^!1blQJ3o=r<2_-T4QS#ByR|D)v37e|Of|+mMRrVA( ztaOM=_wX5?;-0hb-C4*jP?&ZL;+Kxw0^wg>U!o244i#|;WubbXkLF2(W8~!V1GHF^ z!#=+3jC<7Lu~OBiWPwC^NKYup#wLUxM=y0Z<6^^1+jtSm6EH`3Ty%&~QQ>z}q|1Lp z{}Ec3!)O&pPu~i=fM`(*jgmg-v%EA*njDejXV!dWfYK@S3;e1xa3sr6ijG6_b{Qo{ zwvBIs_HQ1AAug?Pdh2I)QWhrQo@1hoja}yD?&X@b;=hIHp^!at{bi*9tU~nn+v7Q) zB&ZSPx+ky&H6Ci4(K$LsNw)qzD$hO1c3IKj@O1%-x>a>VdDJUqvqUI!E!VP56SV4sH;Kq#KkhnYSx}8A#YO%r)$cLIF zDp|&*%Wzw=)lBW69%BOa2pYv(9@{8^>FU2KT~xb!YTp3L-77s2N*)B%)S0$^&L^V- zq*WJ+y`J3*J3bx{yvgwx4gO;Em>1S$vTfatGs>KWNK>?oN8$uHJ3{XLu(#QkB+y|S zeAK_yvG(xQwFK7-f;z&h1%^r!FuP$jf8Yz-3x5hDnaH_M(Wloexf&ussOl$%2 zx};|u|5(LHRZ?_b*Zo=7hZ5wX7>`?@m(aTG%n0SRH;LqRTD>QfO{^aCz3I(X)xzKM zfp}3p{ncIEGS~PKyy8w3zVBZN^U-HztZD=+M<5(+M5WHknL~&C+GwT=f^cy#eZXkF z%d-IYC1eVNUaQvBo(l5>?;OoAk|F78giAy+jv|bDAVBP=19!gwku*6)6NpB1Ggg9mYK@)EMzH967wWi9wzy z86n-Zgdt{5ceF75JqX}cKlIouA#yPb9Z%Wbi{p&1c19}U>ff43j}Smqg=-ppGzrL3 zA7GPgiRfxr-v*%mOcC?fBlD~LJPw%N@Zcb99#q`jeX5Y`adj>pGl%-|1Qe_JUXrz} z;Qrvff^0bKCcW}9Qx`fE27+fa1&d*s4p0`w53;|tmiO=#!FQh$#FjD2LgJpY4iXdw z+4}IGvfnSx8|y-Pwy0$OE=^YO`Ii^&o?Kl7k;@_1zU7W)8F!pu_V5Im4NIN6H8QX3 zH@dEBPnRN+g0UzCz5ku$Wgi;VgAH+qSFuk-TEe?$mvB_{2*kgEpZ>tmfU8l2AH&0! z3hFL;I09taAKPSxYu|g`ujHznpaj?tipU~3CxTmwcML~&OHrpzMhdY2V>WOjG09U9 zdeL-A6eYcHfAL=@$f8-+4*?5Rz*=V@^Q&SXxU~JnWdyuO|2~fv`{m^(;2q8tfQ^ip z2^t_GhD5o%?KFuyhsi8W)cZU2fvKM1s1sj?{|%rLz^5AchHVWePL3DwVr$-7-Fd5) zQ=SyWqMUv)hWlG0l9~f{$Ju4rfCl|W%sZ!ww00XUC2Yrntm0aZyP5;2jRcrW$Y0D0 zhB#}-YlZn76Bk|#%ai>)^y@E>^;>jZQw#j17Fkhci-;?)rGtgEuAcOEk-XoEG*>$O zfMWSTktL>6(dnP@&Dwxp&3mZTE4K-R7s^f>E-Kzj#WXEz| ztXS_xI_pC3&5c<|P9rWaTrZ&}oxy2RfRu9utwO9!A0tnNc{jCM>UJ3@!}g zuBjT-5}s->{x&O;Y@EwYPiXYL^i{S&uPZjHn37>X6=sQI?cLef(e(2uw_8iuX!=VU zWs_nD!Fgj}oGW>x7P<2a6`q0EZ}zd5$B_D*Xqtfmk~I!s%qNMJ{jSRzt_dN(H_Je7 z`CEnMH;0OlrMPNN0YbSIekypy^|&{j1SN^Tlzr}Rbhk^w>zO>XGUg>^*4*G@=ty6_ z|0rM2WIGaOT1*SlS)9EGHGcp0$nK?^=P9eSQ28<6W@6?lbt#6+xHop}+)dUPe~vEa z!kd_-f+YuPiE$LLql}meTVkmw1L|IkamxyyI-jmS6smym!GLPGcGa|+Ta2zJX4vsW z1rTV<(m>22ZT`aTd>qmmt?_t!7qerWkjk$D!JVR@M{x>r^y<+;oYVpE<*azV1VxZ! zy&^yo3J|7Bfx>d{QG$q=x@svmCD`7-`(rZcL0WKN@%iinRj-0Osn}3N`on?aDe&#* zXX0uHMK`fEm&_vvHYO>rWIm;1>HZKPw?-5pE^zkN(#2#b?ajA*&ggn>2$Gk8I!MGSYXP02>&CK|3JPodcK$;TM&bCFAO_WS*0mkpiwTTJR|bAg3A zLZSRhsagRs#USsl;RixW_py6*Xm^6qAZNk%1ecD-6=vfQkpa948J*|RgDeLai*m;Q zQgjo0N&mWH!erd1UyT}ucvs~wXY2(Ltr^NNs|Vel7_yNB;*z(9X`zN_s0$ws*{=_A zGqVR{=g6X>Hq=xgVDgslSn7tdch>&UN0`Z6vRsJA{EUX+7giJf`#=1%vA2yeH{?R> z()j~Ida*fP$#-*Z)sF#reN*7uxE!i6=KCd7p3_4)wVPALVN41I{#Ap6NqecZZiz}J zVV-RvG6P)7!nIZH6mJz~WyrQH__K+)u|AoT&OVArGau*M3FPsk3nvRN<@1|qd9U2b zkr{l*IaV!RPI@!{*y+S>=!psXkH&WoANFYcm_`hZ6@Xw;nVllUQG6SLzR6scsPCF| z@TG+w2fMv*88lbrt7TR>2D{#XrUngf)dUOBTciZ%%#rZmVNt#}HZY&M%io9o3l)EQ z?iTME8x^rtsmawULr=_d(32CVY$z=;KVZmhg|#uhn@ijf>T(r9k%bOmqK2ZuynXq4 zE!h(i3WXor@;kqB^5p=j{|dr2Ena8$bT)1hCJz+dEC>Z#BUgk5oy%X!7N~fLO2&o~ z-2VzS0(CS#y+1YqqV(wDUwO#Hr?-_K?-T7aR)E!qrScdd6f;dFMRA>}sJIOdzU9^7)&ZdoYxKBpXeZ zL?1qCY~KiAr^eoPKx%0}4vUNiQj_AkUX8J1#mv)bx>r>V+K5bqc2y#Fd1^fX>#*ly zQ>T)72pP%V+tl0x#(GkwQ5ygcmU6WByaCkBuC1Rf_(kOdhI7SwqB(tQAo2|>Q^4-~ zSW>lB5eK-WbXoC>ZWHP9Wmt9oXHUoaS_9)=4sQQR%HyfUkIuibH@S2>HB-!G`JG*g=b z_P_gt&rRWNply+7l-_=K!%^v=c(g+5MB->Y5bv=ta_R*?a49?WYA|j?^afEeA4tcV zl$vze{itav<6hn}mLaQ*EMQA7NBK1A0MS$LC=tMYfL_JRtLrq>(#X$_^OE;n@5AN;t>@x^v+W1O>0r*P`E@VC@M4lJbA zmG#OEY1+%a3y@IYjxW*|U30+M#zZUqI9PLYxfVYDM6Vpdf*$IBh-;5543c_=baR=B(@Q2d^jp1J2I=S?2d~aer&9&^N z8h1vUqEq*BIZOl7jy9Pm2v_qwpIk~q8)3!Hjb!1I<&I?t=zd@sQXXbyXt@Zqf$Eqm zO{Wfhj%Hr@(G`L%0y~F-M7ZoHsTVfO8Sqo{p>TE4Zs0~S$~m~rS8+c#f$KhE}KQ2Ljr{<;b$f#Qy3?V!YjSm-A~Dv?!s z+U(2xsSbmpz-~xdVz+vktKpBpaElqqd>ZO*IdM*S%vYjBpOEu`WFr)wU2uy*f9CI@ z{ni@)%oSd%wSU_T&ewa`uQ6lk{zHcGuH&BS)0jclmbfbn#hZGt74p#%1ltl;cwLQB zA_&6t`-(e7Vy7NL@XdlFYUF;UfacUq>rA2a^k3o@8diGk3IPIM+ueHr>z0F1@YM_G zql^F(Mbeyri%Ub^7UU}j!`+43~#~!d?a%i{MyU)S!)!Va`Gu@uI2p9&%_2KoruUQ@j@qG{SJr+SV zl}-!4A!h=Tt=hKru-S1T6nC}E7zLBxfpycAEejWRi*eNzjwu5NSMbGqiYM89en~=s z^oY4hWDH|-UBdqQPoDVr9>V3wbt2OoSHN&Zp_O`fvy{HyuvCY?DVX1x8YcXSopInXie- zCxsqs+{tI9aXUczKMRa!V)_eRwOm6!5tB)Bheh}4>fDL*_R1E z*myt!0>#9Sc^)2$vLCO19V=s19l9MU-Lp?Mwfj;!K!jJT8pN6FKu0_Zzd7iG3$-=o zo;m0vgNuQ!?lfWWa>xqLheJi$rZC0?Y_|d22GjaOYF!MwH`_rWPb!83ZWk%1VM*VCP=N5=He&$)vb8M5n|#Ln>7x%M-ZWc z_(!-~{=EdnG0H@da9xPeW9m$l`70u_;3Z#_%O_?YEGhRAPSC7(vj3PPvFqN-^4!fz zw!_Sb_3axhUG^_u_1SckhOVAKI|(*(Wo75oJH^h|=23S;ie3!vb34`u;#r7~O1GDt z7G%isQ5=lyU2jmpI#8Dg zox$ZeFP)-Zjw?5X7PO7+z^4EF%XqXIcOBT&RPR9A--z>Si#tD&D~KO$Ng0g-QTGJc ze+B@MBdE=SYPz3VmtN%k&qOCl>J*rHl}gy4s6n_gd?)d_(#~Y;$30oIs;o^5DNis# zMe#O$IU7u3`xRyajT_&_Mc1*K9pd6Ww0Dfx< zK*|I1;!t&!YDw!3n{If=xCLs?x5w?U$ar~BV+7z;0ObAV3hiy-)6R2(ulah1UgzQ< zu4WbXPgX$$VpSM~1r_8`R_%L`Ozv-If|TqHJ_S};>`MLcPx~lKjgvP>bi`bN9#Ai;_mNmD~hWigxQm%-J93Gi_cJ=G%FbXs#`%!bl*sS%5b^SB=!2zJD@bi z<3lWLvIZ{zb-2lxxJ$(p%urz|xMTxENKj`t?D6Vn{`&<%cRa^V<@f$hp~1-LJbcy= zpyC)7J*byXiQYRW-#9Bb+hsfrtEtL1h>sdm&P+G^&A*aL897)c!=-+ym48Lm))#0> z!82+cq(=POO$|Q5A3PwANP2uHOx478rsq@6PJ^~h4_qBUbArZG+lPjFvICd zxYJ&<$0toDb*yg)Fu+%_k7-`TGWULct5}?PXWxo^XRed?Gk=a=>9Mc~ME?a$; z3!ij@88o@@WiqledWndw^0daR)j4p!yhtZ)Jb!K`3uoxPY_U8quPq>xRW!%ip4KVQL_ind6WLGrx@!e@QFGyPVP?Dd+_T zf(~nbYD#(R@h#W}C+s0OI8=j1IoC=Lu+MhRVCuMESB8nD-f$hXUJ3{RHCxQxf|Jkz zxCjU9aDXvS{2L|Rrs?Mq+C5NV|145!1Y+ zJ8Zhxy!}o$my)HPd$zvaBCC76FP>YCxE(W?d@B;ePT#a14h^^qz$rU#`i(*LLy&2W z0=;tz%KwnHHcz;1yxpx>w25)QJ`_U-p<4-`15CF?_!;|VohTQRN%SA`UaVn_k z-9Jt3j^y$zNaGfv-~<>FUD(R>qfr|RMVHBEcHGn>@9|3whaf<@zonf*eEDzLPr0{^ z(2$m->GtrMNMT*lL8_f=zGrQG^lx$Fc~s2uu8h4G5FHoe&ZmdqZ|nXu=`MbV67mKp zoUSi6qbyZRCxl;&rzFc~7~1VCa9@9W3bZBJAj_w3wj$UG?Ox*geA@iD{RHG!^wWQV zaMIJX>=nh4z2gyKtQTHsdIJIsDxAF&{Zhui2 za`o^8;MRfddlIBycZax4m_h z(q55l(WzvB=AmvI{A{~keL>}n){(~S9J5l-i}g4(`K0K=Tm@^k=NRPt^Lm;NwJ6pY ze;`>?>_1g8^ZEN}yd?(+4=&xRSjJU$YY1G|dEq5Yg3r|m1%bqt4mK>i-Xo{K|73!b z>YAY%jgl3V7jA$M8R%D_d#dw2_%tbD1dy)(j3SckZ1cf*EHrQId%QD2)lWKvpm13< zoLsrF7+>~x)WpW+wJaa_@t)c~uOe8={|l8SMwHECDa-=A_4SUzl= z;C|Ek5{#C?;+6c4Dk>ZPAA59gwuUz@y<`9MvFNAth}nueUkb`IH0`FA6F*YC@t&PBhju7TDimQ;LA167U8QQ#R?kp6Y&F#U%uV9cQhBG0hp>FF|x` z7#1*EVVOw;wo==OCe|H5q$MSVSbMnWWxG3;Y17YQ$<9NJw4y7vUGdVmol;B?`h%wK zeLZlRYn9N)(p*?LuaIo4Asu-+WuCE*Eh$(BCp7Z2u^GOkS&o=eM)FU zPcMQVri83U$;JPYch=ZCmCfa@_;gqPsdl7=o=engHaF70uK6`SDMDx@#`ruZG>Tik z^^7n6=Tj^BP~nk+qWk`ks-%hVL*v5f-aejHx||z+l=|MWIpv3}IM(nkm!NQyv|Du$ z9IR4~jr!t{>D0QLq&3oX?b}{)wyD^ORd*bjUX1cLtm1;v0uH|9a>k!1RKj9SNw_kH zq|CZRafa+7iWW(uZhGofK#v*QsYD0|L$^Nq(gab9&lLt5ug zjYVNeqQ2?v*T1ZK5YJ183w}`YP|iYyT~i=(17;ei`ypXYl1xx+$3>ue3Gd~D<+DeI zYOC`LIC@F53w#x_)riF)+4%trxvExw!M51uRP}^O~KOseQZa3By8UP_wPp7%^{0i zpdbmJqn}CNfPx@*Az7*{g6r~w4iCR2kqSXcWd=K+%?D#rNH1k>vIjG(;Vi!OQvMdC zp|4gFO08IbU7*QoPz8E@FSv2wqX2C@-m+5fvSZO{!3Ym74DQ~b3$vl8FH-OmtReki zG-)~$X4Z{-s54PuAy2fqU&)G~p`J57EYG^6>~D2lU7{C=(8-ZNEVFl4AkXw4khqK} zsL4!Jf>3%pDGXxa`388bP1o>RrFt{|fvwzJd+DB0zQ4!7AeCKw98OLP9 zJuC@+!sRTWn-ZYE2bGrUU)~~s0$UY0)1dngn@wGh%fSew@$7eugcYGDT6RkJFclU_ z3G=QqV(6kq8=2%G!b8ZwoYk_kn@+V{Zz;V(ITx-77f?na&dDu?U^%FFKS$5jO0=3! zOvWrWdWuDXxy(hiq)TvDID_^z2%wq=TlnI){B^Ay@s;x91b;x)ew0+BW8X2t6-r8z z%P%v8WS?54Q~2rY-)8_TpSC^EK=f58mVXzD-dV|Q{3@JC*8jf$xtr7opz<%qF#)A9 zit%Jt-Qbkgz)1o2{doOSf*#RU<##)T`Ru7Vc=^G+I=5-V`W^+@%Q4k{_bcYD=_|h! zPOGBWxix(7BCsyI&{!6=Y6I0q-0xd^HhN`lO*C#ssA3SmU`0~lWG?i-9Df&DAegYq zSY>$ABE7}>a*rxKYNu+n14G$j)b_Y#oOrJH0`FHKH~I71#Y0TSN|~uDmvgI5f^UBA zE(M#Tcxw|Z0)rzzpM|#AWvq4`Nb7#NAkUkgLC2Qu&yQbh{Hva#LtRK3JCKV(r>K4x zdKEyvv-&LZ3AWxWuD6Ps;)K2X(A(0-%t*Y^bheD{4!-q7`&JP(BRKrf*zqjvQ{9m z;!UVm%Z4Mh!LZFI4))lsA#VJY_S;U82^wFfzJjIw=(bdV0r}|8@Q=N91j(_>X&>f& z`@8|}VhGZ1lLo6*RW##UL_hY70`X5Z#em-qxhw!huQOwnbo!^-chwlgfg?&(P<`1P zq!YxM&8DdYme%IC4q+);u+bz$F zDjbT~P&v21+&>J2i%@*n*vtbP8%BP`3qBq%L)`tRLG(KS`(ZOass2jQO;&jgVPMh^ z`;QyvjV-0~&nQ6_KreYQH43!=dWDpJ3EezfE`?d8Mq2rV8lo2Qg_Rx$&;q5w zf5_u8X$!|k9}{U`E=0GW{#WqPj$v1Jz<7HD)m}RNG1Yv{L7a6V2y!r2>|0b}pfDBE zwQoXIXMEM_839Iy=Z89DX~kQ@0f$Sw|IwQ-SyJbJ*CnusPP9rpK5>UyUmZm3QIr5C~w5=2+bP8&nZFXh#y_+cC(=ULZDM%`*Bim zr?$w8cE>MxXB|?&g=ru}*jDvw2GD)lGZ{MMg5zdC9vL~FgP4qjkmf7+)&1jV8s!y6 zPAP*&yG@=;FO-ceER)em@>rZ>E%0`KDEdBMbrZ&wE#KpD{INO_i9+1X*cO~iOz9nu`)WoTqARhW!;r>a zEE(*anCIK*$sI^C`s_6cAtzH!Yl?0>X?Pl18Ur02qUVQ1R8S9hPBzQY4NI zAMk=*-Jk-t$%`Gv-_6oBE_ERlvHQeMi~ntcHWrW;7hUfqiXZJb_p)UG8#;HD{Otl^ zEUTD7z;2d0!dPr0cFRt&c^7|ySH$*|R!Goljn_~NTIp~R4qMAs+kC^wchd%t8`oSQ z$P}E=>KA{Sny47~w8x3v31If(AM0VPJQTE{SFp&2NvoCWdjtSD3%81=L^Dk^J&K;p zqRfEGHeZf9)p;wY}@Qj3(yYM1xPfSMnIVU9VlDy{*ZBIVkCjX|YA4ITdrU7wRqx4o* zvrB$>T_RM%d>;upX#U>NQx&ewj2C8Cwd>sihhfTF$^TrWMx(2d_|QO!6Du>E&|n7X zotm!YvDK0Gx96K#c{0_5zD0N+lsd*8(?zgw$HnOcX$ zI!NYH2sE!HM)jkLq=lL@0s*))OVULh=I}umW76yF5X>1l^WVfQ!HwjlO!;gO1XCOf0ZMIq<944-g076-AH#&Y$f5dXq`O2+7!LqW02Q z?RZ->i03TcvqgaQ$N_TQ>L7~@Pth-ypu8r!awHrB z4WP3bPNMY(<30W}uqMk4oTQ`TOcgrUG)yi}3CO1aer<0|NQ_P_F?8SJW0&?|lzHux zT|sX^^ou*U#jMPRj;M-RLT5+T`pv3O!~WuF)znR?9Ki*b^dy%Qn|Okl45{c4KK(8z zm30f;L|+&DjtJvFCnNI>VG{jn9Jhc{5#f9K@4dg!*Gzs%F4m~GJh`1MD@l(tUBsyj zQ|C@Y$l$Lbh9kvWvLDl|kDOqcjDirj|CLcp>gs6?Aq+r_|ALpDese*{2{&)#VIBsQ zT4N&eJ6&Medfl6*)XUK}?g@EPb}g8=w4@em>#RJ?HI>Kyo#Y4DP9 zb>=ib?QnO5pwtHc=GtjAXT3KsiQi8;?~i1|sR4j$M*~Z=={3eXkd@+XRaKT3n)zbF z<-P?*ySh1yh?g^Buuf^_(1A3|^X>n?p zN|7$wg{4uIO3?Yz$_pOk=G3S?JQIbm9kt7%X+3YkV}i(kYAFb6jj0lP_(UwNH7y?C z&EZL$mAiNq*F=Q@KZvbY8Ws)<*o|57`a~#Cu5YQfvWVFWmD3#X(p~*FfbKb9F#h#s zSL6M9=1&=mBA^cH*zz#qU;xgS_;T!AILH|UhDJ_y*I_(jXD>Glcw+%^hvN3;t6I`= z>hR;tmY>wK3sO!gVTcaoq5{4-O|QPg?y|`=lfc%mC4AS|;VVHD-YXMrnYa;7+r$=u z>kYw-jK7}IG7Pd(p7wpHjk4eO&RYbR2NhXd1WEIY4wHsnG9C~65k)Y$hgV2yCo4_I z-rUeOFE*QGgbR!owXS%6eGKroO24FxM=&ax=LZZzauZIRx_zztFcFUa!toCfp(2Y)-GOW#Cz1W}$q#Kf+y zbHD9MVJnch9F6;BiISIag*4gR6XS7TaVNt#BW;4<90AbzmJ3QTp9BK>`U)QS{@C03 zKF0X|W^eiL@C13jvv2cVfE+i`pbq`5BI&rdY{8Iy>V#sv${rHcxM2~}J9%O`YkD8f zpR&WaDgQ)0j21WbH2x<=6w&}O9sMt<`e?Ix-mJQE7MwqaZ*t-4z@q?Or%}IJr;f@o zvr1>*dfvE?ny04WI0j>Q;%Ve=}@{feoc4Y#6wwmg+$s&Vy`E7CFhBmFf0h zoNVl+=_HzlED*%-M#QL1@eFUgzxSN=d>Nd8BCRiZF0aARL?^Jx{77SS19Tohs(})G zYeyHJ00?Y+6B*0N*SGO^$Ps*9#mH>qn)m{92|6enq^J>S+I zp@)GS7`!Td!USeJj=O{@KO)Fgfnf+@8>S{hoJn7IhBzVNw`R z249Q?Ym&C5jBR@OCshG2NEMS@I zg+F#LCd@|*mwr~{2s(yAdQWzQ(>m})3M*)3iSa=CS-)II{a*%ys&1IM9f|B z)dbxn@Zi`JK}YuTsEyq$Nt=Lq;)HO=VMi4%8@#_Qt(~W^u1buGd6srMlZiA;=#NfV z2N(J5ef6_YmP76UO`rm1*>!pZ39XP!Fmc??T&i9Ko)oZ}g~5=u7gmt$ARIlYOoO+n z9c#V6xckcr69xr#OjKw$x_rM!u^<3 zg1X8ozO3@sKh|MpKkf_Xsc#29p?9wGGIjcs0KdYzAoUld`#)c3nCwwACag=e?wfCh zv~`NWT#YXd~5C=}#R_t4=gPzv=ie zZS+l1quVVT`*OOMMIzguNXoeiRx}pnpgN%$#^u;Lx6P9k|B<1KP^=;1Kek<;kcqLN zaFkJ1sw^|q@I?+NsF_7zPu{Uy%m-<4u8Z!HmR+EAJ5w3J*F$Snyh=Vk8QYBt?zZ%m>Qaq+{< zfPo%g=v0fmfG^703LYdN+5V?ygK_!+hhsD42~;UdUvb%G+g@v-6RfohD0I(G)D~k6 z!Fq|*2EbULFZaa(Cp?HMo6w7Q>xt=7#Hgb9@-^p^xahSm65ytWe;{lB!H8NZUM5L3 zcxm=nnO9YI-mWbMyAs=Bdu!rrR?*;^1hITyn=0Hj7-9`k)90Z%vOAAw%-m&?4x+nK z#nIi=1<8yhf&-urIO7#^_BJ;mmW#pF`XV!h?Iy7v0*gB~H`#rAA|Q=2Gru3snQogg zjH6w~jOGrBWPOX$$AomU3s9NLUWlO%HT@B_!2XVI;O0TUSA7_(HR(G>oEO7VgLN84 z)PULSy%N#>gtQ8}@MEs#ta$u~ql@6fa-u=3ehkx1x{A;)Gqu2dN4)^S_@@sJ*h=JNlUJ-Bx5}6c0(><3Z$A-F-DWr zi1(PM`t)q#S_LM{G`$H5jkB&Xi$@j8IOPDdX@_~76&8(bDnDK()cJ=U0t7Y!=^cheVsS zRID|qg~_f5_H+XCJP)uEG!AIB^wm8ga)ESy_8p!pLf(!djnO8mZJbb-2Se+r3a^%B z7dK6B+M=wE9~VgV-8o7M4d5YDITT1nRl=iNq=jPUiPiwIso?fELqo>7{o)0wjF}D` zXFG!;Y^j^0`s+es*A-qDurdxIx5CLLfg9`7pjlokIc}cTLKVOk82?jcp76 zb3VW>3MeZ6%^q!73O|S6Wx{}P`wxs_ zom|Bu=fk`xteI>8qie+CC=v8R4rhBPmFB*iaKZN3k7 z=p&8QTb|6Az#myQiUAJKrN%0vsFF&wthZ)xcCWl;ku~G-2pmLr4N151(0=x;-$Akv z832t|Ivi!vgN3fCLwRnZ7G@qV!&FN^!f%t}esRQap8!9Ezd1Wy ziX&jSe0p>gl$H1>I5k+V?V?A0ls={&P{g5cqro^Z{~6~NZR%O7T(u1D(xcZr>9R!_?P9FahS_N zr)1nOcuw_eCiLQ+p}e%iy&&kOMGmuokX%X+l8gJsQM4_(Z*f_L#3_jH;NVpTc6l_; zH>tElS+4Nn_4*M7Ijnp>A*9gcF~%1PY7c(L({W03&@F!%D>lSOAJG*1R)4|92+ET@ zVYPs8KkH89aMb`?Zf^D$f2gyNT5PoHJ0pU+n^KpV31U$iG#jx2>R*=XRqLo!d3BN= zz^p=3^idEdc36$V>igwjm7B6>Z&Yyaz`pk5w)l!c%n5rC%v$CyCOL+uDc0gCCU>A#Y}Cj6hR6rP{B@8MA3zXAhL*av zkrugpm4JZaX?t7W( z5Wl*1*WJ3VBT{palG66=-|YO>h%Imd5?~{hQGM7&Y1G_d^c(5$JtJBQ$_9bU~-If5LhQ3%W?`JcWX{j!W2YT0)O~ z@7){*p!yv(qAm4(%{=*Szam#_P}?pC9+5-!0a*y!DC7j|Gmt2S(Uw*U zW$}{bhnS!0R;wyf6pR{5`W|&Z_IjRzM zsBn14%XMr5aVDJ;krw8suZ0)H5Y%9){RD1qlx6a%bWZlx*-0{bH$<6>J_sNxhpVa9!Q>g$K{EvO$Q8d~|eM zNq5y6icT7n$e*?mIC$81iyTIE@&ux@ee47XQa*up?eKDw& zf8lEw84#_)D^tac+!=16#M=J22)=1~eTI1AiF!Y0dafF;^5oQeC;32xF0l%nE)N;gHK z)>CXHt{}vR0mKd#$x=k~!EGez*c6(3Sg--8Gj(cpo3T*KG3+TQ^shK0+s5-sOaStZ z>6&z>Po#?PFv#te2GbBdrRiAuc+J*dZtN@|OTx5kWC=H?htdU*uijhX#%e*OcET3s>wLYvAP^ z#8g~86Hk&GNlwIjo-XWrk-$rvx>+qxK2Q0# z>M=Vc3`3ev_P1>k9znE!7|`!pGgqf4h9^3q>U3a7qkip8Mu@xAq|VUe4!s5_$-t`| z*i4#s*@Xupf}5B4S7f=#Ue9#fnWP;VNUiqo9avfrD0&ZyrkATZ0P1nCacybhJwW}u znRm{Ko)V^cJKOgO@Z}?m#U>5nS~BUW(ZiTBr~u#qH^?%TXlPWQO{`8P>s-b#<6ffbP25eq4@iL^RdEcq!yM7jys&F{w!YV6DUr_v?$f;_% zQDF;Z9WC?RuJU%mDQqZWo5JI3C!b!+l)L2T8YE0GMin%mgNZ=2tQ-@|am)Bi2EUr4 z65FHUf2pAm5s?B1cghc+?nT{l<<&jbud8FW3BuZsjeJaU5Xmc)!DRXN=#f5b#uc8`c0L=vaN4tTZk{_-8Ng)LbCDY z>XFeM^qBKtY#a@U3Wxu8#J@xPi6YZ9^7E24+Y9ubT#mejE>8h_vR{AG+(C$3WzFnqw#o3TQ*^Go+fTl{AOJwAF zstcCkKfXz#n=z8y;r#xw1GVpB{B3|Q|BIvYSCcO6ids0U{*s@prvPBE;~MN#R-0Ro z%P~ArzhQNX!G9R%H_Odxroq)-qG;*4--CSlEqW8epzDpRUjP&Sv;fUV^(7ss-dN~S z?4fAbUh~F4?q|)>jQp$*BcE4w@8CBW*$&^hSfeGO0PAf3dpFQkaz+^ODA-kxKXrNtX?46S8o#1|iWSS&}nP_rUQ3zB5&9tt^8t&X3!0(j#bo9g%*GUbRkTA*Up=E zNRcm4)+Mj*;3d^O+bcVFC9$}imK0vk&}+LnTE{ENcclSJrNB3h=NXWR2&#tGfadcE zd+JKFdCYWTm-8qmt@K(^0bHm+3S?bCP4dpRur@8k!u|Ad)(Nz&U(#s$q&Yf5`V@uIVbOfX5LH{=uZMEHQ9X>pU9w+j| zpdOQlZEt=S&o^|K?Ll> zqNc|_J(0cgh$!x4!F1MG^ut}663brfWYMa*;<2ss@A%&45^7HoAxJ@^K#~qvrEyR- zN#SrbnNt6Lih&9(ijMh}_5_Nur*FhtblDz5=@J#OQ&`IfP$q$|Ve{L$JBj=W5332h zk#Ha41K7RgA5HjD5Y{Aa2^2WOa0eXRoe9ghzx-uT8%E(@7jUr!jHZSwf3^gM%h-p( zb}=kxCd25=8%-IvHvNZ!uOb%^8bWtLi--0rju0>Mer2-S#z&s)s5N8&x)T30+_(y<<$+lpDKQiy`)N2!6J4g41#^5pim!9JGS z+h6Onrz4KDCxrjDNufbGK7!XwJ2&~UT)7=_lz(B#_Efr5o8Q`XnNY)}M|pNzScj3) z>+f&MrxhDb4}3}r4d6Zoc2^Cf6nmMd7Q-}aKGtqtZ`JCM zmz0-Q3%4Xw@1gY!eS+eXUGyEk7b6g#0evKi`;-|$;pw(PRO0Li!EK<=yU~JbkfY1- z{;d7_7l^unwsX6qSBS4LbvM#f0l{8~6~1VkC8ZMN1VftJ_YB?#Fah68lrHyF#mT10 zu!zYYN~Us*J3o|B|h zd1~HnwKV;@mc0W(o=6m-VnXJ9XQwAir#Kax;6ZWM&|CxaW{*?CZdnJ`v9BkPz@{N> zS&+=N0AxktgYE3BTO-vX4M~7Zz!eQ|W3Gli!Bu@-hq0g*V%zOhd*f@VRS?|I1h)I}($3`?86 ztWM(^oQwC;+sN`f74%6TJ~9=vyX*V@pa;r6w>>l<#Z~A=anbj2#!6XXj-il>MC#yO zw9};5j}n*CZp~cPr~=O}a-1NZP&-;4;ucqKrX1+Re?LMtUg1>r@CRz?{{zST)7_Xm zPKb2XE;URXaGj=>`3YdZSI*%VaXL>@19F2WF%F85!F;M!=0O4EAcm2RIulrh{T+GW z#hx^Edw(|ntEp**YfI!AW`A%+XMAH)!uqfVd2Cl5$Bh7dvD<7?&^jS@Ng(0aGw+?a zy_LeC&<`acr~@hh-}@h2zL9)Hx4VG^QQNt|9>jab_&sy%*pb<8t$n80zZqUDT|;U9 z=j&5BCgN<^ZUaw*kY;2QK--3jCL<~_d&2aBn&R}-Mwz9h@j&?}t!9MTIuL$qg^agvTbxX#sfC-{WJZL(HP!-n|{vMWKNxtY^UpCTqBu&7!RcJIQ$H zCk^R~u1cvkwl+N{XgA27lWzLkP2ycMQ-PuYYXiPn7am|-FE$wrb>Wf>eeL$3E(T_d z1zZ2tfngv?QX1@z!8yH_HCjUH33i!;0y>I;)S4w=>xg-9@#-WU$m;hU3tW#)aZidQ zmzS$U8lrAt%(`tYAfNs$r0J{Y8T&HYLih9MQwiXbb5&4g_L5Z>f@(05a$|2$o=aA& zRc(0r+AJAd<9?rA$1CX&^y9C#CWR?sPYZ!+h-8gP?Ny#=W3J;Y^ziC-FC}n9F+ZNU=b|%02}OA@3DSx zupF)x`)pZybp_B~kPvl2O=R{IO?D&{CuEG;c7(M#ki^LduU4wtg{rv(v9ke!wfi^7= zuC>-qf5sy*AD=af3zr1ET~qWI(Hi|2M_@`wjS}+8C75LMBakn^gxt{b5;v@V*CAM9 zIuXMB;TkrlK3lKpkbl9Mywsx##a&>Qccm~4v?$ic#i2$o!ha>|zB11eQ7#^OllI>v#IO~i78ppnON zC^IDJ*wlH~x;79BN8Q$P5HIJGM~s(kJSG{oSD*x0e&aME_6gY(?@e02FMje|C62ab~T0@Q(+4q7PL99Yw&}Lihy`dL_6JNi^#OB97EX zXRab!b*iMY2)Q8X>~+%W2~8KO6h8*(=&%AaCV zU-1O5v#78ID4!d&NL@yAx#9o)`qN?{zM6X&NJJUgU!6FSN`f%W9Jv@&X8;ojJTMrR z|7_7fxddsBWankv{&o60KbDzcsC3VO5|PWYaS@!+dO0C6m;b{CTMc=Q_G)M-b{YZW*km8lH% zb1;gJ*@dDXit+CNk{+8Y?b@J~+7)%?ayyXHSomT2)aEBs*|!Ou(bT``!vS>IEhI9> zclTKDr+xVEEcn^$R-khgwlgEL2y=dY@uVi3|J~gmbY#L0($qgVxjzm(P!--Er%hW9 z1TlK#A_9dslRS7|HTvn2gq~C4U4>}DYHrh!>UL}%#vx^GdycPjTDcw4|6%uvXyWPN z$2sjF5a9zyMiLwIfi-&7E`Q|w%)`h4{ z$g`lLCld|cCqTmAN`NYy4|;!0t@z8~zJQRD!`d04FmN?W3l!EQWQit8E~%M|#geLG z%4d8pX?u?hlf36`Xl-~ve#;fGz~a>AlWD$sc(lq2mQir@hknRMTHO+>->1Hc1@gB8 z0($}}gp;6m=o-4PXo?McbstFo>6@BgEC%Q;M$lWk=tzNtzVMYcT_EZ;3M7wJm35Ezdo4ef;B&-M|65|smGb0{+G5}0%nc8Dsev}6oa#j ze)blEYQVEWtelvdC|w-S7!LZ-;wLNHT-;5-Zc(^UavM$}ut+6PiP+LZ__cqFBO(KW=znlN{9F>Wet*CT6?( z7HJHo^uLpeH06ztRqJki{wCZ6aJ#wn+1JQS zL2m_-ye`VHL*mM3oUyk1P@4p_tOtO*LLxkEf{IW(Um^p|Op(AJL{Y3IjU|P8SuRfA zpElbMT$J7pb1Ql%g?TrE2f&lAgOLsic)7m#N@Fb%ZDW*omk{= zXqdM-P1KCxGypH@y7h3>S0`ZF*G&*Hx~5ozy;UdNJ*fBg%?@0l`#~mBZeejl9SmP; z+l02_wnM>rjO}N3Sv=NxT&Nun!OgqJNsDVp*{mtol_bE`S`dq-loZyqlL%n<(vtDW zk}SH^eZmcTVWQZ(+X+n9>mCM)6jXO>nyD3(%nVb6gVE~62t?klluEMs)wyIL6HP-NrO2<6O4rl$S`7mekYywj!n8p3%vb^h;2-ju4x5^g0kzIkta^Id zEe}@OPwMAe?Qk?5Xyu5}eyRHvVxhTvF7JTwZW$)V0?X8y#63xN6ujMPsc* z3!TScCk@x>vd%BoHC#1>3yjt08cKHLXiN4^&poDqP#t^l-g(hiLdLXoL*fKjdB$fj z%7Xq-%N#)_5GEakv$ATzB1CnlBE*LRbNGf-xeD8mwW0oNFfiG)E&{+iAZBwZhgXw%qx*n50owBUNE$&j3i68H^bdr)e z?bKSkK@}o*5{@*)h$RMl%3KctwZxg*r-_m1{67s_WFC-89SgFASm6c&sH&0SU*N?g z?7+9aFftA;x4C?d#?t?wOy6=wd>tGnzz^l<3kexiLRg^%Q*O|fmdw`h3K z>eA%G&5wwYi#@qcJ94fDH69*87OIkdkaciaDFxJ$9;aft)Xsoqu8D zu^RLYVhM1am2yf*wcp7#LHWZyPU2psoqb`&;4yAl`l5e} zs|I6KY2%}$L~_0(|C{2y^!ee=Mpx(btCif@|3=KkK|n(;JW+4Q!Vq%;%;_1~;|~Y$ z$(14J-nz^$n(TxDSj`I6d6oE_B=iI%7B(1UQt*(VH6Rb=ENgbKC?5B2a|0sa{2XSr ztnw_6?!Cf*CN@cDy>Z;mle4#LyFTvi^BRl=5kbR?@xO zM5P!-yhE9etC>q>oAF~=qcL`4jxVt)1D3SMtKAtqOoTc@#tD!fKp7K?xfoSv0^?zE z#+yT7YJvZJdZkQ?Uw>7k(HK~W3X;$F4^;c|g3}gT(Dm@$TNj%8;yKr!((N|Zj9g0) zm41u+G|uoK;a0&FlQLOY;&%ywFDKRx{4Is;jGV!_k)n;l{vum|Uob3T*olJv4XZNl zYB_$=UCFfbpt$(0$b{~$F-FzuhDZ&ElzmhWlqandEy+{+Yw=|Pb{*(TO0GIgzD2Sy zL2N^+){NE9s=JG>pB%Xbt&uu7LCQEwl11#eax1H1%sw z^8iF2@qjo5rV*8`RH;Y?JLG$hrNPMMB2Q$UrEX2T=L0|onjwdxSx#{*)15UHE46e# zACVaSrN5%3f$c*s#f9!xUCJ4Y_KS4zUU5!Ta)f8`pFjn!sXGp+YjSMRpPz)n0gy>H z9(=hI4c-he0^QT38kGRDN}}&)N%5&6{pV zrQ_Ng5=(Gu6TsnfE?K^bSOn2%f3o&8i8N`zHO+0d!bvD&-SGv~7L(fA3CONULVC0P z6mL8h`wugCt0W%^JO~pn19+WO>B+*-O8RygqKsb#M1!TNA5?{a8#k9|#WSwW1@x+T zw3|Wv$y1RF8)mS8l+u^A1Sa0Mof{8xi4_)s4QBAZvA)OFIEN=4Ze-S=LVhX!4Cba=9K0g0pL#U<q%w@zfq`3 z8uTLV5w8So_QSc%{njg)cBqCvZ;0#?El}}HIb~|7*^#(X4397 z`j~PMeDXF}@RAM8W$hnMJqBceO$7Zl8%W&Oi+$xR3Gdn0qi{4kqm8<1@P5EVhwV5cm{Pl_Vuep`H7+l}M z${>6V!ug0%RO^A6+aAUD~M)pmB7q**9GN2K%DJ?OiQ0_4E~ zDfCi6cD-tic< zO58PQfdg6Qm8Vv}m$V&{=9G6m4N1v*4mc3$`=jw`b<;UH!emh0!J)J8qA z7woZL{d8j4VxFtTBn`3+c#1_&TzCHQpo~oh?=J@!r^dfG0^LHRo|g%#{^Q7E?Cb@` zDb^J1r~4zMT(IjFD9c;6d67$qEK&hL>2l6h#?k4FEn-fg#5WWCUS=`D zA3FSp3Y=6YLj5;)y6$N9o=d(}lt)>5*8j<~IfhK}b19`I_?%XS10N9kW0Xi7hr$ns zzAc%$i$uB#Tyn5~gFxfb6~tMwA% zmxCG@C(PTgE4Tie+z4hPT`q`n&6AS!6u5ei>ah-~1{HRsk2(xxd7$aZTo2Yn+CHT@ zn9N*hma=oAXItWvK|T=YsfNyb@E2~c>3SAPk#hl;e-IBGplmkc0GLkb$;Nm1;@L#A z<;BbJwn2muxT%Tzn9}ObQ!kEQ-%ig7?LpbjJR06Jkvjea^rCzd^man6hXIT0M9D&t zo}BQ1VTl~3-JYyadTnAB($i&Mr%byRc{0%}B5K_}mj)~INnoCWhZBCbv#?b2{c|8oX9`v@cyf^OBA(CHnwZ3Chf;8B~> zgnLoW@a@ml&C$cM64MfjMr8Am0Ro9N>}YX{B06*MSzTHF8P2=F7j=N9d-f#ov(0uw zbT!mvXu+{Dk2m1}lU2jQ14xhs5d)Dztka2};OkJp;83MWWUH>xPyCs@o<{*L!;;Eb z-Uh8V)+HRea&*wRJnd9Z^RcrF^)1fI8z=@;uKDw7C4&iR>vg^b&z+2;o3Ebzgf|j+ z5^B#FUIZ|7=bpqd4qnQzb=2e4F`kp-KDc@rUVBXMV+aHxn(r!5HodLc-?>SiGvT7v zeH4beAd~#2IdoO7btB3`QrN$8Tcu4bNDemkiO_Jtf0S5`qW3jlz4#VbxVYy@Xx9l- zIq@XOVl+E9X)JPVS1SoDF!m-H(%%3`oDgP*C+?&z!9WG3qxW3x;(T`L`&8bBGO+RE zigddzB%QK7sr*tRCaU}&X`*vT#m!I)9cdencG*uNhpG6&s4CP;q_EwX6A zir9!Sk8|=h*6k}=fFv;;*d)b~WO z8my5KH;q)75SRX%dX^3UEAFHo-hh$G=w2kQ+Fha#bW^FU_uPKD5K)HPhBl%W_2bWUN8s3zci>yl6o+LWPw-802FlfCJmcq?yXqmj_>w6zi&v z(Kmp@2*ka)%_Ihk9I_Nev`Y4vlTrptX$^~D)i3bIwXN(?c_{t5qGr;$l%@ZM0Rn~I zx1={Cuk|zDGBxpvabPHg^I7)|(xLsY4rr70mMUBI4Y8blkb;6Utc_x!NAe{*pfhg! ztJA#OQi6U>gm9}iC5qVnY&d3O>fS?ROCWUM@bK$xmx0~sVF0m;vM5D-LI||pKANL4_rHmAxB~&WueiCg-@d~4`WRT$^X!gL?oovB@pG62v zxa!@luYty5k@(D>f}xk2*`x(8yUySwu@gqi|HJ@k*`5|xVPM2GJ}-84*FvQH9h&6U zK%Nxy@LaPQcr8(-hI9^4=rP}9V?H@S;d!va=RsQyoQ<~-ouzYqBf7hyjUQK^t0tKH6UX!Cd1H;M-cFo-f#_J3O0OURPYChV zWV*#?-=xt2c>mVY{#Z9#9J>DqfD|+WDk@6c*pToO`^!cgrT_00DcLYa$mohyWkrsioKIC zESyT@CZuO7D*m8Z0jPh5P9hu$_HqPaFT-H@SV{w=u-p`)4WUZT|0#IefDE}6iu=Lv zz6iKhfBR?$2CY_hBbj|U&^LuaDb~Fpl>SNrzw=rh;L0x0y98>AE>nA*cY@UcmYLa0 zNr|(idL)O6%%9-*^CDFfz>sVRpVQ+m5Fzdeq(rI+<#9MaJBX?P41ZLDC3618rPRxB z8jPqzT^0N`GIPS9?o!lP^jxWCm-|r<5-ZJ+Incr)yFc#{FNs(6IjCwuH#(3x%42+1 zb;{nVTiaLE<|{O>T(Vb~EHjtOnr1oLLg`$#?AnHGy&g%ey}Af_s>+N6K%UUnNdW;I zVu)GEQ+bm$Hr6H4{6tAD*bq!ZMms=Huf#>JdFfWS4)X=o>O_TsN5GRlIS2}!0${T* zI>{%b`8A$+N+`Ovs3a8^OH5tdon$XJyjHfWuI#g>X=QvjtgE`qGZ)S8?q^>~Laib? z8G-D7J|DnMEs}W^-8X{^q!iZgGK8ckp75ub8(;he>4ji+s~_DcpB)7^yHoBTzn(AS zd(v`UK#x^}cziuSR8v(`B-0blGS73lM5nDtHQX@i1U4LxL@Lq*+g8FMA70eZ_terT zm*|?ce3~ix9wVM&m;-DOG62O{V#tg&7ItB1{lhsB%z3lP(l3CCl7li!L@9iSxe)O5 zhk!Ph0OH37<@zwzn8_AF6ldF6efjfv+hO*Bt)}jkllyaKc@9M%?VIrtz06ZTcVC9o1ee>!?JUZ`PO~-8g|O3Efwg5Q z#@afzgLXt>y3cC25|Yp+B&(GRo}QI!R_}QiIe4bjD3LYtL4$uE?*kHA!Y;Hn(IO`- z%`&(ZuR<@hd%}nE90RC8QL8A@ITAo2mQk%-G5spP!}9pb0+EEINmsR)sy@y?g2^XW z3{QBO+gW>dUO9?Oh#IsLm(19xpmQ}vH59QW_8 zyb-3A8b_TyC-c5`sw}QsKpWjTYnEUgwKo_=pnl355&1S>gf&SZ=6snyl?Dc^)9@xG zdZYRccgQE-D`OsZ-OH7vZC~QAvZ>C$jGnM&`HGkl1+Jvb&M+QaU(~7lT{=Blmq7WhB(YbR0K}bmmLk z9ynU1v6#t(cQ@FnSSHIvB8o!1-bBNQ^ph$_09oP}93bc4+mERYD%~X2`{oLewnpU? z*hDyBER%l!6Hvx5L0B8=)>{N)zoR0VW0{#Uzr(gyMNAXWy(SuwLpD-S@A-21up)kU zBcGeCQ4HX(mNHPa1Ti5DuD1Vn_?O$W&V8z|a_0z|Aa=61mG1B0YiX;oq(9{BJY@%d zR=~A4ZPS+ERo53Nz*E4CDywa~Uk#-m^}>BX)P9LAGFX@%KPaisl-^_!hFDP9Rg?VJ zWH%t85o>j4)cM#Dta|tw}fTV8(N1b-EUSmdsUB*WF z#*pjnc&<@S4;YL`XtIKDH?XQk21ev@%$8)Sh4rDny7ilfcjuR^mgL^ugdZJMMbE6a zgO)pYE1Yxl6AUKlAt}RVsT;UCgy9iMi%E&k?1+S`NaQDOUl--`!=za3qgHK1Y$MCQ z^>xr!JhN=x%FHdc_G?d?_XDBpNfPzE{+j2t^5w7}l&lm^hwdq1p^z<4SHe=|&!Oc* zlM_P9s}?>o#Ah#-!!-bgj45VAesgHY>F52@aEG#me6P8GMo0fMLI$S|*;H?&48qT) zZ&3;pi35Lj?tEooWEX272~mQ^QTP7Bw?a?JC)*u=-z2h-NovBDv3dQdR>k(xbB(#5 zZE)?=v$<3=-FtkYqgYr(RQ87MA*(NK$qpxn5iK_a6#iWit-a=%rq^O$HQoS)d>=mE zgs5J@tlC;x+WV;qvVd}hK2yF4VAtSQd46s{T&kzi(z)kAVVl5ZtfH*Y(-%cTXSwL= zcu&8H%r1+m9-MRwh7NRg3@)G1AcelGL^1ffsAIPg{QHG#?`JwU4I3EUhQ=A7f~oVE zZ74|wCZMPqJH~LWIJ0-ujxEv5(-|W10FU$QE@50&?%Vr1LND(Z*T-NSn|+No?U6r? zsD*iIi+Nk>r1vbg%7e9t@)CbuFw-k#I|*Ln*V^Hx6fxKRxAH@B%U^YETmn2nhz0+@ z59P$1vdPvOk}}k3CQyhLo!nyVyD&+L>G4fw5aP-I)2DI(LPs4m8x~xOI__978gAW) zgn`#W2}k8Dc=}U{5SqSQA?@$~5(uU|^7ELlfThG}Z8a>RkKVx+zc|vPc08QHex5Xa zmPL4DH@vY{_dOgV!w}Epg*_Cwq1zTzKt;%$L#a|Bh;}V5sCrG6P{c3dEbN;nM+O+E zpPo|Od(dPmM<^1;3Zb0tQ@S1V=i^V?who4tWm#w`f{u5|><2mn6tU48#(euC-4m^0f5tLDafBWIZRfSDnWUPm|n{%%VYNq@-ff|vu%1^F7^LkGv062WQ_{Loi-4JBjrME=D!g}hxn8HoJL z+c8_x*;sc_aAU>JU#C-=G|BgY@1>*#GQ`ImkbOtFQ?jE^VwaEvszzwV(Wr=$7D;gk zNJTMmh+`{ysmZN%WTcG_m!<<-Tbh1wRJr|xVlGk`?Pn=gb|=wbR+eFCs2b$X7<-nOu84)=$v?@Edr`>nhO&2tF3!i zf*G#{X;5$sK&AUD7Z6lxvp><6XJb?R^>6#VSS6K-P*^2Kqoil>32sJWs;TTn6-sKI zf$#-0ZcKj;Eh~xh(AEw^VuK%*o`&^Tzl}u{!^!dbUDk8oY{s69qnZMAwG(K8KdDkq zFR}kxIJ2u9Su(>3N4iXLQWJYZO}y&?cHtK0HC|vhu8fO~2?SYzvVP;JaSF@ZIaZOt z&vA`9VPh5Ls^xK)rVenY-lM=gWvzj{bBf4#a=|8<=LKTfz9WZvx6I1tSfbf8odS-Y z?xqf4k8o{LQKtC>{r^ z$0-O3QmPT?Y1kA5EdYbG&Mhpb_i?Z2V!es#rI`4b=)NNpfBIc9rccl(-$4d011JX!9iRWvDf z+|~~iQ$tN;vBtEB288~JT3R@nQH!6TfBrYNkl>g_gL5Vv^5+Z%g zF2c&GaY6=^zEsHxpjEbH6Wi*9T=k!*O<=euH_buo-vO{PhCEsYFEGX%HTTl##`DbA z(+K``UlWmXzEysDmEd`mqPs7VjpoybetiJ#lQ>>TW*f6r?1jQV1>pAzmUFKMU))qbJZZS>g9nkM24CI z(Z$^0xqcA_n5lQ1e9K=;(0y-P>|J;U#{}RxL;xT19WE3uLEmi(T0vHKLR@~ zLXEEx9I~Z=SNt6M{8OkWMqWgTbamtke-HxMQWF2@^)u@%%5MB);E++PTETtH6X=BF_NV4wU25xE8< zGgVu#Tq9777*fc|@6a;yfl$U<;JgB#?B~MH9PXgY|FpKxbcbSTFW5@K1^_Pbk2h)* zDz1v7>sSmTL&<`OYfkJkO6oT(4*B;~0~Dc-!zXZsI3`r!2#WiXK4E2G=+w@NZ8)yp z#rea5Pg`O<_zClpjlnxo><0osWfSGGcFcuG`yRJb*cCbFh+J=yo?)P)Lrq-Dc0R{n zA3}J0!7bN;^UrWdbRqhwTJLAP;qr;)Jn={JTk4*umXtF5<;|7VMp~xPgmkO1H$kg> zSWDaoC}Zqtd^NndVV~c1wHl&|9;bdGnDpH3|KtbIp#SJ5Vw?0DS7c8b2j3`bQ&K3E z!&y+v3<6!JCwSI#ecN$H`Lj{(-%E)Y2WMo92)AGbJu3`{h}g7{dQbk2SFB zf}#{atTq+49-7ErQ|!UsE1S`RoUBW1|2phF_*7D9@e~RF&4Crh1nWtT^GS%FRYWyw z39?NeYalMLfsr3cP+EEoOHb>RD0)IcD|$(} z11LQmml?8PgqaS=LVF0m3DVj})ab~SuMmBpf3|t`TTWt5FNy_2;4r3|&3#4XZmw&>A)>FUlG)^4t~44~HJBvZ z93@%VM3m*50*kTs%^F?gDCz@plcz)79a{czrEWsS&@rM5FJ%<{t*`Uofg!NMrutyp z@CW%ZK5haIo<8zTgVujJ_l@6^3?b8+lXdjV!MQaKjM}!dy4xIyu7vjxwR$GwILKay z@PA){TppPHpT;3NtIIUJkD1JF6I8?IzX-K3UPyy4B~1J42m4=AgJOo)R1G%<(2o5d#}(vCTf<4lb;g;V&w;gGqpSzx z@XGJEV1p3(7?HCHTT^j_fJoFuRoo-0*oSk@;SJC_o#-ennf|D@k1M?(4+MYy&RAoU8XT65p;8pvlbo43`&~ZPF=pb%nE7kk4?Lb z@32w~>%DZh_m0+m!-91!C6i-yn>9mq?z$ta`gFIOkm|^5H>8}ad0K)Cd?b*PC{Fq( zN?Qgzcy7Wme&1V1n~{RNQnD~_Cr_dDF2}Zf@o8XXo)3Lib64Bg^PhlYLu`w4dsl(v z7G4P%i8_v;K)4JM_ImSNxkeLeO&H-`ulz>sZlW12#Q|BJ`^kXy4??>VD+l^|5~5O} z0RtD;<~eT`zs6WAM<@o=xy#&GsIpO_vn3|wrVTC&FfThF`xq>ACah>S1OhgRcGS|7 zMR!*XDNk7et#=3Zm=!rVvsy>BRDpN|9lNT);XMBZ<}oR)v3=Ec0-FChlWmwCp?r2r z?cJCdLDSPpKw!{>O4S*@#LhR(`}0PG|Mp=;(bSt?hNT00_9dK;YuCwWO>1q?yEifs zG9<}kfLTfd1%MaR1ZE(0b9=w`&%P+hx@k88js&8owlLpO?nKZH7@)7Dr?O7mo^<^v zRzMR6y4KI5n#HD8!PG%i<5P=RTvSB`jHj-Of+#BCnKr}m>C@#wJFNdHt9LL+Yf7KU zJnyA%ESZVu3tdORjGM8)cOT;$8i1-1B(Y$K=h#9myD)muYbvw3(X2SLSb#`W``xQ1 z^k=8cs(?j87uQuAA)aqktQ|IHF-*od^G>Mze~u5@Sy^of%c0isR5> z)C)5b=u%2ENF73Em>=EB6W9N;K$UOD%cCd;}8DWD2*5V=p^aT zB&#f3AMhqZKSnv3bn$?UaQxsPkUkl&RhS+dzKtZ);)fCky%v(|{e}{}m?e)Xn-w+S zOPUBHc0SL_HedJ(;6*JZtD&auCG8c275I;0q#osS0Mn*M$d&6Cs_~e2A1z!xS;yx( zcBcFZRdLA4re!^Y336X;tfwb;29v5v5)!&!RI!UW$?C3fug1vM@=_^ z&k70m-pUlF*$Z8t$;VCdfwaF84|@v(>JaER*}3feyI7Q%!t~jTN;`b8krwzw2tS8r z_fdjO#u2Ah1jrEkj6`l;`vhTYo0XUtiOM+1L6&8G*uep(rM!(Oi9 z$38RC`*$^Y3eK(8^<{qTnUs55$=60iC}7|c((d!rSWJiuCOP9-eKu4czUGs|dXpVW z1)aAy{(A&Bgiid!UdTd(-b0`t09EhiAnw-@r=%BbK@MaFN%akjLkRNQJR})4CAj08 z>V8Xa(;`kIGYy%CD=?*2@8kK^o4gy_jgh^i@F4Bs)qZOKnqKM5^W?Aza_0}Yfaitq z#$YNvIE8CcG>=nR^ogW9JUj=TMt76$T?YZy&pjF2g}nGnyNba$?NFiq@&z&FwL>YJ zdc?Jg@k>&`PblDaU{oiB+W+GlugA?E7CZYz-|1#E9S3%ycmAg)57^a@ta$j*Ulv6X zC;r$4gL1O%iJc_cAfz7d7^5$+VU|wh(&%c6SzEx2X!VE>I&Z()UTf`xBO)Wus4ylH&CP7024oEicW$mbhM+K^byIjgYjyaR5P6WwE zMWvsZg4XxjN{oD1A?P@KTCfJUDgZY?$iIX72gdmKR{l-C7ILLIf9FIO;exR#m>S7% zlQRTG%-_Y7L{+mhFX_PRG25xk%K?25iSJD(o~r8mUY;nRfR&yJMG6oYbhEz`xg&IL z_0{OSUfiLR>mFXNpeMG7XKSa9BPimPYYbKR^!hEr9If4@q&nIl-_;rK_c!oAOi(r- zV9e!w-&=~X(l+6x^rN+VYieMl{xm=sg*%E#gdI`I>Z`ihqR_kbF%67!N$I!auX5?K zdVO-OKH{`M<29GMScYe&v^U*5M`{%v)J*;j( zKrdAvOO}DXUWBy?{d@g%69GXq4>G8B;WSP2PnrgPH>I%M<=f%{w=G7zz%OMUy1|Zk zkK~ad*f~f|HPwn^4i_NoUEZjRVYZsGejz zYBP$MTyk5^N@QhIUCPi+(ve`6YT=50g|(`Hs)62CzIz{Q@1Vdh#~$SHsAQz`aoz7O zD-*pi?kXlM82iAV%S`;}%F?|K6_^{*d&t^aMx-#Q;`$l9ZdNl}4>p)KPrO-tR3Dyu zMEqY&Aepx93&jBnv((RGIqq%j<;nBo<%?_}yt)**3N!Z;J8B&SD?8l2R5$%E=1zpa zMRvne_W6-}A#RG~gJtNE$lmv8YfMYw%bCW?<%~fN@%)hD?=mP+k#P5Q5VbeTTQu$? zZnVjCCX=Gk zY*Vn6_Mh`#*m=8yBH@;Ytgur*e_B+X=9u!oEqLH7utm$HmZ+T13A-RJr*6dZ$#t#3 z3COao*O(u~78k~2q%-1x3dL7Z4tj}ab1;J=#p5Q0IBr1DW{kE+qkp9&#`!1OdObq{ zo56P3*2)5cMh;StwYl47v;rUZp8{;mnptuDq@lHT%pe@6TbqogVU3TD=Ie~H#txgw z+UVt#@jT0qs%{lIZZto_LnrMk<8@Aq3@EY(zUR{RI$(4ZxW0aMTqS1-WjFe1NQ>$x zt3N`aw~(8aSJwok=S zqzm=LJhJo@l>>O%u|A{bMA`e0aOrOW6A&R)iIiFvSwM0=v{uSGN^jdTPIQceufT?C z$LmXZ>wM@zwb``U9d9kH9yG!^ag$(EQUf?Og&}1s?cUnQZLWEb8cABVkygWbm!irf z>T`ecmks?&G;*nzxWLWUX%q`%<#F%Vev`J1;SVjMQ-R^ z6{}Hm?(`6=(1SfUAM48gd(H~}tT2+Nge9$HeHb_=XOPV)M?9USTqd(tquLtN}TIxhI>?Kxl7ma`u_;stNU8ie`I-!NPv(_+G=10LRlYZQSP)o!bxj z3$bYkoSyf4H2vIgBCH$=4XYeB3Iog#*|1IZu*K^*aFJ_r;rO@&TF8~$1emF!vtVnq z3q(Uc@W37HLoK;9u~-$g6BjeIS(t;{>aF;`6JkWim!c zy`uge_toGDMmz5T2~#fbI&)lj(WerE2 zD1XCqqp6Cu0x!s_m=e`STLWXfV8a#1w`4a>wjet)N50dqeu|svX^zWJC|wU_<``5~ zX!3iuqsN&Zo`dw5)dSw!BG?Jx!7G_)&a{RLE>7*(=kg^1O}4d$f%MrP{|*Hv(Xv)5?fg z`OtPCY6PCEV@gQYqHBCwc;rrk9^N1Q8RzC51g3ZQE;TkXIBe4ShUIg2x#ZJ|fFia0 zkxU=iNZWH*$Si|V-SoPZ*^BwpCi&Bw3LunGrMHbSuDv4dp)eN)1qb}n^7zF@11{6N zf}8`|LnwfO!~*5OlT{OH&~qrY;j$^-`G{q&6V4Cv*#{Z^D|?7<^dfingcC4^9 zy)~$#I(zJ>+D}IAaH(yYI@zt`b10%wbmHqeqJN9ja}Xu1)7&&rLwhbo-e8eI8xYwU z+e^~%$bcoZ-stPI2}iY+sdKiNe_^W$V)FToAj!{=gN4B}pRrhlwLQY@N@RZ);4PMu z2;B1q!Wl{Sh|E7Pot_aG3!0K8NNd!i89Zn`_OS$YQ82C&iw)4U07%+8F(=t}H*iy< zq043ls!)x^r2Y%y=W4q2_3ANbn0;J7^_P>A&u9T=kZpRO2{hEo8k42Ujm8FE-KIz45);s1m6j%7QOtCxGH`8#;Vo|#3~Bm z{u%dhoS#1_JkHY%!8%c^or3=^*bEQwUCA9)ckazfd)_%x@${}Nhnbq6_|=P~wvnzZ zbPp=vs+Tn+d*^1GIX$In%EfTo0qtP@?^Zpl^26$$X90A^^E*INMSUUgI;CKiK#of+ zjnm9$9PzmX&{KrvYWDl(!P`tu#!zh3odPC7a7UWmzNaI-xBcA2T}CbdpT&T(Mri%1 zdG8O&TkIauZ;~aph)yRX#J>m)dWyYm0q?F?Q<)`D5#R89JRuqvDeDP`kf3Yx?47)hE8Ud2ZcQSf{X=r-}d8^jKD6p7oV8g^Z~6 z72^(+Swz5fVnZR#onOlLNZ+GGt@OjK19v{y4863JYTs#|z{bY*Ii3_6hg%=X6ErZ=szog90 z8N^Wk+{6iRH-6r!R~KET&#bB5%s2Mh3rmS8KP1{j0<+vnc?Cf>0JP4$Elb?Pp8|^; zHBdr0Er>e=7WC~?bLh)jPWO4=zQ&B-A5H6 zOVA&A5O8H_eJ!9DBrw0I`te}m>~r&?jj0pY*1RII)cIA-;xwcFPjIg_W*DSgL^h74 z*!EW(a)}drx8TjPxN<1CXT{Dw#i~ooHS=YqGUCc70cu(BQ#pDPMPI0qrPY*z*bPUk zJJ)lQj(&xS|A^c`n!~~SILVj9hpBQ;SsPpKA$-*!S zV+{~P+^G&ZWZ0y%KrQxFs=Yr9KcoElNHnFy685ku0AEpDFhHEZkA=)Q(+}u{JWM3} zuH4AK6TY+jADZYN;_xGH$}}GMaTiW5Iu$olDMInw2-C`+evY16B0s6}lD#h^V~h&d z5B9=d$7PNL^^SkS=#g)2!4TI9NCF4~^}KqzC}~Ca z6$a;1oW^Q;8>;W%weMSDhc_Ptu;82b4?_rhke}SE=iOK`0_=*D7HrhzTLxQx<2TTF z@&$#~xq67dWs5^YBS+lq8F=5NZ8IT5MRz1^MC?s+Yf`833BLq{MZ%J z8}G|I);*7v!}cjleMWYc{!0hJI7mEoy3a5K$2icb>KF*)5PtkSy5T5*>gu#fAfKS9%L(8u0LG6L=RdNQgl~>A=_G z$$OneVl{pw@~zxEZKz77t# z=q(fjBBFplr3W>4OTT#!y}UJc6Dd5b_FeQ6U9Wgw6hFd9f{Eti2qp9WIBv`p+(u2uqS_9E#Ym^> zQ!_s)q+)YQd^NM9e)y1etO9O!GpoJsg@II=k+Qg3QhD-%M^INz)tfJhh|-X8EntQY z7j^A0|g2|`szlC^(V9AIb%z$}#zoULmNao%iCF*@}# z>x&vPT`MmZEp_Qe?v+l}BS|~hU%|E^ph9Whb&qgN`@oR7=NwY6`J{pRH87FpCk6TV zzNqP@wY%jDkYa%2!Y=mH@&>K{7sGNns=!XIH%vh(&lq#2P@5U3SX!eF4*}?Gkp(n z0g)Z`7Qrxm9g6V1u1t_}HKN2jgMADbk4%M@Sc1Xot$Wf)4t2nP7-@lb1JykHf%PW~ zg7%B^PA>$Cm>Kn7qyS}P&b6MX4dIqJ!({Hiz#w5Q|Jwy~ayH;il!D-(G!P50UmL>S4o)CD8Rujcw9}|K zy}ZA_@!K84g~QnI7_m=bRGW|kP$WBy&t;v{-}0+H0he)uVRgQ0#0a+$>}!j}%^)wx z41^swrEcuWoWOh5$v%hQN+dOl#M$jsew{cngwnHXj~XvsLMD5?1==IrK?&0df1A84 z45AY~ceKU!pr@jtr&DAD>c3|zgf1=evtH!DID=F$_gl8eByA(#AP>(e%BQiGGma`_})9`=%0ABD?|9^rhd(QEol|e(RTOjn3-eno)E12Vh!XJ*bf6`RlL;AT~>-~Df zS$qkVGN|S^1m{70y#Nm;Rx}o^Q=)~e>m{P_VT&AeRRhavZ7R~R5gwW^gFR+u=8xX1V;sShh8M||w0hf@xWK9Cj+Becx zu*Wb**mmZS^io-6I#)$ZaozqDI_87(Qv3q}xYair&ra-n`%UP2BAL;uDjH;f z_XaVR48L#fwtW&q)GP81ppjE9{ZuOF-I)Kbs?5T`A8ZPHMj%kX37nFBEAr~zqGB|H zL@h_Qy+20JU!jmike;A7g}~tJKBJUQqKfHXzGehV5d*$iDeo?P;S6CJ#nH>zR!N4G z7OR@Vdfa}M7e*x5fwr6^K$dR@7xtH&6d%G70mq8|JoeW^RLoHO3+acW{QsY0x}*9# z(^T%ipqJeQ2ifN&e}22ZKnU`=D{Yh_yQ1pF67bZBOeoT+Xwz8-=N)F#31WgbFE;4n7M{ z-aJ}dLJpkrRZ~fNtB6Du#txlv4TkN9G4_HZqI#x1k_D)1OhGAs@`%L&cu)Lb6YG$o zVbPw;KXYleGt{jwz6wOhjogx{Q!OG|2fN)p!zGU={0c>w6W~s4zaMZllPbAfK0URB z)=~Q_pl)OmKW|u1+;ddp53ARjT>ohJTb@yM5_G+6HDOQg_p6`6M(~^^3Gz*X%a$!# z;!q=wUTRROb{Rk1QDkHo$(&BgtFZ9BYvGGaq>)|60Dp-a#-~Dr%|>qHvBO}vyU%)fhmQ1_m6=nBN#ZjMKHbW* z6d7|-wpz${Iu)l*ygZrwpBw6h8Y@{sPx{VSX%@nO(VpM#;ll&5AJ4wjeq3iG6Yn(! zs!Z+mL|>4qSo+{zaD*HovM#s6?qixq(jEaw^(GBeuUi1pns57do%vnwZ^kQlsz6Nz zN>^8{cv3-woxZ_Qv#bVl>g6@aBTFNNIr{WD@}h1`K!d_Vjgs<^M>rK8x0h;>%9d%@ z26JoFqUoL{j$rG?C`SsrN=gqi@rQ~?QI*j{tA2X?|3rx zXRZbA=%f^F7M)6L%};(zj*M=aJ*?$;|2_9)w*#4wpR=}c^e0J?7sF#J*`EWAzqBF` za=#cML{CB?eX9S+BPCKiPWO>~LqCI^I;y~xsuO&OK@+W#{saMTxtRQ${`?Wz}PyzZ|#{lnrri0aZA4Cikt-6CI;Z9U{A|7CQ_Z zHfW|n@1)WJ&^RJdTg6XCvj5oStP~EZI+eulo#ld-&V1_*oT6W2rFEcf5@iapqzBqq zNXhz;y$E-lJGojP>ysPiGcg?q)O;Nk#CodiO>w+l7Qk{)TfD~lN}=1*t*Afl^`a}A z)9ug#u;9c>-TWaLB~xsBm>mJ}r3x_U|NH{c;e{NW*^vM)!zfQiQ(kK`XQQFmH3`dg zX|Q&gkFg3_VJ8K~$pgL*@;}?HBkZ?c(*g6NKyCctogQ-bxrV*-JAry9aV?D_|7O)? zXNqfY-ZvEoTn_dFV8zob!hWArF$C>-2z8cU8bbD7(^7j^L9^ap4s#78IcQ)8qKGnfubRnMYM7d;eu{G?m3M^>g15yL6HEcr?vAAv+>A5COi~&P(9Rs?>`hdO) zRN>S&ls|@jHqXUF!3G8*Z&Ldx&U=$4UWSR!43X(S!_MR%YAL94H4<3qq4umum5E;; zFpbMmxIz;VehunaP9PDTU3B};Gu1xHjgh7pz&f}2M&NV`Bs93K9f_HgcI&j`6XgA0 z_ooxW!j&+31g1_{LvFJUnPepRe`G=~%Wo!@N)g3|r5-q);!ZMkiit#7uigQC$?(*r z-rN5f6Ya5h%_d6t9}JRX;y)tS9DmQUsP1ArhN%4Hhxz#LG*PV9jr|Gb?c`ShK|=z{ zGv@e&qd)w9Vsf6QTeGonJFJWP&_A=$uWNJ+F+Bf-&Ayqt=~8bs!qXwp4e z^nG1)LjO`^r`2$VrMkkqc`3~;I~#uCqC2-owe4Vm^&I#}#l?GOR-~O&+h5Mhgi;Ug z^co@+$owuA10;basQDf8vcf5!%vW7S;~OKgL{bgu$*%y14UWu@$SVx?0ZW)5NT}(B zcn(m@x^Siu^`I0{*j4VFW?(7NG7`C&MF zkch)t=($Pu{!jd0_ckm(*_3v0om{~%!vrqWk`q^&(SNPQv4K-rsTp$~Tbg9e_*68V zh@Ki^K=oKDAz1ROD*IA12SF|9>L3V4csowtXGoe10Ro`>k=6PT0_yBOQ_+*V^lGo4 zUPGENAnS^G_A)$0ghr%X5Qz#N+u5Oa%4UA=@2RPlrSG4Jv`M z;Y#9AO*q|mn&RV0o{CNghnul$zt-)O*-26<^9cH<_5@tjygI^{uK1mV8jGyH}nXMBHrbT)=INbHC2J3v67c^X$U#wf=`$+BnzS6-LeQj0SW zTkG64!PWFMj4e}XEPf5Vq@RIY$;JsXir{!RXPj5Bx~J_;csf>CP`Mda9w>rI!PfZ~985 z&znV0&O&c=X-3&7kf4D&VcRLxkaEuD)iX)9EbL9}u%|4NubZt)5V)eq2#kEM9~z5{ zTC&^I&WynjTMP>Akti8|2V=7Mt$_oB7N34b6g%pEahtph6jAs;fljlGEbLd7)~?af z#bs$u4Imfo#gh|exDtvEwgaQ~eO(36Tm3Md7pMWkgLo~%zXl6Q;v7>*S>}YK^v+p2;#wE>M7ML9nA!z z%FCY~U4@RlCP7XZ*_cCtYJ_LOA|yoLkHa67lSrxH>OoapCxB4P_H8NFfd@jyksS+4 zkarz%X z&}HZqgvHgZ!@aWAp6B65QeHbE;`A-vqT3v!4bQAN&FS)s>wlPycf}5R7l&)(2Gz)K z9)*$77S6g$4oKnO8kpQ&(lSklQjov(O2mYX&pIA7JwGHc)fvs;3UbF8CDrPWYhv60OS< zF9po=WUxKH+2zq1?gDh>3I8eNlXgm!%yCB6!YJ25cuMA__ElbJP-?iSS6OI770EkL z#&%4W*$}^B(1iQ<<9?h>!$m%bjl4_1mbB4RO%5!wkFGLb{R5-}qo*cu2a|hf#DK(Q z>LQ?Tw;4z-QeN$^JMw01oXgeT2P-Y+crG4%tkm!p!X}5m5p_CewMJXMB9x6oqXqXaIo|mzrm|$Kq*I{F1)e@>R{%(Fe!A z+upeR>7UFGQo{FU|0tfSSyfe;Sb`At$S9Bjeo<@Vog^10FtN-%mB(P3c6 zVi-;?BNzH>)e=#8gVhUi4EKfR{j5IElZpFv19}kspFvH>#U#elW`yvX?gl0Z6!A^@ z=Nx00Ksn8;3HGDNPij0S2J%xUs%k8RtH$HDwvSuqI@2uHIhryvVu%9-qFy=!$G z0BKB_L3BxLyMj^FBGuM)mn7hE3GE`f5?75OffzRGOxPL;cc-uzM9_2Z-A8!hj8b0D z?<=ehkIBgEus#zW5kSQfr{5@;D<8+dSxUmlblS03jIws$zhN2!Or1uGhKDJEPF{rf zT(%_|S;pDz#!-$llw9hydcrQnfz}8w zHu63J29B@$GXr90qfL}R&>y`%$Hfdsa^k9pXa&vg(1FhtBi~nm&<5V@*<2^#0SX{J zyzE9D`&R-Bkb$2PAW#bsPz%9O;rY~wq-e7;Ze4){*!&HshtwWIHn2_6v&-CzL}pte z5l2Bql^L_?vGSj57{|53aF^^?kD2I0Gg^E_UwAdnXXAn9@4swEneOB^aW&^Sy3|XR zMPnr}Ad!uVa(Ai@rSbu)&S{8(jQ9QetYu-P)B}(9G8*q*wf~0aFX1uRtQ*eP`ZDE= z=&YelCg_Hff`qsF+VDWrP3BRCG&AZiNx@k=UrpQCa@cU7nYH>=QgxM~^^`3uU7kNL zJlxyLhKqecFwvYdX`|~IU?1zLH+5f1EaTimwPh)k%No0WG{Z7EpvTPl#=cC7_2}nM zsp2;TdQ>C(6P1bZS#g^Vzm;Z>w|1Nw}rx zQu4-VhE?EkOGkH_dQNi3IIh1xxMU6Ey-v-&&HSz|W0Zzyz&r&{=Yy8&vA&Ntn~p!E z6^w5Vt!;P8Ir}NL$^YWa?t@mUax-dbP*TSmF&&Fc$1kZobyPqZHbssldMjLt zIglH6_<4pe84XjByfmMqnhYinWTiYQje&Ymo2|3H3~YA>zM{_g+>hZK?@~w&lQh`W z%@qxGWQ_=ppCCyQEeb)vJq?#%d4ghlvyDiP)hL~fw7S!(YxAC(QUEn6p8NIn_R(Zf zwmC(slYXU-6%c83tuOEMTrG?v16;xc9dg+DOHs&w=I}q^V(jS_gx7pVgF8o4=yY~d zWpWZPh~WN32$Ovcsu1UqC%VMVY1hXaC}%lk`71Gt^?DR&&4Af&7|#2*Yl+T!$@yJ;XfhE$5l~N zVw6|=vL$xZh8$Ncf(y|Dd?SCI#eNsMZC++K zw%32zEgc;}^&JGuki9`#U+dg-iIs3)#;hg$@q@H6lVJy#UvD5tZ&_ zZHe@w=V-H*GIWmra*zb+r%EFiTB)&>K=SqEd#ZQl`iVqdm3K4!^+#D-!yS{CmYD{~0nDa372zs3mCsi+@Ag2wg-YY`;RUjgvmX zpO3D7OS4ljY4c`*Y4*o3=uYdgy*NeNN3>1E|IMk%(JXz|N;oZ>w74kVsUqDR!|3KM ztAchDQWaQ=T#0Vr6Hf|-;F8XL=rQJg%vqF8+!sxB?ec z>9njr`C?US_PIXj;j;+=0RYs@TPJ-vIFb%MLF7q{w85@Jtlu|thvncc3i}Cim96dl zy|ZEX`REu36f<$|)lw?SOEL=Bi27eHcbNA7>CyE5sNz=d{g2w~D&K2I@J(&aOq7Px zks-P!Nk2|r{2@_{6>t?8JrHu;HM3ECY`9Lq*bflLidfj&*s$@e5sC>2^8zi=?3v|- z3iE-RQH}AT)Kf$W-RsE59`dRE(3|Z!l*&txw#0dCdO*Ba1@QM~4x0QiRoa(TYVmk>VUSn^+^&#VcNE2OXm>Ki0loz)3}X1lwqSPv?i&rhMQ)=? zOavximO^XzLi&qRD5p>vcIc!3$*>+o+X=Errkz%96MlzOt5}zF5`gT=`-j7{l%oi{ z5`L0WXonSQT7}bas7g+4w63K`;Heaeb3*)Mmrm;Ay-nj#q~#@I$)0TIA^Jl!-yjM= z2z7~Jox;TgZ(@;>+l&a=;V@k3?mEOhtZlvtK<`Pa145n7YM-ID6N%NzjU!X8ZE)N{ z@%rAFa^O!m+hnZy&7iBZGS+x!o6C`p+p9t^+odTm%dD*eF+Tp0e&H1$Xm29q>asQ9 z7Hq&2#0F$4W8G->!@`vgzcJm;i6h}Djq=>G7MV#8AUd46%$|T@mMIT^P?eBml>_ri zeJU}9vZ@D^Q&<4^e|#XKy@NfpuKw11UKYV~Y=Qp1m?6nkZr^83-h4mwv5`SaWM%nP zkI=Ov36plO=gW0vhV6x0;RECYIuL@&ChF_E&8Vz&@9*{10M)>fDGYnOLFDhs$nscJ zwP_dk%lm*XFCzMMJ2bTLsXyfpxu>^Pi|lRayz z5PEq3sW#%N;K6*Tr_*p?gao_7SWV?djiW1Z<}C;(@9l3lQMb<%DyF+ON!U);K`DnK z@x2sMI&Vx4)UC>)01$2=1}W8J_PiLdyA2 z<~?Uqvu!SJCs4J;t^j27yUU39eO^6Pn+&$PLwOZoq5l*R2;tYt6xcZ+n$G3B%gF31 zVA624j=YQ@nB^aXOA~>Z9decn=SOPKT~MfHSnCpziq#nRJSQhy?iTE8c%C-BPJ?oS zdKOH(IJARev&tJhC`jd_`ZRiHCYeLh!e?m!I)j|8vHC(-TXa z2LEVc42rlYN%+-$Vk;-=QhE*ip+eBsZH9=UaTwpvREKl`5Tc`c9u9b??&#hBSSHcA z08*;fhL8eWuXg`>vZrlI%(%m0xKe&6i(V=ww|HGsaQ{8*zdO<^$qB9E0~>$QFOZBF z{9%U5IuzabJTiWS>(rmGsg+sa9MF-4I2vXV79{PhZVzIb3Q4!gbj%*kB-=>UZ>7WR z>K@EOLuVudCh@`_nmnuW0rsZq;J@)#Ek;J`WA)6F`2-F=!}wyWF4ms(*?eR1rwFDd zb5z~*9o3Jv>1gwls3gVWwMeLI)`zvI7$maNdn!&y5XC7S6v51a%FYd?Y1VssTh?Qt zR)Cm+6xRloO&(kYyV7=Dj>njduwQ#KG)9LyK$|&!D+y{a{Da0@e+@RwIm018KKv>) zSd?)jbp`7=2*vLdv}VBf(q6-v>mvc!K4NDuV|%HN!d+K~I674eq)UOJ&sw=Sjb3S1 zt~QsN#`qgVq^z-1{+T&q!G54l+pvgyns6V!q8zF>QJ)kL=peRSMx^9ZCgywQr!;xr zdPr5^hWq;Mz`QydlyZ2JyfnM? z#rCWe>d8{v^0%;#Tc!I3z$Q(4v3Nfs+dwj1VeN>{749~DV^^!jGbB~^HYV|TNXjB$ z5?0z}s}xrtr0yJi-~$_i!#R@4Gu}+2`7IzliAw7ye!{=IM%Iph;-zA=e)m58rQupV zOWeHODPY>7sAaTccMwpE!&=7`DwJgF0?QAZ)?Qttnua40GDuDKyT`%e| zLOu5b|EoFyGWM)j8`yKhnN%$htM!Y0uc$*S432HeQ_&9IvIJ83w`YKIPR%F@S~pHO zlcS!Cv8|S62oc8n71jzAuZaP2+~?W458?Ads}ESFR;Y3fy2sa1+zpLTEl8pH%G)I| zHvL~KXijM@xlaj0P&7Tvr5?XupsO+yKeDwg|M=L|&6&;r@K`k^`t3H*1eEP6{L~=V zOA9udSMTri*F-rPM;J>o-v}vm5NbS*e^TC2&vtH>tgew3z0gxdf6=F!w6f+{Dq!0< z-PF+XwasuV|H)OFu@0wd=C)Ul!n-LZUxleElctfsQ|$vzj2^Nd+KLs8C-ijZgQ4gb zT9YgUk->Un z(cDjhpu8F?Q(D<1O!J+5KW+$QY;|}ncHRQS!7vt}3L(>>-8wB-u1s&od59b_Ld*zS zSUyOE1WoVHiY7^hPtw#}Snu7jrTSo;>Slg(J(bAH&wm@=%_ibl{}VdKdA}-B=W?DN zxf=Z)X`9t-BL$o*`!$EP_#wY;+i)X3C6_v_#3(hqqw( zec&%D0c`hT$=Z%J9T#eZw!&btKJy9hRS*{DwogHd#*V!aIZtE}tgHZcz*&2+ajLTT zW(m(fiwz@$*!0awNhtH0A$hmd4+Wm6OnEkqFov?Y-I_@xHN3#H74*Zrp9O4UdSBAc zB_VKN=0={fR^CQHoU5h(<+@S@(ndLh#GKi%QEryuUc>wOK2yzb_r}*==1248ydyEO z^4-~8U36oB)u8_m<~Nrd=W-C1Gvn->>W)b}jTQrq{dqNV!)Xhfoqt}feApzWm?3>t zq-a>dJkkvc_XzlsYXW%B{r=JvbcNClahMz~3-7UsmFt)r`3Lp7`$dE;}u1uQJu2PI+YE3j~S6JMj!uW%d?`UjaTOb5&r zgd5lJDd!Mxk?aR6%e=XxMwhCEubbREX0q)ReVhS2djOvSlP6{x;<=Tp-rt7RZBVPvz9q6(+Safm%(up zoj$cjI-rSp;$9=If}oJxyRD1gmAHtY-0XX+B)69KMP2Duqo;pMHx!^W#Cr9GW_}xK zVu>{`=rEItIrF5}yKft+=eikdFA$NFJPjLLM6cbm0L=irEHyC|~k6Sn?Da`ah(-=Ui zBcSfYikq=CEYb{<%q|QKQ>HPE$Mlk3YHxQe2bXqY;f4y&38|B5ieS6n`*wdUQiw0f zB7CC8@2(uUO>xksgoa^_FuVB`sh=Q$$&9b|u48NR8Xm#50!mqOniPGFZwD|p7t@J_ zZ*WI7CROO2$y?t=eh3%pZ+=~JR+-@1_)}4T4Y7dZ2TR69t!MIH4bMRuiB~ewoUlC? z+tTC7T64ow5TLa2HR>Bk&SH+@pI&plI8(U)LBJcx>XN1kF}`u`Iu7vdh735*l86|p zQjyvbAJ#4p_%)vpL627lpOIA1E%8rKa+R{+!%6lZ&x`<8$H+#b8q0^_;-tlG^ZW$9 zl_~Nomv2w|sQn!k6J@1D9hP>vRMu%P2(>w#1|a}(3&mA~EI3XC>&VA2&yQ<|I|MB> z3zHeLnCa4LHPaEBC0~(>g-z*G8ksfqSfC@k*MeWUAsm7 zU8XrEZ0{%7h&?Wxvv)HjD3RdW*BrASzC{4wA=)8Td>V3i6&b*|s@v^`-VsX({S57` zD<}t(TDaGdQAIz!f3?lQ7WKjd$#_%%fP;WQX2MBSSb2bW#J!~a^Edmez>1NfS9H3E zM#SmAJ_6>N9i6EQl!6h&I`KFOx292RPWR{t0ZQAtLc}Aem%VDs6+D#zqlH4&Ma8R4 z*Ns-~{Y4dy#nao6*H@Fjqa)csUrs+_0wpIJl=n-%$2W|ztuQ@1`TudFk|Ne*+YVby z6INokw{y^X=v|s;hNW%IX-G?cgLeWffcnqd6<)CoVg9mrJwDmRNom{bCgL~HWe>HS zeu@EwN%;M)uUfZ$1^bx9S;gEyi9b)<;b(BYLoVnacg4kIDwmc0@?P79i56P_Jb02m ziZJhvD?aSsk+ibl7gwx+dHst<8rln=mtkb}n*+1sx0TBh!b4}EW4x|MpP|>iHA>%t z+Z6s92SA3LJPyE)fHx=E^#Gu;GAMkThBEFnbM2daIYywi?2K*Q*S|#;w3T;k=iJ^z z`tvU^%jTEactswBe00GzdJqdeK~D&b;Is8;J3efxAxuATMES#h2|pXGMP^a&gP%elI#x_zR% zc>|XNj2gj7v-!rcXmZTV(s8T7Vev3bKA@M>aJ%Wz!id!vAMRBtRQdSQ5374^vSwox z%8dGN__4sL8Bi22%0Qq=kl7VMk|*nlx8r?mCeE+nq0V4q%a<%VG%0?LIEIu2FfoS{ z%z#tH<|YnMfS2s((EV%V6iC}?-j%fySRm&~Jf`zjJtC)=CJq-7 zeCuz5VFd_DcnmcdiHKP=%XEv#*n3+x602yy!px)f1a{pLm;@}{mF@HeZF?+O%6DoK z()dDz=1=I;U>-Ci&y}DVH7v(U?(mQnQ zO$7J3aGXn}u9+{gDYV%TH6+^sfZR4V?hy{nE%gU%*R6Uam)KU<9;$N$ovr~OFp|x-dTO3q>1AIX;OZS2ujlebYHY06J(Se-g>QK83{;m#{ON?j4*%tj%C_BxV zwy^-`M&a5<^~iKPyGt%cx>71g`chx)ggK=2jgR_p(c-yMr}vVp|}QJdw|AEP>`PHD=CT`RtBp^Xgc=u6KhC_ z{D^zSsjPhJy{HC0*TPg80IYe0F~L;sPc+EQZe=Qf8y~*KSAY5vd%m$5BgD=r99U2i zH+;mA(I)viJX(xPaQZAWJQOQ@ckYUAkGRA`MI$Q`!bFVudGl}tt(!x7C@ePS>rLsj zM(N9u!!9iScy59*P=T-ONRD~LcG^O~%cSJEZ2# z%V%zfTgI3uthlLU&?A*by@}WY9sI;lB^n#m2}MDcc;sO z5B|f)it6L<$2R&jYqsM#7tsJ>E8|T9cl^B#Bx6Y2ttiC3blt9&L~9*>?H+j&t7`8e zmH%s~4BgUByUxcmTp6zXM_w=p-Pt29@=d-egTZG=@Cx>t!rj&z#~zc%jT0pnEa)^zS!+W4YtEq?7Ji$qlzgtQb@ z*OlPL<{3VxTrI1xdX`6^Jf};K#-#ufJoBa!;^i~=M`u(laBhC1mi@`kN2>hg*)5yx zQ@K$&H0wr-OFhU~IX2Rn_R|C=llN{t;7uF_nZ8*;%K_m79{g#7ZoB(jU@b^V4g3&8 ze$51ajkE>syaW5_`@#l}XP#m+C1UWc}+KrQM9k6#aS0rt=QBUGkA0*aVKi219yit1_+mtZ-&w)g) zKZa7Rya@NHfX<(?q;rK&E>4m)Dkm#ifOG<8wCgwOTEQMeoyV@?(0B>iyft+gLSY`G zWj;R=ey+WaE#-YjN!8c6^nOZfxp>rDG^tHgG-v5=6;KH$`^0Qt_r%1a`;~O-04&>6 zW!bGnBA3AXyOCgajX3v4j>Qdmdo@H<32fNO(cKz~lSf1Sk)OY;s>K>43CRdHxkhe) zYlRz{t$0qO7K1RzhE2vFRxq>hQKn)FSCNhzZSM@W;SPbOA?9Dd_GGfSgI!0C5H#Nm z6&5x`Efh9Q5u=4^VkGfN>k9VPtb}1)M!SkL>L?Gk*|&6gs3|N-NQ7Hzr)D9QWj zeUlL5JTKrmD%+d@hIcUiC};{2G0*=2w7(G(IMNrNT+ZS1E3FW|`Be3$6x02oUxkDg z$tfO2lEMgF&R|#|h`~tHaD;w_{Cp$)d(d#)wjD)_JKk2;@`-fq0_JyPd(sub;iSCV ztw;|E=1ZDGX+3fdc@e-(MTj6Qp~G2eR)e-cx<9)nL*Wshx2fTz344&t{guz(8J<`0-@34ogrCY3uz)^lJG?&XPB z|K`_tWeab%$8%+Hwy^#mPl#rIIozI}tldx+Se9NOtT`Sz&jbzv(c`cwpG~-FqIt+L zPX`(>_ni(^%k{CXuybJe0-#Vt(4*#pN<)`UV=DK7UUq5oroj7n8N_H~r<^JZH=4_C1Z u&Q8G@Bu1fIdWez*>KHn#V^xjfXaqi`mrl^0u8bN5HAJ%il1}fS0001m;v6dg diff --git a/src/assets/images/folderbg.svg b/src/assets/images/folderbg.svg deleted file mode 100644 index dbcb62f..0000000 --- a/src/assets/images/folderbg.svg +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/images/folderbg.webp b/src/assets/images/folderbg.webp deleted file mode 100644 index 75b948dbb9b2cb962d6c65398acd6e8f9543798f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19128 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 diff --git a/src/assets/images/icons/android-chrome-512x512.png b/src/assets/images/icons/android-chrome-512x512.png deleted file mode 100644 index 6a53405cc5f3faba61331b3ab3075487f0d93004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39338 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 E0H_@Gr2qf` diff --git a/src/assets/images/icons/apple-touch-icon.png b/src/assets/images/icons/apple-touch-icon.png deleted file mode 100644 index ecd3bb07983f40c65c16ff16691db1ce5aa69b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9776 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 diff --git a/src/assets/images/icons/favicon-32x32.png b/src/assets/images/icons/favicon-32x32.png deleted file mode 100644 index 1e1e0693dc1321c8d2b6a07a1a039b41ed4b3c88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1244 zcmV<21S9*2P)Px(mPtfGR9HvFmuqZPMHGO)*=`?O>hAUd)fT$cg%Z?YKx~YZD*6LOi5iWl)gM4X zVggFqLP0G;6l+?9O27npNC=6MDC!SV6HpUh*eF#V2K%(BDGe=b-!0wUUNg75_1?XA zA2FJqU%PW2^Ua+(XU+&>6h%>-z%t+gU_Rgi>$85z#CZMacuo zfoA|)H2Z*l82AXN6hbsa@(Bx|C`vN01K0q>$2f7QnHP8us1QO7nZ+;#P!wf0a1yxv zUrrqAb_sYw2+l>KR7dRHM#kD5*Uv5W!@Jwg{s)3TA)oU#^)SCcEeRg6d zRqhfT)|+$?Z6h75Z+r{CGNv030g$>~LWolNLj?$=+C}YY-`2X1pZn#Ix#Zbg>~z0^ z&5|@>aJ2JtKE7IOaJbKTH=A-+X~$)D+#ypm2yhr!skL~w{U~QVXCv zVO8zIZQJ7+53(lfsnA$Qgb=Glpu%;878$t`xuR%N=v+wIjFnh~h2qNfS>=hLKUZy*IQa3Xxo0{2Mu!=ad zSVa=xAh0@AtDsQQRK*`dtuaBokhz?b-Deo^j~BdTOA`6^c@$?oNvhQzF2*4V@CzV| zk3qV;*C}hNrpxPz31V5=VjfN}Bqh#NvVY(hOw`&r>2bgY9(4%3fjjb(v7#;!>jT}7P7A4x+fSVIC*gb1Ac56yFYxNMCrlIuc@%3}8^9z3JJFoth zsVRd#lvcopou9>k0ELc)Y<3y4Jm{;Yp=lwKd;N0b+sF$>E7^(DI51~BhdMst)9%wz zA!KG8p8Fs~Gl8rr=Hn~60kj;ge z$Sf&quBPM0Rf9UFmMj1v+i|riJwMQZ$JeJ`qiI$L?&KLHh{(@_Zm)++gUtp2nE|&= zam(@WO=-|;QrmJ3#N<6pG!T>bG}CV4q&-eUPtyPOJpUVxoYaCn7$1ZH0000GL;YU5@P?W)r6iI%ZOou1>uF>=6}-lHDc6(!#mR|n2I>fw(X zUpxQ517`&5Dt%RYruQFq9qohk)ImbSXr*|l^t&F~7wgxH{jINyQ$2^p6xyf(Y1s!7 z-e`KpL;GIa8{$~}fSu32(Ll~g{Fmd$u~qsqEpFZ-$M6c;t@7RDXUze}{9)Z!8#f7# z2Vs0BfjPBO@^H@|i(by(IOb-1qFLhPjB{8xm-;7rME67oSvuyg#)Epuwy=@`SjIZ` z+$XILC{uHieXGWo-?Fdty1DqKoyh}!14#RnEkMr&z{S8K;ALPBaN0tCGmmAgLlc)1 z0IxfM#lSIORA61w!0KiOpuH8i6*vjZ6i7=Rx2B^7>fa752j&XM>-H!*px!;e?pz7h z_>kv4K{}wE?Uu4@hD*ey{*!`suVJK8OeUS{R^w}b_Dyz68q(=lKT@IUkhifPkk9e9 z`+R%D2HQ5#?yN2UvA77nelRrEFE&^I#zCWO+wP`9os2R(^8tCBCpNg{lh=yU`vmu5 zH;he>if3w98D*31&8BDFBwO`yKq1$dW1hd(_@t5Fq0YA*yl79kkEphqQrdeLP?o(m z@y)gBfVWy+G4iC(pup`zm}E2WUF=l`C}tlZpLWe-TQ2l{W|Xh?sgw`0%~;2+$7$^Q z2B1u3Q$5A>t#rRf@!VX!RM!2V&FjOcI(kZ

Hzo;csOuMoOD)1kP!W!($ac70XM$ zCEH40?r7J0k=ji?ikhA?^0qS7UJ_JCmL)L9dne-JqxQX!ozg{br|Fxz4o?jR@mBj- zP#wF>&j&Nfeyn1#uzX^h-tf_bJno^PP&ItT=);+0uPJ*_G>_GX@^KJbN(#C5R_w%627cOK{ZW$YJe0A+Iy7@-&I=6999h$Nf3{Iz8V z&H)XgXQB%}YG}7ort+CQ@@Ze5uPcZw`|q9ah)2qQXxHZ)C~kg13{LfVcxxF&_@)i; zz%`7yyMO)u?{D1+`lMJ_@e>ct(={v57ml-qE{n2__V-BFyB=O9`9;mo;VhXtmu{;1 zwULJF)&SD}T6=(J|Ji%}MI$d=hnE{R;@rfoECr@LoAuvs+pVhTsoZ}o`JVlEhvA&5 z%YL?YjY!Nmx2=ylXd6@KSv}p;{Jbug-&ES(e=Qxh>Xo*mZ8{JA`}f#`hNcGe>hilS z(IkBoy)M69{txRq{0~chp#P+%2gpK%g|Xk$x&xrmd1jR!D3Hvty{ z7Xj}B76Oj|Yk)MQ+`x$ZW**B}hjmFq+M7I#XE_5hZwB5ATo3#hNaL3TMg`U-4Qa`P zyl$RlwIzGV$pdoTwg7Kz()g1hkOz5@XWneI0et5HZv(Cc1|D2co(+&UWl+|x%- zXDm>k{Z6{TGa$-851FSlUm0|vPy*jk z@$*Zohp*~B)QyxIV{dNVee|bJ)a^FEaX=Yu zug69P=}%e9(T4N=$3f~39f=nEzSX3!JMVb6r~k>Ex~(nNi8* znOU9Jbq0)g@Q%)XSE%UxQr_qK0CmjM+kpS{XNrC5%em+$N98l7*pGV#H!$Y&3hpL3 zMyhU<^g{m$H!J-=b+!E^eA9oT4`Kw~jfcrxU-2`+*p3bpxJPB|Vnu0sx>HuoaH-D9 z{Y_o(#3)Zo9%IuZ;+@vlBFA;z{I=Aui(-?h^FrVvAbs%w zNQzpFXV4gMFW{Wzdi??6Jz2#5_TJ*hKw=UIrhH53@TDa3sk$9E;} z%=G($hsz$2?;Q?Dj4%4Ng?;4Od;RpH&g#tPSI3h-Iz22ZhW;atbsrE1JN_izZrvf@ zs4%9>eT?y4Ki$Ie+4l#rpX;$pj{?q&Li|1A%!>Yx_MWn6XZT(v>Rp0gI~beg+mAGW zx;u?t8pN#1yT*#4%VKru{TcT=eGuNO4jW>pA?i@~%$!K6`;6e;kj`C(sqeScKZ>_r zO(Cipi>Z4mNN+3-&TL6E;BI}XV;!6H3(9-4`nP!F<8XI_g*r=Be8!m@@{cx>Z;v)r zncoEj>8r}PR;fGR*<}GLwv-kN-esk82c>k@Q_i`v!HejLjEA2(bN-~Yeg`M}#LEp& zr0tLCy06CGRt_7?wVx$W_sI5>wtrVsWF`(|;144oK z?NRQ|l%A%PKE}5C$K_kU*YVzi`yJmQeA4-ryx$GE(=_Qw-6Q!AXZt?IdG~>gZ9Loa zamQce8;O;r-*NEa*`NUaAK!JPaYwHFhfx2G_kp|*HT7wfJl@^&J!mqS6rc5c66lxG z|KT|~0x18DK4_r-%rjJ`wvv7Q=a!e`e5X#Qdyj}!W&XY??do2<`5kxNp&Htw{O8c~ zOVd~_{7vVWN9lLg+1|L(aaVt-|6ieg(uT?<>fNeAZJEWh)_S0fX(0_fKk|KBRDD%F z_Tvk6kBE`!At_M(&^I={2T*iONvplhQ>1#@fVKl! zcS(BUC)A$+S?2gv`;B+@x}K(Q+K>8C`(376efgj7(!=5@hWH_AedAY_{%OY#^)|5I z=}(6N&nSF5PrqNM*S`(=b1=i=hiS!cb$Q%>&h;IO?9*_sn>wU*f8-hm&Lz%0uQ5dCECFRvCS^yyH&S}LQ}DFwqVnJWIi2;VA}$}_2oi>dgGiW9I*o%u+^vq#qJ)2-K+|G(^k Hs6FsMy})4S diff --git a/src/assets/images/logo.webp b/src/assets/images/logo.webp deleted file mode 100644 index 8c43924da152401080c7c5c099e2de266a25763e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 107184 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 A6951J diff --git a/src/assets/logo.svg b/src/assets/logo.svg deleted file mode 100644 index 68cd099..0000000 --- a/src/assets/logo.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/assets/scss/BottomBar/BottomBar.scss b/src/assets/scss/BottomBar/BottomBar.scss deleted file mode 100644 index 1c406a6..0000000 --- a/src/assets/scss/BottomBar/BottomBar.scss +++ /dev/null @@ -1,64 +0,0 @@ -.b-bar { - height: 100%; - - .grid { - background-color: $primary; - height: 100%; - padding-right: $small; - - @include phone-only { - grid-template-columns: 1fr 9.2rem; - } - - .controlsx { - width: 100%; - overflow: hidden; - display: grid; - grid-template-columns: 12rem 1fr 12rem; - align-items: center; - padding: $small; - - .progress-bottom { - display: flex; - align-items: center; - } - - .progress-bottom { - width: 100%; - - .durationx { - background-color: $black; - padding: $smaller; - border-radius: 0.5rem; - margin: 0 $small 0 $small; - font-size: 0.8rem; - min-width: 2.5rem; - } - } - } - - .r-group { - display: flex; - align-items: center; - gap: $small; - - #heart { - background-image: url(../../icons/heart.svg); - } - - #add-to { - background-image: url(../../icons/plus.svg); - } - - #repeat { - background-image: url(../../icons/repeat.svg); - } - } - - .volume-group { - @include tablet-portrait { - display: none; - } - } - } -} diff --git a/src/assets/scss/Global/album-grid.scss b/src/assets/scss/Global/album-grid.scss deleted file mode 100644 index 2113138..0000000 --- a/src/assets/scss/Global/album-grid.scss +++ /dev/null @@ -1,12 +0,0 @@ -.card-grid-view { - height: 100%; - - .scrollable { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(10rem, 1fr)); - padding: 0 1rem; - padding-bottom: 4rem; - overflow: auto; - max-height: 100%; - } -} diff --git a/src/assets/scss/Global/app-grid.scss b/src/assets/scss/Global/app-grid.scss deleted file mode 100644 index 97fbefe..0000000 --- a/src/assets/scss/Global/app-grid.scss +++ /dev/null @@ -1,139 +0,0 @@ -$g-border: solid 1px $gray5; - -#app-grid { - display: grid; - grid-template-columns: min-content 1fr 29rem; - grid-template-rows: max-content 1fr 5rem; - grid-template-areas: - "l-sidebar nav r-sidebar" - "l-sidebar content r-sidebar" - "bottombar bottombar bottombar"; - - // gap: 0 1.5rem; - height: 100%; - border: $g-border; - border-top: none; - border-bottom: none; - margin: 0 auto; - max-width: 1720px; -} - -#acontent { - width: 100%; - grid-area: content; - padding-right: calc($medium); - - overflow: hidden; -} - -.vue-recycle-scroller__item-wrapper { - overflow: visible !important; -} - -.vue-recycle-scroller { - padding-left: 1.25rem; - scrollbar-gutter: stable; -} - -.r-sidebar { - grid-area: r-sidebar; - border-left: $g-border; -} - -.topnav { - grid-area: nav; - margin: 1rem 0; -} - -.l-sidebar { - width: 15rem; - grid-area: l-sidebar; - display: grid; - grid-template-rows: 1fr max-content; - border-right: $g-border; -} - -.b-bar { - grid-area: bottombar; - border-top: $g-border; -} - -.content-page { - margin-left: 1.25rem; - margin-right: -$medium; - padding-right: $medium; - scrollbar-gutter: stable; -} - -// ====== MODIFIERS ======= - -#app-grid.extendWidth { - max-width: 100%; - padding-right: 0; - border-left: none; - border-right: none; -} - -#app-grid.noSidebar { - grid-template-columns: min-content 1fr; - grid-template-areas: - "l-sidebar nav" - "l-sidebar content" - "bottombar bottombar"; - - #acontent { - margin-right: 0 !important; - padding-right: $medium !important; - } - - .topnav { - //reduce width to match #acontent - width: calc(100% - 1rem); - padding-right: 0; - } -} - -#app-grid.NoSideBorders { - border-right: none; - border-left: none; -} - -.v-scroll-page { - width: calc(100% + $medium) !important; - - .scroller { - height: 100%; - width: 100%; - padding-right: 1.25rem; - padding-bottom: $content-padding-bottom; - } -} - -.isSmall { - .songlist-item { - grid-template-columns: 1.75rem 2fr 2.5rem 2.5rem; - } - - .song-artists, - .song-album { - display: none !important; - } - - .isSmallArtists { - display: unset !important; - font-size: small; - color: $white; - opacity: 0.67; - } -} - -.isMedium { - // hide album column - .songlist-item { - grid-template-columns: 1.75rem 1.5fr 1fr 2.5rem 2.5rem; - } - - .song-album { - display: none !important; - } -} diff --git a/src/assets/scss/Global/basic.scss b/src/assets/scss/Global/basic.scss deleted file mode 100644 index ed91240..0000000 --- a/src/assets/scss/Global/basic.scss +++ /dev/null @@ -1,150 +0,0 @@ -// TEXT - -.t-center { - text-align: center; -} - -.ellip { - display: -webkit-box; - -webkit-line-clamp: 1; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; - word-break: break-all; - width: fit-content; - max-width: 100%; -} - -.ellip2 { - word-wrap: anywhere; - display: -webkit-box; - -webkit-line-clamp: 2; - -webkit-box-orient: vertical; - overflow: hidden; - text-overflow: ellipsis; -} - -.heading { - font-size: 2rem; - font-weight: bold; -} - -a { - text-decoration: none; - color: #fff; -} - -.image { - background-position: center; - background-repeat: no-repeat; - background-size: cover; - transition: transform 0.3s ease-in-out; -} - -// BORDERS -.rounded { - border-radius: 1rem; -} - -.rounded-sm { - border-radius: $small; -} - -.rounded-md { - border-radius: $medium; -} - -.circular { - border-radius: 10rem; -} - -.border { - border: 1px solid $gray3; -} - -.bg-primary { - background-color: $gray4; - box-shadow: 0 0 1rem rgba(0, 0, 0, 0.425); -} - -// BUTTONS -button { - border: none; - font-size: 0.9rem !important; - color: inherit; - border-radius: $small; - display: flex; - align-items: center; - justify-content: center; - height: 2.25rem; - background: linear-gradient(70deg, $gray3, $gray2); - padding: 0 $small; - - svg { - transition: all 0.2s; - } - - &:active { - svg { - transform: scale(0.75); - } - } - - &:hover { - background-image: linear-gradient($darkestblue, $darkblue); - } -} - -.btn-active { - background-image: linear-gradient($darkestblue, $darkblue); -} - -.btn-disabled { - pointer-events: none; - opacity: 0.5; -} - -.btn-more { - width: 2.5rem; -} - -// POSITION - -.abs { - position: absolute; -} - -// OTHERS -.grid { - display: grid; -} - -.flex { - display: flex; -} - -.separator { - border-top: 1px $separator solid; - color: transparent; - margin: $small 0 $small 0; - opacity: 0.5; -} - -// NO THIS, NO THAT (OVERRIDES) -.no-border { - border: none; -} - -.no-scroll { - overflow: hidden; -} - -.no-select { - user-select: none; -} - -.load_disabled { - pointer-events: all; - background: $gray5 !important; - opacity: 1; -} diff --git a/src/assets/scss/Global/index.scss b/src/assets/scss/Global/index.scss deleted file mode 100644 index a5c28e1..0000000 --- a/src/assets/scss/Global/index.scss +++ /dev/null @@ -1,47 +0,0 @@ -@import "./app-grid.scss", "./controls.scss", "./inputs.scss", - "./scrollbars.scss", "./state.scss", "./variants.scss", "./basic.scss", - "./search-tabheaders.scss", "./album-grid.scss"; - -* { - box-sizing: border-box; -} - -#vue-recycle-scroller__item-wrapper { - overflow: visible !important; -} - -html { - cursor: default !important; - - & > * { - overflow: visible !important; - } -} - -html.loading, -html.loading * { - cursor: progress !important; -} - -body { - background-color: $body; - color: $white; - font-family: "SFCompactDisplay", -apple-system, BlinkMacSystemFont, "Segoe UI", - Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", - "Segoe UI Symbol"; - font-size: 1rem; - image-rendering: -webkit-optimize-contrast; - height: 100vh; - width: 100vw; - overflow: hidden; - margin: 0; - - #app { - width: 100%; - height: 100%; - } - - a { - cursor: default !important; - } -} diff --git a/src/assets/scss/Global/inputs.scss b/src/assets/scss/Global/inputs.scss deleted file mode 100644 index e1cca9d..0000000 --- a/src/assets/scss/Global/inputs.scss +++ /dev/null @@ -1,10 +0,0 @@ -input[type="number"] { - width: 40px; - padding: 4px 5px; - border: 1px solid #bbb; - border-radius: 3px; -} - -input[type="search"] { - height: 2.25rem !important; -} diff --git a/src/assets/scss/Global/scrollbars.scss b/src/assets/scss/Global/scrollbars.scss deleted file mode 100644 index 6174149..0000000 --- a/src/assets/scss/Global/scrollbars.scss +++ /dev/null @@ -1,23 +0,0 @@ -::-webkit-scrollbar { - width: 3px; -} - -/* Track */ - -::-webkit-scrollbar-track { - background: transparent; - border-radius: 1rem; -} - -/* Handle */ - -::-webkit-scrollbar-thumb { - background: $gray1; - border-radius: 1rem; -} - -/* Handle on hover */ - -::-webkit-scrollbar-thumb:hover { - background: $blue; -} diff --git a/src/assets/scss/Global/search-tabheaders.scss b/src/assets/scss/Global/search-tabheaders.scss deleted file mode 100644 index e9c2fee..0000000 --- a/src/assets/scss/Global/search-tabheaders.scss +++ /dev/null @@ -1,33 +0,0 @@ -.tabheaders { - display: grid; - grid-template-columns: repeat(5, max-content); - justify-content: space-around; - margin: 1rem; - width: max-content; - background-color: $gray4; - height: 2.25rem; - - & > * { - border-left: solid 1px $gray3; - } - - .tab { - display: flex; - align-items: center; - justify-content: center; - user-select: none; - - transition: all 0.3s ease; - padding: 0 $small; - - &:first-child { - border-left: solid 1px transparent; - } - } - - .activetab { - background-color: $darkblue; - transition: all 0.3s ease; - border-left: solid 1px transparent; - } -} diff --git a/src/assets/scss/Global/state.scss b/src/assets/scss/Global/state.scss deleted file mode 100644 index 25c2b54..0000000 --- a/src/assets/scss/Global/state.scss +++ /dev/null @@ -1,18 +0,0 @@ - -.now-playing-track-indicator { - background-image: url(../../assets/icons/playing.gif); - height: 2rem; - width: 2rem; - border-radius: 50%; - background-color: $white; - background-size: 1.5rem !important; -} - -.last_played { - background-image: url(../../assets/icons/playing.webp); - transition: all 0.3s ease-in-out; -} - -.hidden { - display: none; -} diff --git a/src/assets/scss/Global/variants.scss b/src/assets/scss/Global/variants.scss deleted file mode 100644 index 6980bb9..0000000 --- a/src/assets/scss/Global/variants.scss +++ /dev/null @@ -1,29 +0,0 @@ -// paddings -.pad-smaller { - padding: $smaller; -} - -.pad-sm { - padding: $small; -} - -.pad-medium { - padding: $medium; -} - -.pad-lg { - padding: 1rem; -} - -// shadows -.shadow-sm { - box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.452); -} - -.shadow-md { - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.075); -} - -.shadow-lg { - box-shadow: 0 0 $medium rgba(0, 0, 0, 0.589); -} diff --git a/src/assets/scss/ProgressBar.scss b/src/assets/scss/ProgressBar.scss deleted file mode 100644 index 77940f3..0000000 --- a/src/assets/scss/ProgressBar.scss +++ /dev/null @@ -1,72 +0,0 @@ -input[type="range"] { - -webkit-appearance: none; - margin-right: 15px; - width: calc(100% - 2px); - height: 0.3rem; - border-radius: 5px; - background: $gray4 linear-gradient(90deg, $darkblue, $darkestblue) no-repeat; - background-size: 100% 100%; - - &::-webkit-slider-thumb { - -webkit-appearance: none; - - height: 0; - width: 0.8rem; - border-radius: 50%; - background: $darkestblue; - } - - &::-moz-range-thumb { - -webkit-appearance: none; - - height: 0; - border-radius: 50%; - background: $darkestblue; - border: none; - } - - &::-ms-thumb { - -webkit-appearance: none; - - height: 0; - width: 0.8rem; - border-radius: 50%; - background: $darkestblue; - border: none; - } -} - -/* Input Thumb */ -input[type="range"]::-webkit-slider-thumb:hover { - background: $accent; -} - -input[type="range"]::-moz-range-thumb:hover { - background: $accent; -} - -input[type="range"]::-ms-thumb:hover { - background: $accent; -} - -/* Input Track */ -input[type="range"]::-webkit-slider-runnable-track { - -webkit-appearance: none; - box-shadow: none; - border: none; - background: transparent; -} - -input[type="range"]::-moz-range-track { - -webkit-appearance: none; - box-shadow: none; - border: none; - background: transparent; -} - -input[type="range"]::-ms-track { - -webkit-appearance: none; - box-shadow: none; - border: none; - background: transparent; -} diff --git a/src/assets/scss/_mixins.scss b/src/assets/scss/_mixins.scss deleted file mode 100644 index ac7c5fb..0000000 --- a/src/assets/scss/_mixins.scss +++ /dev/null @@ -1,36 +0,0 @@ -@mixin ximage { - background-position: center; - background-size: cover; - background-repeat: no-repeat; -} - -// media query mixins -@mixin phone-only { - @media (max-width: 599px) { - @content; - } -} - -@mixin tablet-landscape { - @media (max-width: 1080px) { - @content; - } -} - -@mixin tablet-portrait { - @media (max-width: 810) { - @content; - } -} - -@mixin for-desktop-down { - @media (max-width: 1600px) { - @content; - } -} - -@mixin for-desktop-up { - @media (min-width: 1800px) { - @content; - } -} diff --git a/src/assets/scss/_variables.scss b/src/assets/scss/_variables.scss deleted file mode 100644 index 49df347..0000000 --- a/src/assets/scss/_variables.scss +++ /dev/null @@ -1,56 +0,0 @@ -// colors - -$separator: #ffffff2f; -$highlight-blue: #006eff; -$darkestblue: #234ece; -$bbb: #161616; //bottom controls background -$theme: #464545fd; - -// sizes -$small: 0.5rem; -$smaller: 0.25rem; -$medium: 0.75rem; -$large: 1.5rem; -$larger: 2rem; - -$banner-height: 18rem; -$song-item-height: 4rem; -$content-padding-bottom: 2rem; - -// apple human design guideline colors -$black: #181a1c; -$white: #ffffffde; - -$gray: #1c1c1e; -$gray1: rgb(142, 142, 147); -$gray2: rgb(99, 99, 102); -$gray3: rgb(72, 72, 74); -$gray4: rgb(58, 58, 60); -$gray5: rgb(44, 44, 46); -$body: rgba(0, 0, 0, 0.95); - -$red: #ff453a; -$blue: #0a84ff; -$darkblue: #055ee2; -$green: rgb(20, 160, 55); -$yellow: rgb(255, 214, 10); -$orange: rgb(255, 159, 10); -$pink: rgb(255, 55, 95); -$purple: #bf5af2; -$brown: rgb(172, 142, 104); -$indigo: #5e5ce6; -$teal: rgb(64, 200, 224); - -$primary: $gray4; -$accent: $gray1; -$secondary: $gray5; -$danger: $red; -$track-hover: $gray4; -$context: black; -$playlist-card-bg: $gray4; - -// SVG COLORS -$default: $accent; -$side-nav-svg: $red; - -$overshoot: cubic-bezier(0.68, -0.55, 0.265, 1.55); diff --git a/src/assets/scss/index.scss b/src/assets/scss/index.scss deleted file mode 100644 index 87e56c0..0000000 --- a/src/assets/scss/index.scss +++ /dev/null @@ -1,15 +0,0 @@ -@import -"./mixins.scss", -"./variables", -"./ProgressBar.scss", -"./BottomBar/BottomBar.scss", -"./Global", -"./moz.scss" -; - - -@font-face { - font-family: "SFCompactDisplay"; - src: url("../sf-compact.woff") format("woff"); -} - diff --git a/src/assets/scss/moz.scss b/src/assets/scss/moz.scss deleted file mode 100644 index f403fff..0000000 --- a/src/assets/scss/moz.scss +++ /dev/null @@ -1,40 +0,0 @@ -// Styles that only apply to our dear Firefox - -@-moz-document url-prefix() { - #acontent { - margin-right: calc(-1rem + 1px); - padding-right: 1rem; - } - - // applies to playlist list page - .content-page { - margin-right: calc(0rem - ($medium + 4px)); - } - - // virtual scroller pages: folder, playlist, album - .header-list-layout { - margin-right: calc(0rem - ($medium + 4px)) !important; - - .scrollable { - padding-right: calc(1rem - 3px) !important; - } - } - - .v-scroll-page { - width: calc(100% + 1rem) !important; - - .scroller { - height: 100%; - width: 100%; - // padding-right: 1.25rem !important; - } - } - - #app-grid.noSidebar > #acontent { - padding-right: 1rem !important; - } - - .search-view { - margin-right: -1rem !important; - } -} diff --git a/src/assets/sf-compact.woff b/src/assets/sf-compact.woff deleted file mode 100644 index a1cfb3196d6b07a15c95cbf81e8ae838d4aeaa98..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126084 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 diff --git a/src/components/AlbumView/AlbumBio.vue b/src/components/AlbumView/AlbumBio.vue deleted file mode 100644 index 68637d3..0000000 --- a/src/components/AlbumView/AlbumBio.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/src/components/AlbumView/AlbumDiscBar.vue b/src/components/AlbumView/AlbumDiscBar.vue deleted file mode 100644 index ad67712..0000000 --- a/src/components/AlbumView/AlbumDiscBar.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - diff --git a/src/components/AlbumView/ArtistAlbums.vue b/src/components/AlbumView/ArtistAlbums.vue deleted file mode 100644 index db5b904..0000000 --- a/src/components/AlbumView/ArtistAlbums.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/src/components/AlbumView/GenreBanner.vue b/src/components/AlbumView/GenreBanner.vue deleted file mode 100644 index 7918206..0000000 --- a/src/components/AlbumView/GenreBanner.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - - - diff --git a/src/components/AlbumView/Header.vue b/src/components/AlbumView/Header.vue deleted file mode 100644 index 429189a..0000000 --- a/src/components/AlbumView/Header.vue +++ /dev/null @@ -1,263 +0,0 @@ - - - - - diff --git a/src/components/AlbumsExplorer/AlbumList.vue b/src/components/AlbumsExplorer/AlbumList.vue deleted file mode 100644 index a0030c7..0000000 --- a/src/components/AlbumsExplorer/AlbumList.vue +++ /dev/null @@ -1,218 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/components/AlbumsExplorer/TopAlbums.vue b/src/components/AlbumsExplorer/TopAlbums.vue deleted file mode 100644 index e5e2e3f..0000000 --- a/src/components/AlbumsExplorer/TopAlbums.vue +++ /dev/null @@ -1,164 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/ArtistView/ArtistAlbumsFetcher.vue b/src/components/ArtistView/ArtistAlbumsFetcher.vue deleted file mode 100644 index 1ef949a..0000000 --- a/src/components/ArtistView/ArtistAlbumsFetcher.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - diff --git a/src/components/ArtistView/Header.vue b/src/components/ArtistView/Header.vue deleted file mode 100644 index f67c085..0000000 --- a/src/components/ArtistView/Header.vue +++ /dev/null @@ -1,158 +0,0 @@ - - - - - diff --git a/src/components/ArtistView/TopTracks.vue b/src/components/ArtistView/TopTracks.vue deleted file mode 100644 index 8535330..0000000 --- a/src/components/ArtistView/TopTracks.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/src/components/ArtistsExplorer/ArtistsList.vue b/src/components/ArtistsExplorer/ArtistsList.vue deleted file mode 100644 index 0cb736f..0000000 --- a/src/components/ArtistsExplorer/ArtistsList.vue +++ /dev/null @@ -1,126 +0,0 @@ - - - - diff --git a/src/components/ArtistsExplorer/TopArtists.vue b/src/components/ArtistsExplorer/TopArtists.vue deleted file mode 100644 index 08b4c61..0000000 --- a/src/components/ArtistsExplorer/TopArtists.vue +++ /dev/null @@ -1,160 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/components/BottomBar.vue b/src/components/BottomBar.vue deleted file mode 100644 index c8b2be3..0000000 --- a/src/components/BottomBar.vue +++ /dev/null @@ -1,253 +0,0 @@ - - - - - diff --git a/src/components/ContextMenu.vue b/src/components/ContextMenu.vue deleted file mode 100644 index ea7361a..0000000 --- a/src/components/ContextMenu.vue +++ /dev/null @@ -1,91 +0,0 @@ - - - - - diff --git a/src/components/Contextmenu/ContextItem.vue b/src/components/Contextmenu/ContextItem.vue deleted file mode 100644 index b356d20..0000000 --- a/src/components/Contextmenu/ContextItem.vue +++ /dev/null @@ -1,205 +0,0 @@ - - - - - diff --git a/src/components/FolderView/FolderItem.vue b/src/components/FolderView/FolderItem.vue deleted file mode 100644 index a4006d9..0000000 --- a/src/components/FolderView/FolderItem.vue +++ /dev/null @@ -1,62 +0,0 @@ - - - - - diff --git a/src/components/FolderView/FolderList.vue b/src/components/FolderView/FolderList.vue deleted file mode 100644 index c4398d3..0000000 --- a/src/components/FolderView/FolderList.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/components/HomePage.vue b/src/components/HomePage.vue deleted file mode 100644 index 378e5b0..0000000 --- a/src/components/HomePage.vue +++ /dev/null @@ -1,3 +0,0 @@ - diff --git a/src/components/LeftSidebar/NP/HotKeys.vue b/src/components/LeftSidebar/NP/HotKeys.vue deleted file mode 100644 index 1f495c1..0000000 --- a/src/components/LeftSidebar/NP/HotKeys.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - - diff --git a/src/components/LeftSidebar/NP/Progress.vue b/src/components/LeftSidebar/NP/Progress.vue deleted file mode 100644 index 2f998a2..0000000 --- a/src/components/LeftSidebar/NP/Progress.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - diff --git a/src/components/LeftSidebar/NP/SongCard.vue b/src/components/LeftSidebar/NP/SongCard.vue deleted file mode 100644 index babcfde..0000000 --- a/src/components/LeftSidebar/NP/SongCard.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/src/components/LeftSidebar/NP/otherKeys.vue b/src/components/LeftSidebar/NP/otherKeys.vue deleted file mode 100644 index d4cd915..0000000 --- a/src/components/LeftSidebar/NP/otherKeys.vue +++ /dev/null @@ -1,31 +0,0 @@ - - - diff --git a/src/components/LeftSidebar/Navigation.vue b/src/components/LeftSidebar/Navigation.vue deleted file mode 100644 index 60d7a2f..0000000 --- a/src/components/LeftSidebar/Navigation.vue +++ /dev/null @@ -1,129 +0,0 @@ - - - - - diff --git a/src/components/LeftSidebar/NowPlayingImg.vue b/src/components/LeftSidebar/NowPlayingImg.vue deleted file mode 100644 index 05fe673..0000000 --- a/src/components/LeftSidebar/NowPlayingImg.vue +++ /dev/null @@ -1,17 +0,0 @@ - - - - diff --git a/src/components/LeftSidebar/index.vue b/src/components/LeftSidebar/index.vue deleted file mode 100644 index 002ddae..0000000 --- a/src/components/LeftSidebar/index.vue +++ /dev/null @@ -1,20 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/Logo.vue b/src/components/Logo.vue deleted file mode 100644 index 44fa47e..0000000 --- a/src/components/Logo.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/src/components/Notification.vue b/src/components/Notification.vue deleted file mode 100644 index 86a5494..0000000 --- a/src/components/Notification.vue +++ /dev/null @@ -1,93 +0,0 @@ - - - - diff --git a/src/components/PlaylistView/ArtistsList.vue b/src/components/PlaylistView/ArtistsList.vue deleted file mode 100644 index b05da25..0000000 --- a/src/components/PlaylistView/ArtistsList.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - diff --git a/src/components/PlaylistView/Header.vue b/src/components/PlaylistView/Header.vue deleted file mode 100644 index 71e571d..0000000 --- a/src/components/PlaylistView/Header.vue +++ /dev/null @@ -1,163 +0,0 @@ - - - - - diff --git a/src/components/PlaylistsList/PlaylistCard.vue b/src/components/PlaylistsList/PlaylistCard.vue deleted file mode 100644 index 77e93d5..0000000 --- a/src/components/PlaylistsList/PlaylistCard.vue +++ /dev/null @@ -1,82 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Home/Main.vue b/src/components/RightSideBar/Home/Main.vue deleted file mode 100644 index bfbf0ac..0000000 --- a/src/components/RightSideBar/Home/Main.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Home/Recommendation.vue b/src/components/RightSideBar/Home/Recommendation.vue deleted file mode 100644 index fedad7a..0000000 --- a/src/components/RightSideBar/Home/Recommendation.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Main.vue b/src/components/RightSideBar/Main.vue deleted file mode 100644 index f740150..0000000 --- a/src/components/RightSideBar/Main.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Queue.vue b/src/components/RightSideBar/Queue.vue deleted file mode 100644 index d00df8c..0000000 --- a/src/components/RightSideBar/Queue.vue +++ /dev/null @@ -1,81 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Queue/QueueActions.vue b/src/components/RightSideBar/Queue/QueueActions.vue deleted file mode 100644 index 47af51d..0000000 --- a/src/components/RightSideBar/Queue/QueueActions.vue +++ /dev/null @@ -1,46 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Queue/upNext.vue b/src/components/RightSideBar/Queue/upNext.vue deleted file mode 100644 index 276cf40..0000000 --- a/src/components/RightSideBar/Queue/upNext.vue +++ /dev/null @@ -1,65 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Search/ArtistGrid.vue b/src/components/RightSideBar/Search/ArtistGrid.vue deleted file mode 100644 index 916b63e..0000000 --- a/src/components/RightSideBar/Search/ArtistGrid.vue +++ /dev/null @@ -1,61 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Search/LoadMore.vue b/src/components/RightSideBar/Search/LoadMore.vue deleted file mode 100644 index 4643f51..0000000 --- a/src/components/RightSideBar/Search/LoadMore.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Search/Main.vue b/src/components/RightSideBar/Search/Main.vue deleted file mode 100644 index 4a9a933..0000000 --- a/src/components/RightSideBar/Search/Main.vue +++ /dev/null @@ -1,59 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Search/Tab.vue b/src/components/RightSideBar/Search/Tab.vue deleted file mode 100644 index d52e674..0000000 --- a/src/components/RightSideBar/Search/Tab.vue +++ /dev/null @@ -1,39 +0,0 @@ - - - diff --git a/src/components/RightSideBar/Search/TabsWrapper.vue b/src/components/RightSideBar/Search/TabsWrapper.vue deleted file mode 100644 index bb4d71c..0000000 --- a/src/components/RightSideBar/Search/TabsWrapper.vue +++ /dev/null @@ -1,60 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Search/TracksGrid.vue b/src/components/RightSideBar/Search/TracksGrid.vue deleted file mode 100644 index 26cda85..0000000 --- a/src/components/RightSideBar/Search/TracksGrid.vue +++ /dev/null @@ -1,70 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/SearchInput.vue b/src/components/RightSideBar/SearchInput.vue deleted file mode 100644 index 1568ac4..0000000 --- a/src/components/RightSideBar/SearchInput.vue +++ /dev/null @@ -1,113 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Tabs.vue b/src/components/RightSideBar/Tabs.vue deleted file mode 100644 index 2c2392c..0000000 --- a/src/components/RightSideBar/Tabs.vue +++ /dev/null @@ -1,75 +0,0 @@ - - - - - diff --git a/src/components/SearchPage/FetchMore.vue b/src/components/SearchPage/FetchMore.vue deleted file mode 100644 index 4266aea..0000000 --- a/src/components/SearchPage/FetchMore.vue +++ /dev/null @@ -1,12 +0,0 @@ - - diff --git a/src/components/SettingsView/Components/Select.vue b/src/components/SettingsView/Components/Select.vue deleted file mode 100644 index af8d74d..0000000 --- a/src/components/SettingsView/Components/Select.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/src/components/SettingsView/Components/Switch.vue b/src/components/SettingsView/Components/Switch.vue deleted file mode 100644 index 72b5324..0000000 --- a/src/components/SettingsView/Components/Switch.vue +++ /dev/null @@ -1,41 +0,0 @@ - - - - - diff --git a/src/components/SettingsView/Content.vue b/src/components/SettingsView/Content.vue deleted file mode 100644 index 612ae48..0000000 --- a/src/components/SettingsView/Content.vue +++ /dev/null @@ -1,26 +0,0 @@ - - - - - diff --git a/src/components/SettingsView/Group.vue b/src/components/SettingsView/Group.vue deleted file mode 100644 index 7d3e35c..0000000 --- a/src/components/SettingsView/Group.vue +++ /dev/null @@ -1,96 +0,0 @@ - - - - - diff --git a/src/components/SettingsView/Nav.vue b/src/components/SettingsView/Nav.vue deleted file mode 100644 index c4888eb..0000000 --- a/src/components/SettingsView/Nav.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - - diff --git a/src/components/WelcomeModal.vue b/src/components/WelcomeModal.vue deleted file mode 100644 index 683bc42..0000000 --- a/src/components/WelcomeModal.vue +++ /dev/null @@ -1,63 +0,0 @@ - - - - - diff --git a/src/components/modal.vue b/src/components/modal.vue deleted file mode 100644 index e03110b..0000000 --- a/src/components/modal.vue +++ /dev/null @@ -1,107 +0,0 @@ - - - - - diff --git a/src/components/modals/ConfirmModal.vue b/src/components/modals/ConfirmModal.vue deleted file mode 100644 index fd28b06..0000000 --- a/src/components/modals/ConfirmModal.vue +++ /dev/null @@ -1,32 +0,0 @@ - - - - - diff --git a/src/components/modals/NewPlaylist.vue b/src/components/modals/NewPlaylist.vue deleted file mode 100644 index 8179847..0000000 --- a/src/components/modals/NewPlaylist.vue +++ /dev/null @@ -1,105 +0,0 @@ - - - - - diff --git a/src/components/modals/updatePlaylist.vue b/src/components/modals/updatePlaylist.vue deleted file mode 100644 index 5b0241c..0000000 --- a/src/components/modals/updatePlaylist.vue +++ /dev/null @@ -1,206 +0,0 @@ - - - - - diff --git a/src/components/nav/NavBar.vue b/src/components/nav/NavBar.vue deleted file mode 100644 index 66f5564..0000000 --- a/src/components/nav/NavBar.vue +++ /dev/null @@ -1,123 +0,0 @@ - - - - - diff --git a/src/components/nav/NavButtons.vue b/src/components/nav/NavButtons.vue deleted file mode 100644 index 8c28944..0000000 --- a/src/components/nav/NavButtons.vue +++ /dev/null @@ -1,48 +0,0 @@ - - - - - diff --git a/src/components/nav/Titles/ArtistDiscographyTitle.vue b/src/components/nav/Titles/ArtistDiscographyTitle.vue deleted file mode 100644 index 967a612..0000000 --- a/src/components/nav/Titles/ArtistDiscographyTitle.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - - - diff --git a/src/components/nav/Titles/Folder.vue b/src/components/nav/Titles/Folder.vue deleted file mode 100644 index 774fc8f..0000000 --- a/src/components/nav/Titles/Folder.vue +++ /dev/null @@ -1,135 +0,0 @@ - - - - - diff --git a/src/components/nav/Titles/PlaylistsTitle.vue b/src/components/nav/Titles/PlaylistsTitle.vue deleted file mode 100644 index 703130a..0000000 --- a/src/components/nav/Titles/PlaylistsTitle.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - - - diff --git a/src/components/nav/Titles/QueueTitle.vue b/src/components/nav/Titles/QueueTitle.vue deleted file mode 100644 index c650424..0000000 --- a/src/components/nav/Titles/QueueTitle.vue +++ /dev/null @@ -1,154 +0,0 @@ - - - - - diff --git a/src/components/nav/Titles/SearchTitle.vue b/src/components/nav/Titles/SearchTitle.vue deleted file mode 100644 index 40d5ebc..0000000 --- a/src/components/nav/Titles/SearchTitle.vue +++ /dev/null @@ -1,57 +0,0 @@ - - - - - diff --git a/src/components/nav/Titles/SettingsTitle.vue b/src/components/nav/Titles/SettingsTitle.vue deleted file mode 100644 index 8a78479..0000000 --- a/src/components/nav/Titles/SettingsTitle.vue +++ /dev/null @@ -1,18 +0,0 @@ - - - - - diff --git a/src/components/nav/Titles/SimpleNav.vue b/src/components/nav/Titles/SimpleNav.vue deleted file mode 100644 index 717a568..0000000 --- a/src/components/nav/Titles/SimpleNav.vue +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/src/components/shared/AlbumCard.vue b/src/components/shared/AlbumCard.vue deleted file mode 100644 index 437438f..0000000 --- a/src/components/shared/AlbumCard.vue +++ /dev/null @@ -1,144 +0,0 @@ - - - - - diff --git a/src/components/shared/ArtistCard.vue b/src/components/shared/ArtistCard.vue deleted file mode 100644 index 4189dfb..0000000 --- a/src/components/shared/ArtistCard.vue +++ /dev/null @@ -1,56 +0,0 @@ - - - - - diff --git a/src/components/shared/ArtistName.vue b/src/components/shared/ArtistName.vue deleted file mode 100644 index 86043b3..0000000 --- a/src/components/shared/ArtistName.vue +++ /dev/null @@ -1,54 +0,0 @@ - - - - - diff --git a/src/components/shared/HeartSvg.vue b/src/components/shared/HeartSvg.vue deleted file mode 100644 index 6913cdf..0000000 --- a/src/components/shared/HeartSvg.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - - - diff --git a/src/components/shared/Loader.vue b/src/components/shared/Loader.vue deleted file mode 100644 index ecf81d0..0000000 --- a/src/components/shared/Loader.vue +++ /dev/null @@ -1,42 +0,0 @@ - - - - - diff --git a/src/components/shared/MasterFlag.vue b/src/components/shared/MasterFlag.vue deleted file mode 100644 index 08a8c88..0000000 --- a/src/components/shared/MasterFlag.vue +++ /dev/null @@ -1,15 +0,0 @@ - - - diff --git a/src/components/shared/NavSearchInput.vue b/src/components/shared/NavSearchInput.vue deleted file mode 100644 index 82d4839..0000000 --- a/src/components/shared/NavSearchInput.vue +++ /dev/null @@ -1,130 +0,0 @@ - - - - - diff --git a/src/components/shared/Option.vue b/src/components/shared/Option.vue deleted file mode 100644 index d6559fe..0000000 --- a/src/components/shared/Option.vue +++ /dev/null @@ -1,32 +0,0 @@ - - diff --git a/src/components/shared/PlayBtn.vue b/src/components/shared/PlayBtn.vue deleted file mode 100644 index 41dd431..0000000 --- a/src/components/shared/PlayBtn.vue +++ /dev/null @@ -1,51 +0,0 @@ - - - - - diff --git a/src/components/shared/PlayBtnRect.vue b/src/components/shared/PlayBtnRect.vue deleted file mode 100644 index 83ae39a..0000000 --- a/src/components/shared/PlayBtnRect.vue +++ /dev/null @@ -1,40 +0,0 @@ - - - - - diff --git a/src/components/shared/SeeAll.vue b/src/components/shared/SeeAll.vue deleted file mode 100644 index 4996c66..0000000 --- a/src/components/shared/SeeAll.vue +++ /dev/null @@ -1,23 +0,0 @@ - - - - - diff --git a/src/components/shared/SongItem.vue b/src/components/shared/SongItem.vue deleted file mode 100644 index e73676f..0000000 --- a/src/components/shared/SongItem.vue +++ /dev/null @@ -1,298 +0,0 @@ - - - - - - - diff --git a/src/components/shared/SongList.vue b/src/components/shared/SongList.vue deleted file mode 100644 index 21b6b3c..0000000 --- a/src/components/shared/SongList.vue +++ /dev/null @@ -1,36 +0,0 @@ - - - \ No newline at end of file diff --git a/src/components/shared/TrackItem.vue b/src/components/shared/TrackItem.vue deleted file mode 100644 index 5892a9e..0000000 --- a/src/components/shared/TrackItem.vue +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - diff --git a/src/composables/colors/album.ts b/src/composables/colors/album.ts deleted file mode 100644 index 069493c..0000000 --- a/src/composables/colors/album.ts +++ /dev/null @@ -1,64 +0,0 @@ -/** - * Returns `true` if the rgb color passed is light. - * - * @param {string} rgb The color to check whether it's light or dark. - * @returns {boolean} true if color is light, false if color is dark. - */ -export function isLight(rgb: string): boolean { - if (rgb == null || undefined) return false; - - const [r, g, b] = rgb.match(/\d+/g)!.map(Number); - const brightness = (r * 299 + g * 587 + b * 114) / 1000; - - return brightness > 165; -} - -interface BtnColor { - color: string; - isDark: boolean; -} - -/** - * Returns the luminance of a color. - * @param r The red value of the color. - * @param g The green value of the color. - * @param b The blue value of the color. - */ -export function luminance(r: any, g: any, b: any) { - let a = [r, g, b].map(function (v) { - v /= 255; - return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4); - }); - return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; -} - -/** - * Returns a contrast ratio of `color1`:`color2` - * @param {string} color1 The first color - * @param {string} color2 The second color - */ -export function contrast(color1: number[], color2: number[]): number { - let lum1 = luminance(color1[0], color1[1], color1[2]); - let lum2 = luminance(color2[0], color2[1], color2[2]); - let brightest = Math.max(lum1, lum2); - let darkest = Math.min(lum1, lum2); - return (brightest + 0.05) / (darkest + 0.05); -} - -/** - * Converts a rgb color string to an array of the form: `[r, g, b]` - * @param rgb The color to convert - * @returns {number[]} The array representation of the color - */ -export function rgbToArray(rgb: string): number[] { - return rgb.match(/\d+/g)!.map(Number); -} - -/** - * Returns true if the `color2` contrast with `color1`. - * @param color1 The first color - * @param color2 The second color - */ -export function theyContrast(color1: string, color2: string) { - return contrast(rgbToArray(color1), rgbToArray(color2)) > 3; -} diff --git a/src/composables/context.ts b/src/composables/context.ts deleted file mode 100644 index 30ad3dd..0000000 --- a/src/composables/context.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Ref } from "vue"; - -import useModalStore from "@/stores/modal"; -import useQueueStore from "@/stores/queue"; -import useContextStore from "@/stores/context"; - -import { ContextSrc } from "./enums"; -import { Track } from "@/interfaces"; -import trackContext from "@/contexts/track_context"; - -/** - * Handles showing the context menu for a track component. - * @param e The MouseEvent for positioning the context menu - * @param track The track to link to the context menu - * @param flag The boolean that manages the context visibility in the source component - */ -export const showTrackContextMenu = ( - e: MouseEvent, - track: Track, - flag: Ref -) => { - const menu = useContextStore(); - - const options = () => trackContext(track, useModalStore, useQueueStore); - - menu.showContextMenu(e, options, ContextSrc.Track); - flag.value = true; - - // watch for context menu visibility and reset flag - menu.$subscribe((mutation, state) => { - if (!state.visible) { - flag.value = false; - } - }); -}; diff --git a/src/composables/enums.ts b/src/composables/enums.ts deleted file mode 100644 index b6cc5e6..0000000 --- a/src/composables/enums.ts +++ /dev/null @@ -1,61 +0,0 @@ -export enum playSources { - playlist, - album, - search, - folder, - artist, - favorite, -} - -export enum NotifType { - Success = "success", - Info = "info", - Error = "error", - Working = "working", - Favorite = "favorite", -} - -export enum FromOptions { - playlist = "playlist", - folder = "folder", - album = "album", - search = "search", - artist = "artist", - albumCard = "albumCard", - favorite = "favorite", -} - -export enum ContextSrc { - PHeader = "PHeader", - Track = "Track", - AHeader = "AHeader", - FHeader = "FHeader", -} - -export const FuseTrackOptions = { - keys: [ - { name: "title", weight: 1 }, - { name: "album", weight: 0.7 }, - { name: "artist.name", weight: 0.5 }, - { name: "albumartist", weight: 0.25 }, - ], -}; - -export enum contextChildrenShowMode { - click = "click", - hover = "hover", -} - -export enum discographyAlbumTypes { - all = "All", - albums = "Albums", - singles = "Singles", - eps = "EPs", - appearances = "Appearances", -} - -export enum favType { - artist = "artist", - album = "album", - track = "track", -} diff --git a/src/composables/favoriteHandler.ts b/src/composables/favoriteHandler.ts deleted file mode 100644 index 5804817..0000000 --- a/src/composables/favoriteHandler.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { favType } from "./enums"; -import { addFavorite, removeFavorite } from "./fetch/favorite"; -import useQueueStore from "@/stores/queue"; -/** - * Handles the favorite state of an item. - * @param setter The ref to track the is_favorite state - * @param type The type of item - * @param itemhash The hash of the item - */ -export default async function favoriteHandler( - flag: boolean | undefined, - type: favType, - itemhash: string, - setter: (x?: unknown) => void, - remover: (x?: unknown) => void -) { - const queue = useQueueStore(); - const is_current = - type === favType.track && itemhash === queue.currenttrackhash; - if (flag) { - const removed = await removeFavorite(type, itemhash); - if (removed) remover(); - } else { - const added = await addFavorite(type, itemhash); - if (added) setter(); - } - - if (is_current) { - queue.toggleFav(queue.currentindex); - } -} diff --git a/src/composables/fetch/album.ts b/src/composables/fetch/album.ts deleted file mode 100644 index a0bf62e..0000000 --- a/src/composables/fetch/album.ts +++ /dev/null @@ -1,100 +0,0 @@ -import { paths } from "@/config"; -import { NotifType, useNotifStore } from "@/stores/notification"; -import { Album, Track } from "../../interfaces"; -import useAxios from "./useAxios"; - -const { - album: albumUrl, - albumartists: albumArtistsUrl, - albumbio: albumBioUrl, - albumsByArtistUrl, -} = paths.api; - -const getAlbumData = async (hash: string, ToastStore: typeof useNotifStore) => { - interface AlbumData { - info: Album; - tracks: Track[]; - } - - const { data, status } = await useAxios({ - url: albumUrl, - props: { - hash: hash, - }, - }); - - if (status == 204) { - ToastStore().showNotification("Album not created yet!", NotifType.Error); - } - return data as AlbumData; -}; - -const getAlbumArtists = async (hash: string) => { - const { data, error } = await useAxios({ - url: albumArtistsUrl, - props: { - hash: hash, - }, - }); - - if (error) { - console.error(error); - } - - return data.artists; -}; - -const getAlbumBio = async (hash: string) => { - const { data, status } = await useAxios({ - url: albumBioUrl, - props: { - hash: hash, - }, - }); - - if (data) { - return data.bio; - } - - if (status == 404) { - return null; - } -}; - -const getAlbumsFromArtist = async ( - albumartists: string, - limit: number = 2, - exclude: string -) => { - const { data } = await useAxios({ - url: albumsByArtistUrl, - props: { - albumartists: albumartists, - limit: limit, - exclude: exclude, - }, - }); - - if (data) { - return data.data; - } - - return []; -}; - -async function getAlbumTracks(albumhash: string): Promise { - const { data } = await useAxios({ - url: albumUrl + `/${albumhash}/` + "tracks", - get: true, - }); - - return data.tracks; -} - -export { - getAlbumData as getAlbum, - getAlbumTracks, - getAlbumArtists, - getAlbumBio, - getAlbumsFromArtist, -}; diff --git a/src/composables/fetch/artists.ts b/src/composables/fetch/artists.ts deleted file mode 100644 index ef1da75..0000000 --- a/src/composables/fetch/artists.ts +++ /dev/null @@ -1,62 +0,0 @@ -import { NotifType, useNotifStore } from "@/stores/notification"; -import { paths } from "@/config"; -import useAxios from "./useAxios"; -import { Artist, Track, Album } from "@/interfaces"; - -const getArtistData = async (hash: string, limit: number = 5) => { - interface ArtistData { - artist: Artist; - tracks: Track[]; - } - - const { data, error, status } = await useAxios({ - get: true, - url: paths.api.artist + `/${hash}?limit=${limit}`, - }); - - if (status == 404) { - useNotifStore().showNotification("Artist not found", NotifType.Error); - } - - if (error) { - console.error(error); - } - - return data as ArtistData; -}; - -const getArtistAlbums = async (hash: string, limit = 6, all = false) => { - interface ArtistAlbums { - albums: Album[]; - eps: Album[]; - singles: Album[]; - appearances: Album[]; - artistname: string; - } - - const { data, error } = await useAxios({ - get: true, - url: paths.api.artist + `/${hash}/albums?limit=${limit}&all=${all}`, - }); - - if (error) { - console.error(error); - } - - return data as ArtistAlbums; -}; - -const getArtistTracks = async (hash: string, offset: number = 0, limit = 6) => { - const { data, error } = await useAxios({ - get: true, - url: paths.api.artist + `/${hash}/tracks?offset=${offset}&limit=${limit}`, - }); - - if (error) { - console.error(error); - } - - return data.tracks as Track[]; -}; - -export { getArtistData, getArtistAlbums, getArtistTracks }; diff --git a/src/composables/fetch/favorite.ts b/src/composables/fetch/favorite.ts deleted file mode 100644 index 8752b6b..0000000 --- a/src/composables/fetch/favorite.ts +++ /dev/null @@ -1,99 +0,0 @@ -import useAxios from "./useAxios"; -import { paths } from "@/config"; -import { favType, NotifType } from "@/composables/enums"; - -import { useNotifStore as notif } from "@/stores/notification"; -import { Album, Artist, Track } from "@/interfaces"; - -export async function addFavorite(favtype: favType, itemhash: string) { - const { data, error } = await useAxios({ - url: paths.api.addFavorite, - props: { - type: favtype, - hash: itemhash, - }, - }); - - if (error) { - notif().showNotification("Something funny happened!", NotifType.Error); - return false; - } - - if (data) { - notif().showNotification("Added to favorites!", NotifType.Success); - } - - return true; -} - -export async function removeFavorite(favtype: favType, itemhash: string) { - const { data, error } = await useAxios({ - url: paths.api.removeFavorite, - props: { - type: favtype, - hash: itemhash, - }, - }); - - if (error) { - notif().showNotification("Something funny happened!", NotifType.Error); - return false; - } - - if (data) { - notif().showNotification("Removed from favorites!", NotifType.Error); - } - - return true; -} - -export async function getAllFavs( - track_limit = 6, - album_limit = 6, - artist_limit = 6 -) { - const { data } = await useAxios({ - url: - paths.api.favorites + - `?track_limit=${track_limit}&album_limit=${album_limit}&artist_limit=${artist_limit}`, - get: true, - }); - - return data; -} - -export async function getFavAlbums(limit = 6) { - const { data } = await useAxios({ - url: paths.api.favAlbums + `?limit=${limit}`, - get: true, - }); - - return data.albums as Album[]; -} - -export async function getFavTracks(limit = 5) { - const { data } = await useAxios({ - url: paths.api.favTracks + `?limit=${limit}`, - get: true, - }); - - return data.tracks as Track[]; -} - -export async function getFavArtists(limit = 6) { - const { data } = await useAxios({ - url: paths.api.favArtists + `?limit=${limit}`, - get: true, - }); - - return data.artists as Artist[]; -} - -export async function isFavorite(itemhash: string, type: favType) { - const { data } = await useAxios({ - url: paths.api.isFavorite + `?hash=${itemhash}&type=${type}`, - get: true, - }); - - return data.is_favorite as boolean; -} diff --git a/src/composables/fetch/folders.ts b/src/composables/fetch/folders.ts deleted file mode 100644 index c4efc63..0000000 --- a/src/composables/fetch/folders.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { paths } from "@/config"; -import { Folder, Track } from "@/interfaces"; -import useAxios from "./useAxios"; - -export default async function (path: string) { - interface FolderData { - tracks: Track[]; - folders: Folder[]; - } - - const { data, error } = await useAxios({ - url: paths.api.folder, - props: { - folder: path, - }, - }); - - if (error) { - console.error(error); - } - - if (data) { - return data as FolderData; - } - - return { - tracks: [], - folders: [], - }; -} diff --git a/src/composables/fetch/playlists.ts b/src/composables/fetch/playlists.ts deleted file mode 100644 index f5dc67c..0000000 --- a/src/composables/fetch/playlists.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { paths } from "@/config"; -import { Artist, Playlist, Track } from "../../interfaces"; -import { Notification, NotifType } from "../../stores/notification"; -import useAxios from "./useAxios"; - -const { - new: newPlaylistUrl, - all: allPlaylistsUrl, - base: basePlaylistUrl, - artists: playlistArtistsUrl, -} = paths.api.playlist; - -/** - * Creates a new playlist on the server. - * @param playlist_name The name of the playlist to create. - */ -export async function createNewPlaylist(playlist_name: string, track?: Track) { - const { data, status } = await useAxios({ - url: newPlaylistUrl, - props: { - name: playlist_name, - }, - }); - - if (status == 201) { - new Notification("Playlist created successfullly!"); - - if (track) { - setTimeout(() => { - addTrackToPlaylist(data.playlist, track); - }, 1000); - } - - return { - success: true, - playlist: data.playlist as Playlist, - }; - } - - let message = "Something went wrong"; - - if (status == 409) { - message = "That playlist already exists"; - } - - new Notification(message, NotifType.Error); - - return { - success: false, - playlist: {}, - }; -} - -/** - * Fetches all playlists from the server. - * @returns {Promise} A promise that resolves to an array of playlists. - */ -export async function getAllPlaylists(): Promise { - const { data, error } = await useAxios({ - url: allPlaylistsUrl, - get: true, - }); - - if (error) console.error(error); - - if (data) { - return data.data; - } - - return []; -} - -export async function addTrackToPlaylist(playlist: Playlist, track: Track) { - const uri = `${basePlaylistUrl}/${playlist.id}/add`; - - const { status } = await useAxios({ - url: uri, - props: { - track: track.trackhash, - }, - }); - - if (status == 409) { - new Notification("Track already exists in playlist"); - return; - } - - new Notification( - track.title + " added to " + playlist.name, - NotifType.Success - ); -} - -export async function getPlaylist(pid: string) { - const uri = `${basePlaylistUrl}/${pid}`; - - interface PlaylistData { - info: Playlist; - tracks: Track[]; - } - - const { data, status } = await useAxios({ - url: uri, - get: true, - }); - - if (status == 404) { - new Notification("Playlist not found", NotifType.Error); - } - - if (data) { - return data as PlaylistData; - } - - return null; -} - -export async function updatePlaylist( - pid: string, - playlist: FormData, - pStore: any -) { - const uri = `${basePlaylistUrl}/${pid}/update`; - - const { data, status } = await useAxios({ - url: uri, - put: true, - props: playlist, - headers: { - "Content-Type": "multipart/form-data", - }, - }); - - if (status == 400) { - new Notification("Failed: Unsupported image", NotifType.Error); - return; - } - - if (data) { - pStore.updatePInfo(data.data); - new Notification("Playlist updated!"); - } -} - -/** - * Gets the artists in a playlist. - * @param pid The playlist id to fetch tracks for. - * @returns {Promise} A promise that resolves to an array of artists. - */ -export async function getPlaylistArtists(pid: string): Promise { - const { data, error } = await useAxios({ - url: playlistArtistsUrl, - props: { - pid: pid, - }, - }); - - if (error) { - new Notification("Something funny happened!", NotifType.Error); - } - - if (data) { - return data.data as Artist[]; - } - - return []; -} - -export async function deletePlaylist(pid: string) { - const { status } = await useAxios({ - url: paths.api.playlist.base + "/delete", - props: { - pid, - }, - }); - - if (status == 200) { - new Notification("Playlist deleted", NotifType.Success); - } -} - -export async function updateBannerPos(pid: number, pos: number) { - const { status } = await useAxios({ - url: paths.api.playlist.base + `/${pid}/set-image-pos`, - props: { - pos, - }, - }); - - if (status === 200) { - new Notification("Image position saved", NotifType.Info); - return; - } - - new Notification("Unable to save image position", NotifType.Error); -} diff --git a/src/composables/fetch/searchMusic.ts b/src/composables/fetch/searchMusic.ts deleted file mode 100644 index 6d2cf26..0000000 --- a/src/composables/fetch/searchMusic.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { paths } from "@/config"; -import axios from "axios"; -import useAxios from "./useAxios"; - -const { - tracks: searchTracksUrl, - albums: searchAlbumsUrl, - artists: searchArtistsUrl, - load: loadMoreUrl, -} = paths.api.search; - -/** - * Fetch data from url - * @param url url to fetch json from - * @returns promise that resolves to the JSON - */ -async function fetchData(url: string) { - const { data } = await useAxios({ - url: url, - get: true, - }); - - return data; -} - -async function searchTracks(query: string) { - const url = searchTracksUrl + encodeURIComponent(query.trim()); - return await fetchData(url); -} - -async function searchAlbums(query: string) { - const url = searchAlbumsUrl + encodeURIComponent(query.trim()); - return await fetchData(url); -} - -async function searchArtists(query: string) { - const url = searchArtistsUrl + encodeURIComponent(query.trim()); - return await fetchData(url); -} - -async function loadMoreTracks(index: number) { - const response = await axios.get(loadMoreUrl, { - params: { - type: "tracks", - index: index, - }, - }); - - return response.data; -} - -async function loadMoreAlbums(index: number) { - const response = await axios.get(loadMoreUrl, { - params: { - type: "albums", - index: index, - }, - }); - - return response.data; -} - -async function loadMoreArtists(index: number) { - const response = await axios.get(loadMoreUrl, { - params: { - type: "artists", - index: index, - }, - }); - - return response.data; -} - -export { - searchTracks, - searchAlbums, - searchArtists, - loadMoreTracks, - loadMoreAlbums, - loadMoreArtists, -}; - -// TODO: Rewrite this module using `useAxios` hook diff --git a/src/composables/fetch/useAxios.ts b/src/composables/fetch/useAxios.ts deleted file mode 100644 index 3da8457..0000000 --- a/src/composables/fetch/useAxios.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { FetchProps } from "../../interfaces"; -import axios, { AxiosError, AxiosResponse } from "axios"; - -import useLoaderStore from "@/stores/loader"; -import { paths } from "@/config"; - -const url = paths.api - -export default async (args: FetchProps) => { - let data: any = null; - let error: string | null = null; - let status: number | null = null; - - function getAxios() { - if (args.get) { - return axios.get(args.url, args.props); - } - - if (args.put) { - return axios.put(args.url, args.props, args.headers); - } - - return axios.post(args.url, args.props); - } - - const { startLoading, stopLoading } = useLoaderStore(); - startLoading(); - await getAxios() - .then((res: AxiosResponse) => { - data = res.data; - status = res.status; - }) - .catch((err: AxiosError) => { - error = err.message as string; - status = err.response?.status as number; - }) - .then(() => stopLoading()); - - return { data, error, status }; -}; diff --git a/src/composables/mediaNotification.ts b/src/composables/mediaNotification.ts deleted file mode 100644 index 70285af..0000000 --- a/src/composables/mediaNotification.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { paths } from "../config"; - -import useQueueStore from "../stores/queue"; - -export default () => { - if ("mediaSession" in navigator) { - const queue = useQueueStore(); - const { currenttrack: track } = queue; - - if (track === undefined) { - return; - } - - const url = paths.images.thumb.large; - - navigator.mediaSession.metadata = new window.MediaMetadata({ - title: track.title, - artist: track.artist.map((a) => a.name).join(", "), - artwork: [ - { - src: url + track.image, - sizes: "96x96", - type: "image/jpeg", - }, - { - src: url + track.image, - sizes: "128x128", - type: "image/webp", - }, - { - src: url + track.image, - sizes: "192x192", - type: "image/webp", - }, - { - src: url + track.image, - sizes: "256x256", - type: "image/webp", - }, - { - src: url + track.image, - sizes: "384x384", - type: "image/webp", - }, - { - src: url + track.image, - sizes: "512x512", - type: "image/webp", - }, - ], - }); - - navigator.mediaSession.setActionHandler("play", () => { - queue.playPause(); - }); - navigator.mediaSession.setActionHandler("pause", () => { - queue.playPause(); - }); - navigator.mediaSession.setActionHandler("previoustrack", () => { - queue.playPrev(); - }); - navigator.mediaSession.setActionHandler("nexttrack", () => { - queue.playNext(); - }); - } -}; diff --git a/src/composables/normalizeContextMenu.ts b/src/composables/normalizeContextMenu.ts deleted file mode 100644 index ddc17f9..0000000 --- a/src/composables/normalizeContextMenu.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { getElem } from "./perks"; - -export default (mouseX: number, mouseY: number) => { - const scope = getElem("app", "id"); - const contextMenu = getElem("context-menu", "class"); - // ? compute what is the mouse position relative to the container element - // (scope) - let { left: scopeOffsetX, top: scopeOffsetY } = scope.getBoundingClientRect(); - - scopeOffsetX = scopeOffsetX < 0 ? 0 : scopeOffsetX; - scopeOffsetY = scopeOffsetY < 0 ? 0 : scopeOffsetY; - - const scopeX = mouseX - scopeOffsetX; - const scopeY = mouseY - scopeOffsetY; - - // ? check if the element will go out of bounds - const outOfBoundsOnX = scopeX + contextMenu.clientWidth > scope.clientWidth; - - const outOfBoundsOnY = scopeY + contextMenu.clientHeight > scope.clientHeight; - - let normalX = mouseX; - let normalY = mouseY; - let normalizedX = false; - let normalizedY = false; - - if (window.innerWidth - normalX < 375) { - normalizedX = true; - } - // ? normalize on X - if (outOfBoundsOnX) { - normalX = scopeOffsetX + scope.clientWidth - contextMenu.clientWidth; - normalX -= 10; - } - - // ? normalize on Y - if (outOfBoundsOnY) { - normalY = scopeOffsetY + scope.clientHeight - contextMenu.clientHeight; - normalY -= 10; - - normalizedY = true; - } - - return { normalX, normalY, normalizedX, normalizedY }; -}; diff --git a/src/composables/perks.ts b/src/composables/perks.ts deleted file mode 100644 index eca9a2b..0000000 --- a/src/composables/perks.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { RouteLocationNormalized } from "vue-router"; - -function getElem(id: string, type: string) { - switch (type) { - case "class": { - return document.getElementsByClassName(id)[0]; - } - case "id": { - return document.getElementById(id); - } - } -} - -type r = RouteLocationNormalized; - -function isSameRoute(to: r, from: r) { - if (to.params.path == from.params.path) { - return true; - } - - return false; -} - -export { getElem, isSameRoute }; diff --git a/src/composables/state.ts b/src/composables/state.ts deleted file mode 100644 index e876ab7..0000000 --- a/src/composables/state.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ref } from "@vue/reactivity"; - -const loading = ref(false); -const settings = { - uri: "http://10.5.8.81:1970", -}; - -export default { - loading, - settings, -}; diff --git a/src/composables/useBreakpoints.ts b/src/composables/useBreakpoints.ts deleted file mode 100644 index 6d1756e..0000000 --- a/src/composables/useBreakpoints.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { useBreakpoints } from "@vueuse/core"; - -const breakpoints = useBreakpoints({ - xl: 1280, - xxl: 1720, -}); - -const xl = breakpoints.greater("xl"); -const xxl = breakpoints.greater("xxl"); - -export { xl, xxl }; diff --git a/src/composables/useKeyboard.ts b/src/composables/useKeyboard.ts deleted file mode 100644 index cb1e5bf..0000000 --- a/src/composables/useKeyboard.ts +++ /dev/null @@ -1,86 +0,0 @@ -import useQStore from "@/stores/queue"; - -let key_down_fired = false; - -function focusPageSearchBox() { - const elem = document.getElementById( - "page-search-trigger" - ) as HTMLButtonElement; - if (elem) { - elem.dispatchEvent(new MouseEvent("click", { bubbles: false })); - } -} - -export default function (queue: typeof useQStore) { - const q = queue(); - window.addEventListener("keydown", (e: KeyboardEvent) => { - const target = e.target as HTMLElement; - if (e.altKey) return; - if (e.shiftKey) return; - - let ctrlKey = e.ctrlKey; - - function FocusedOnInput(target: HTMLElement) { - return target.tagName === "INPUT" || target.tagName === "TEXTAREA"; - } - - if (FocusedOnInput(target)) return; - - switch (e.key) { - case "ArrowRight": - { - if (!key_down_fired) { - key_down_fired = true; - - setTimeout(() => { - key_down_fired = false; - }, 1000); - - q.playNext(); - } - } - break; - - case "ArrowLeft": - { - if (!key_down_fired) { - key_down_fired = true; - - q.playPrev(); - - setTimeout(() => { - key_down_fired = false; - }, 1000); - } - } - - break; - - case " ": - { - if (!key_down_fired) { - e.preventDefault(); - key_down_fired = true; - - q.playPause(); - } - } - - break; - - case "f": { - if (!key_down_fired) { - if (!ctrlKey) return; - e.preventDefault(); - focusPageSearchBox(); - - key_down_fired = true; - } - } - } - }); -} - -window.addEventListener("keyup", () => { - key_down_fired = false; -}); diff --git a/src/composables/usePlayFrom.ts b/src/composables/usePlayFrom.ts deleted file mode 100644 index 4f188a1..0000000 --- a/src/composables/usePlayFrom.ts +++ /dev/null @@ -1,111 +0,0 @@ -import { NotifType, playSources } from "@/composables/enums"; - -import { useNotifStore } from "@/stores/notification"; -import useAStore from "@/stores/pages/album"; -import useArtistPageStore from "@/stores/pages/artist"; -import useFStore from "@/stores/pages/folder"; -import usePStore from "@/stores/pages/playlist"; -import useQStore from "@/stores/queue"; -import useSettingsStore from "@/stores/settings"; - -import { getAlbumTracks } from "./fetch/album"; -import { getArtistTracks } from "./fetch/artists"; - -const queue = useQStore; -const folder = useFStore; -const album = useAStore; -const playlist = usePStore; -const artist = useArtistPageStore; - -type store = - | typeof queue - | typeof folder - | typeof album - | typeof playlist - | typeof artist; - -export default async function play( - source: playSources, - aqueue: typeof queue, - store: store -) { - const useQueue = aqueue(); - - switch (source) { - // check which route the play request come from - // case playSources.folder: - // store = store as typeof folder; - // const f = store(); - - // useQueue.playFromFolder(f.path, f.tracks); - // useQueue.play(); - // break; - case playSources.album: - store = store as typeof album; - const a_store = store(); - - useQueue.playFromAlbum( - a_store.info.title, - a_store.info.albumhash, - a_store.srcTracks - ); - useQueue.play(); - break; - case playSources.playlist: - store = store as typeof playlist; - const p = store(); - - if (p.tracks.length === 0) return; - - useQueue.playFromPlaylist(p.info.name, p.info.id, p.tracks); - useQueue.play(); - break; - - case playSources.artist: - store = store as typeof artist; - utilPlayFromArtist(useQStore, useArtistPageStore, 0); - } -} - -async function utilPlayFromArtist( - queue: typeof useQStore, - artist: typeof useArtistPageStore, - index: number = 0 -) { - const qu = queue(); - const ar = artist(); - const settings = useSettingsStore(); - - if (ar.tracks.length === 0) return; - - if (ar.info.trackcount <= settings.artist_top_tracks_count) { - qu.playFromArtist(ar.info.artisthash, ar.info.name, ar.tracks); - qu.play(); - return; - } - - const tracks = await getArtistTracks(ar.info.artisthash); - - qu.playFromArtist(ar.info.artisthash, ar.info.name, tracks); - qu.play(index); -} - -async function playFromAlbumCard( - queue: typeof useQStore, - albumhash: string, - albumname: string -) { - const qu = queue(); - - const tracks = await getAlbumTracks(albumhash); - - if (tracks.length === 0) { - useNotifStore().showNotification("Album tracks not found", NotifType.Error); - return; - } - - qu.playFromAlbum(albumname, albumhash, tracks); - qu.play(); -} - -export { utilPlayFromArtist, playFromAlbumCard }; diff --git a/src/composables/useWaitForScroll.ts b/src/composables/useWaitForScroll.ts deleted file mode 100644 index 41127da..0000000 --- a/src/composables/useWaitForScroll.ts +++ /dev/null @@ -1,41 +0,0 @@ -// CREDITS: https://stackoverflow.com/a/66664192 - -/** - * Scrolls and waits for the scroll to finish. Returns a promise that resolves when the scroll is finished. - * @param elem The element to scroll and wait for - * @param pos The position to scroll to - * @param delay The delay in seconds to wait for - * @returns A promise that resolves when the element has been scrolled to the position - */ -export default function waitForScrollEnd( - elem: HTMLElement, - pos = 0, - delay = 100 -): Promise { - elem.scroll({ - top: pos, - behavior: "smooth", - }); - const frame_limit = 20; - let last_changed_frame = 0; - let last_y = elem.scrollTop; - - return new Promise((resolve) => { - function tick(frames: number) { - // We requestAnimationFrame either for 500 frames or until 20 frames with - // no change have been observed. - if (frames >= 500 || frames - last_changed_frame > frame_limit) { - setTimeout(() => { - resolve(); - }, delay); - } else { - if (window.scrollY != last_y) { - last_changed_frame = frames; - last_y = window.scrollY; - } - requestAnimationFrame(tick.bind(null, frames + 1)); - } - } - tick(0); - }); -} diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index 1665c42..0000000 --- a/src/config.ts +++ /dev/null @@ -1,89 +0,0 @@ -const development = import.meta.env.DEV; -const dev_url = "http://localhost:1970"; - -const baseApiUrl = development ? dev_url : ""; -const baseImgUrl = baseApiUrl + "/img"; - -const imageRoutes = { - thumb: { - large: "/t/", - small: "/t/s/", - }, - artist: { - large: "/a/", - small: "/a/s/", - }, - playlist: "/p/", - raw: "/raw/", -}; - -const paths = { - api: { - album: baseApiUrl + "/album", - favorite: baseApiUrl + "/favorite", - favorites: baseApiUrl + "/favorites", - favAlbums: baseApiUrl + "/albums/favorite", - favTracks: baseApiUrl + "/tracks/favorite", - favArtists: baseApiUrl + "/artists/favorite", - isFavorite: baseApiUrl + "/favorites/check", - artist: baseApiUrl + "/artist", - get addFavorite() { - return this.favorite + "/add"; - }, - get removeFavorite() { - return this.favorite + "/remove"; - }, - get albumartists() { - return this.album + "/artists"; - }, - get albumbio() { - return this.album + "/bio"; - }, - get albumsByArtistUrl() { - return this.album + "/from-artist"; - }, - folder: baseApiUrl + "/folder", - playlist: { - base: baseApiUrl + "/playlist", - get new() { - return this.base + "/new"; - }, - get all() { - return this.base + "s"; - }, - get artists() { - return this.base + "/artists"; - }, - }, - search: { - base: baseApiUrl + "/search", - get tracks() { - return this.base + "/tracks?q="; - }, - get albums() { - return this.base + "/albums?q="; - }, - get artists() { - return this.base + "/artists?q="; - }, - get load() { - return this.base + "/loadmore"; - }, - }, - files: baseApiUrl + "/file", - }, - images: { - thumb: { - small: baseImgUrl + imageRoutes.thumb.small, - large: baseImgUrl + imageRoutes.thumb.large, - }, - artist: { - small: baseImgUrl + imageRoutes.artist.small, - large: baseImgUrl + imageRoutes.artist.large, - }, - playlist: baseImgUrl + imageRoutes.playlist, - raw: baseImgUrl + imageRoutes.raw, - }, -}; - -export { paths }; diff --git a/src/contexts/playlist.ts b/src/contexts/playlist.ts deleted file mode 100644 index f06eecd..0000000 --- a/src/contexts/playlist.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Option } from "../interfaces"; - -export default async () => { - const deletePlaylist: Option = { - label: "Delete playlist", - critical: true, - action: () => { - console.log("delete playlist"); - }, - }; - - const playNext: Option = { - label: "Play next", - action: () => { - console.log("play next"); - }, - }; - - const addToQueue: Option = { - label: "Add to queue", - action: () => { - console.log("add to queue"); - }, - }; - - - return [playNext, addToQueue, deletePlaylist]; -}; diff --git a/src/contexts/track_context.ts b/src/contexts/track_context.ts deleted file mode 100644 index a2287da..0000000 --- a/src/contexts/track_context.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { Artist, Playlist, Track } from "../interfaces"; - -// @ts-ignore -import { Option } from "../interfaces"; -import Router from "../router"; - -import { - addTrackToPlaylist, - getAllPlaylists, -} from "../composables/fetch/playlists"; - -import useModalStore from "../stores/modal"; -import useQueueStore from "../stores/queue"; -import { Routes } from "@/router/routes"; -/** - * Returns a list of context menu items for a track. - * @param {any} track a track object. - * @param {any} modalStore a pinia store. - * @return {Array