From edaa4cf232f3a981bb279f2719cb9e55054da7c5 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Wed, 18 May 2022 18:03:07 +0300 Subject: [PATCH 01/20] install rapidfuzz --- server/poetry.lock | 154 +++++++++++++++++++++++++++++++++++++++++- server/pyproject.toml | 1 + 2 files changed, 154 insertions(+), 1 deletion(-) diff --git a/server/poetry.lock b/server/poetry.lock index e20a8fe5..92ba5c7c 100644 --- a/server/poetry.lock +++ b/server/poetry.lock @@ -118,6 +118,14 @@ category = "main" optional = false python-versions = ">=3.6" +[[package]] +name = "jarowinkler" +version = "1.0.2" +description = "library for fast approximate string matching using Jaro and Jaro-Winkler similarity" +category = "main" +optional = false +python-versions = ">=3.6" + [[package]] name = "jinja2" version = "3.0.3" @@ -181,6 +189,20 @@ snappy = ["python-snappy"] srv = ["dnspython (>=1.16.0,<3.0.0)"] zstd = ["zstandard"] +[[package]] +name = "rapidfuzz" +version = "2.0.11" +description = "rapid fuzzy string matching" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +jarowinkler = ">=1.0.2,<1.1.0" + +[package.extras] +full = ["numpy"] + [[package]] name = "requests" version = "2.27.1" @@ -262,7 +284,7 @@ watchdog = ["watchdog"] [metadata] lock-version = "1.1" python-versions = "^3.8" -content-hash = "a2a0355e78fe2881e226dabda21b6d972a98aa4f1d60bf9f7f74957bb8ba6bea" +content-hash = "143a7a7f2158b3c3abfcfec207443a90f1a3d31a6935dfdf5e5e7452e226ca58" [metadata.files] certifi = [ @@ -309,6 +331,88 @@ itsdangerous = [ {file = "itsdangerous-2.0.1-py3-none-any.whl", hash = "sha256:5174094b9637652bdb841a3029700391451bd092ba3db90600dea710ba28e97c"}, {file = "itsdangerous-2.0.1.tar.gz", hash = "sha256:9e724d68fc22902a1435351f84c3fb8623f303fffcc566a4cb952df8c572cff0"}, ] +jarowinkler = [ + {file = "jarowinkler-1.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:71772fcd787e0286b779de0f1bef1e0a25deb4578328c0fc633bc345f13ffd20"}, + {file = "jarowinkler-1.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:912ee0a465822a8d659413cebc1ab9937ac5850c9cd1e80be478ba209e7c8095"}, + {file = "jarowinkler-1.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0320f7187dced1ad413bf2c3631ec47567e65dfdea92c523aafb2c085ae15035"}, + {file = "jarowinkler-1.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58bc6a8f01b0dfdf3721f9a4954060addeccf8bbe5e72a71cf23a88ce0d30440"}, + {file = "jarowinkler-1.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:679ec7a42f70baa61f3a214d1b59cec90fc036021c759722075efcc8697e7b1f"}, + {file = "jarowinkler-1.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dde57d47962d6a4436d8a3b477bcc8233c6da28e675027eb3a490b0d6dc325be"}, + {file = "jarowinkler-1.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:657f50204970fac8f120c293e52a3451b742c9b26125010405ec7365cb6e2a49"}, + {file = "jarowinkler-1.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04f18a7398766b36ffbe4bcd26d34fcd6ed01f4f2f7eea13e316e6cca0e10c98"}, + {file = "jarowinkler-1.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:33a24b380e2c076eabf2d3e12eee56b6bf10b1f326444e18c36a495387dbf0de"}, + {file = "jarowinkler-1.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e1d7d6e6c98fb785026584373240cc4076ad21033f508973faae05e846206e8c"}, + {file = "jarowinkler-1.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e50c750a45c800d91134200d8cbf746258ed357a663e97cc0348ee42a948386a"}, + {file = "jarowinkler-1.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:5b380afce6cdc25a4dafd86874f07a393800577c05335c6ad67ccda41db95c60"}, + {file = "jarowinkler-1.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e73712747ac5d2218af3ed3c1600377f18a0a45af95f22c39576165aea2908b4"}, + {file = "jarowinkler-1.0.2-cp310-cp310-win32.whl", hash = "sha256:9511f4e1f00c822e08dbffeb69e15c75eb294a5f24729815a97807ecf03d22eb"}, + {file = "jarowinkler-1.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a5c44f92e9ac6088286292ecb69e970adc2b98e139b8923bce9bbb9d484e6a0f"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:02b0bf34ffc2995b695d9b10d2f18c1c447fbbdb7c913a84a0a48c186ccca3b8"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df7a8e45176298a1210c06f8b2328030cc3c93a45dab068ac1fbc9cf075cd95b"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:da27a9c206249a50701bfa5cfbbb3a04236e1145b2b0967e825438acb14269bf"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43ea0155379df92021af0f4a32253be3953dfa0f050ec3515f314b8f48a96674"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f33b6b1687db1be1abba60850628ee71547501592fcf3504e021274bc5ccb7a"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff304de32ee6acd5387103a0ad584060d8d419aa19cbbeca95204de9c4f01171"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:662dd6f59cca536640be0cda32c901989504d95316b192e6aa41d098fa08c795"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:01f85abb75fa43e98db34853d35570d98495ee2fcbbf45a93838e0289c162f19"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5b9332dcc8130af4101c9752a03e977c54b8c12982a2a3ca4c2e4cc542accc00"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:af765b037404a536c372e33ddd4c430aea28f1d82a8ef51a2955442b8b690577"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aea2c7d66b57c56d00f9c45ae7862d86e3ae84368ecea17f3552c0052a7f3bcf"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:8b1288a09a8d100e9bf7cf9ce1329433db73a0d0350d74c2c6f5c31ac69096cf"}, + {file = "jarowinkler-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ed39199b0e806902347473c65e5c05933549cf7e55ba628c6812782f2c310b19"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:473b057d7e5a0f5e5b8c0e0f7960d3ca2f2954c3c93fd7a9fb2cc4bc3cc940fb"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdb892dbbbd77b3789a10b2ce5e8acfe5821cc6423e835bae2b489159f3c2211"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:012a8333328ce061cba1ff081843c8d80eb1afe8fa2889ad29d767ea3fdc7562"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3421120c07ee6d3f59c5adde32eb9a050cfd1b3666b0e2d8c337d934a9d091f9"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dad57327cc90f8daa3afb98e2d274d7dd1b60651f32717449be95d3b3366d61a"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4fd1757eff43df97227fd63d9c8078582267a0b25cefef6f6a64d3e46e80ba2"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:32269ebbcb860f01c055d9bb145b4cc91990f62c7644a85b21458b4868621113"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3b5a0839e84f5ff914b01b5b94d0273954affce9cc2b2ee2c31fe2fcb9c8ae76"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6c9d3a9ef008428b5dce2855eebe2b6127ea7a7e433aedf240653fad4bd4baa6"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3d7759d8a66ee05595bde012f93da8a63499f38205e2bb47022c52bd6c47108"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2ba1b1b0bf45042a9bbb95d272fd8b0c559fe8f6806f088ec0372899e1bc6224"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-win32.whl", hash = "sha256:4cb33f4343774d69abf8cf65ad57919e7a171c44ba6ad57b08147c3f0f06b073"}, + {file = "jarowinkler-1.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:0392b72ddb5ab5d6c1d5df94dbdac7bf229670e5e64b2b9a382d02d6158755e5"}, + {file = "jarowinkler-1.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:94f663ad85bc7a89d7e8b6048f93a46d2848a0570ab07fc895a239b9a5d97b93"}, + {file = "jarowinkler-1.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:895a10766ff3db15e7cf2b735e4277bee051eaafb437aaaef2c5de64a5c3f05c"}, + {file = "jarowinkler-1.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0c1a84e770b3ec7385a4f40efb30bdc96f96844564f91f8d3937d54a8969d82c"}, + {file = "jarowinkler-1.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27defe81d76e02b3929322baea999f5232837e7f308c2dc5b37de7568c2bc583"}, + {file = "jarowinkler-1.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:158f117481388f8d23fe4bd2567f37be0ccae0f4631c34e4b0345803147da207"}, + {file = "jarowinkler-1.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:427c675b4f3e83c79a4b6af7441f29e30a173c7a0ae72a54f51090eee7a8ae02"}, + {file = "jarowinkler-1.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90a7f3fd173339bc62e52c02f43d50c947cb3af9cda41646e218aea13547e0c2"}, + {file = "jarowinkler-1.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3975cbe8b6ae13fc63d74bcbed8dac1577078d8cd8728e60621fe75885d2a8c5"}, + {file = "jarowinkler-1.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:141840f33345b00abd611839080edc99d4d31abd2dcf701a3e50c90f9bfb2383"}, + {file = "jarowinkler-1.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:f592f9f6179e347a5f518ca7feb9bf3ac068f2fad60ece5a0eef5e5e580d4c8b"}, + {file = "jarowinkler-1.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:30565d70396eb9d1eb622e1e707ddc2f3b7a9692558b8bf4ea49415a5ca2f854"}, + {file = "jarowinkler-1.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:35fc430c11b80a43ed826879c78c4197ec665d5150745b3668bec961acf8a757"}, + {file = "jarowinkler-1.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e4cf4b7090f0c4075bec1638717f54b22c3b0fe733dc87146a19574346ed3161"}, + {file = "jarowinkler-1.0.2-cp38-cp38-win32.whl", hash = "sha256:199f4f7edbc49439a97440caa1e244d2e33da3e16d7b0afce4e4dfd307e555c7"}, + {file = "jarowinkler-1.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:b587e8fdd96cc470d6bdf428129c65264731b09b5db442e2d092e983feec4aab"}, + {file = "jarowinkler-1.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4b233180b3e2f2d7967aa570d36984e9d2ec5a9067c0d1c44cd3b805d9da9363"}, + {file = "jarowinkler-1.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2220665a1f52262ae8b76e3baf474ebcd209bfcb6a7cada346ffd62818f5aa3e"}, + {file = "jarowinkler-1.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08c98387e04e749c84cc967db628e5047843f19f87bf515a35b72f7050bc28ad"}, + {file = "jarowinkler-1.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d710921657442ad3c942de684aba0bdf16b7de5feed3223b12f3b2517cf17f7c"}, + {file = "jarowinkler-1.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:401c02ac7245103826f54c816324274f53d50b638ab0f8b359a13055a7a6e793"}, + {file = "jarowinkler-1.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a1929a0029f208cc9244499dc93b4d52ee8e80d2849177d425cf6e0be1ea781"}, + {file = "jarowinkler-1.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab25d147be9b04e7de2d28a18e72fadc152698c3e51683c6c61f73ffbae2f9e"}, + {file = "jarowinkler-1.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:465cfdff355ec9c55f65fd1e1315260ec20c8cff0eb90d9f1a0ad8d503dc002b"}, + {file = "jarowinkler-1.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:29ef1113697cc74c2f04bc15008abbd726cb2d5b01c040ba87c6cb7abd1d0e0d"}, + {file = "jarowinkler-1.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:61b57c8b36361ec889f99f761441bb0fa21b850a5eb3305dea25fef68f6a797b"}, + {file = "jarowinkler-1.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ee9d9af1bbf194d78f4b69c2139807c23451068b27a053a1400d683d6f36c61d"}, + {file = "jarowinkler-1.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a9b33b0ceb472bbc65683467189bd032c162256b2a137586ee3448a9f8f886ec"}, + {file = "jarowinkler-1.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:582f6e213a6744883ced44482a51efcc21ae632defac27f12f6430a8e99b1070"}, + {file = "jarowinkler-1.0.2-cp39-cp39-win32.whl", hash = "sha256:4d1c8f403016d5c0262de7a8588eee370c37a609e1f529f8407e99a70d020af7"}, + {file = "jarowinkler-1.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:ab50ffa66aa201616871c1b90ac0790f56666118db3c8a8fcb3a7a6e03971510"}, + {file = "jarowinkler-1.0.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8e59a289dcf93504ab92795666c39b2dbe98ac18655201992a7e6247de676bf4"}, + {file = "jarowinkler-1.0.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c36eccdc866f06a7b35da701bd8f91e0dfc83b35c07aba75ce8c906cbafaf184"}, + {file = "jarowinkler-1.0.2-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:123163f01a5c43f12e4294e7ce567607d859e1446b1a43bd6cd404b3403ffa07"}, + {file = "jarowinkler-1.0.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d41fdecd907189e47c7d478e558ad417da38bf3eb34cc20527035cb3fca3e2b8"}, + {file = "jarowinkler-1.0.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e7829368fc91de225f37f6325f8d8ec7ad831dc5b0e9547f1977e2fdc85eccc1"}, + {file = "jarowinkler-1.0.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:278595417974553a8fdf3c8cce5c2b4f859335344075b870ecb55cc416eb76cf"}, + {file = "jarowinkler-1.0.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:208fc49741db5d3e6bbd4a2f7b32d32644b462bf205e7510eca4e2d530225f03"}, + {file = "jarowinkler-1.0.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:924afcab6739c453f1c3492701d185d71dc0e5ba15692bd0bfa6d482c7e8f79e"}, + {file = "jarowinkler-1.0.2.tar.gz", hash = "sha256:788ac33e6ffdbd78fd913b481e37cfa149288575f087a1aae1a4ce219cb1c654"}, +] jinja2 = [ {file = "Jinja2-3.0.3-py3-none-any.whl", hash = "sha256:077ce6014f7b40d03b47d1f1ca4b0fc8328a692bd284016f806ed0eaca390ad8"}, {file = "Jinja2-3.0.3.tar.gz", hash = "sha256:611bb273cd68f3b993fabdc4064fc858c5b47a973cb5aa7999ec1ba405c87cd7"}, @@ -513,6 +617,54 @@ pymongo = [ {file = "pymongo-4.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:65f8a93816dcb2202710839907759aca9eece94d9f13215686f224fcc8966f9e"}, {file = "pymongo-4.0.1.tar.gz", hash = "sha256:13d0624c13a91da71fa0d960205d93b3d98344481be865ee7cc238c972d41d73"}, ] +rapidfuzz = [ + {file = "rapidfuzz-2.0.11-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eb54edd0fa8620d37a7c0762895260bc75a6cc083d161b14d40a562b6f303975"}, + {file = "rapidfuzz-2.0.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8093b5f234be618bb8cfe34d65c072fee362fbd13f6c1b37f80eac0f30c24cfa"}, + {file = "rapidfuzz-2.0.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:aea72586c08ba8ce08c37c21bb7c383df740dc7d6e921423e1881570be62ed15"}, + {file = "rapidfuzz-2.0.11-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ee9a057b7638e91377b217df3724d4adefec3936617180b3df1f64fa64cd995"}, + {file = "rapidfuzz-2.0.11-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bad453a76f6832a99251beb89c352a4f436f4e7687a5843b080c294dba68d8d6"}, + {file = "rapidfuzz-2.0.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a545627a7d45ea4ad1cb66fb6ad7b951825b0e97053056cda9d2f5fbb30abe3e"}, + {file = "rapidfuzz-2.0.11-cp310-cp310-win32.whl", hash = "sha256:8e583595efe5afdd68a7b5423cbd5fff0d1870d60cee16af17897f701f39d933"}, + {file = "rapidfuzz-2.0.11-cp310-cp310-win_amd64.whl", hash = "sha256:09efd5a02a33dfb18ec6f28b85f102b51cbac080e624924f3a4f36d3b08962ef"}, + {file = "rapidfuzz-2.0.11-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c81216ecff325765bb441caf7f50a1f55aa66192aca12ec6d448b509c9387a39"}, + {file = "rapidfuzz-2.0.11-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b555dbebb413ab66c2cd394338c860094a5464f9b63faeb40ebec44271c460b"}, + {file = "rapidfuzz-2.0.11-cp36-cp36m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a007fe85dfff7a961daba13884629dcd9ab45197a2fc40749a7e8f750e7715a4"}, + {file = "rapidfuzz-2.0.11-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1031420c083681b41346267e26f9f76ef2c1544a0129fa67b07239d7a9ab9fd6"}, + {file = "rapidfuzz-2.0.11-cp36-cp36m-win32.whl", hash = "sha256:4b16147122ec4c5e4a31131b8530e674ba1b3e74e2b43b73aedc6bd0021fcae6"}, + {file = "rapidfuzz-2.0.11-cp36-cp36m-win_amd64.whl", hash = "sha256:de7559765e1da54d8d42495368e0a9852041cf8d4e077fb27811d6f009611a4b"}, + {file = "rapidfuzz-2.0.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ace59b7857e5d5b252564dd60d840667c19c00d357c7ba32e9671b68615dc49a"}, + {file = "rapidfuzz-2.0.11-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09d83e5ab57fb61a6003a3607494b1f443978e8d6b199fed3094e92f466f3bba"}, + {file = "rapidfuzz-2.0.11-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3a53797613b53e93adbf9c410260aecde5ab1d7cd1b07792be1ee4800716598"}, + {file = "rapidfuzz-2.0.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9084a550719aff3752e5a63e32d381d64b09264cabf35d5e21e6a9f0e91baca"}, + {file = "rapidfuzz-2.0.11-cp37-cp37m-win32.whl", hash = "sha256:35c8f2cae3e2079616fdf90c6b6bcf850d3810c9184c6e89a4826b6d0af88974"}, + {file = "rapidfuzz-2.0.11-cp37-cp37m-win_amd64.whl", hash = "sha256:1da580130b37a007684ab9dc6f85125e3c0d06c9f9df349e7bd52e312811c436"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:757ae64598a93d0f8a21007c1abd6800f38c04e4b89167ca7b833ce30f54aef3"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f5b0fd8f6bde8d89c07b76643c9f3a01e2e089b246a97b721e7fe97fdaa41820"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a13cea3303b444af49417352cd11830ea2245d4e5a82bb06b6895638b81c6029"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96dba6ef863cba7efd22077ba28e19a8829b523c7c7e41304c568a6ab91fc4d"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9dcecc662df808ad051d9524608a3682fd80d882c93664adbaab4c7b0796e385"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff74f3abd0ed473f81ba67d3207ca6db74b8b50ebae1a6734ba199a8d90d67b4"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-win32.whl", hash = "sha256:b3e7eea1dd304bac4ac74a1af71da35bb68bf6060f5d6b4ad8a3e4e2c84d5110"}, + {file = "rapidfuzz-2.0.11-cp38-cp38-win_amd64.whl", hash = "sha256:5b203e83adc10dbe961a3000fa09cc47f5672d2c98c3fd2f6bb7b0df225805ee"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1fe837f8b305c59549e2eec6fe8dbdd7344eeef0033fa4ee90af65f72b32c25f"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fc2c8aa23de4a0bef2162440f5095f606052c289059fbeb03180740783e25e6b"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ebb03a6a5171233958b6adcada00c7521186ea4b78b6652b99d94d5dbf59c809"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f21d8754ee49ee8da73ad5e746495a27fd29ab769f5e45ede4d8232955e0237"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23c79ca555f188445f2e054b40a89c82e5d21b22d34f00da6e7491a6d70feff5"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b10de1ea834be1f26d1f35f3e1d1f8c003c7951a7475ab9b28b5a62e9f6f0c0"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-win32.whl", hash = "sha256:1bda150aca38c4d4739780c3a99c190c05101839adc10ab7804ed86000440267"}, + {file = "rapidfuzz-2.0.11-cp39-cp39-win_amd64.whl", hash = "sha256:f4ea654ef221a57b47523fe70d7423254dd285f73948b9d8c1215610d2a38e9e"}, + {file = "rapidfuzz-2.0.11-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2542f0a3c4079b15c0485ece589e5a248633de84326e4a3ca63ea024a0b59775"}, + {file = "rapidfuzz-2.0.11-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2dca3c02511d23a58ef14f2fbcd7b311eae1bc40e3d36be493ef22b9572ebed1"}, + {file = "rapidfuzz-2.0.11-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fbb649a978fab0232cefdeb67321d853c676b3ebb7481b8b80030905a42d799"}, + {file = "rapidfuzz-2.0.11-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:081415323e94e0016109715438d4ccb233ab038b09ba3cf79038e50601a410e9"}, + {file = "rapidfuzz-2.0.11-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a80efb64f1b38c64f04f4ca6881c9684d7912dc9124ecbf953c9b541f935b33c"}, + {file = "rapidfuzz-2.0.11-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ac8ab8106bc7b0ffab539baa5279a850c61b71ccad86dc11503bc084f6ac1af"}, + {file = "rapidfuzz-2.0.11-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3933a1cfdf6ab4e059d8eb68460fa430a4f6be06431d1a8b05f7fecdd63e586e"}, + {file = "rapidfuzz-2.0.11-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:537b72d954ff395cefc210fc7e41810a26e84ed7f1e93d0dffe3669277d6ea23"}, + {file = "rapidfuzz-2.0.11-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2d167b1bf92a60eefbaea3abf646baa2a3aa7125595e129c8890072706a80ac"}, + {file = "rapidfuzz-2.0.11.tar.gz", hash = "sha256:934b65fea75e3bd310d74903ec69ff3df061b3058ab5b7f49ab772958109bca8"}, +] requests = [ {file = "requests-2.27.1-py2.py3-none-any.whl", hash = "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d"}, {file = "requests-2.27.1.tar.gz", hash = "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61"}, diff --git a/server/pyproject.toml b/server/pyproject.toml index 3a142c54..a719b9a1 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -18,6 +18,7 @@ Pillow = "^9.0.1" Flask-Caching = "^1.10.1" "colorgram.py" = "^1.2.0" tqdm = "^4.64.0" +rapidfuzz = "^2.0.11" [tool.poetry.dev-dependencies] From 8405efede0b95f2cc3f82a2223cc44a4d0634e09 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Wed, 18 May 2022 18:03:38 +0300 Subject: [PATCH 02/20] add argument to start image server --- server/start.sh | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/server/start.sh b/server/start.sh index b86f0ca5..f1ce5d07 100755 --- a/server/start.sh +++ b/server/start.sh @@ -5,8 +5,20 @@ #python manage.py gpath=$(poetry run which gunicorn) -cd app -"$gpath" -b 0.0.0.0:9877 -w 4 --threads=2 "imgserver:app" & -echo "Booted image server" -cd ../ -"$gpath" -b 0.0.0.0:9876 -w 1 --threads=4 "manage:create_app()" #--log-level=debug +while getopts ':s' opt; do + case $opt in + s) + echo "🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴🔴" + cd "./app" + "$gpath" -b 0.0.0.0:9877 -w 4 --threads=2 "imgserver:app" & + cd ../ + ;; + \?) + echo "Invalid option: -$OPTARG" >&2 + ;; + esac +done + +"$gpath" -b 0.0.0.0:9876 -w 1 --threads=4 "manage:create_app()" + + From 4040b995180117fcf62be94ea34970dac1f63667 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Wed, 18 May 2022 18:04:01 +0300 Subject: [PATCH 03/20] rewrite search functions as classes --- server/app/api/search.py | 2 +- server/app/lib/albumslib.py | 13 ++++- server/app/lib/populate.py | 31 ++++++++-- server/app/lib/searchlib.py | 103 +++++++++++++++++++++++++++++++--- server/app/lib/taglib.py | 2 +- server/app/lib/watchdoge.py | 18 ++++-- server/app/models.py | 21 ++++++- src/components/nav/Search.vue | 2 +- src/contexts/track_context.ts | 10 ++-- 9 files changed, 170 insertions(+), 32 deletions(-) diff --git a/server/app/api/search.py b/server/app/api/search.py index 18da8342..34374490 100644 --- a/server/app/api/search.py +++ b/server/app/api/search.py @@ -40,7 +40,7 @@ def search(): if artist_obj not in artists_dicts: artists_dicts.append(artist_obj) - _tracks = searchlib.get_tracks(query) + _tracks = searchlib.SearchTracks(query)() tracks = [*_tracks, *artist_tracks] SEARCH_RESULTS.clear() diff --git a/server/app/lib/albumslib.py b/server/app/lib/albumslib.py index 67193893..aa59a86a 100644 --- a/server/app/lib/albumslib.py +++ b/server/app/lib/albumslib.py @@ -52,6 +52,10 @@ def create_everything() -> List[models.Track]: def find_album(albums: List[models.Album], hash: str) -> int | None: """ Finds an album by album title and artist. + + :param `albums`: List of album objects. + :param `hash`: Hash of album. + :return: Index of album in list. """ left = 0 @@ -62,8 +66,11 @@ def find_album(albums: List[models.Album], hash: str) -> int | None: iter += 1 mid = (left + right) // 2 - if albums[mid].hash == hash: - return mid + try: + if albums[mid].hash == hash: + return mid + except AttributeError: + print(albums) if albums[mid].hash < hash: left = mid + 1 @@ -151,7 +158,7 @@ def get_album_tracks(album: str, artist: str) -> List: return GetAlbumTracks(album, artist).find_tracks() -def create_album(track: dict, tracklist: list) -> models.Album: +def create_album(track: dict, tracklist: list) -> dict: """ Generates and returns an album object from a track object. """ diff --git a/server/app/lib/populate.py b/server/app/lib/populate.py index df4c0be3..364f3910 100644 --- a/server/app/lib/populate.py +++ b/server/app/lib/populate.py @@ -1,6 +1,7 @@ from concurrent.futures import ThreadPoolExecutor +from multiprocessing import Pool from copy import deepcopy - +import os from os import path import time from typing import List @@ -46,7 +47,7 @@ class Populate: def run(self): self.check_untagged() - self.tag_all_files() + self.get_all_tags() if len(self.tagged_tracks) == 0: return @@ -76,6 +77,17 @@ class Populate: Log(f"Found {len(self.files)} untagged tracks") + def process_tags(self, tags: dict): + for t in tags: + if t is None: + continue + + t["albumhash"] = create_album_hash(t["album"], t["albumartist"]) + self.tagged_tracks.append(t) + api.DB_TRACKS.append(t) + + self.folders.add(t["folder"]) + def get_tags(self, file: str): tags = get_tags(file) @@ -87,15 +99,22 @@ class Populate: self.tagged_tracks.append(tags) api.DB_TRACKS.append(tags) - def tag_all_files(self): + def get_all_tags(self): """ Loops through all the untagged files and tags them. """ s = time.time() - print(f"Started tagging files") - with ThreadPoolExecutor() as executor: - executor.map(self.get_tags, self.files) + # print(f"Started tagging files") + # with ThreadPoolExecutor() as executor: + # executor.map(self.get_tags, self.files) + + with Pool(maxtasksperchild=10) as p: + tags = p.map(get_tags, tqdm(self.files)) + self.process_tags(tags) + + # for t in tqdm(self.files): + # self.get_tags(t) d = time.time() - s Log(f"Tagged {len(self.tagged_tracks)} files in {d} seconds") diff --git a/server/app/lib/searchlib.py b/server/app/lib/searchlib.py index ae7225c2..cf7438e0 100644 --- a/server/app/lib/searchlib.py +++ b/server/app/lib/searchlib.py @@ -3,17 +3,100 @@ This library contains all the functions related to the search functionality. """ from typing import List -from app import models, helpers + +from app import api, helpers, models from app.lib import albumslib -from app import api +from rapidfuzz import fuzz, process -def get_tracks(query: str) -> List[models.Track]: - """ - Gets all songs with a given title. - """ - tracks = [track for track in api.TRACKS if query.lower() in track.title.lower()] - return helpers.remove_duplicates(tracks) +class SearchTracks: + def __init__(self, query) -> None: + self.query = query + + def __call__(self) -> List[models.Track]: + """ + Gets all songs with a given title. + """ + + tracks = [track.title for track in api.TRACKS] + results = process.extract( + self.query, tracks, scorer=fuzz.token_set_ratio, score_cutoff=50 + ) + print(results) + return [api.TRACKS[i[2]] for i in results] + + +class SearchArtists: + def __init__(self, query) -> None: + self.query = query + + @staticmethod + def get_all_artist_names() -> List[str]: + """ + Gets all artist names. + """ + + artists = [track.artists for track in api.TRACKS] + + f_artists = [] + for artist in artists: + aa = artist.split(",") + f_artists.extend(aa) + + return f_artists + + @staticmethod + def get_valid_name(name: str) -> str: + """ + returns a valid artist name + """ + + return "".join([i for i in name if i not in '/\\:*?"<>|']) + + def __call__(self) -> list: + """ + Gets all artists with a given name. + """ + + artists = self.get_all_artist_names() + results = process.extract(self.query, artists) + + f_artists = [] + for artist in results: + aa = { + "name": artist[0], + "image": self.get_valid_name(artist[0]) + ".webp", + } + f_artists.append(aa) + + return f_artists + + +class SearchAlbums: + def __init__(self, query) -> None: + self.query = query + + def get_albums_by_name(self) -> List[models.Album]: + """ + Gets all albums with a given title. + """ + + albums = [album.title for album in api.ALBUMS] + results = process.extract(self.query, albums) + return [api.ALBUMS[i[2]] for i in results] + + def __call__(self) -> List[models.Album]: + """ + Gets all albums with a given title. + """ + + artists = SearchArtists(self.query)() + a_albums = [] + + # 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] def get_search_albums(query: str) -> List[models.Album]: @@ -27,4 +110,6 @@ def get_artists(artist: str) -> List[models.Track]: """ Gets all songs with a given artist. """ - return [track for track in api.TRACKS if artist.lower() in str(track.artists).lower()] + return [ + track for track in api.TRACKS if artist.lower() in str(track.artists).lower() + ] diff --git a/server/app/lib/taglib.py b/server/app/lib/taglib.py index 3a695a51..bee344ff 100644 --- a/server/app/lib/taglib.py +++ b/server/app/lib/taglib.py @@ -154,7 +154,7 @@ def parse_disk_number(audio): return disk_number -def get_tags(fullpath: str) -> dict: +def get_tags(fullpath: str) -> dict | None: """ Returns a dictionary of tags for a given file. """ diff --git a/server/app/lib/watchdoge.py b/server/app/lib/watchdoge.py index e094d849..2b98bd25 100644 --- a/server/app/lib/watchdoge.py +++ b/server/app/lib/watchdoge.py @@ -50,18 +50,19 @@ def add_track(filepath: str) -> None: tags = get_tags(filepath) if tags is not None: - tags["albumhash"] = create_album_hash(tags["album"], tags["albumartist"]) + hash = create_album_hash(tags["album"], tags["albumartist"]) + tags["albumhash"] = hash api.DB_TRACKS.append(tags) - albumindex = find_album(tags["album"], tags["albumartist"]) + albumindex = find_album(api.ALBUMS, hash) if albumindex is not None: album = api.ALBUMS[albumindex] else: album_data = create_album(tags, api.DB_TRACKS) - instances.album_instance.insert_album(album_data) - album = models.Album(album_data) + + instances.album_instance.insert_album(album) api.ALBUMS.append(album) tags["image"] = album.image @@ -152,7 +153,14 @@ class Handler(PatternMatchingEventHandler): Fired when a created file is closed. """ print("⚫ closed ~~~") - self.files_to_process.remove(event.src_path) + try: + self.files_to_process.remove(event.src_path) + except ValueError: + """ + The file was already removed from the list, or it was not in the list to begin with. + """ + pass + add_track(event.src_path) diff --git a/server/app/models.py b/server/app/models.py index d3d3a35f..5cc7d112 100644 --- a/server/app/models.py +++ b/server/app/models.py @@ -32,8 +32,11 @@ class Track: albumhash: str def __init__(self, tags): + try: + self.trackid = tags["_id"]["$oid"] + except KeyError: + print(tags) - self.trackid = tags["_id"]["$oid"] self.title = tags["title"] self.artists = tags["artists"].split(", ") self.albumartist = tags["albumartist"] @@ -49,6 +52,22 @@ class Track: self.albumhash = tags["albumhash"] +@dataclass(slots=True) +class Artist: + """ + Artist class + """ + + artistid: str + name: str + image: str + + def __init__(self, tags): + self.artistid = tags["_id"]["$oid"] + self.name = tags["name"] + self.image = tags["image"] + + @dataclass class Album: """ diff --git a/src/components/nav/Search.vue b/src/components/nav/Search.vue index ad60eaab..7640bbb6 100644 --- a/src/components/nav/Search.vue +++ b/src/components/nav/Search.vue @@ -5,7 +5,7 @@ type="search" name="" id="" - placeholder="Search this playlist" + placeholder="Search here" class="rounded" /> diff --git a/src/contexts/track_context.ts b/src/contexts/track_context.ts index 99a35a0f..f9f33fde 100644 --- a/src/contexts/track_context.ts +++ b/src/contexts/track_context.ts @@ -137,14 +137,14 @@ export default async ( add_to_playlist, play_next, add_to_q, - add_to_fav, + // add_to_fav, separator, go_to_folder, - go_to_artist, - go_to_alb_artist, + // go_to_artist, + // go_to_alb_artist, go_to_album, - separator, - del_track, + // separator, + // del_track, ]; return options; From 4aa8576c73cc1fd362a108e098d3408519034289 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Sun, 22 May 2022 03:23:42 +0300 Subject: [PATCH 04/20] rewrite album and artist search with rapidfuzz --- server/app/api/search.py | 25 +++------ server/app/helpers.py | 18 ++++-- server/app/lib/searchlib.py | 83 ++++++++++++++++++++++------ server/app/models.py | 2 +- src/components/Search/TracksGrid.vue | 1 + 5 files changed, 88 insertions(+), 41 deletions(-) diff --git a/server/app/api/search.py b/server/app/api/search.py index 34374490..3730c988 100644 --- a/server/app/api/search.py +++ b/server/app/api/search.py @@ -23,25 +23,14 @@ def search(): """ query = request.args.get("q") or "Mexican girl" - albums = searchlib.get_search_albums(query) - artists_dicts = [] + albums = searchlib.SearchAlbums(query)() + artists_dicts = searchlib.SearchArtists(query)() - artist_tracks = searchlib.get_artists(query) + tracks = searchlib.SearchTracks(query)() + top_artist = artists_dicts[0]["name"] - for song in artist_tracks: - for artist in song.artists: - if query.lower() in artist.lower(): - - artist_obj = { - "name": artist, - "image": helpers.check_artist_image(artist), - } - - if artist_obj not in artists_dicts: - artists_dicts.append(artist_obj) - - _tracks = searchlib.SearchTracks(query)() - tracks = [*_tracks, *artist_tracks] + _tracks = searchlib.GetTopArtistTracks(top_artist)() + tracks = [*tracks, *[t for t in _tracks if t not in tracks]] SEARCH_RESULTS.clear() SEARCH_RESULTS["tracks"] = tracks @@ -65,6 +54,8 @@ def search_load_more(): type = request.args.get("type") start = int(request.args.get("start")) + print(type, start) + if type == "tracks": return { "tracks": SEARCH_RESULTS["tracks"][start : start + 5], diff --git a/server/app/helpers.py b/server/app/helpers.py index e6278fee..0d8bd637 100644 --- a/server/app/helpers.py +++ b/server/app/helpers.py @@ -1,16 +1,14 @@ """ This module contains mini functions for the server. """ -from datetime import datetime import os import random import threading import time -from typing import Dict -from typing import List +from datetime import datetime +from typing import Dict, List -from app import models -from app import settings +from app import models, settings app_dir = settings.APP_DIR @@ -120,7 +118,15 @@ def create_album_hash(title: str, artist: str) -> str: """ return (title + artist).replace(" ", "").lower() + def create_new_date(): now = datetime.now() str = now.strftime("%Y-%m-%d %H:%M:%S") - return str \ No newline at end of file + return str + + +def create_safe_name(name: str) -> str: + """ + Creates a url-safe name from a name. + """ + return "".join([i for i in name if i not in '/\\:*?"<>|']) diff --git a/server/app/lib/searchlib.py b/server/app/lib/searchlib.py index cf7438e0..fabacbc0 100644 --- a/server/app/lib/searchlib.py +++ b/server/app/lib/searchlib.py @@ -9,6 +9,30 @@ from app.lib import albumslib from rapidfuzz import fuzz, process +ratio = fuzz.ratio +wratio = fuzz.WRatio + + +class Cutoff: + """ + Holds all the default cutoff values. + """ + + tracks: int = 70 + albums: int = 70 + artists: int = 70 + + +class Limit: + """ + Holds all the default limit values. + """ + + tracks: int = 10 + albums: int = 10 + artists: int = 10 + + class SearchTracks: def __init__(self, query) -> None: self.query = query @@ -20,9 +44,13 @@ class SearchTracks: tracks = [track.title for track in api.TRACKS] results = process.extract( - self.query, tracks, scorer=fuzz.token_set_ratio, score_cutoff=50 + self.query, + tracks, + scorer=fuzz.WRatio, + score_cutoff=Cutoff.tracks, + limit=Limit.tracks, ) - print(results) + return [api.TRACKS[i[2]] for i in results] @@ -38,34 +66,33 @@ class SearchArtists: artists = [track.artists for track in api.TRACKS] - f_artists = [] + f_artists = set() + for artist in artists: - aa = artist.split(",") - f_artists.extend(aa) + for a in artist: + f_artists.add(a) return f_artists - @staticmethod - def get_valid_name(name: str) -> str: - """ - returns a valid artist name - """ - - return "".join([i for i in name if i not in '/\\:*?"<>|']) - def __call__(self) -> list: """ Gets all artists with a given name. """ artists = self.get_all_artist_names() - results = process.extract(self.query, artists) + results = process.extract( + self.query, + artists, + scorer=fuzz.WRatio, + score_cutoff=Cutoff.artists, + limit=Limit.artists, + ) f_artists = [] for artist in results: aa = { "name": artist[0], - "image": self.get_valid_name(artist[0]) + ".webp", + "image": helpers.create_safe_name(artist[0]) + ".webp", } f_artists.append(aa) @@ -90,14 +117,36 @@ class SearchAlbums: Gets all albums with a given title. """ - artists = SearchArtists(self.query)() - a_albums = [] + albums = [a.title for a in api.ALBUMS] + results = process.extract( + self.query, + albums, + scorer=fuzz.WRatio, + score_cutoff=Cutoff.albums, + limit=Limit.albums, + ) + + return [api.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 GetTopArtistTracks: + def __init__(self, artist: str) -> None: + self.artist = artist + + def __call__(self) -> List[models.Track]: + """ + Gets all tracks from a given artist. + """ + + return [track for track in api.TRACKS if self.artist in track.artists] + def get_search_albums(query: str) -> List[models.Album]: """ diff --git a/server/app/models.py b/server/app/models.py index 5cc7d112..c4ac3bed 100644 --- a/server/app/models.py +++ b/server/app/models.py @@ -18,7 +18,7 @@ class Track: trackid: str title: str - artists: str + artists: list albumartist: str album: str folder: str diff --git a/src/components/Search/TracksGrid.vue b/src/components/Search/TracksGrid.vue index 0eddae54..56354a97 100644 --- a/src/components/Search/TracksGrid.vue +++ b/src/components/Search/TracksGrid.vue @@ -35,6 +35,7 @@ const emit = defineEmits(["loadMore"]); function loadMore() { counter += 5; + console.log("load more", counter); emit("loadMore", counter); } From 6ef725c0ae18a4aaad488c421b1d04d86f4de78b Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Sun, 22 May 2022 19:26:54 +0300 Subject: [PATCH 05/20] separate search endpoints --- server/app/api/search.py | 74 +++++++++++++++++++++++++++++++++++----- 1 file changed, 66 insertions(+), 8 deletions(-) diff --git a/server/app/api/search.py b/server/app/api/search.py index 3730c988..719f4b0a 100644 --- a/server/app/api/search.py +++ b/server/app/api/search.py @@ -16,6 +16,63 @@ SEARCH_RESULTS = { } +@search_bp.route("/search/tracks", methods=["GET"]) +def search_tracks(): + """ + Searches for tracks. + """ + + query = request.args.get("q") + if not query: + return {"error": "No query provided"}, 400 + + results = searchlib.SearchTracks(query)() + SEARCH_RESULTS["tracks"] = results + + return { + "tracks": results[:5], + "more": len(results) > 5, + }, 200 + + +@search_bp.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 + + results = searchlib.SearchAlbums(query)() + SEARCH_RESULTS["albums"] = results + + return { + "albums": results[:6], + "more": len(results) > 6, + }, 200 + + +@search_bp.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 + + results = searchlib.SearchArtists(query)() + SEARCH_RESULTS["artists"] = results + + return { + "artists": results[:6], + "more": len(results) > 6, + }, 200 + + @search_bp.route("/search") def search(): """ @@ -52,24 +109,25 @@ def search_load_more(): Returns more songs, albums or artists from a search query. """ type = request.args.get("type") - start = int(request.args.get("start")) + index = int(request.args.get("index")) - print(type, start) + print(type, index) + print(len(SEARCH_RESULTS["tracks"])) if type == "tracks": return { - "tracks": SEARCH_RESULTS["tracks"][start : start + 5], - "more": len(SEARCH_RESULTS["tracks"]) > start + 5, + "tracks": SEARCH_RESULTS["tracks"][index : index + 5], + "more": len(SEARCH_RESULTS["tracks"]) > index + 5, } elif type == "albums": return { - "albums": SEARCH_RESULTS["albums"][start : start + 6], - "more": len(SEARCH_RESULTS["albums"]) > start + 6, + "albums": SEARCH_RESULTS["albums"][index : index + 6], + "more": len(SEARCH_RESULTS["albums"]) > index + 6, } elif type == "artists": return { - "artists": SEARCH_RESULTS["artists"][start : start + 6], - "more": len(SEARCH_RESULTS["artists"]) > start + 6, + "artists": SEARCH_RESULTS["artists"][index : index + 6], + "more": len(SEARCH_RESULTS["artists"]) > index + 6, } From 6a2b87b48c5825ab4ebb6080acd452a25c21eccb Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Sun, 22 May 2022 19:29:16 +0300 Subject: [PATCH 06/20] use tabs to seperate search results --- src/components/RightSideBar/Search.vue | 138 +++--------------- .../{ => RightSideBar}/Search/AlbumGrid.vue | 37 ++--- .../RightSideBar/Search/ArtistGrid.vue | 45 ++++++ .../{ => RightSideBar}/Search/Filters.vue | 0 .../{ => RightSideBar}/Search/LoadMore.vue | 0 .../{ => RightSideBar}/Search/Options.vue | 0 .../{ => RightSideBar}/Search/TracksGrid.vue | 37 ++--- src/components/RightSideBar/SearchInput.vue | 25 +--- src/components/RightSideBar/Tab.vue | 15 ++ src/components/RightSideBar/TabsWrapper.vue | 54 +++++++ src/components/Search/ArtistGrid.vue | 52 ------- src/components/shared/ArtistCard.vue | 2 +- src/components/shared/TrackItem.vue | 1 - src/composables/loadmore.js | 42 ------ src/composables/searchMusic.js | 27 ---- src/composables/searchMusic.ts | 106 ++++++++++++++ src/composables/useDebouncedRef.js | 58 +++++--- src/stores/queue.ts | 36 +++-- src/stores/search.ts | 134 +++++++++++++++++ 19 files changed, 463 insertions(+), 346 deletions(-) rename src/components/{ => RightSideBar}/Search/AlbumGrid.vue (50%) create mode 100644 src/components/RightSideBar/Search/ArtistGrid.vue rename src/components/{ => RightSideBar}/Search/Filters.vue (100%) rename src/components/{ => RightSideBar}/Search/LoadMore.vue (100%) rename src/components/{ => RightSideBar}/Search/Options.vue (100%) rename src/components/{ => RightSideBar}/Search/TracksGrid.vue (54%) create mode 100644 src/components/RightSideBar/Tab.vue create mode 100644 src/components/RightSideBar/TabsWrapper.vue delete mode 100644 src/components/Search/ArtistGrid.vue delete mode 100644 src/composables/searchMusic.js create mode 100644 src/composables/searchMusic.ts create mode 100644 src/stores/search.ts diff --git a/src/components/RightSideBar/Search.vue b/src/components/RightSideBar/Search.vue index ead15982..57db2d2f 100644 --- a/src/components/RightSideBar/Search.vue +++ b/src/components/RightSideBar/Search.vue @@ -1,152 +1,48 @@ - diff --git a/src/components/Search/Filters.vue b/src/components/RightSideBar/Search/Filters.vue similarity index 100% rename from src/components/Search/Filters.vue rename to src/components/RightSideBar/Search/Filters.vue diff --git a/src/components/Search/LoadMore.vue b/src/components/RightSideBar/Search/LoadMore.vue similarity index 100% rename from src/components/Search/LoadMore.vue rename to src/components/RightSideBar/Search/LoadMore.vue diff --git a/src/components/Search/Options.vue b/src/components/RightSideBar/Search/Options.vue similarity index 100% rename from src/components/Search/Options.vue rename to src/components/RightSideBar/Search/Options.vue diff --git a/src/components/Search/TracksGrid.vue b/src/components/RightSideBar/Search/TracksGrid.vue similarity index 54% rename from src/components/Search/TracksGrid.vue rename to src/components/RightSideBar/Search/TracksGrid.vue index 56354a97..f6d6e47a 100644 --- a/src/components/Search/TracksGrid.vue +++ b/src/components/RightSideBar/Search/TracksGrid.vue @@ -1,9 +1,8 @@ diff --git a/src/components/Search/ArtistGrid.vue b/src/components/Search/ArtistGrid.vue deleted file mode 100644 index e13597f4..00000000 --- a/src/components/Search/ArtistGrid.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/src/components/shared/ArtistCard.vue b/src/components/shared/ArtistCard.vue index fa108040..9a332d15 100644 --- a/src/components/shared/ArtistCard.vue +++ b/src/components/shared/ArtistCard.vue @@ -17,7 +17,7 @@ const imguri = paths.images.artist; defineProps<{ artist: any; - color: string; + color?: string; }>(); diff --git a/src/components/shared/TrackItem.vue b/src/components/shared/TrackItem.vue index 94581669..b999dd5f 100644 --- a/src/components/shared/TrackItem.vue +++ b/src/components/shared/TrackItem.vue @@ -97,7 +97,6 @@ const playThis = (track: Track) => { } .track-item { - width: 26.55rem; display: flex; align-items: center; border-radius: 0.5rem; diff --git a/src/composables/loadmore.js b/src/composables/loadmore.js index 314018bd..e69de29b 100644 --- a/src/composables/loadmore.js +++ b/src/composables/loadmore.js @@ -1,42 +0,0 @@ -import axios from "axios"; - -const url = "http://127.0.0.1:9876/search/loadmore"; - -async function loadMoreTracks(start) { - const response = await axios.get(url, { - params: { - type: "tracks", - start: start, - }, - }); - - return response.data; -} - -async function loadMoreAlbums(start) { - const response = await axios.get(url, { - params: { - type: "albums", - start: start, - }, - }); - - return response.data; -} - -async function loadMoreArtists(start) { - const response = await axios.get(url, { - params: { - type: "artists", - start: start, - }, - }); - - return response.data; -} - -export default { - loadMoreTracks, - loadMoreAlbums, - loadMoreArtists, -}; diff --git a/src/composables/searchMusic.js b/src/composables/searchMusic.js deleted file mode 100644 index c696bd2f..00000000 --- a/src/composables/searchMusic.js +++ /dev/null @@ -1,27 +0,0 @@ -import state from "./state"; - -const base_url = `${state.settings.uri}/search?q=`; - -async function search(query) { - state.loading.value = true; - const url = base_url + encodeURIComponent(query.trim()); - - const res = await fetch(url); - - if (!res.ok) { - const message = `An error has occured: ${res.status}`; - throw new Error(message); - } - - const data = await res.json(); - - state.loading.value = false; - - return { - tracks: data.data[0], - albums: data.data[1], - artists: data.data[2], - }; -} - -export default search; diff --git a/src/composables/searchMusic.ts b/src/composables/searchMusic.ts new file mode 100644 index 00000000..d18d784b --- /dev/null +++ b/src/composables/searchMusic.ts @@ -0,0 +1,106 @@ +import state from "./state"; +import axios from "axios"; + +const base_url = `${state.settings.uri}/search`; + +const uris = { + tracks: `${base_url}/tracks?q=`, + albums: `${base_url}/albums?q=`, + artists: `${base_url}/artists?q=`, +}; + +async function search(query: string) { + state.loading.value = true; + + const url = base_url + encodeURIComponent(query.trim()); + + const res = await fetch(url); + + if (!res.ok) { + const message = `An error has occured: ${res.status}`; + throw new Error(message); + } + + const data = await res.json(); + + state.loading.value = false; + + return { + tracks: data.data[0], + albums: data.data[1], + artists: data.data[2], + }; +} + +async function searchTracks(query: string) { + const url = uris.tracks + encodeURIComponent(query.trim()); + + const res = await fetch(url); + + if (!res.ok) { + const message = `An error has occured: ${res.status}`; + throw new Error(message); + } + + const data = await res.json(); + + return data; +} + +async function searchAlbums(query: string) { + const url = uris.albums + encodeURIComponent(query.trim()); + + const res = await axios.get(url); + return res.data; +} + +async function searchArtists(query: string) { + const url = uris.artists + encodeURIComponent(query.trim()); + + const res = await axios.get(url); + return res.data; +} + +const url = state.settings.uri + "/search/loadmore"; + +async function loadMoreTracks(index: number) { + const response = await axios.get(url, { + params: { + type: "tracks", + index: index, + }, + }); + + return response.data; +} + +async function loadMoreAlbums(index: number) { + const response = await axios.get(url, { + params: { + type: "albums", + index: index, + }, + }); + + return response.data; +} + +async function loadMoreArtists(index: number) { + const response = await axios.get(url, { + params: { + type: "artists", + index: index, + }, + }); + + return response.data; +} + +export { + searchTracks, + searchAlbums, + searchArtists, + loadMoreTracks, + loadMoreAlbums, + loadMoreArtists, +}; diff --git a/src/composables/useDebouncedRef.js b/src/composables/useDebouncedRef.js index 8a8de05f..b31a62a3 100644 --- a/src/composables/useDebouncedRef.js +++ b/src/composables/useDebouncedRef.js @@ -1,33 +1,49 @@ -import {customRef, ref} from 'vue' +import { customRef, ref } from "vue"; +/** + * Debounces a function + * + * @param {*} fn The function to debounce + * @param {*} delay The delay in milliseconds + * @param {*} immediate whether to debounce immediately + * @returns {Function} The debounced function + */ const debounce = (fn, delay = 0, immediate = false) => { - let timeout + let timeout; return (...args) => { - if (immediate && !timeout) fn(...args) - clearTimeout(timeout) + if (immediate && !timeout) fn(...args); + clearTimeout(timeout); timeout = setTimeout(() => { - fn(...args) - }, delay) - } -} + fn(...args); + }, delay); + }; +}; -const useDebouncedRef = (initialValue, delay, immediate) => { - const state = ref(initialValue) +/** + * Emits the ref updated value after the given delay. + * + * @param {*} initialValue The default value of the ref + * @param {*} delay The delay in milliseconds + * @param {*} immediate Whether to call the function immediately + * @returns {Object} The ref and a function to call to update the ref + */ +const useDebouncedRef = (initialValue, delay, immediate = false) => { + const state = ref(initialValue); return customRef((track, trigger) => ({ get() { - track() - return state.value + track(); + return state.value; }, set: debounce( - value => { - state.value = value - trigger() - }, - delay, - immediate + (value) => { + state.value = value; + trigger(); + }, + delay, + immediate ), - })) -} + })); +}; -export default useDebouncedRef +export default useDebouncedRef; diff --git a/src/stores/queue.ts b/src/stores/queue.ts index c02ba872..fda6d73a 100644 --- a/src/stores/queue.ts +++ b/src/stores/queue.ts @@ -12,7 +12,8 @@ import { import notif from "../composables/mediaNotification"; import { FromOptions } from "../composables/enums"; -function addQToLocalStorage( + +function writeQueue( from: fromFolder | fromAlbum | fromPlaylist, tracks: Track[] ) { @@ -25,11 +26,11 @@ function addQToLocalStorage( ); } -function addCurrentToLocalStorage(track: Track) { +function writeCurrent(track: Track) { localStorage.setItem("current", JSON.stringify(track)); } -function readCurrentFromLocalStorage(): Track { +function readCurrent(): Track { const current = localStorage.getItem("current"); if (current) { return JSON.parse(current); @@ -114,7 +115,7 @@ export default defineStore("Queue", { } } }, - readQueueFromLocalStorage() { + readQueue() { const queue = localStorage.getItem("queue"); if (queue) { @@ -123,7 +124,7 @@ export default defineStore("Queue", { this.tracks = parsed.tracks; } - this.updateCurrent(readCurrentFromLocalStorage()); + this.updateCurrent(readCurrent()); }, updateCurrent(track: Track) { this.current = track; @@ -131,7 +132,7 @@ export default defineStore("Queue", { this.updateNext(this.current); this.updatePrev(this.current); - addCurrentToLocalStorage(track); + writeCurrent(track); }, updateNext(track: Track) { const index = this.tracks.findIndex( @@ -161,8 +162,9 @@ export default defineStore("Queue", { }, setNewQueue(tracklist: Track[]) { if (this.tracks !== tracklist) { - this.tracks = tracklist; - addQToLocalStorage(this.from, this.tracks); + this.tracks = []; + this.tracks.push(...tracklist); + writeQueue(this.from, this.tracks); } }, playFromFolder(fpath: string, tracks: Track[]) { @@ -201,7 +203,8 @@ export default defineStore("Queue", { }, addTrackToQueue(track: Track) { this.tracks.push(track); - addQToLocalStorage(this.from, this.tracks); + writeQueue(this.from, this.tracks); + this.updateNext(this.current); }, playTrackNext(track: Track) { const Toast = useNotifStore(); @@ -209,19 +212,24 @@ export default defineStore("Queue", { (t: Track) => t.trackid === this.current.trackid ); - const next: Track = this.tracks[currentid + 1]; + if (currentid == this.tracks.length - 1) { + this.tracks.push(track); + } else { + const next: Track = this.tracks[currentid + 1]; - if (next.trackid === track.trackid) { - Toast.showNotification("Track is already queued", NotifType.Info); - return; + if (next.trackid === track.trackid) { + Toast.showNotification("Track is already queued", NotifType.Info); + return; + } } this.tracks.splice(currentid + 1, 0, track); + this.updateNext(this.current); Toast.showNotification( `Added ${track.title} to queue`, NotifType.Success ); - addQToLocalStorage(this.from, this.tracks); + writeQueue(this.from, this.tracks); }, }, }); diff --git a/src/stores/search.ts b/src/stores/search.ts new file mode 100644 index 00000000..1b8a7292 --- /dev/null +++ b/src/stores/search.ts @@ -0,0 +1,134 @@ +import { ref, reactive } from "@vue/reactivity"; +import { defineStore } from "pinia"; +import { AlbumInfo, Artist, Track } from "../interfaces"; +import { + searchTracks, + searchAlbums, + searchArtists, + loadMoreTracks, + loadMoreAlbums, + loadMoreArtists, +} from "../composables/searchMusic"; +import { watch } from "vue"; +import useDebouncedRef from "../composables/useDebouncedRef"; + +/** + * + * @param id The id of the element of the div to scroll + * Scrolls on clicking the loadmore button + */ +function scrollOnLoad(id: string) { + const elem = document.getElementById(id); + + elem.scroll({ + top: elem.scrollHeight, + left: 0, + behavior: "smooth", + }); +} + +export default defineStore("search", () => { + const query = useDebouncedRef("", 600); + + const tracks = reactive({ + value: [], + more: false, + }); + + const albums = reactive({ + value: [], + more: false, + }); + + const artists = reactive({ + value: [], + more: false, + }); + + /** + * Searches for tracks, albums and artists + * @param query query to search for + */ + function search(query: string) { + searchTracks(query).then((res) => { + tracks.value = res.tracks; + tracks.more = res.more; + }); + + searchAlbums(query).then((res) => { + albums.value = res.albums; + albums.more = res.more; + }); + + searchArtists(query).then((res) => { + artists.value = res.artists; + artists.more = res.more; + }); + } + + /** + * Loads more search tracks results + * + * @param index The starting index of the tracks to load + */ + function loadTracks(index: number) { + loadMoreTracks(index) + .then((res) => { + tracks.value = [...tracks.value, ...res.tracks]; + tracks.more = res.more; + }) + .then(() => { + scrollOnLoad("tab-content"); + }); + } + + /** + * Loads more search albums results + * + * @param index The starting index of the albums to load + */ + function loadAlbums(index: number) { + loadMoreAlbums(index) + .then((res) => { + albums.value = [...albums.value, ...res.albums]; + albums.more = res.more; + }) + .then(() => { + scrollOnLoad("tab-content"); + }); + } + + /** + * Loads more search artists results + * + * @param index The starting index of the artists to load + */ + function loadArtists(index: number) { + loadMoreArtists(index) + .then((res) => { + artists.value = [...artists.value, ...res.artists]; + artists.more = res.more; + }) + .then(() => { + scrollOnLoad("tab-content"); + }); + } + + watch( + () => query.value, + (newQuery) => { + search(newQuery); + } + ); + + return { + tracks, + albums, + artists, + query, + search, + loadTracks, + loadAlbums, + loadArtists, + }; +}); From 16857b5053019b76786c29126155996b1ce1a9f7 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Sun, 22 May 2022 19:29:37 +0300 Subject: [PATCH 07/20] minor refactors --- server/app/lib/searchlib.py | 6 +++--- src/App.vue | 6 +++--- src/assets/css/global.scss | 5 ----- src/components/LeftSidebar/Navigation.vue | 22 +--------------------- src/components/LeftSidebar/PinnedStuff.vue | 16 ++-------------- src/components/RightSideBar/Main.vue | 4 ++-- src/components/nav/NavButtons.vue | 4 ---- 7 files changed, 11 insertions(+), 52 deletions(-) diff --git a/server/app/lib/searchlib.py b/server/app/lib/searchlib.py index fabacbc0..f5851c39 100644 --- a/server/app/lib/searchlib.py +++ b/server/app/lib/searchlib.py @@ -28,9 +28,9 @@ class Limit: Holds all the default limit values. """ - tracks: int = 10 - albums: int = 10 - artists: int = 10 + tracks: int = 50 + albums: int = 50 + artists: int = 50 class SearchTracks: diff --git a/src/App.vue b/src/App.vue index a84e001c..39f418f6 100644 --- a/src/App.vue +++ b/src/App.vue @@ -2,10 +2,10 @@ -
+
- - diff --git a/src/composables/keyboard.ts b/src/composables/keyboard.ts index a9f7de70..f2774b98 100644 --- a/src/composables/keyboard.ts +++ b/src/composables/keyboard.ts @@ -64,11 +64,15 @@ export default function (queue: any) { if (!key_down_fired) { if (!ctrlKey) return; e.preventDefault(); - focusSearchBox(); + key_down_fired = true; } } + case "/": {{ + e.preventDefault(); + focusSearchBox(); + }} } }); } From 599ba060b2f1f4ae8ff792a7381f3832593c871d Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Tue, 24 May 2022 13:29:28 +0300 Subject: [PATCH 10/20] focus search tab on query change --- .../RightSideBar/Search/Filters.vue | 52 ----------- .../RightSideBar/Search/Options.vue | 90 ------------------- src/components/RightSideBar/Tab.vue | 8 +- src/components/RightSideBar/TabsWrapper.vue | 14 +-- src/stores/search.ts | 18 +++- 5 files changed, 28 insertions(+), 154 deletions(-) delete mode 100644 src/components/RightSideBar/Search/Filters.vue delete mode 100644 src/components/RightSideBar/Search/Options.vue diff --git a/src/components/RightSideBar/Search/Filters.vue b/src/components/RightSideBar/Search/Filters.vue deleted file mode 100644 index 2fa1d511..00000000 --- a/src/components/RightSideBar/Search/Filters.vue +++ /dev/null @@ -1,52 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Search/Options.vue b/src/components/RightSideBar/Search/Options.vue deleted file mode 100644 index 92819fbf..00000000 --- a/src/components/RightSideBar/Search/Options.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - - - diff --git a/src/components/RightSideBar/Tab.vue b/src/components/RightSideBar/Tab.vue index 0009dd39..3fd0781e 100644 --- a/src/components/RightSideBar/Tab.vue +++ b/src/components/RightSideBar/Tab.vue @@ -1,15 +1,13 @@ diff --git a/src/components/RightSideBar/TabsWrapper.vue b/src/components/RightSideBar/TabsWrapper.vue index 872cb40b..e25c3f01 100644 --- a/src/components/RightSideBar/TabsWrapper.vue +++ b/src/components/RightSideBar/TabsWrapper.vue @@ -5,7 +5,8 @@ class="tab rounded" v-for="slot in $slots.default()" :key="slot.key" - @click="currentTab = slot.props.name" + @click="s.changeTab(slot.props.name)" + :class="{ activetab: slot.props.name === s.currentTab }" > {{ slot.props.name }}
@@ -17,10 +18,9 @@ diff --git a/src/components/RightSideBar/NowPlaying.vue b/src/components/RightSideBar/NowPlaying.vue index ccc109a6..ab270944 100644 --- a/src/components/RightSideBar/NowPlaying.vue +++ b/src/components/RightSideBar/NowPlaying.vue @@ -51,7 +51,7 @@ \ No newline at end of file +.home { + padding-left: 20px; + text-align: center; +} + From 87b6b6d9aabb918fff1b83e95ed28b30fc184920 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Wed, 25 May 2022 16:22:23 +0300 Subject: [PATCH 14/20] update v-motion to beta.18 --- package.json | 3 ++- yarn.lock | 27 +++++++++++++++++++-------- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index a53cec04..0acbe885 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ "lint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src" }, "dependencies": { - "@vueuse/motion": "^2.0.0-beta.12", + "@vueuse/motion": "^2.0.0-beta.18", "axios": "^0.26.1", + "defu": "^6.0.0", "mitt": "^3.0.0", "node-vibrant": "^3.2.1-alpha.1", "pinia": "^2.0.11", diff --git a/yarn.lock b/yarn.lock index 7fcebd8d..db0c383e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -376,7 +376,7 @@ resolved "https://registry.yarnpkg.com/@vue/shared/-/shared-3.2.29.tgz#07dac7051117236431d2f737d16932aa38bbb925" integrity sha512-BjNpU8OK6Z0LVzGUppEk0CMYm/hKDnZfYdjSmPOs0N+TR1cLKJAkDwW8ASZUvaaSLEi6d3hVM7jnWnX+6yWnHw== -"@vueuse/core@^8.0.1": +"@vueuse/core@^8.1.2": version "8.5.0" resolved "https://registry.yarnpkg.com/@vueuse/core/-/core-8.5.0.tgz#2b7548e52165c88e1463756c36188e105d806543" integrity sha512-VEJ6sGNsPlUp0o9BGda2YISvDZbhWJSOJu5zlp2TufRGVrLcYUKr31jyFEOj6RXzG3k/H4aCYeZyjpItfU8glw== @@ -390,19 +390,20 @@ resolved "https://registry.yarnpkg.com/@vueuse/metadata/-/metadata-8.5.0.tgz#1aaa3787922cfda0f38243aaa7779366a669b4db" integrity sha512-WxsD+Cd+bn+HcjpY6Dl9FJ8ywTRTT9pTwk3bCQpzEhXVYAyNczKDSahk50fCfIJKeWHhyI4B2+/ZEOxQAkUr0g== -"@vueuse/motion@^2.0.0-beta.12": - version "2.0.0-beta.12" - resolved "https://registry.yarnpkg.com/@vueuse/motion/-/motion-2.0.0-beta.12.tgz#5ce0afd04f1991a87370ce90907e3979b82f6380" - integrity sha512-cAZqXexLX6xo+H1N1Mv+wBSSqG4wB+BdjIuHQ50jwlelXCDxSi8gj0K/9nDS+aUZtWh6YMwS6UGCKg58jMVglA== +"@vueuse/motion@^2.0.0-beta.18": + version "2.0.0-beta.18" + resolved "https://registry.yarnpkg.com/@vueuse/motion/-/motion-2.0.0-beta.18.tgz#e98e9a4c34da2ca456a10639dca3b36409e97b5f" + integrity sha512-mPeXxuqZp13lqpcb+345TnEP7tEOjC/wTkwf8be1Obzt3913lPpZPXgwKafMoocKRNOnMZye8Y6PqQOEKztk9A== dependencies: - "@vueuse/core" "^8.0.1" - "@vueuse/shared" "^8.0.1" + "@vueuse/core" "^8.1.2" + "@vueuse/shared" "^8.1.2" + csstype "^3.0.11" framesync "^6.1.0" popmotion "^11.0.3" style-value-types "^5.1.0" vue-demi "*" -"@vueuse/shared@8.5.0", "@vueuse/shared@^8.0.1": +"@vueuse/shared@8.5.0", "@vueuse/shared@^8.1.2": version "8.5.0" resolved "https://registry.yarnpkg.com/@vueuse/shared/-/shared-8.5.0.tgz#fa01ecd3161933f521dd6428b9ef8015ded1bbd3" integrity sha512-qKG+SZb44VvGD4dU5cQ63z4JE2Yk39hQUecR0a9sEdJA01cx+XrxAvFKJfPooxwoiqalAVw/ktWK6xbyc/jS3g== @@ -750,6 +751,11 @@ csstype@^2.6.8: resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.19.tgz#feeb5aae89020bb389e1f63669a5ed490e391caa" integrity sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ== +csstype@^3.0.11: + version "3.1.0" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.0.tgz#4ddcac3718d787cf9df0d1b7d15033925c8f29f2" + integrity sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA== + debug@^4.1.1, debug@^4.3.2: version "4.3.3" resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" @@ -762,6 +768,11 @@ deep-is@^0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== +defu@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/defu/-/defu-6.0.0.tgz#b397a6709a2f3202747a3d9daf9446e41ad0c5fc" + integrity sha512-t2MZGLf1V2rV4VBZbWIaXKdX/mUcYW0n2znQZoADBkGGxYL8EWqCuCZBmJPJ/Yy9fofJkyuuSuo5GSwo0XdEgw== + doctrine@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" From 79cbf11af59a5f7c1e93c6c52757d8b2d9df6424 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Wed, 25 May 2022 16:23:59 +0300 Subject: [PATCH 15/20] add custom transitions --- src/main.js | 4 +-- src/transitions.ts | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/transitions.ts diff --git a/src/main.js b/src/main.js index a3a1ab00..d1a44e36 100644 --- a/src/main.js +++ b/src/main.js @@ -4,13 +4,13 @@ import "./registerServiceWorker"; import router from "./router"; import { createPinia } from "pinia"; import { MotionPlugin } from "@vueuse/motion"; - +import useCustomTransitions from "./transitions"; import "../src/assets/css/global.scss"; const app = createApp(App); app.use(createPinia()); app.use(router); -app.use(MotionPlugin); +app.use(MotionPlugin, useCustomTransitions); app.mount("#app"); diff --git a/src/transitions.ts b/src/transitions.ts new file mode 100644 index 00000000..4e393909 --- /dev/null +++ b/src/transitions.ts @@ -0,0 +1,70 @@ +export default { + directives: { + "slide-from-left": { + initial: { + opacity: 0, + x: 0, + y: 20 + }, + enter: { + opacity: 1, + x: 0, + y: 0, + transition: { + duration: 100, + ease: "circInOut", + }, + }, + }, + "slide-from-left-100": { + initial: { + opacity: 0, + x: -20, + }, + enter: { + opacity: 1, + x: 0, + transition: { + delay: 100, + }, + }, + }, + "slide-from-top": { + initial: { + y: -20, + opacity: 0, + }, + enter: { + y: 0, + opacity: 1, + transition: { + delay: 200, + }, + }, + }, + "slide-from-right": { + initial: { + x: 20, + opacity: 0, + }, + enter: { + x: 0, + opacity: 1, + transition: { + delay: 200, + }, + }, + }, + scale: { + initial: { + scale: 0.8, + }, + enter: { + scale: 1, + transition: { + duration: 200, + }, + }, + }, + }, +}; From 2eabed3f3f0517f9f68235fceb4ff4555e807104 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Wed, 25 May 2022 16:24:42 +0300 Subject: [PATCH 16/20] add new cat logo --- src/assets/images/logo.webp | Bin 13188 -> 107184 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/assets/images/logo.webp b/src/assets/images/logo.webp index fd3f62464634ba4ebca1fa2034c94336519c3035..8c43924da152401080c7c5c099e2de266a25763e 100644 GIT binary patch literal 107184 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 A6951J literal 13188 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≶L(kN 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 From 99533b2baae8ae8bd11be173077a716512542e94 Mon Sep 17 00:00:00 2001 From: geoffrey45 Date: Wed, 25 May 2022 16:25:17 +0300 Subject: [PATCH 17/20] animate album image and title in album page --- src/components/AlbumView/Header.vue | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/AlbumView/Header.vue b/src/components/AlbumView/Header.vue index 9cc464b1..91bf89d4 100644 --- a/src/components/AlbumView/Header.vue +++ b/src/components/AlbumView/Header.vue @@ -3,17 +3,19 @@
-
+
Compilation
@@ -23,7 +25,8 @@
{{ props.album.count }} Tracks • - {{ formatSeconds(props.album.duration) }} • {{ props.album.date }} • + {{ formatSeconds(props.album.duration, true) }} • + {{ props.album.date }} • {{ props.album.artist }}
@@ -34,11 +37,11 @@