mycelium-ai 0.5.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mycelium_ai-0.5.0/LICENSE +21 -0
- mycelium_ai-0.5.0/PKG-INFO +312 -0
- mycelium_ai-0.5.0/README.md +268 -0
- mycelium_ai-0.5.0/pyproject.toml +92 -0
- mycelium_ai-0.5.0/setup.cfg +4 -0
- mycelium_ai-0.5.0/src/mycelium/__init__.py +0 -0
- mycelium_ai-0.5.0/src/mycelium/api/__init__.py +0 -0
- mycelium_ai-0.5.0/src/mycelium/api/app.py +1147 -0
- mycelium_ai-0.5.0/src/mycelium/api/client_app.py +170 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/__init__.py +0 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/__init__.py +97 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api/__init__.py +5 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api/default_api.py +2473 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api_client.py +766 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api_response.py +25 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/configuration.py +434 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/exceptions.py +166 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/__init__.py +41 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/api_section.py +71 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/chroma_section.py +69 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/clap_section.py +75 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/compute_on_server200_response.py +79 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/compute_on_server_request.py +67 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/compute_text_search_request.py +69 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/config_request.py +81 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/config_response.py +107 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/create_playlist_request.py +71 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/get_similar_by_track200_response.py +143 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/library_stats_response.py +77 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/logging_section.py +67 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/media_server_section.py +67 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/playlist_response.py +73 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/plex_section.py +71 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/processing_response.py +90 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/save_config_response.py +73 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/scan_library_response.py +75 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/search_result_response.py +75 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/server_section.py +67 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/stop_processing_response.py +71 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/task_status_response.py +87 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/track_database_stats.py +75 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/track_response.py +77 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/tracks_list_response.py +81 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/rest.py +329 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/__init__.py +0 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_api_section.py +57 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_chroma_section.py +55 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_clap_section.py +60 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_compute_on_server200_response.py +52 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_compute_on_server_request.py +53 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_compute_text_search_request.py +54 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_config_request.py +66 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_config_response.py +97 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_create_playlist_request.py +60 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_default_api.py +150 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_get_similar_by_track200_response.py +61 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_library_stats_response.py +63 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_logging_section.py +53 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_media_server_section.py +53 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_playlist_response.py +58 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_plex_section.py +56 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_processing_response.py +61 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_save_config_response.py +58 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_scan_library_response.py +61 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_search_result_response.py +69 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_server_section.py +53 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_stop_processing_response.py +55 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_task_status_response.py +71 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_track_database_stats.py +60 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_track_response.py +63 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_tracks_list_response.py +75 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/__init__.py +61 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api/__init__.py +5 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api/default_api.py +318 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api_client.py +766 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api_response.py +25 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/configuration.py +434 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/exceptions.py +166 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/__init__.py +23 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/save_config_response.py +73 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_clap_section.py +75 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_client_api_section.py +69 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_client_section.py +79 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_config_request.py +73 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_config_response.py +89 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_logging_section.py +67 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/rest.py +329 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/__init__.py +0 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_default_api.py +45 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_save_config_response.py +58 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_clap_section.py +60 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_client_api_section.py +55 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_client_section.py +65 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_config_request.py +59 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_config_response.py +89 -0
- mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_logging_section.py +53 -0
- mycelium_ai-0.5.0/src/mycelium/api/worker_models.py +99 -0
- mycelium_ai-0.5.0/src/mycelium/application/__init__.py +11 -0
- mycelium_ai-0.5.0/src/mycelium/application/job_queue.py +323 -0
- mycelium_ai-0.5.0/src/mycelium/application/library_management_use_cases.py +292 -0
- mycelium_ai-0.5.0/src/mycelium/application/search_use_cases.py +96 -0
- mycelium_ai-0.5.0/src/mycelium/application/services.py +340 -0
- mycelium_ai-0.5.0/src/mycelium/client.py +554 -0
- mycelium_ai-0.5.0/src/mycelium/client_config.py +251 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/404.html +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_buildManifest.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_ssgManifest.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/app/page-cc6bad295789134e.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/main-6b37be50736577a2.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/css/1eb7f0e2c78e0734.css +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/favicon.ico +0 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/file.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/globe.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/index.html +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/index.txt +20 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/next.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/vercel.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/window.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/config.py +346 -0
- mycelium_ai-0.5.0/src/mycelium/domain/__init__.py +13 -0
- mycelium_ai-0.5.0/src/mycelium/domain/models.py +71 -0
- mycelium_ai-0.5.0/src/mycelium/domain/repositories.py +98 -0
- mycelium_ai-0.5.0/src/mycelium/domain/worker.py +77 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/404.html +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/app/page-a761463485e0540b.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/main-6b37be50736577a2.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/css/1eb7f0e2c78e0734.css +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_buildManifest.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_ssgManifest.js +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/favicon.ico +0 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/file.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/globe.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/index.html +10 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/index.txt +20 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/next.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/vercel.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/frontend_dist/window.svg +1 -0
- mycelium_ai-0.5.0/src/mycelium/infrastructure/__init__.py +17 -0
- mycelium_ai-0.5.0/src/mycelium/infrastructure/chroma_adapter.py +232 -0
- mycelium_ai-0.5.0/src/mycelium/infrastructure/clap_adapter.py +280 -0
- mycelium_ai-0.5.0/src/mycelium/infrastructure/plex_adapter.py +145 -0
- mycelium_ai-0.5.0/src/mycelium/infrastructure/track_database.py +467 -0
- mycelium_ai-0.5.0/src/mycelium/main.py +183 -0
- mycelium_ai-0.5.0/src/mycelium_ai.egg-info/PKG-INFO +312 -0
- mycelium_ai-0.5.0/src/mycelium_ai.egg-info/SOURCES.txt +168 -0
- mycelium_ai-0.5.0/src/mycelium_ai.egg-info/dependency_links.txt +1 -0
- mycelium_ai-0.5.0/src/mycelium_ai.egg-info/entry_points.txt +2 -0
- mycelium_ai-0.5.0/src/mycelium_ai.egg-info/not-zip-safe +1 -0
- mycelium_ai-0.5.0/src/mycelium_ai.egg-info/requires.txt +22 -0
- mycelium_ai-0.5.0/src/mycelium_ai.egg-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2025 marceljungle
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
@@ -0,0 +1,312 @@
|
|
1
|
+
Metadata-Version: 2.4
|
2
|
+
Name: mycelium-ai
|
3
|
+
Version: 0.5.0
|
4
|
+
Summary: Plex collection creator and recommendation system using LAION-CLAP
|
5
|
+
Author-email: marceljungle <gigi.dan2011@gmail.com>
|
6
|
+
License: MIT
|
7
|
+
Project-URL: Homepage, https://github.com/marceljungle/mycelium
|
8
|
+
Project-URL: Repository, https://github.com/marceljungle/mycelium
|
9
|
+
Project-URL: Issues, https://github.com/marceljungle/mycelium/issues
|
10
|
+
Keywords: plex,music,recommendation,clap,ml
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
12
|
+
Classifier: Intended Audience :: Developers
|
13
|
+
Classifier: License :: OSI Approved :: MIT License
|
14
|
+
Classifier: Programming Language :: Python :: 3
|
15
|
+
Classifier: Programming Language :: Python :: 3.9
|
16
|
+
Classifier: Programming Language :: Python :: 3.10
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
19
|
+
Requires-Python: >=3.9
|
20
|
+
Description-Content-Type: text/markdown
|
21
|
+
License-File: LICENSE
|
22
|
+
Requires-Dist: plexapi>=4.15.0
|
23
|
+
Requires-Dist: transformers>=4.30.0
|
24
|
+
Requires-Dist: torch>=2.0.0
|
25
|
+
Requires-Dist: librosa>=0.10.0
|
26
|
+
Requires-Dist: chromadb>=0.4.0
|
27
|
+
Requires-Dist: tqdm>=4.65.0
|
28
|
+
Requires-Dist: fastapi>=0.100.0
|
29
|
+
Requires-Dist: uvicorn>=0.23.0
|
30
|
+
Requires-Dist: python-multipart>=0.0.6
|
31
|
+
Requires-Dist: pydantic>=2.0.0
|
32
|
+
Requires-Dist: typer[all]>=0.16.0
|
33
|
+
Requires-Dist: requests>=2.31.0
|
34
|
+
Requires-Dist: urllib3<3,>=1.26
|
35
|
+
Requires-Dist: python-dateutil>=2.8.2
|
36
|
+
Requires-Dist: certifi>=2023.0.0
|
37
|
+
Provides-Extra: dev
|
38
|
+
Requires-Dist: pytest>=7.0.0; extra == "dev"
|
39
|
+
Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
|
40
|
+
Requires-Dist: black>=23.0.0; extra == "dev"
|
41
|
+
Requires-Dist: isort>=5.12.0; extra == "dev"
|
42
|
+
Requires-Dist: mypy>=1.0.0; extra == "dev"
|
43
|
+
Dynamic: license-file
|
44
|
+
|
45
|
+
# 🍄 Mycelium
|
46
|
+
|
47
|
+
[](https://python.org)
|
48
|
+
[](https://fastapi.tiangolo.com/)
|
49
|
+
[](https://nextjs.org/)
|
50
|
+
[](LICENSE)
|
51
|
+
[](https://pytorch.org/)
|
52
|
+
|
53
|
+
AI-powered music recommendation system for Plex using semantic search with CLAP embeddings that understands both natural language and sonic characteristics.
|
54
|
+
|
55
|
+

|
56
|
+
|
57
|
+
## What is this?
|
58
|
+
|
59
|
+
Mycelium connects to your Plex media server and uses AI to understand your music collection at both semantic and sonic levels. Search for songs using natural language descriptions ("melancholic indie rock", "fast drumbeat with distorted guitar") or upload audio files to find tracks with similar rhythm, timbre, and sonic characteristics. Uses CLAP (Contrastive Language-Audio Pre-training) to analyze both text descriptions and actual audio features like tempo, instrumentation, and production qualities.
|
60
|
+
|
61
|
+
## How it works
|
62
|
+
|
63
|
+
1. **Scan** - Connects to Plex and extracts music track metadata
|
64
|
+
2. **Process** - Generates AI embeddings using CLAP model for comprehensive music understanding (both semantic and acoustic features)
|
65
|
+
3. **Search** - Find music using natural language or audio file similarity
|
66
|
+
4. **Recommend** - Get AI-powered recommendations based on sonic qualities, rhythm patterns, mood, and style
|
67
|
+
|
68
|
+
**Architecture**: Python backend (FastAPI) + Next.js frontend + ChromaDB vector database
|
69
|
+
|
70
|
+
## Features
|
71
|
+
|
72
|
+
**🔍 Smart Search**
|
73
|
+
- Text search: "upbeat 80s synthpop", "melancholic indie rock", "fast drumbeat with heavy bass", "acoustic guitar with reverb"
|
74
|
+
- Audio search: Upload files to find similar tracks by rhythm, tempo, and sonic characteristics
|
75
|
+
- Browse library with AI recommendations based on musical patterns
|
76
|
+
|
77
|
+
**🚀 Performance**
|
78
|
+
- Distributed GPU processing for large libraries
|
79
|
+
- Resumable embedding generation
|
80
|
+
- Real-time progress tracking
|
81
|
+
|
82
|
+
**⚙️ Integration**
|
83
|
+
- Seamless Plex integration
|
84
|
+
- Modern web interface (Next.js + TypeScript)
|
85
|
+
- YAML configuration with platform-specific paths
|
86
|
+
|
87
|
+
## Setup
|
88
|
+
|
89
|
+
### Requirements
|
90
|
+
- Python 3.9+ and Node.js 18+
|
91
|
+
- Plex Media Server with music library
|
92
|
+
- GPU recommended for faster processing
|
93
|
+
|
94
|
+
### Installation
|
95
|
+
|
96
|
+
```bash
|
97
|
+
# 1. Clone and install backend
|
98
|
+
git clone https://github.com/marceljungle/mycelium.git
|
99
|
+
cd mycelium
|
100
|
+
pip install -e .
|
101
|
+
|
102
|
+
# 2. Setup configuration
|
103
|
+
mkdir -p ~/.config/mycelium
|
104
|
+
cp config.example.yml ~/.config/mycelium/config.yml
|
105
|
+
# Edit config.yml with your Plex token
|
106
|
+
|
107
|
+
# 3. Install frontend dependencies
|
108
|
+
cd frontend && npm install
|
109
|
+
```
|
110
|
+
|
111
|
+
### Quick Start
|
112
|
+
|
113
|
+
```bash
|
114
|
+
# Start server (API + Frontend)
|
115
|
+
mycelium-ai server
|
116
|
+
|
117
|
+
# For distributed processing (optional)
|
118
|
+
mycelium-ai client --server-host 192.168.1.100 # On GPU machine
|
119
|
+
```
|
120
|
+
|
121
|
+
Visit `http://localhost:8000` for the web interface.
|
122
|
+
|
123
|
+
## Usage
|
124
|
+
|
125
|
+
### Basic Workflow
|
126
|
+
|
127
|
+
```bash
|
128
|
+
# 1. Start the web interface
|
129
|
+
mycelium-ai server
|
130
|
+
|
131
|
+
# 2. Open http://localhost:8000 in your browser
|
132
|
+
# 3. Use the web interface to:
|
133
|
+
# - Scan your Plex library
|
134
|
+
# - Generate AI embeddings
|
135
|
+
# - Search and explore your music
|
136
|
+
```
|
137
|
+
|
138
|
+
### Available Commands
|
139
|
+
|
140
|
+
```bash
|
141
|
+
mycelium-ai server # Start server (API + Frontend)
|
142
|
+
mycelium-ai client --server-host HOST # Start GPU worker client
|
143
|
+
```
|
144
|
+
|
145
|
+
### Web Interface
|
146
|
+
|
147
|
+
**Search**: Natural language search ("upbeat indie rock", "slow tempo with piano") or upload audio files to find sonically similar tracks
|
148
|
+
**Library**: Browse tracks, scan Plex library, and process embeddings
|
149
|
+
**Settings**: Configure Plex connection and processing options
|
150
|
+
|
151
|
+
Access the web interface at `http://localhost:8000` after starting the server.
|
152
|
+
|
153
|
+
### Distributed Processing
|
154
|
+
|
155
|
+
For large libraries, use GPU workers for faster processing:
|
156
|
+
|
157
|
+
```bash
|
158
|
+
# On main server
|
159
|
+
mycelium-ai server
|
160
|
+
|
161
|
+
# On GPU machine(s)
|
162
|
+
mycelium-ai client --server-host YOUR_SERVER_IP
|
163
|
+
```
|
164
|
+
|
165
|
+
## Configuration
|
166
|
+
|
167
|
+
Edit `~/.config/mycelium/config.yml` with your Plex token:
|
168
|
+
|
169
|
+
```yaml
|
170
|
+
plex:
|
171
|
+
url: http://localhost:32400
|
172
|
+
token: your_plex_token_here
|
173
|
+
music_library_name: Music
|
174
|
+
|
175
|
+
api:
|
176
|
+
host: 0.0.0.0
|
177
|
+
port: 8000
|
178
|
+
```
|
179
|
+
|
180
|
+
**Platform paths**:
|
181
|
+
- Linux/macOS: `~/.config/mycelium/config.yml`
|
182
|
+
- Windows: `%APPDATA%\mycelium\config.yml`
|
183
|
+
|
184
|
+
## API Reference
|
185
|
+
|
186
|
+
**Library**: `/api/library/scan`, `/api/library/process`, `/api/library/stats`
|
187
|
+
**Search**: `/api/search/text?q=query`, `/api/search/audio` (POST)
|
188
|
+
**Workers**: `/workers/register`, `/workers/get_job`, `/workers/submit_result`
|
189
|
+
|
190
|
+
## Development
|
191
|
+
|
192
|
+
```bash
|
193
|
+
# Development setup
|
194
|
+
pip install -e ".[dev]"
|
195
|
+
cd frontend && npm install
|
196
|
+
|
197
|
+
# Code quality
|
198
|
+
black src/ && isort src/ && mypy src/
|
199
|
+
cd frontend && npm run lint && npm run build
|
200
|
+
```
|
201
|
+
|
202
|
+
## Project Structure
|
203
|
+
|
204
|
+
```
|
205
|
+
mycelium/
|
206
|
+
├── src/mycelium/ # Python backend (FastAPI + clean architecture)
|
207
|
+
│ ├── domain/ # Core business logic
|
208
|
+
│ ├── application/ # Use cases and services
|
209
|
+
│ ├── infrastructure/ # External adapters (Plex, CLAP, ChromaDB)
|
210
|
+
│ ├── api/ # FastAPI endpoints
|
211
|
+
│ └── main.py # CLI entry point
|
212
|
+
├── frontend/ # Next.js frontend (TypeScript + Tailwind)
|
213
|
+
│ └── src/components/ # React components
|
214
|
+
└── config.example.yml # Configuration template
|
215
|
+
```
|
216
|
+
|
217
|
+
## Tips
|
218
|
+
|
219
|
+
- **Large libraries**: Use GPU workers (`mycelium-ai client`) for faster processing
|
220
|
+
- **Plex token**: Get from Plex settings → Network → "Show Advanced"
|
221
|
+
- **Resume processing**: Embedding generation can be stopped and resumed anytime
|
222
|
+
- **Performance**: Batch processing adapts to available memory automatically
|
223
|
+
|
224
|
+
## Packaging and Distribution
|
225
|
+
|
226
|
+
Mycelium includes automated CI/CD workflows for building and publishing to PyPI.
|
227
|
+
|
228
|
+
### Build Process
|
229
|
+
|
230
|
+
The package build follows a two-stage process:
|
231
|
+
|
232
|
+
1. **Frontend Compilation**: Next.js frontend is built into static files
|
233
|
+
2. **Python Package Build**: Frontend assets are included in the Python wheel
|
234
|
+
|
235
|
+
To build locally:
|
236
|
+
|
237
|
+
```bash
|
238
|
+
# Generate OpenAPI clients and build both frontend bundles
|
239
|
+
./build.sh
|
240
|
+
|
241
|
+
# Build Python wheel (after frontend build)
|
242
|
+
python -m build
|
243
|
+
```
|
244
|
+
|
245
|
+
The `build.sh` orchestrator supports optional flags (run `./build.sh --help`) to
|
246
|
+
skip specific stages or trigger `python -m build` automatically when using the
|
247
|
+
`--with-wheel` flag.
|
248
|
+
|
249
|
+
### GitHub Actions Workflow
|
250
|
+
|
251
|
+
The repository includes a GitHub Action (`.github/workflows/build-and-publish.yml`) that:
|
252
|
+
|
253
|
+
- **Automatic Triggers**: Runs when merging PRs to the `main` branch
|
254
|
+
- **Smart Versioning**: Automatically determines version bump based on PR labels
|
255
|
+
- **Manual Triggers**: Can be triggered manually via GitHub Actions UI for testing
|
256
|
+
- **Test PyPI Support**: Option to upload to Test PyPI for validation
|
257
|
+
- **Build Verification**: Validates that frontend assets are included in the package
|
258
|
+
|
259
|
+
#### Automatic Release Strategy
|
260
|
+
|
261
|
+
The workflow automatically creates releases when merging to `main` based on PR labels:
|
262
|
+
|
263
|
+
**Version Bump Types**:
|
264
|
+
- `major` label: Creates `x+1.0.0` version (breaking changes)
|
265
|
+
- `minor` label: Creates `x.y+1.0` version (new features)
|
266
|
+
- `hotfix` label: Creates `x.y.z+1` version (bug fixes)
|
267
|
+
- No label: Defaults to patch version (`x.y.z+1`)
|
268
|
+
|
269
|
+
**Workflow Examples**:
|
270
|
+
|
271
|
+
1. **Feature Release** (develop → main):
|
272
|
+
```bash
|
273
|
+
# Create PR from develop to main with "minor" label
|
274
|
+
# When merged: 1.0.0 → 1.1.0
|
275
|
+
```
|
276
|
+
|
277
|
+
2. **Major Release** (develop → main):
|
278
|
+
```bash
|
279
|
+
# Create PR from develop to main with "major" label
|
280
|
+
# When merged: 1.1.0 → 2.0.0
|
281
|
+
```
|
282
|
+
|
283
|
+
3. **Hotfix** (hotfix/issue-123 → main):
|
284
|
+
```bash
|
285
|
+
# Create PR from hotfix branch to main with "hotfix" label
|
286
|
+
# When merged: 1.1.0 → 1.1.1
|
287
|
+
```
|
288
|
+
|
289
|
+
#### Manual Testing
|
290
|
+
|
291
|
+
**Manual Trigger for Testing**:
|
292
|
+
1. Go to GitHub Actions tab in the repository
|
293
|
+
2. Select "Build and Publish to PyPI" workflow
|
294
|
+
3. Click "Run workflow"
|
295
|
+
4. Choose version type and whether to upload to Test PyPI
|
296
|
+
|
297
|
+
#### Required Secrets
|
298
|
+
|
299
|
+
Configure these secrets in your GitHub repository settings:
|
300
|
+
|
301
|
+
- `PYPI_API_TOKEN`: API token for PyPI uploads
|
302
|
+
- `TEST_PYPI_API_TOKEN`: API token for Test PyPI uploads (optional, for testing)
|
303
|
+
|
304
|
+
The workflow uses PyPI's trusted publishing when possible, or falls back to API tokens.
|
305
|
+
|
306
|
+
## Contributing
|
307
|
+
|
308
|
+
Contributions welcome! Ensure changes follow existing patterns, include TypeScript types, and use the logging system.
|
309
|
+
|
310
|
+
## License
|
311
|
+
|
312
|
+
MIT License - see [LICENSE](LICENSE) file.
|
@@ -0,0 +1,268 @@
|
|
1
|
+
# 🍄 Mycelium
|
2
|
+
|
3
|
+
[](https://python.org)
|
4
|
+
[](https://fastapi.tiangolo.com/)
|
5
|
+
[](https://nextjs.org/)
|
6
|
+
[](LICENSE)
|
7
|
+
[](https://pytorch.org/)
|
8
|
+
|
9
|
+
AI-powered music recommendation system for Plex using semantic search with CLAP embeddings that understands both natural language and sonic characteristics.
|
10
|
+
|
11
|
+

|
12
|
+
|
13
|
+
## What is this?
|
14
|
+
|
15
|
+
Mycelium connects to your Plex media server and uses AI to understand your music collection at both semantic and sonic levels. Search for songs using natural language descriptions ("melancholic indie rock", "fast drumbeat with distorted guitar") or upload audio files to find tracks with similar rhythm, timbre, and sonic characteristics. Uses CLAP (Contrastive Language-Audio Pre-training) to analyze both text descriptions and actual audio features like tempo, instrumentation, and production qualities.
|
16
|
+
|
17
|
+
## How it works
|
18
|
+
|
19
|
+
1. **Scan** - Connects to Plex and extracts music track metadata
|
20
|
+
2. **Process** - Generates AI embeddings using CLAP model for comprehensive music understanding (both semantic and acoustic features)
|
21
|
+
3. **Search** - Find music using natural language or audio file similarity
|
22
|
+
4. **Recommend** - Get AI-powered recommendations based on sonic qualities, rhythm patterns, mood, and style
|
23
|
+
|
24
|
+
**Architecture**: Python backend (FastAPI) + Next.js frontend + ChromaDB vector database
|
25
|
+
|
26
|
+
## Features
|
27
|
+
|
28
|
+
**🔍 Smart Search**
|
29
|
+
- Text search: "upbeat 80s synthpop", "melancholic indie rock", "fast drumbeat with heavy bass", "acoustic guitar with reverb"
|
30
|
+
- Audio search: Upload files to find similar tracks by rhythm, tempo, and sonic characteristics
|
31
|
+
- Browse library with AI recommendations based on musical patterns
|
32
|
+
|
33
|
+
**🚀 Performance**
|
34
|
+
- Distributed GPU processing for large libraries
|
35
|
+
- Resumable embedding generation
|
36
|
+
- Real-time progress tracking
|
37
|
+
|
38
|
+
**⚙️ Integration**
|
39
|
+
- Seamless Plex integration
|
40
|
+
- Modern web interface (Next.js + TypeScript)
|
41
|
+
- YAML configuration with platform-specific paths
|
42
|
+
|
43
|
+
## Setup
|
44
|
+
|
45
|
+
### Requirements
|
46
|
+
- Python 3.9+ and Node.js 18+
|
47
|
+
- Plex Media Server with music library
|
48
|
+
- GPU recommended for faster processing
|
49
|
+
|
50
|
+
### Installation
|
51
|
+
|
52
|
+
```bash
|
53
|
+
# 1. Clone and install backend
|
54
|
+
git clone https://github.com/marceljungle/mycelium.git
|
55
|
+
cd mycelium
|
56
|
+
pip install -e .
|
57
|
+
|
58
|
+
# 2. Setup configuration
|
59
|
+
mkdir -p ~/.config/mycelium
|
60
|
+
cp config.example.yml ~/.config/mycelium/config.yml
|
61
|
+
# Edit config.yml with your Plex token
|
62
|
+
|
63
|
+
# 3. Install frontend dependencies
|
64
|
+
cd frontend && npm install
|
65
|
+
```
|
66
|
+
|
67
|
+
### Quick Start
|
68
|
+
|
69
|
+
```bash
|
70
|
+
# Start server (API + Frontend)
|
71
|
+
mycelium-ai server
|
72
|
+
|
73
|
+
# For distributed processing (optional)
|
74
|
+
mycelium-ai client --server-host 192.168.1.100 # On GPU machine
|
75
|
+
```
|
76
|
+
|
77
|
+
Visit `http://localhost:8000` for the web interface.
|
78
|
+
|
79
|
+
## Usage
|
80
|
+
|
81
|
+
### Basic Workflow
|
82
|
+
|
83
|
+
```bash
|
84
|
+
# 1. Start the web interface
|
85
|
+
mycelium-ai server
|
86
|
+
|
87
|
+
# 2. Open http://localhost:8000 in your browser
|
88
|
+
# 3. Use the web interface to:
|
89
|
+
# - Scan your Plex library
|
90
|
+
# - Generate AI embeddings
|
91
|
+
# - Search and explore your music
|
92
|
+
```
|
93
|
+
|
94
|
+
### Available Commands
|
95
|
+
|
96
|
+
```bash
|
97
|
+
mycelium-ai server # Start server (API + Frontend)
|
98
|
+
mycelium-ai client --server-host HOST # Start GPU worker client
|
99
|
+
```
|
100
|
+
|
101
|
+
### Web Interface
|
102
|
+
|
103
|
+
**Search**: Natural language search ("upbeat indie rock", "slow tempo with piano") or upload audio files to find sonically similar tracks
|
104
|
+
**Library**: Browse tracks, scan Plex library, and process embeddings
|
105
|
+
**Settings**: Configure Plex connection and processing options
|
106
|
+
|
107
|
+
Access the web interface at `http://localhost:8000` after starting the server.
|
108
|
+
|
109
|
+
### Distributed Processing
|
110
|
+
|
111
|
+
For large libraries, use GPU workers for faster processing:
|
112
|
+
|
113
|
+
```bash
|
114
|
+
# On main server
|
115
|
+
mycelium-ai server
|
116
|
+
|
117
|
+
# On GPU machine(s)
|
118
|
+
mycelium-ai client --server-host YOUR_SERVER_IP
|
119
|
+
```
|
120
|
+
|
121
|
+
## Configuration
|
122
|
+
|
123
|
+
Edit `~/.config/mycelium/config.yml` with your Plex token:
|
124
|
+
|
125
|
+
```yaml
|
126
|
+
plex:
|
127
|
+
url: http://localhost:32400
|
128
|
+
token: your_plex_token_here
|
129
|
+
music_library_name: Music
|
130
|
+
|
131
|
+
api:
|
132
|
+
host: 0.0.0.0
|
133
|
+
port: 8000
|
134
|
+
```
|
135
|
+
|
136
|
+
**Platform paths**:
|
137
|
+
- Linux/macOS: `~/.config/mycelium/config.yml`
|
138
|
+
- Windows: `%APPDATA%\mycelium\config.yml`
|
139
|
+
|
140
|
+
## API Reference
|
141
|
+
|
142
|
+
**Library**: `/api/library/scan`, `/api/library/process`, `/api/library/stats`
|
143
|
+
**Search**: `/api/search/text?q=query`, `/api/search/audio` (POST)
|
144
|
+
**Workers**: `/workers/register`, `/workers/get_job`, `/workers/submit_result`
|
145
|
+
|
146
|
+
## Development
|
147
|
+
|
148
|
+
```bash
|
149
|
+
# Development setup
|
150
|
+
pip install -e ".[dev]"
|
151
|
+
cd frontend && npm install
|
152
|
+
|
153
|
+
# Code quality
|
154
|
+
black src/ && isort src/ && mypy src/
|
155
|
+
cd frontend && npm run lint && npm run build
|
156
|
+
```
|
157
|
+
|
158
|
+
## Project Structure
|
159
|
+
|
160
|
+
```
|
161
|
+
mycelium/
|
162
|
+
├── src/mycelium/ # Python backend (FastAPI + clean architecture)
|
163
|
+
│ ├── domain/ # Core business logic
|
164
|
+
│ ├── application/ # Use cases and services
|
165
|
+
│ ├── infrastructure/ # External adapters (Plex, CLAP, ChromaDB)
|
166
|
+
│ ├── api/ # FastAPI endpoints
|
167
|
+
│ └── main.py # CLI entry point
|
168
|
+
├── frontend/ # Next.js frontend (TypeScript + Tailwind)
|
169
|
+
│ └── src/components/ # React components
|
170
|
+
└── config.example.yml # Configuration template
|
171
|
+
```
|
172
|
+
|
173
|
+
## Tips
|
174
|
+
|
175
|
+
- **Large libraries**: Use GPU workers (`mycelium-ai client`) for faster processing
|
176
|
+
- **Plex token**: Get from Plex settings → Network → "Show Advanced"
|
177
|
+
- **Resume processing**: Embedding generation can be stopped and resumed anytime
|
178
|
+
- **Performance**: Batch processing adapts to available memory automatically
|
179
|
+
|
180
|
+
## Packaging and Distribution
|
181
|
+
|
182
|
+
Mycelium includes automated CI/CD workflows for building and publishing to PyPI.
|
183
|
+
|
184
|
+
### Build Process
|
185
|
+
|
186
|
+
The package build follows a two-stage process:
|
187
|
+
|
188
|
+
1. **Frontend Compilation**: Next.js frontend is built into static files
|
189
|
+
2. **Python Package Build**: Frontend assets are included in the Python wheel
|
190
|
+
|
191
|
+
To build locally:
|
192
|
+
|
193
|
+
```bash
|
194
|
+
# Generate OpenAPI clients and build both frontend bundles
|
195
|
+
./build.sh
|
196
|
+
|
197
|
+
# Build Python wheel (after frontend build)
|
198
|
+
python -m build
|
199
|
+
```
|
200
|
+
|
201
|
+
The `build.sh` orchestrator supports optional flags (run `./build.sh --help`) to
|
202
|
+
skip specific stages or trigger `python -m build` automatically when using the
|
203
|
+
`--with-wheel` flag.
|
204
|
+
|
205
|
+
### GitHub Actions Workflow
|
206
|
+
|
207
|
+
The repository includes a GitHub Action (`.github/workflows/build-and-publish.yml`) that:
|
208
|
+
|
209
|
+
- **Automatic Triggers**: Runs when merging PRs to the `main` branch
|
210
|
+
- **Smart Versioning**: Automatically determines version bump based on PR labels
|
211
|
+
- **Manual Triggers**: Can be triggered manually via GitHub Actions UI for testing
|
212
|
+
- **Test PyPI Support**: Option to upload to Test PyPI for validation
|
213
|
+
- **Build Verification**: Validates that frontend assets are included in the package
|
214
|
+
|
215
|
+
#### Automatic Release Strategy
|
216
|
+
|
217
|
+
The workflow automatically creates releases when merging to `main` based on PR labels:
|
218
|
+
|
219
|
+
**Version Bump Types**:
|
220
|
+
- `major` label: Creates `x+1.0.0` version (breaking changes)
|
221
|
+
- `minor` label: Creates `x.y+1.0` version (new features)
|
222
|
+
- `hotfix` label: Creates `x.y.z+1` version (bug fixes)
|
223
|
+
- No label: Defaults to patch version (`x.y.z+1`)
|
224
|
+
|
225
|
+
**Workflow Examples**:
|
226
|
+
|
227
|
+
1. **Feature Release** (develop → main):
|
228
|
+
```bash
|
229
|
+
# Create PR from develop to main with "minor" label
|
230
|
+
# When merged: 1.0.0 → 1.1.0
|
231
|
+
```
|
232
|
+
|
233
|
+
2. **Major Release** (develop → main):
|
234
|
+
```bash
|
235
|
+
# Create PR from develop to main with "major" label
|
236
|
+
# When merged: 1.1.0 → 2.0.0
|
237
|
+
```
|
238
|
+
|
239
|
+
3. **Hotfix** (hotfix/issue-123 → main):
|
240
|
+
```bash
|
241
|
+
# Create PR from hotfix branch to main with "hotfix" label
|
242
|
+
# When merged: 1.1.0 → 1.1.1
|
243
|
+
```
|
244
|
+
|
245
|
+
#### Manual Testing
|
246
|
+
|
247
|
+
**Manual Trigger for Testing**:
|
248
|
+
1. Go to GitHub Actions tab in the repository
|
249
|
+
2. Select "Build and Publish to PyPI" workflow
|
250
|
+
3. Click "Run workflow"
|
251
|
+
4. Choose version type and whether to upload to Test PyPI
|
252
|
+
|
253
|
+
#### Required Secrets
|
254
|
+
|
255
|
+
Configure these secrets in your GitHub repository settings:
|
256
|
+
|
257
|
+
- `PYPI_API_TOKEN`: API token for PyPI uploads
|
258
|
+
- `TEST_PYPI_API_TOKEN`: API token for Test PyPI uploads (optional, for testing)
|
259
|
+
|
260
|
+
The workflow uses PyPI's trusted publishing when possible, or falls back to API tokens.
|
261
|
+
|
262
|
+
## Contributing
|
263
|
+
|
264
|
+
Contributions welcome! Ensure changes follow existing patterns, include TypeScript types, and use the logging system.
|
265
|
+
|
266
|
+
## License
|
267
|
+
|
268
|
+
MIT License - see [LICENSE](LICENSE) file.
|
@@ -0,0 +1,92 @@
|
|
1
|
+
[build-system]
|
2
|
+
requires = ["setuptools>=61.0", "wheel"]
|
3
|
+
build-backend = "setuptools.build_meta"
|
4
|
+
|
5
|
+
[project]
|
6
|
+
name = "mycelium-ai"
|
7
|
+
version = "0.5.0"
|
8
|
+
description = "Plex collection creator and recommendation system using LAION-CLAP"
|
9
|
+
readme = "README.md"
|
10
|
+
requires-python = ">=3.9"
|
11
|
+
license = {text = "MIT"}
|
12
|
+
authors = [
|
13
|
+
{name = "marceljungle", email = "gigi.dan2011@gmail.com"}
|
14
|
+
]
|
15
|
+
keywords = ["plex", "music", "recommendation", "clap", "ml"]
|
16
|
+
classifiers = [
|
17
|
+
"Development Status :: 3 - Alpha",
|
18
|
+
"Intended Audience :: Developers",
|
19
|
+
"License :: OSI Approved :: MIT License",
|
20
|
+
"Programming Language :: Python :: 3",
|
21
|
+
"Programming Language :: Python :: 3.9",
|
22
|
+
"Programming Language :: Python :: 3.10",
|
23
|
+
"Programming Language :: Python :: 3.11",
|
24
|
+
"Programming Language :: Python :: 3.12",
|
25
|
+
]
|
26
|
+
|
27
|
+
dependencies = [
|
28
|
+
"plexapi>=4.15.0",
|
29
|
+
"transformers>=4.30.0",
|
30
|
+
"torch>=2.0.0",
|
31
|
+
"librosa>=0.10.0",
|
32
|
+
"chromadb>=0.4.0",
|
33
|
+
"tqdm>=4.65.0",
|
34
|
+
"fastapi>=0.100.0",
|
35
|
+
"uvicorn>=0.23.0",
|
36
|
+
"python-multipart>=0.0.6",
|
37
|
+
"pydantic>=2.0.0",
|
38
|
+
"typer[all]>=0.16.0",
|
39
|
+
"requests>=2.31.0",
|
40
|
+
# Runtime deps for OpenAPI-generated Python client (urllib3-based)
|
41
|
+
"urllib3>=1.26,<3",
|
42
|
+
"python-dateutil>=2.8.2",
|
43
|
+
"certifi>=2023.0.0",
|
44
|
+
]
|
45
|
+
|
46
|
+
[project.optional-dependencies]
|
47
|
+
dev = [
|
48
|
+
"pytest>=7.0.0",
|
49
|
+
"pytest-asyncio>=0.21.0",
|
50
|
+
"black>=23.0.0",
|
51
|
+
"isort>=5.12.0",
|
52
|
+
"mypy>=1.0.0",
|
53
|
+
]
|
54
|
+
|
55
|
+
[project.urls]
|
56
|
+
Homepage = "https://github.com/marceljungle/mycelium"
|
57
|
+
Repository = "https://github.com/marceljungle/mycelium"
|
58
|
+
Issues = "https://github.com/marceljungle/mycelium/issues"
|
59
|
+
|
60
|
+
[project.scripts]
|
61
|
+
"mycelium-ai" = "mycelium.main:main"
|
62
|
+
|
63
|
+
[tool.setuptools.packages.find]
|
64
|
+
where = ["src"]
|
65
|
+
include = ["mycelium*"]
|
66
|
+
|
67
|
+
[tool.setuptools.package-data]
|
68
|
+
mycelium = ["frontend_dist/**", "client_frontend_dist/**"]
|
69
|
+
|
70
|
+
[tool.setuptools.package-dir]
|
71
|
+
"" = "src"
|
72
|
+
|
73
|
+
[tool.black]
|
74
|
+
line-length = 88
|
75
|
+
target-version = ['py39']
|
76
|
+
include = '\.pyi?$'
|
77
|
+
|
78
|
+
[tool.isort]
|
79
|
+
profile = "black"
|
80
|
+
multi_line_output = 3
|
81
|
+
line_length = 88
|
82
|
+
|
83
|
+
[tool.mypy]
|
84
|
+
python_version = "3.9"
|
85
|
+
warn_return_any = true
|
86
|
+
warn_unused_configs = true
|
87
|
+
disallow_untyped_defs = true
|
88
|
+
# Exclude generated client sources from strict checks
|
89
|
+
exclude = "^src/mycelium/api/generated_sources/.*$"
|
90
|
+
|
91
|
+
[tool.setuptools]
|
92
|
+
zip-safe = false
|
File without changes
|
File without changes
|