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.
Files changed (170) hide show
  1. mycelium_ai-0.5.0/LICENSE +21 -0
  2. mycelium_ai-0.5.0/PKG-INFO +312 -0
  3. mycelium_ai-0.5.0/README.md +268 -0
  4. mycelium_ai-0.5.0/pyproject.toml +92 -0
  5. mycelium_ai-0.5.0/setup.cfg +4 -0
  6. mycelium_ai-0.5.0/src/mycelium/__init__.py +0 -0
  7. mycelium_ai-0.5.0/src/mycelium/api/__init__.py +0 -0
  8. mycelium_ai-0.5.0/src/mycelium/api/app.py +1147 -0
  9. mycelium_ai-0.5.0/src/mycelium/api/client_app.py +170 -0
  10. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/__init__.py +0 -0
  11. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/__init__.py +97 -0
  12. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api/__init__.py +5 -0
  13. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api/default_api.py +2473 -0
  14. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api_client.py +766 -0
  15. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/api_response.py +25 -0
  16. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/configuration.py +434 -0
  17. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/exceptions.py +166 -0
  18. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/__init__.py +41 -0
  19. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/api_section.py +71 -0
  20. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/chroma_section.py +69 -0
  21. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/clap_section.py +75 -0
  22. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/compute_on_server200_response.py +79 -0
  23. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/compute_on_server_request.py +67 -0
  24. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/compute_text_search_request.py +69 -0
  25. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/config_request.py +81 -0
  26. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/config_response.py +107 -0
  27. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/create_playlist_request.py +71 -0
  28. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/get_similar_by_track200_response.py +143 -0
  29. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/library_stats_response.py +77 -0
  30. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/logging_section.py +67 -0
  31. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/media_server_section.py +67 -0
  32. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/playlist_response.py +73 -0
  33. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/plex_section.py +71 -0
  34. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/processing_response.py +90 -0
  35. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/save_config_response.py +73 -0
  36. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/scan_library_response.py +75 -0
  37. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/search_result_response.py +75 -0
  38. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/server_section.py +67 -0
  39. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/stop_processing_response.py +71 -0
  40. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/task_status_response.py +87 -0
  41. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/track_database_stats.py +75 -0
  42. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/track_response.py +77 -0
  43. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/models/tracks_list_response.py +81 -0
  44. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/rest.py +329 -0
  45. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/__init__.py +0 -0
  46. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_api_section.py +57 -0
  47. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_chroma_section.py +55 -0
  48. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_clap_section.py +60 -0
  49. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_compute_on_server200_response.py +52 -0
  50. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_compute_on_server_request.py +53 -0
  51. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_compute_text_search_request.py +54 -0
  52. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_config_request.py +66 -0
  53. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_config_response.py +97 -0
  54. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_create_playlist_request.py +60 -0
  55. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_default_api.py +150 -0
  56. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_get_similar_by_track200_response.py +61 -0
  57. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_library_stats_response.py +63 -0
  58. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_logging_section.py +53 -0
  59. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_media_server_section.py +53 -0
  60. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_playlist_response.py +58 -0
  61. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_plex_section.py +56 -0
  62. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_processing_response.py +61 -0
  63. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_save_config_response.py +58 -0
  64. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_scan_library_response.py +61 -0
  65. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_search_result_response.py +69 -0
  66. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_server_section.py +53 -0
  67. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_stop_processing_response.py +55 -0
  68. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_task_status_response.py +71 -0
  69. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_track_database_stats.py +60 -0
  70. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_track_response.py +63 -0
  71. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/server_schemas/test/test_tracks_list_response.py +75 -0
  72. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/__init__.py +61 -0
  73. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api/__init__.py +5 -0
  74. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api/default_api.py +318 -0
  75. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api_client.py +766 -0
  76. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/api_response.py +25 -0
  77. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/configuration.py +434 -0
  78. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/exceptions.py +166 -0
  79. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/__init__.py +23 -0
  80. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/save_config_response.py +73 -0
  81. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_clap_section.py +75 -0
  82. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_client_api_section.py +69 -0
  83. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_client_section.py +79 -0
  84. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_config_request.py +73 -0
  85. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_config_response.py +89 -0
  86. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/models/worker_logging_section.py +67 -0
  87. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/rest.py +329 -0
  88. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/__init__.py +0 -0
  89. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_default_api.py +45 -0
  90. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_save_config_response.py +58 -0
  91. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_clap_section.py +60 -0
  92. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_client_api_section.py +55 -0
  93. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_client_section.py +65 -0
  94. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_config_request.py +59 -0
  95. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_config_response.py +89 -0
  96. mycelium_ai-0.5.0/src/mycelium/api/generated_sources/worker_schemas/test/test_worker_logging_section.py +53 -0
  97. mycelium_ai-0.5.0/src/mycelium/api/worker_models.py +99 -0
  98. mycelium_ai-0.5.0/src/mycelium/application/__init__.py +11 -0
  99. mycelium_ai-0.5.0/src/mycelium/application/job_queue.py +323 -0
  100. mycelium_ai-0.5.0/src/mycelium/application/library_management_use_cases.py +292 -0
  101. mycelium_ai-0.5.0/src/mycelium/application/search_use_cases.py +96 -0
  102. mycelium_ai-0.5.0/src/mycelium/application/services.py +340 -0
  103. mycelium_ai-0.5.0/src/mycelium/client.py +554 -0
  104. mycelium_ai-0.5.0/src/mycelium/client_config.py +251 -0
  105. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/404.html +1 -0
  106. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_buildManifest.js +1 -0
  107. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_ssgManifest.js +1 -0
  108. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +1 -0
  109. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js +1 -0
  110. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js +1 -0
  111. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js +1 -0
  112. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/app/page-cc6bad295789134e.js +1 -0
  113. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js +1 -0
  114. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/main-6b37be50736577a2.js +1 -0
  115. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js +1 -0
  116. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js +1 -0
  117. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js +1 -0
  118. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  119. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js +1 -0
  120. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/_next/static/css/1eb7f0e2c78e0734.css +1 -0
  121. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/favicon.ico +0 -0
  122. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/file.svg +1 -0
  123. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/globe.svg +1 -0
  124. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/index.html +1 -0
  125. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/index.txt +20 -0
  126. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/next.svg +1 -0
  127. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/vercel.svg +1 -0
  128. mycelium_ai-0.5.0/src/mycelium/client_frontend_dist/window.svg +1 -0
  129. mycelium_ai-0.5.0/src/mycelium/config.py +346 -0
  130. mycelium_ai-0.5.0/src/mycelium/domain/__init__.py +13 -0
  131. mycelium_ai-0.5.0/src/mycelium/domain/models.py +71 -0
  132. mycelium_ai-0.5.0/src/mycelium/domain/repositories.py +98 -0
  133. mycelium_ai-0.5.0/src/mycelium/domain/worker.py +77 -0
  134. mycelium_ai-0.5.0/src/mycelium/frontend_dist/404.html +1 -0
  135. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +1 -0
  136. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js +1 -0
  137. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js +1 -0
  138. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js +1 -0
  139. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/app/page-a761463485e0540b.js +1 -0
  140. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js +1 -0
  141. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/main-6b37be50736577a2.js +1 -0
  142. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js +1 -0
  143. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js +1 -0
  144. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js +1 -0
  145. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  146. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js +1 -0
  147. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/css/1eb7f0e2c78e0734.css +1 -0
  148. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_buildManifest.js +1 -0
  149. mycelium_ai-0.5.0/src/mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_ssgManifest.js +1 -0
  150. mycelium_ai-0.5.0/src/mycelium/frontend_dist/favicon.ico +0 -0
  151. mycelium_ai-0.5.0/src/mycelium/frontend_dist/file.svg +1 -0
  152. mycelium_ai-0.5.0/src/mycelium/frontend_dist/globe.svg +1 -0
  153. mycelium_ai-0.5.0/src/mycelium/frontend_dist/index.html +10 -0
  154. mycelium_ai-0.5.0/src/mycelium/frontend_dist/index.txt +20 -0
  155. mycelium_ai-0.5.0/src/mycelium/frontend_dist/next.svg +1 -0
  156. mycelium_ai-0.5.0/src/mycelium/frontend_dist/vercel.svg +1 -0
  157. mycelium_ai-0.5.0/src/mycelium/frontend_dist/window.svg +1 -0
  158. mycelium_ai-0.5.0/src/mycelium/infrastructure/__init__.py +17 -0
  159. mycelium_ai-0.5.0/src/mycelium/infrastructure/chroma_adapter.py +232 -0
  160. mycelium_ai-0.5.0/src/mycelium/infrastructure/clap_adapter.py +280 -0
  161. mycelium_ai-0.5.0/src/mycelium/infrastructure/plex_adapter.py +145 -0
  162. mycelium_ai-0.5.0/src/mycelium/infrastructure/track_database.py +467 -0
  163. mycelium_ai-0.5.0/src/mycelium/main.py +183 -0
  164. mycelium_ai-0.5.0/src/mycelium_ai.egg-info/PKG-INFO +312 -0
  165. mycelium_ai-0.5.0/src/mycelium_ai.egg-info/SOURCES.txt +168 -0
  166. mycelium_ai-0.5.0/src/mycelium_ai.egg-info/dependency_links.txt +1 -0
  167. mycelium_ai-0.5.0/src/mycelium_ai.egg-info/entry_points.txt +2 -0
  168. mycelium_ai-0.5.0/src/mycelium_ai.egg-info/not-zip-safe +1 -0
  169. mycelium_ai-0.5.0/src/mycelium_ai.egg-info/requires.txt +22 -0
  170. 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
+ [![Python Version](https://img.shields.io/badge/python-3.9%2B-blue)](https://python.org)
48
+ [![FastAPI](https://img.shields.io/badge/FastAPI-0.100%2B-green)](https://fastapi.tiangolo.com/)
49
+ [![Next.js](https://img.shields.io/badge/Next.js-15.4.5-black)](https://nextjs.org/)
50
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
51
+ [![PyTorch](https://img.shields.io/badge/PyTorch-2.0%2B-red)](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
+ ![Mycelium Frontend](https://github.com/user-attachments/assets/1a838b24-6f74-43ea-bf85-31f66efaffdb)
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
+ [![Python Version](https://img.shields.io/badge/python-3.9%2B-blue)](https://python.org)
4
+ [![FastAPI](https://img.shields.io/badge/FastAPI-0.100%2B-green)](https://fastapi.tiangolo.com/)
5
+ [![Next.js](https://img.shields.io/badge/Next.js-15.4.5-black)](https://nextjs.org/)
6
+ [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+ [![PyTorch](https://img.shields.io/badge/PyTorch-2.0%2B-red)](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
+ ![Mycelium Frontend](https://github.com/user-attachments/assets/1a838b24-6f74-43ea-bf85-31f66efaffdb)
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
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
File without changes
File without changes