C# .NET 10 port of automatic-ripping-machine — a drop-in Docker replacement for optical disc ripping with feature parity.
# Run the CLI (disc identification + rip + transcode)
docker run --rm --privileged \
-v /dev/sr0:/dev/sr0 \
-v /opt/arm:/home/arm/media \
ghcr.io/negativeeddy/arm-sharp:latest cli --device /dev/sr0
# Run the Web UI
docker run -d --privileged \
-p 8080:8080 \
-v /dev/sr0:/dev/sr0 \
-v /opt/arm:/home/arm/media \
ghcr.io/negativeeddy/arm-sharp:latest webui- DVD rip: Identify → CRC64 → MakeMKV → HandBrake transcode → move → notify
- Blu-ray rip: Identify → MakeMKV → HandBrake transcode → move → notify
- Audio CD rip: MusicBrainz lookup → abcde rip
- Data disc: dd-based raw rip
- Web UI: ASP.NET Core MVC with real-time SignalR notifications, job history, log viewer, settings
| Project | Description |
|---|---|
ArmRipper.Core | Business logic: identification, ripping, transcoding, metadata, notifications |
ArmRipper.Cli | Console entry point for headless operation |
ArmRipper.WebUi | ASP.NET Core MVC + Razor Pages web interface |
ArmRipper.Core.Tests | xUnit tests (52+ tests) |
Configuration is DB-first: runtime settings are stored as overrides in the database (ripper_settings) and always win. /etc/arm/config/arm.yaml is no longer loaded at startup — use the "Import ARM settings" action in the Settings UI to pull legacy ARM values into the DB once. appsettings.json supplies file defaults.
Key paths (configurable via arm.yaml):
- Raw rips:
/home/arm/media/raw - Transcoding:
/home/arm/media/transcode - Completed:
/home/arm/media/completed - Logs:
/home/arm/logs - Database:
/etc/arm/config/arm.db
dotnet build # 0 warnings, 0 errors
dotnet test# 52/52 passing
dotnet run --project src/ArmRipper.Cli -- --device /dev/sr0 --test
dotnet run --project src/ArmRipper.WebUidocker build -t arm-sharp .
docker run --rm arm-sharp cli --help
docker run --rm arm-sharp webui# NVIDIA
docker run --gpus all ...
# Intel QSV
docker run --device /dev/dri:/dev/dri ...
# AMD VAAPI
docker run --device /dev/dri:/dev/dri ...MIT