* Fix makemkv progress log path (Fixed the duplication in the log path on line 115 (Fixes#1734)
Fix makemkv stage text (Updated the progress reading logic to properly find the last PRGV and PRGC lines)
Add ETA and Track counter for makemkv (Created a text file where each job saves a timestamp when the track rip begins and use the percent complete to provide an ETA)
* Bump version from 2.23.1 to 2.23.3
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
* [FEATURE] feat(ripper): sort main feature by chapters, filesize, then track number (#1697)
* feat(ripper): sort main feature by chapters, filesize, then track number
Updated main feature scan to now look at chapters and filesizes.
Updated database to keep track of these new values as well.
Sorts tracks by highest chapter count, then largest filesize,
then lowest track number to better identify the main feature
on Disney Blu-rays.
Fixes#1697
* Update VERSION
* Bump version from 2.22.1 to 2.23.1
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
* Update Gotify settings format in Config-apprise.yaml.md
previous documentation was incorrect, must use {gotify apprise syntax}(https://appriseit.com/services/gotify/)
* gotify section formatting
Added formatting and clarification for Gotify settings in the configuration documentation.
I believe this is due to Ubuntu shipping an old version of mount.
- Removed mount options (not needed, since the Dockerfile sets up the
mountpoints). Passing any at all makes this version of mount fail.
- Added --source option to add to clarity of the code.
ARM no longer crashes when any config file is read-only, if that is the
case, the respective settings page fields are grayed out and offer a
tooltip detailing why.
`tail` exhibits significant performance issues on files above the ~20MiB range, which is reached quite easily on the DEBUG loglevel, because of the makemkv messaging. This PR replaces the call to `tail` with a very simple native implementation, which is orders of magnitude faster.
* refactor: use ProcessHandler instead of subprocess.run
* fix(logger): consistency, versatility and formatting
Before:
[2026-02-06 18:40:20] DEBUG ARM: Class.method <message>
After:
2026-02-08 10:18:08 ARM: DEBUG: Class.method: <message>
- stdout now uses short formatting (eg. for journald, which timestamps stdout)
- Handling of debug level formatting is more consistent now
- Removed `clean_loggers()`:
- This function wasn't really doing what it said it was, since it was only removing at most one handler. Instead, I opted to only remove FileHandlers, such that if a more specific log file is created, the messages are not also logged to arm.log, but they are still logged to stdout and syslog.
* fix(logger): crash because of empty label
* feat(ripper.main): --no-syslog argument
Some containers don't have or need a syslog
* fix(ripper.main): log level of critical errors
* fix(ripper.main): handle errors during setup
* fix(ripper.main): handle SIGTERM
* refactor(ripper.utils.arm_setup): simplify log setup
* fix(ripper.utils.arm_setup): create logs/progress folder
* refactor(ripper.utils): always use RipperException to bail
Replaces all bare Exceptions and all sys.exit() calls with
RipperExceptions.
- more consistent error handling
- simplified make_dir helper function
- removed try-catch where we were calling sys.exit() anyways
* fix: remove UNIDENTIFIED_EJECT
Closesautomatic-ripping-machine/automatic-ripping-machine#1360
UNIDENTIFIED_EJECT is not necessary anymore, since the ripper will now
always eject at the end (if AUTO_EJECT is set), even if an error is
thrown, so we can do away with the unreliable pre-check entirely and
rest assured that the ripper itself is much more capable of correctly
identifying whether a disc is rippable or not.
* fix: joblength should be 0 if it didn't start
* refactor(logger): deduplicated timestamp-filename logic
* fix(ripper): allow ripping of discs with no label
* fix(ripper.makemkv): missing attribute
* feat(ProcessHandler): capture stderr
* chore(ripper): remove unused imports and variables
* fix(ProcessHandler): type issues
* Bump version from 2.21.5 to 2.22.1
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
fix(installer): correctly detect contrib for bookworm-updates/security across deb822 + mirror lists
- Replace `apt-cache policy` grep checks with APT index target parsing to avoid false negatives
- Accept Debian suite aliases (stable, stable-updates, stable-security) in addition to codename suites
- Add fallbacks for deb822 `*.sources` and classic `sources.list`/`*.list` formats
- Prevent repeated “Missing bookworm-updates/contrib” warnings when contrib is already configured
* Add macOS UTM Docker installation guide
* Update _Sidebar.md
Added macOS with UTM (Docker) link at the end of the "Alternate Installations" section
* Update Alternate-Install-macOS-UTM.md
Added the > [!CAUTION] block right after the title, matching the format from the Debian install page.
fix(settings): trim whitespace from form values on save
Prevents issues with keys/values that have leading/trailing spaces,
such as MAKEMKV_PERMA_KEY failing validation when pasted with spaces.
* fix(handbrake): skip preset argument when empty
HandBrakeCLI does not require a preset, so we should not pass
an empty --preset argument when hb_preset is not configured.
Fixes#1637
* Update VERSION
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
* If a log directory doesn't exist, skip it so the script doesn't crash
* Move logging cleanup inside of the try-catch block
If an exception is thrown inside of the logging cleanup, this will
properly handle it and clean up the job.
* Bump version
* Narrow the scope of the catch
* Add back newline
* Bump version
* Bump version from 2.21.1 to 2.21.4
* Update VERSION
* Update VERSION
fixing, went the wrong way
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
Co-authored-by: 1337-server <sndspamfilter@gmail.com>
fix: replace hard-coded paths with configurable ones
- Location of arm.yaml can now optionally be set via the ARM_CONFIG_FILE environment variable
- The default location stays the same (/etc/arm/config/arm.yaml)
- All settings concerning paths in arm.yaml should now work as expected,
the following have had their behavior fixed:
- INSTALLPATH
- APPRISE
- ABCDE_CONFIG_FILE
- LOGPATH
- Mountpoints for discs are not hardcoded any more, instead:
- If the disc is already mounted anywhere and the mountpoint is
readable, it is used
- Otherwise, the disc is mounted via `mount --all <devpath>` (aka. auto-mount) to wherever specified in `fstab`
- That is the reason why the default `fstab` has changed, to allow for auto-mount
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
* Add --minlength option to MakeMKV commands
This does two things:
1. Enables listing of tracks <120s for 'manual mode'
(otherwise track listing only shows >120s per makemkv defaults)
2. Adds MINLENGTH to track ripping
(otherwise tracks <120s fail to rip per makemkv defaults)
* Removed blank line
* Fix missing cmd line
* Fix extraneous f-string without placeholder
* Bump version from 2.21.2 to 2.21.3
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
* Enhance dark mode styles for toast component
Added styles for toast component in dark mode.
* Bump version from 2.21.1 to 2.21.2
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
* [BUGFIX] resolve x86 CPU Model Name Bug
`re.IGNORECASE` also somehow ignores spaces. I'm not sure why, but on an x86 Intel CPU, the CPU ID is 94, not a CPU model string.
* Bump version from 2.21.0 to 2.21.3
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>
* Fix: Handle None job.drive in makemkv.py
When job.drive is None (drive not properly associated with job),
the code would crash with AttributeError when accessing job.drive.mdisc.
Changes:
- makemkv.py: Check if job.drive is None before accessing mdisc
- makemkv.py: Refresh job session after updating drive database
- makemkv.py: Add proper error handling if drive still not found
- DriveUtils.py: Add None check in update_drive_job() to prevent crash
This fixes the error:
AttributeError: 'NoneType' object has no attribute 'mdisc'
* bugfix version bump
---------
Co-authored-by: Mtech <62650032+microtechno9000@users.noreply.github.com>