update plan

This commit is contained in:
copyrights 2025-04-21 23:13:46 +02:00
parent d9ca4ef2f1
commit 5e9f7d7a56

View file

@ -51,12 +51,61 @@ flowchart TD
- `StreamingController` (ASP.NET Controller)
- Register virtual folder with `ILibraryManager.RegisterVirtualFolder` on startup.
## 3. Scanning Integration
- Research Jellyfin scan engine provider interfaces.
- Implement `RemoteLibraryProvider` to list directories/files via `WebDavClientService`.
- Map each remote item to a `BaseItem` (e.g., `Video`, `Folder`) with metadata.
- Track ETags or timestamps to support incremental scans.
## 3. Scanning Proof-of-Concept (M2)
```mermaid
flowchart TD
subgraph Plugin Core
Cfg[PluginConfiguration<br/> holds URL, creds, rootPath, cache settings]
Reg[ServiceRegistrator<br/> registers DI & virtual folder]
end
subgraph Scanning POC
WCS[WebDavClientService<br/> list, HEAD for size]
RLP[RemoteLibraryProvider<br/> implements scanning]
MI[MediaInfoParser<br/> extract duration]
Items[BaseItem list]
end
Cfg --> Reg
Reg --> WCS
Reg --> RLP
WCS --> RLP
RLP --> MI
RLP --> Items
Items --> ScanEngine[Jellyfin Scan Engine]
```
**POC Interface Choice:**
Use an `IHostedService` (the existing `WebDavSyncService`) to sync remote content into a local cache directory, then register that directory via `ILibraryManager.AddVirtualFolder`. This leverages the builtin file system scan engine for enumeration and HEAD/partial reads for metadata retrieval.
### 3.1 Dependency Injection & Registration
- Add `RemoteLibraryProvider` to DI with `serviceCollection.AddSingleton<RemoteLibraryProvider>();`.
- On startup in a hosted service, call `ILibraryManager.RegisterVirtualFolder("Nextcloud", providerInstance)` to hook into Jellyfin's scan pipeline.
### 3.2 Plugin Configuration
- Ensure `PluginConfiguration` exposes:
- `WebDavUrl`, `Username`, `Password`
- `RootPath`, `CacheDirectory`, `CacheSizeMb`
### 3.3 RemoteLibraryProvider Implementation
- Inject `WebDavClientService`, `PluginConfiguration`, and `ILogger<RemoteLibraryProvider>` in the constructor.
- Implement `GetItemsAsync(BaseItem parent, CancellationToken ct)`:
1. Call `webDav.ListAsync(cfg.RootPath + parent.Path)` to enumerate remote children.
2. For directories: create `new BaseItem { Name = dirName, IsFolder = true, Id = GenerateId(path) }`.
3. For video files:
- Use `webDav.HeadAsync(path)` to get `Content-Length` for size.
- Download a small buffer and parse with `MediaInfoParser.Parse(stream)` to get `Duration`.
- Create `new BaseItem { Name = fileName, RunTimeTicks = durationTicks, MediaSources = { new MediaSourceInfo { Size = size } }, Id = GenerateId(path) }`.
4. Return the list of `BaseItem`s.
### 3.4 Logging & Diagnostics
- Log total items found per folder and individual metadata (size, duration) for verification.
### 3.5 Manual Validation
- Deploy locally, configure plugin with test Nextcloud credentials.
- Restart Jellyfin and trigger a library scan.
- Verify in logs that the `RemoteLibraryProvider` runs and emits items with correct size and duration.
## 4. Streaming & Caching
- Create `StreamingController : ControllerBase` with endpoint `/WebDav/Stream/{itemId}`.
- Map `itemId` to remote path and stream via `WebDavClientService.GetStream`.