mycelium-ai 0.5.0__py3-none-any.whl

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 (164) hide show
  1. mycelium/__init__.py +0 -0
  2. mycelium/api/__init__.py +0 -0
  3. mycelium/api/app.py +1147 -0
  4. mycelium/api/client_app.py +170 -0
  5. mycelium/api/generated_sources/__init__.py +0 -0
  6. mycelium/api/generated_sources/server_schemas/__init__.py +97 -0
  7. mycelium/api/generated_sources/server_schemas/api/__init__.py +5 -0
  8. mycelium/api/generated_sources/server_schemas/api/default_api.py +2473 -0
  9. mycelium/api/generated_sources/server_schemas/api_client.py +766 -0
  10. mycelium/api/generated_sources/server_schemas/api_response.py +25 -0
  11. mycelium/api/generated_sources/server_schemas/configuration.py +434 -0
  12. mycelium/api/generated_sources/server_schemas/exceptions.py +166 -0
  13. mycelium/api/generated_sources/server_schemas/models/__init__.py +41 -0
  14. mycelium/api/generated_sources/server_schemas/models/api_section.py +71 -0
  15. mycelium/api/generated_sources/server_schemas/models/chroma_section.py +69 -0
  16. mycelium/api/generated_sources/server_schemas/models/clap_section.py +75 -0
  17. mycelium/api/generated_sources/server_schemas/models/compute_on_server200_response.py +79 -0
  18. mycelium/api/generated_sources/server_schemas/models/compute_on_server_request.py +67 -0
  19. mycelium/api/generated_sources/server_schemas/models/compute_text_search_request.py +69 -0
  20. mycelium/api/generated_sources/server_schemas/models/config_request.py +81 -0
  21. mycelium/api/generated_sources/server_schemas/models/config_response.py +107 -0
  22. mycelium/api/generated_sources/server_schemas/models/create_playlist_request.py +71 -0
  23. mycelium/api/generated_sources/server_schemas/models/get_similar_by_track200_response.py +143 -0
  24. mycelium/api/generated_sources/server_schemas/models/library_stats_response.py +77 -0
  25. mycelium/api/generated_sources/server_schemas/models/logging_section.py +67 -0
  26. mycelium/api/generated_sources/server_schemas/models/media_server_section.py +67 -0
  27. mycelium/api/generated_sources/server_schemas/models/playlist_response.py +73 -0
  28. mycelium/api/generated_sources/server_schemas/models/plex_section.py +71 -0
  29. mycelium/api/generated_sources/server_schemas/models/processing_response.py +90 -0
  30. mycelium/api/generated_sources/server_schemas/models/save_config_response.py +73 -0
  31. mycelium/api/generated_sources/server_schemas/models/scan_library_response.py +75 -0
  32. mycelium/api/generated_sources/server_schemas/models/search_result_response.py +75 -0
  33. mycelium/api/generated_sources/server_schemas/models/server_section.py +67 -0
  34. mycelium/api/generated_sources/server_schemas/models/stop_processing_response.py +71 -0
  35. mycelium/api/generated_sources/server_schemas/models/task_status_response.py +87 -0
  36. mycelium/api/generated_sources/server_schemas/models/track_database_stats.py +75 -0
  37. mycelium/api/generated_sources/server_schemas/models/track_response.py +77 -0
  38. mycelium/api/generated_sources/server_schemas/models/tracks_list_response.py +81 -0
  39. mycelium/api/generated_sources/server_schemas/rest.py +329 -0
  40. mycelium/api/generated_sources/server_schemas/test/__init__.py +0 -0
  41. mycelium/api/generated_sources/server_schemas/test/test_api_section.py +57 -0
  42. mycelium/api/generated_sources/server_schemas/test/test_chroma_section.py +55 -0
  43. mycelium/api/generated_sources/server_schemas/test/test_clap_section.py +60 -0
  44. mycelium/api/generated_sources/server_schemas/test/test_compute_on_server200_response.py +52 -0
  45. mycelium/api/generated_sources/server_schemas/test/test_compute_on_server_request.py +53 -0
  46. mycelium/api/generated_sources/server_schemas/test/test_compute_text_search_request.py +54 -0
  47. mycelium/api/generated_sources/server_schemas/test/test_config_request.py +66 -0
  48. mycelium/api/generated_sources/server_schemas/test/test_config_response.py +97 -0
  49. mycelium/api/generated_sources/server_schemas/test/test_create_playlist_request.py +60 -0
  50. mycelium/api/generated_sources/server_schemas/test/test_default_api.py +150 -0
  51. mycelium/api/generated_sources/server_schemas/test/test_get_similar_by_track200_response.py +61 -0
  52. mycelium/api/generated_sources/server_schemas/test/test_library_stats_response.py +63 -0
  53. mycelium/api/generated_sources/server_schemas/test/test_logging_section.py +53 -0
  54. mycelium/api/generated_sources/server_schemas/test/test_media_server_section.py +53 -0
  55. mycelium/api/generated_sources/server_schemas/test/test_playlist_response.py +58 -0
  56. mycelium/api/generated_sources/server_schemas/test/test_plex_section.py +56 -0
  57. mycelium/api/generated_sources/server_schemas/test/test_processing_response.py +61 -0
  58. mycelium/api/generated_sources/server_schemas/test/test_save_config_response.py +58 -0
  59. mycelium/api/generated_sources/server_schemas/test/test_scan_library_response.py +61 -0
  60. mycelium/api/generated_sources/server_schemas/test/test_search_result_response.py +69 -0
  61. mycelium/api/generated_sources/server_schemas/test/test_server_section.py +53 -0
  62. mycelium/api/generated_sources/server_schemas/test/test_stop_processing_response.py +55 -0
  63. mycelium/api/generated_sources/server_schemas/test/test_task_status_response.py +71 -0
  64. mycelium/api/generated_sources/server_schemas/test/test_track_database_stats.py +60 -0
  65. mycelium/api/generated_sources/server_schemas/test/test_track_response.py +63 -0
  66. mycelium/api/generated_sources/server_schemas/test/test_tracks_list_response.py +75 -0
  67. mycelium/api/generated_sources/worker_schemas/__init__.py +61 -0
  68. mycelium/api/generated_sources/worker_schemas/api/__init__.py +5 -0
  69. mycelium/api/generated_sources/worker_schemas/api/default_api.py +318 -0
  70. mycelium/api/generated_sources/worker_schemas/api_client.py +766 -0
  71. mycelium/api/generated_sources/worker_schemas/api_response.py +25 -0
  72. mycelium/api/generated_sources/worker_schemas/configuration.py +434 -0
  73. mycelium/api/generated_sources/worker_schemas/exceptions.py +166 -0
  74. mycelium/api/generated_sources/worker_schemas/models/__init__.py +23 -0
  75. mycelium/api/generated_sources/worker_schemas/models/save_config_response.py +73 -0
  76. mycelium/api/generated_sources/worker_schemas/models/worker_clap_section.py +75 -0
  77. mycelium/api/generated_sources/worker_schemas/models/worker_client_api_section.py +69 -0
  78. mycelium/api/generated_sources/worker_schemas/models/worker_client_section.py +79 -0
  79. mycelium/api/generated_sources/worker_schemas/models/worker_config_request.py +73 -0
  80. mycelium/api/generated_sources/worker_schemas/models/worker_config_response.py +89 -0
  81. mycelium/api/generated_sources/worker_schemas/models/worker_logging_section.py +67 -0
  82. mycelium/api/generated_sources/worker_schemas/rest.py +329 -0
  83. mycelium/api/generated_sources/worker_schemas/test/__init__.py +0 -0
  84. mycelium/api/generated_sources/worker_schemas/test/test_default_api.py +45 -0
  85. mycelium/api/generated_sources/worker_schemas/test/test_save_config_response.py +58 -0
  86. mycelium/api/generated_sources/worker_schemas/test/test_worker_clap_section.py +60 -0
  87. mycelium/api/generated_sources/worker_schemas/test/test_worker_client_api_section.py +55 -0
  88. mycelium/api/generated_sources/worker_schemas/test/test_worker_client_section.py +65 -0
  89. mycelium/api/generated_sources/worker_schemas/test/test_worker_config_request.py +59 -0
  90. mycelium/api/generated_sources/worker_schemas/test/test_worker_config_response.py +89 -0
  91. mycelium/api/generated_sources/worker_schemas/test/test_worker_logging_section.py +53 -0
  92. mycelium/api/worker_models.py +99 -0
  93. mycelium/application/__init__.py +11 -0
  94. mycelium/application/job_queue.py +323 -0
  95. mycelium/application/library_management_use_cases.py +292 -0
  96. mycelium/application/search_use_cases.py +96 -0
  97. mycelium/application/services.py +340 -0
  98. mycelium/client.py +554 -0
  99. mycelium/client_config.py +251 -0
  100. mycelium/client_frontend_dist/404.html +1 -0
  101. mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_buildManifest.js +1 -0
  102. mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_ssgManifest.js +1 -0
  103. mycelium/client_frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +1 -0
  104. mycelium/client_frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js +1 -0
  105. mycelium/client_frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js +1 -0
  106. mycelium/client_frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js +1 -0
  107. mycelium/client_frontend_dist/_next/static/chunks/app/page-cc6bad295789134e.js +1 -0
  108. mycelium/client_frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js +1 -0
  109. mycelium/client_frontend_dist/_next/static/chunks/main-6b37be50736577a2.js +1 -0
  110. mycelium/client_frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js +1 -0
  111. mycelium/client_frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js +1 -0
  112. mycelium/client_frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js +1 -0
  113. mycelium/client_frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  114. mycelium/client_frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js +1 -0
  115. mycelium/client_frontend_dist/_next/static/css/1eb7f0e2c78e0734.css +1 -0
  116. mycelium/client_frontend_dist/favicon.ico +0 -0
  117. mycelium/client_frontend_dist/file.svg +1 -0
  118. mycelium/client_frontend_dist/globe.svg +1 -0
  119. mycelium/client_frontend_dist/index.html +1 -0
  120. mycelium/client_frontend_dist/index.txt +20 -0
  121. mycelium/client_frontend_dist/next.svg +1 -0
  122. mycelium/client_frontend_dist/vercel.svg +1 -0
  123. mycelium/client_frontend_dist/window.svg +1 -0
  124. mycelium/config.py +346 -0
  125. mycelium/domain/__init__.py +13 -0
  126. mycelium/domain/models.py +71 -0
  127. mycelium/domain/repositories.py +98 -0
  128. mycelium/domain/worker.py +77 -0
  129. mycelium/frontend_dist/404.html +1 -0
  130. mycelium/frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js +1 -0
  131. mycelium/frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js +1 -0
  132. mycelium/frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js +1 -0
  133. mycelium/frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js +1 -0
  134. mycelium/frontend_dist/_next/static/chunks/app/page-a761463485e0540b.js +1 -0
  135. mycelium/frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js +1 -0
  136. mycelium/frontend_dist/_next/static/chunks/main-6b37be50736577a2.js +1 -0
  137. mycelium/frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js +1 -0
  138. mycelium/frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js +1 -0
  139. mycelium/frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js +1 -0
  140. mycelium/frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
  141. mycelium/frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js +1 -0
  142. mycelium/frontend_dist/_next/static/css/1eb7f0e2c78e0734.css +1 -0
  143. mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_buildManifest.js +1 -0
  144. mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_ssgManifest.js +1 -0
  145. mycelium/frontend_dist/favicon.ico +0 -0
  146. mycelium/frontend_dist/file.svg +1 -0
  147. mycelium/frontend_dist/globe.svg +1 -0
  148. mycelium/frontend_dist/index.html +10 -0
  149. mycelium/frontend_dist/index.txt +20 -0
  150. mycelium/frontend_dist/next.svg +1 -0
  151. mycelium/frontend_dist/vercel.svg +1 -0
  152. mycelium/frontend_dist/window.svg +1 -0
  153. mycelium/infrastructure/__init__.py +17 -0
  154. mycelium/infrastructure/chroma_adapter.py +232 -0
  155. mycelium/infrastructure/clap_adapter.py +280 -0
  156. mycelium/infrastructure/plex_adapter.py +145 -0
  157. mycelium/infrastructure/track_database.py +467 -0
  158. mycelium/main.py +183 -0
  159. mycelium_ai-0.5.0.dist-info/METADATA +312 -0
  160. mycelium_ai-0.5.0.dist-info/RECORD +164 -0
  161. mycelium_ai-0.5.0.dist-info/WHEEL +5 -0
  162. mycelium_ai-0.5.0.dist-info/entry_points.txt +2 -0
  163. mycelium_ai-0.5.0.dist-info/licenses/LICENSE +21 -0
  164. mycelium_ai-0.5.0.dist-info/top_level.txt +1 -0
@@ -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,164 @@
1
+ mycelium/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ mycelium/client.py,sha256=IHuEOCeWiljvxPNaE5g7qRvuE_XPqM8wbqyKLohJ0JY,23589
3
+ mycelium/client_config.py,sha256=bkhAJajl9Ae7XoC_Scn5bZTvY0f7a7dkIAbhiZqLoJA,9434
4
+ mycelium/config.py,sha256=SZFLL_qp1zrvbqHOmYxKZL_eWKR86eWHbp-znGuUHn8,11566
5
+ mycelium/main.py,sha256=ONed9mgyt-17jgbrBJUucMTbk1unwCcfWC9zCVo8MpU,5189
6
+ mycelium/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ mycelium/api/app.py,sha256=ARTQLDT_s9mM097CqoIJtG3vmI8D3AEU5BcOficGPiQ,44962
8
+ mycelium/api/client_app.py,sha256=pTlxSeyvZlyZT3DeiPeXdWs3GlItwl-AQOl3mwS6xIY,6550
9
+ mycelium/api/worker_models.py,sha256=IYqFQCMkcfhMYygEJh4wMuAT1WvmNJUAuwoKEB_zKr4,2643
10
+ mycelium/api/generated_sources/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
11
+ mycelium/api/generated_sources/server_schemas/__init__.py,sha256=uovNxmx7Iok2Jn8oexmrYJFEHCHJawXrd5vVLQ8AaAU,5423
12
+ mycelium/api/generated_sources/server_schemas/api_client.py,sha256=L2GLxePYmGCU42Ti4U0JshftzEP7rlOPw2o1lIcKcws,29995
13
+ mycelium/api/generated_sources/server_schemas/api_response.py,sha256=uCehWdXXDnAO2HAHGKe0SgpQ_mJiGDbcu-BHDF3n_IM,852
14
+ mycelium/api/generated_sources/server_schemas/configuration.py,sha256=4Dh6hd-IavPZgql5MfE5vpBaLJR2lUNQpdqAca_rn8Q,14391
15
+ mycelium/api/generated_sources/server_schemas/exceptions.py,sha256=m5KX3-HCevSI_Ul9Q-58B5-DKcrdneMcinxGvfrqKr8,5393
16
+ mycelium/api/generated_sources/server_schemas/rest.py,sha256=Hx-P0VV_ZBDFRQbDF-l4GvFc8aTlfqTUe1xDoEM4SZM,14051
17
+ mycelium/api/generated_sources/server_schemas/api/__init__.py,sha256=Z51xKVg-5GtaaMZYJ4h0lNdaXrrpdg38YSkU7OJTF44,133
18
+ mycelium/api/generated_sources/server_schemas/api/default_api.py,sha256=BuUjD8x8ijLni7ojvjdWudo-OQRo3inKEFsI3OtP4z8,104860
19
+ mycelium/api/generated_sources/server_schemas/models/__init__.py,sha256=u-p_4Dh_x8wiV4Eyn2Sx6vH66m9vh9qKaOKSDKBDEdU,2931
20
+ mycelium/api/generated_sources/server_schemas/models/api_section.py,sha256=eQzK6yPFlC0_VG6P31KjEtuqh1WBxVlWJSPBMu5WqMc,1972
21
+ mycelium/api/generated_sources/server_schemas/models/chroma_section.py,sha256=ys-AM7EYX8tgbg2EDV7nx9zqNJqteGrqmJalvPMBGx0,1965
22
+ mycelium/api/generated_sources/server_schemas/models/clap_section.py,sha256=OGb3tTNzXxLTq01EOOeetnwszMZGlJYsmfhthSF_QFI,2314
23
+ mycelium/api/generated_sources/server_schemas/models/compute_on_server200_response.py,sha256=MmYutTmyon1Abjjwj7Bwh8N4U1w5tSMJY6OCmUTneUQ,2479
24
+ mycelium/api/generated_sources/server_schemas/models/compute_on_server_request.py,sha256=HfNCXQQA0cC6-kS_oN5zFsQZEImEoWCSu_kyyImsywc,1896
25
+ mycelium/api/generated_sources/server_schemas/models/compute_text_search_request.py,sha256=k6QkkDoGLYSK7YwYckhfXvB7dDCdK0hpe9SQkpOVby4,2082
26
+ mycelium/api/generated_sources/server_schemas/models/config_request.py,sha256=YNcm7jTLln51uDur1fDyXTHDa-cjcXQPI2BNuIL0HZg,2497
27
+ mycelium/api/generated_sources/server_schemas/models/config_response.py,sha256=iZJniM11tFu1IFL9WKSih3Bmw0h-yg3ktP81B0BQpAw,4615
28
+ mycelium/api/generated_sources/server_schemas/models/create_playlist_request.py,sha256=h16yt4yfy3lK_3_xw4ce7cm_lRyBMRTW0_Axof_NvOY,2183
29
+ mycelium/api/generated_sources/server_schemas/models/get_similar_by_track200_response.py,sha256=S0j_MRaPAtMXuf8G6N0F8Yc_IquFSCWmQ4GA3R53npw,5790
30
+ mycelium/api/generated_sources/server_schemas/models/library_stats_response.py,sha256=ZeBXDjjftUrrISEbTr-LXcvpMI9zsc4-gNORkMdz9BU,2750
31
+ mycelium/api/generated_sources/server_schemas/models/logging_section.py,sha256=ArFIfw-KrXqarMFJQCScrEhfYB7eT2M9zNz1fvUMF7A,1820
32
+ mycelium/api/generated_sources/server_schemas/models/media_server_section.py,sha256=l9Oq14D5wuQLNsZUAlF5HidDSa6QIrBSOuJLOwSxWao,1848
33
+ mycelium/api/generated_sources/server_schemas/models/playlist_response.py,sha256=fL8MY3d6S6-N1UyOe83baibyycEi_M1c1NYy9ozXTUg,2180
34
+ mycelium/api/generated_sources/server_schemas/models/plex_section.py,sha256=HVa_F_AQili5eBKuZZ-c4xpmLPdMTO3452Q7PNsom_4,2035
35
+ mycelium/api/generated_sources/server_schemas/models/processing_response.py,sha256=V8TfPWXtLviAvS6EIwt6QM0KwrgRYTXMo0h31xd6BLs,3257
36
+ mycelium/api/generated_sources/server_schemas/models/save_config_response.py,sha256=GDsD5cAYsjZkvCyTUlAdzGzlnHjzZHpChZAGm-PBatU,2194
37
+ mycelium/api/generated_sources/server_schemas/models/scan_library_response.py,sha256=U3RT86_zdSesDED_5GKR3i3jMo8vW_gj_hUwlu--dZc,2327
38
+ mycelium/api/generated_sources/server_schemas/models/search_result_response.py,sha256=6V-xO3Em3FCzp5ySrs6MfS7J81Sf3eoDbkAG9HjY-N0,2487
39
+ mycelium/api/generated_sources/server_schemas/models/server_section.py,sha256=Pbf7397DjsAA1rb2qzc9pqhbb0BYd48KlbBJL1A7nvg,1848
40
+ mycelium/api/generated_sources/server_schemas/models/stop_processing_response.py,sha256=cTiTDNKG74R0v2ZkKpq30_oThOc73hPQvDExGPjx_sQ,2130
41
+ mycelium/api/generated_sources/server_schemas/models/task_status_response.py,sha256=Zx1RgKFDQZfebHb7vLMnrG0LfN_gwvLyJ__UZoyG-fs,3112
42
+ mycelium/api/generated_sources/server_schemas/models/track_database_stats.py,sha256=GkXNOD7wMz2OYlvWKxU3mmntrj8TXwl9TvkmdDE5j_o,2476
43
+ mycelium/api/generated_sources/server_schemas/models/track_response.py,sha256=hJLm4ahBaZDWYsMBB-PMRAlktYg3Bvj1aauO_LfKvdw,2358
44
+ mycelium/api/generated_sources/server_schemas/models/tracks_list_response.py,sha256=HIgY1Fez-O5kkK5RWArjNzGp-cMaorJKCwucYqfOw68,2651
45
+ mycelium/api/generated_sources/server_schemas/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
+ mycelium/api/generated_sources/server_schemas/test/test_api_section.py,sha256=2Fmk-89F6VQpd4tv-L8YF1KkrJ6rlAOOX4fR9FYtnVs,1517
47
+ mycelium/api/generated_sources/server_schemas/test/test_chroma_section.py,sha256=pqtqN5poJ_CjM1qZYE4yGFPDJbwbLnl-fsuelRjE3B0,1525
48
+ mycelium/api/generated_sources/server_schemas/test/test_clap_section.py,sha256=HG89ScN-y4jv1zR2Ob3rOBykchQI0jHALRH2OkDjLes,1671
49
+ mycelium/api/generated_sources/server_schemas/test/test_compute_on_server200_response.py,sha256=6NkovEetffjiEmocwt9yyZRJ8vHG6g59E-XLo7NT3-k,1571
50
+ mycelium/api/generated_sources/server_schemas/test/test_compute_on_server_request.py,sha256=3vlb5h_ryIyAx2n4-zzomISs_Gc8CYYYKkOfd8i7R24,1555
51
+ mycelium/api/generated_sources/server_schemas/test/test_compute_text_search_request.py,sha256=VhY0jYokI4bhDFv2g14ydC-OKCbV51zMCBJyXezx7kA,1605
52
+ mycelium/api/generated_sources/server_schemas/test/test_config_request.py,sha256=oVuD-1gsduI4b1k7FGY6Lv48FrUORiITZVvz6A1okKk,1835
53
+ mycelium/api/generated_sources/server_schemas/test/test_config_response.py,sha256=HsOy38YsyH747eEu6x0uxaHKRqli2LjNzjlqYfeVwMU,4133
54
+ mycelium/api/generated_sources/server_schemas/test/test_create_playlist_request.py,sha256=a_NVfCzx6un8DQdxBChqIBkMmCWpvKARt0QnG49YMp4,1719
55
+ mycelium/api/generated_sources/server_schemas/test/test_default_api.py,sha256=oncIj71MaR0THxqDylcATC61WpoT1JvH3SxCu3q_GTU,3386
56
+ mycelium/api/generated_sources/server_schemas/test/test_get_similar_by_track200_response.py,sha256=8aANpQAHuOPPvvFI9d662S5omB8_Oe6W8lsuuXla1f4,1913
57
+ mycelium/api/generated_sources/server_schemas/test/test_library_stats_response.py,sha256=GiLXwKs3QTxl8uoe5umQLPJzgLpq4lipV3wbYFezIqk,2052
58
+ mycelium/api/generated_sources/server_schemas/test/test_logging_section.py,sha256=AtalAegoLdhbj8IqZbxV8CKlCEGKbelb8GvcFj9n3zw,1451
59
+ mycelium/api/generated_sources/server_schemas/test/test_media_server_section.py,sha256=Yb8tL3ZAXvxD8WbND7PCru324GUTWAvXr2CvSL4vlnU,1498
60
+ mycelium/api/generated_sources/server_schemas/test/test_playlist_response.py,sha256=RM_J5qUPI6Yj6ilcSEepXt8AkYKvUnX99_jGATLDyZk,1639
61
+ mycelium/api/generated_sources/server_schemas/test/test_plex_section.py,sha256=KQZ8J9WzUPxn0r3g5cx8Mw7imTswl1Uf7G45jX4Trhw,1521
62
+ mycelium/api/generated_sources/server_schemas/test/test_processing_response.py,sha256=l7-rKbqBn07KPSvIRhLYsgevVH-lTBZ2tbwVDF5RVjY,1790
63
+ mycelium/api/generated_sources/server_schemas/test/test_save_config_response.py,sha256=QZEA9EANkUJOHhfrU_QpzfEqeankINvWD0hBOzRJCBU,1663
64
+ mycelium/api/generated_sources/server_schemas/test/test_scan_library_response.py,sha256=xXjfkYYnDxURg2BvPYwJiBdIOQT05gJULvVkJr55NIw,1800
65
+ mycelium/api/generated_sources/server_schemas/test/test_search_result_response.py,sha256=3kXr0VI4ZsiFH3SooG9ajSlcp1bR-tBSuzybZAxKg7c,2302
66
+ mycelium/api/generated_sources/server_schemas/test/test_server_section.py,sha256=OzxqxUbIP6FAgETXZt3h3czJSIkNUgBN3mNRMRNCpCs,1457
67
+ mycelium/api/generated_sources/server_schemas/test/test_stop_processing_response.py,sha256=tFpxQDYhzZvSMTtNTedELCRNyCuORgDus0TRup3Rhvg,1615
68
+ mycelium/api/generated_sources/server_schemas/test/test_task_status_response.py,sha256=OMDAXwmHiOBZd-z-z1z5QmGyAZvMy2TXv_jdHiOuSCc,2366
69
+ mycelium/api/generated_sources/server_schemas/test/test_track_database_stats.py,sha256=NbZ-kHiA6Wp3Usyy2cqs4fgaYIr0e2pwW0kacflKno8,1802
70
+ mycelium/api/generated_sources/server_schemas/test/test_track_response.py,sha256=RFrRlvb3In3q5sZFXhFfcLbbaca4VgqHmhp5e8s_MMo,1787
71
+ mycelium/api/generated_sources/server_schemas/test/test_tracks_list_response.py,sha256=RotF2sz5LpGC_cGmX9H9qh7Ms5RcfRDZqdT-lm8qSnE,2442
72
+ mycelium/api/generated_sources/worker_schemas/__init__.py,sha256=84CZMgHBbU3bw1WHeIr0C4NvMZtXuy6YvVnHR2iitpY,2752
73
+ mycelium/api/generated_sources/worker_schemas/api_client.py,sha256=IGBOTxxPu_7WLBE7Gj90wYH28N2kAQOEc8g11dlR5Z8,29987
74
+ mycelium/api/generated_sources/worker_schemas/api_response.py,sha256=uCehWdXXDnAO2HAHGKe0SgpQ_mJiGDbcu-BHDF3n_IM,852
75
+ mycelium/api/generated_sources/worker_schemas/configuration.py,sha256=idsw62PPDUAFwy8Evt0dmjDGjB6BxV2ls5m-sfC4SWc,14383
76
+ mycelium/api/generated_sources/worker_schemas/exceptions.py,sha256=sA_BZsQWuzNS7qNjKzXgJyHLDHTYFRv3HUkWEgDJjy4,5385
77
+ mycelium/api/generated_sources/worker_schemas/rest.py,sha256=1NinDsjSp0fKdAu2TONJP-yMbdWimw_4Lega3dIJZMA,14043
78
+ mycelium/api/generated_sources/worker_schemas/api/__init__.py,sha256=7seMixIi5tu4H_6LX3t_SGr-qlGhZ_0mWSVKHQDKWtM,133
79
+ mycelium/api/generated_sources/worker_schemas/api/default_api.py,sha256=uUgzzhgtPz4MTt2X1P8g-wuBfthqP-a_vbfHfVRvW0o,13037
80
+ mycelium/api/generated_sources/worker_schemas/models/__init__.py,sha256=Yc2bODmVP4VYkSoedjhNLZ2J7d306VoH5ChPZAEhHS8,1082
81
+ mycelium/api/generated_sources/worker_schemas/models/save_config_response.py,sha256=A4A88Seh1OsINv7fhRk5QR_SA0zHLnAJnxuf4EldC2A,2186
82
+ mycelium/api/generated_sources/worker_schemas/models/worker_clap_section.py,sha256=uTB08GK-K1bm3GpEnG6nmKw6cFsonBrUoiw7C3MFXHk,2354
83
+ mycelium/api/generated_sources/worker_schemas/models/worker_client_api_section.py,sha256=7fERDxwwuGK3xOTMNaCAd_bIo2UeE6ara8IOF1lXCck,1961
84
+ mycelium/api/generated_sources/worker_schemas/models/worker_client_section.py,sha256=hCseEcrPnZSJPpjbRSoLIiBD5u1iUsarpJistDjGT4Q,2664
85
+ mycelium/api/generated_sources/worker_schemas/models/worker_config_request.py,sha256=GHU77eLuBNoxZrzjwc0hBk5HWwiD51Vii-ju8YpKROo,2163
86
+ mycelium/api/generated_sources/worker_schemas/models/worker_config_response.py,sha256=m-e_UIwPYStVD4DLhW_RwVxEouK_PXMjDUouK1EOz_U,3555
87
+ mycelium/api/generated_sources/worker_schemas/models/worker_logging_section.py,sha256=P1bTTYXhw3e_MYU9J17czuso7JoEnd9ZS9R_9CBcS4c,1860
88
+ mycelium/api/generated_sources/worker_schemas/test/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
89
+ mycelium/api/generated_sources/worker_schemas/test/test_default_api.py,sha256=SmfdACqjaBjeL8YdqD3P7dfv3vErMaAyAl7h_xg0lQs,991
90
+ mycelium/api/generated_sources/worker_schemas/test/test_save_config_response.py,sha256=qBvro2_56YNkZ3v9YLUk-AHF67SWoHhgPF7dJIBBhhY,1655
91
+ mycelium/api/generated_sources/worker_schemas/test/test_worker_clap_section.py,sha256=NLixdT2jdT5XYHyI-kdAJIuIK_xCGNkr7G6r9kLAi1I,1736
92
+ mycelium/api/generated_sources/worker_schemas/test/test_worker_client_api_section.py,sha256=1IwQwsiXcLJG4z3-ZvTX12Z6hB1jLYVcW2NW50zAawE,1593
93
+ mycelium/api/generated_sources/worker_schemas/test/test_worker_client_section.py,sha256=9U35WsMqF4J3MnOe44_QkLrQGVlujK4xOexGdqfKa5Q,1972
94
+ mycelium/api/generated_sources/worker_schemas/test/test_worker_config_request.py,sha256=gMk-DndHraimjSd9zZfSLNH1A-p6OHKtek2BVPC0Wuw,1694
95
+ mycelium/api/generated_sources/worker_schemas/test/test_worker_config_response.py,sha256=6K0iOZoiVqIdyva9k8KBDlvUMh0VKauPiww6clwGQ-s,3652
96
+ mycelium/api/generated_sources/worker_schemas/test/test_worker_logging_section.py,sha256=5rifguLeTFPg-Vdb8FF6WHWvMQrDMFeWI_ATzvjPMyo,1516
97
+ mycelium/application/__init__.py,sha256=0iHrB3Q3gHd_3UGcu9-6f8WxodVUVXQlozk15d7bsHE,201
98
+ mycelium/application/job_queue.py,sha256=vzUr42-zMubLiI--XsQvCMSGEi4rLm2JrfmJOxGdO_A,13251
99
+ mycelium/application/library_management_use_cases.py,sha256=m_VRHle4RQ-1NDVVCog4kaaa5h1uDELEZV32Ixcl3GI,11674
100
+ mycelium/application/search_use_cases.py,sha256=QZD3tZR178nJ_00nk6v-gBUCW667Nv6-xprgiTSRHgs,3800
101
+ mycelium/application/services.py,sha256=5EQ4Yw523rv2JxWjh0vSgPkjFPGVTXN7FPQbshoEfig,14651
102
+ mycelium/client_frontend_dist/404.html,sha256=0A8e3w1PYAuiE-yq4AHAuhL3BjNOTQW_2FuCUhtj4oU,6324
103
+ mycelium/client_frontend_dist/favicon.ico,sha256=K4rS0zRVqPc2_DqOv48L3qiEitTA20iigzvQ-c13WTI,25931
104
+ mycelium/client_frontend_dist/file.svg,sha256=K2eBLDJcGZoCU2zb7qDFk6cvcH0yO3LuPgjbqwZ1O9Q,391
105
+ mycelium/client_frontend_dist/globe.svg,sha256=thS5vxg5JZV2YayFFJj-HYAp_UOmL7_thvniYkpX588,1035
106
+ mycelium/client_frontend_dist/index.html,sha256=7Vdo0aM6RPPE9GRCBJkPwQyo0yn6VQvQ4QskHm2NTck,7537
107
+ mycelium/client_frontend_dist/index.txt,sha256=babZd5VYz-hSqqCkODxEju_BeLowxG9byOhLQhSdMAw,3277
108
+ mycelium/client_frontend_dist/next.svg,sha256=VZld-tbstJRaHoVt3KA8XhaqW_E_0htN9qdK55NXvPw,1375
109
+ mycelium/client_frontend_dist/vercel.svg,sha256=8IEzey_uY1tFW2MnVAaj5_OdagFOJa2Q2rWmfmKhKsQ,128
110
+ mycelium/client_frontend_dist/window.svg,sha256=ZEdoxKrrR2e84pM0TusMEl-4BKlNgBRAQkByIC2F46E,385
111
+ mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_buildManifest.js,sha256=j1u6BhF-PCQQBDiSp0UbEYyjZ1-hjTIIosO4Tx9e3KI,544
112
+ mycelium/client_frontend_dist/_next/static/a4iyRdfsvkjdyMAK9cE9Y/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
113
+ mycelium/client_frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js,sha256=LZF4GSB27wWEGfcZ8svgftIhKsR-dbSEPQOMFE1UMZk,172729
114
+ mycelium/client_frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js,sha256=3dTwk656hHptlUywHkHRwrWc2dNamNzfldBwZe2bLDk,165956
115
+ mycelium/client_frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js,sha256=DOKGYsI-E-_-bPetqL9T2YAkmfJw74DS4rMmb0q-Nu4,182720
116
+ mycelium/client_frontend_dist/_next/static/chunks/main-6b37be50736577a2.js,sha256=F8bJ6CPXMXJRwCueDsFl7bOdy9lKoR_Xh5V2QkdLjB4,117541
117
+ mycelium/client_frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js,sha256=oUaEzNgnBigzn7t_vIFIIoLuQrdI-Th8yaniGls0pi0,557
118
+ mycelium/client_frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
119
+ mycelium/client_frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js,sha256=Z6qPdm3Nf-D3QFz988m8VuBYt9QhXuqN2OLKdAq_CV0,3330
120
+ mycelium/client_frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js,sha256=Zg6WSIgMuxsnSKbWmkBsAWbNGh772osGe5SzP1caohI,193
121
+ mycelium/client_frontend_dist/_next/static/chunks/app/page-cc6bad295789134e.js,sha256=Q_eNl47jFa2WX3k6R4gjumGGr8G5jE44qebcc8oH-Lk,100461
122
+ mycelium/client_frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js,sha256=kHEI7PblAXY3ViT5P4Lwh8tcsdVNF-huhpjfLWlj09w,2670
123
+ mycelium/client_frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js,sha256=42mX-qEGt0LNFAAUjOhcM71wHqZHO_xQFM53G5WPiSc,233
124
+ mycelium/client_frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js,sha256=m8CkMJwrMUfIvaSXNXOsO6TOxsWPXQjBa9R52GCvaQk,218
125
+ mycelium/client_frontend_dist/_next/static/css/1eb7f0e2c78e0734.css,sha256=rZR0g0AyN85FORsmvHTCqN3SSlgeG07TjX5KwEfSxWA,30581
126
+ mycelium/domain/__init__.py,sha256=VKK0Y-mNb-xNkV3Agghv8dPNoaxBBbNpXDlBjAyL5tg,335
127
+ mycelium/domain/models.py,sha256=JSbRs9tRbhxMBXSNPq7vYchohJdRDu_l8ioz5XZtVwc,1653
128
+ mycelium/domain/repositories.py,sha256=5nZ0q1WWifimf7wHqL9hN705g_FGE34uBZM09V2Oj8E,3116
129
+ mycelium/domain/worker.py,sha256=Kj33OWqN1p982IxM_btWaDv9CJfZ2WVClamiqYb3Nug,2219
130
+ mycelium/frontend_dist/404.html,sha256=uF7sEm5pHa_femeNappOrMu9cShiaX1ZqcxsH_V4npc,6324
131
+ mycelium/frontend_dist/favicon.ico,sha256=K4rS0zRVqPc2_DqOv48L3qiEitTA20iigzvQ-c13WTI,25931
132
+ mycelium/frontend_dist/file.svg,sha256=K2eBLDJcGZoCU2zb7qDFk6cvcH0yO3LuPgjbqwZ1O9Q,391
133
+ mycelium/frontend_dist/globe.svg,sha256=thS5vxg5JZV2YayFFJj-HYAp_UOmL7_thvniYkpX588,1035
134
+ mycelium/frontend_dist/index.html,sha256=zPpLslXu-qUur9IESYuIfdcoHq7UNTvN6YfNzearyrU,11560
135
+ mycelium/frontend_dist/index.txt,sha256=kRROL3sdOcwjRNui0GycUzfiHR1kagQD4_WerG9ezXY,3277
136
+ mycelium/frontend_dist/next.svg,sha256=VZld-tbstJRaHoVt3KA8XhaqW_E_0htN9qdK55NXvPw,1375
137
+ mycelium/frontend_dist/vercel.svg,sha256=8IEzey_uY1tFW2MnVAaj5_OdagFOJa2Q2rWmfmKhKsQ,128
138
+ mycelium/frontend_dist/window.svg,sha256=ZEdoxKrrR2e84pM0TusMEl-4BKlNgBRAQkByIC2F46E,385
139
+ mycelium/frontend_dist/_next/static/chunks/4bd1b696-cf72ae8a39fa05aa.js,sha256=LZF4GSB27wWEGfcZ8svgftIhKsR-dbSEPQOMFE1UMZk,172729
140
+ mycelium/frontend_dist/_next/static/chunks/964-830f77d7ce1c2463.js,sha256=3dTwk656hHptlUywHkHRwrWc2dNamNzfldBwZe2bLDk,165956
141
+ mycelium/frontend_dist/_next/static/chunks/framework-7c95b8e5103c9e90.js,sha256=DOKGYsI-E-_-bPetqL9T2YAkmfJw74DS4rMmb0q-Nu4,182720
142
+ mycelium/frontend_dist/_next/static/chunks/main-6b37be50736577a2.js,sha256=F8bJ6CPXMXJRwCueDsFl7bOdy9lKoR_Xh5V2QkdLjB4,117541
143
+ mycelium/frontend_dist/_next/static/chunks/main-app-4153d115599d3126.js,sha256=oUaEzNgnBigzn7t_vIFIIoLuQrdI-Th8yaniGls0pi0,557
144
+ mycelium/frontend_dist/_next/static/chunks/polyfills-42372ed130431b0a.js,sha256=CXPB1kyIrcjjyVBBDLWLKI9yEY1ZZbeASUON648vloM,112594
145
+ mycelium/frontend_dist/_next/static/chunks/webpack-c81e624915b2ea70.js,sha256=Z6qPdm3Nf-D3QFz988m8VuBYt9QhXuqN2OLKdAq_CV0,3330
146
+ mycelium/frontend_dist/_next/static/chunks/app/layout-9b3d32f96dfe13b6.js,sha256=Zg6WSIgMuxsnSKbWmkBsAWbNGh772osGe5SzP1caohI,193
147
+ mycelium/frontend_dist/_next/static/chunks/app/page-a761463485e0540b.js,sha256=DSnJQbSM2F2RiacEx7ybgXQeGiqdFquVIQIZs6HxJ98,100551
148
+ mycelium/frontend_dist/_next/static/chunks/app/_not-found/page-d25eede5a9099bd3.js,sha256=kHEI7PblAXY3ViT5P4Lwh8tcsdVNF-huhpjfLWlj09w,2670
149
+ mycelium/frontend_dist/_next/static/chunks/pages/_app-0a0020ddd67f79cf.js,sha256=42mX-qEGt0LNFAAUjOhcM71wHqZHO_xQFM53G5WPiSc,233
150
+ mycelium/frontend_dist/_next/static/chunks/pages/_error-03529f2c21436739.js,sha256=m8CkMJwrMUfIvaSXNXOsO6TOxsWPXQjBa9R52GCvaQk,218
151
+ mycelium/frontend_dist/_next/static/css/1eb7f0e2c78e0734.css,sha256=rZR0g0AyN85FORsmvHTCqN3SSlgeG07TjX5KwEfSxWA,30581
152
+ mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_buildManifest.js,sha256=j1u6BhF-PCQQBDiSp0UbEYyjZ1-hjTIIosO4Tx9e3KI,544
153
+ mycelium/frontend_dist/_next/static/glVJ0yJSL0zWN7anTTG3_/_ssgManifest.js,sha256=Z49s4suAsf5y_GfnQSvm4qtq2ggxEbZPfEDTXjy6XgA,80
154
+ mycelium/infrastructure/__init__.py,sha256=N1GNnT5iy-JZBP-IFbA0hrxas5tXf-0UsOshM1PNLpY,755
155
+ mycelium/infrastructure/chroma_adapter.py,sha256=r5M-JbbiUgOsiP1u7twLovAln7SRcyP_SrvujylNNbc,9423
156
+ mycelium/infrastructure/clap_adapter.py,sha256=MJ3XSYWt-zfpX1tFhzLQiffDJPJSVw3L6QQxtl7kWtk,11232
157
+ mycelium/infrastructure/plex_adapter.py,sha256=3s96r6hhwBQJnQJXETkiFhORMDdMEGuR3V20GwgXUpg,6318
158
+ mycelium/infrastructure/track_database.py,sha256=vItZD05MDqD6p7yLLg-Uif8XIzSpZ3TtQ-oclMbbeCY,20000
159
+ mycelium_ai-0.5.0.dist-info/licenses/LICENSE,sha256=QhYM6_7CwEAC9vHW8RSot9PiGgr0-Z72c-k74rMTE-M,1069
160
+ mycelium_ai-0.5.0.dist-info/METADATA,sha256=fDeSxKmgDojXTcwj4q-ovbcAHzxY5qCg6gHxoaRnNR0,10267
161
+ mycelium_ai-0.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
162
+ mycelium_ai-0.5.0.dist-info/entry_points.txt,sha256=4L948CQZK7-5yVvO20WqL85ljh_VdgR1mw_lIkGr5Z8,51
163
+ mycelium_ai-0.5.0.dist-info/top_level.txt,sha256=NPWNAPk_TrhchhMq_7wTM-2q04WV2SwvNN3ntFuD7qE,9
164
+ mycelium_ai-0.5.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ mycelium-ai = mycelium.main:main
@@ -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 @@
1
+ mycelium