Skip to content

Releases: carlashley/loopdown

v2.0.20260120

20 Jan 20:46
b922a2b

Choose a tag to compare

About

This is the last version of the Python implementation of loopdown. Future releases will be Swift implementations and will only support macOS 14+.

Notes

  • This has been tested on Python 3.13, it should work for Python 3.10+ but no testing has been done for older Python releases.
  • The zipapp build should install the two requirements when ./build.sh is run.
    • See Build help below for usage.
  • This is intended to be the last release of a Python version of this tool, future releases will be implemented in Swift.
    • New features will be sparingly added to the Swift release as the intention is to create a very basic tool to handle downloading and installing content packages.
    • There is no guarantee that there will be regular releases of the Swift implementation.
  • This version no longer relies on applications existing in /Applications. Application installation paths are determined from the output of system_profiler data.
  • Downloads do not rely on curl -C - for partial file resumption, in fact there are no attempts made at resuming incomplete downloads.
    • There are no plans to implement any partial download resumption in this release.
  • Please take note of the new argument syntax as noted in the Usage section below.

Building

  1. In your preferred directory: git clone https://github.com/carlashley/loopdown
  2. cd loopdown/loopdown
  3. ./build.sh -h
  4. ./build.sh [your chosen options]

Build help

./build.sh -h
Usage: ./build.sh [options]

Options:
  --build-python=...   Python to use for building (pip + zipapp). If omitted, uses python3 on PATH.
                       Examples:
                         --build-python=/opt/python/bin/python3
                         --build-python=/usr/local/bin/python3

  --interpreter=...    Interpreter string embedded in the zipapp shebang (default: /usr/bin/env python3)
                       Examples:
                         --interpreter=/usr/local/bin/python3
                         --interpreter="/usr/bin/env python3"

  --main=...           Zipapp entrypoint (default: loopdown.__main__:main)

  -h, --help           Show help

Usage

Primary help

python3 -m loopdown -h
usage: loopdown [-h] [-v] [-l [level]] [-q] [deploy,download] ...

Process additional content for installed audio applications, GarageBand, Logic Pro, and/or MainStage.

positional arguments:
  [deploy,download]     use [deploy,download] -h for further help
    deploy              deploy audio content packages locally (requires elevated permission when not performing dry-run)
    download            download audio content packages locally

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -l, --log-level [level]
                        override the log level; default is 'info', choices are 'critical', 'error', 'warning', 'info', 'debug', 'notset'
  -q, --quiet           all console output (stdout/stderr) is suppressed; events logged to file only

loopdown v2.0.20260120. Copyright © 2026 Carl Ashley. All rights reserved. Apache License Version 2.0 - http://www.apache.org/licenses/

Download help

python3 -m loopdown download -h
usage: loopdown download [-h] [-n] [-a [app ...]] [-r] [-o] [-f] [-d [dir]]

Download audio content packages locally

options:
  -h, --help            show this help message and exit
  -n, --dry-run         perform a dry run; no mutating action taken
  -a, --apps [app ...]  override the default 'garageband', 'logicpro', 'mainstage' set of apps that audio content will be processed for;
                        choices are 'garageband', 'logicpro', 'mainstage'
  -r, --req             include the required audio packages
  -o, --opt             include the optional audio packages
  -f, --force           force the specified action
  -d, --dest [dir]      override the download directory path when '--download-only' used; default is '/tmp/loopdown'

Deploy help

python3 -m loopdown deploy -h
usage: loopdown deploy [-h] [-n] [-a [app ...]] [-r] [-o] [-f] [-c [url]] [-m [[url]]]

Deploy audio content packages locally (requires elevated permission when not performing dry-run)

options:
  -h, --help            show this help message and exit
  -n, --dry-run         perform a dry run; no mutating action taken
  -a, --apps [app ...]  override the default 'garageband', 'logicpro', 'mainstage' set of apps that audio content will be processed for;
                        choices are 'garageband', 'logicpro', 'mainstage'
  -r, --req             include the required audio packages
  -o, --opt             include the optional audio packages
  -f, --force           force the specified action
  -c, --cache-server [url]
                        use a caching server; when no server is specified, attempts to auto detect; expected format is 'http://ipaddr:port'
  -m, --mirror-server [[url]]
                        local mirror server to use; expected format is 'https://example.org'

v1.0.20240525

25 May 02:06
80c975e

Choose a tag to compare

Fixes:

  • Support for major app version updates when using the --discover-plists argument

v1.0.20240102

02 Jan 02:55

Choose a tag to compare

Fixes:

  • Includes the packaging package to resolve #7

v1.0.20230726

26 Jul 06:49

Choose a tag to compare

Fixes:

  • Issue with -i/--install argument failing with -m/--mandatory and/or -o/--optional specified

Full Changelog: 2410bbd

v1.0.20230706

06 Jul 09:18

Choose a tag to compare

v1.0.20230706 Pre-release
Pre-release

Fixes:

  • Issues with various arguments that have a default value being incorrectly validated
  • Optionally filter the output of --discover-plists by providing the -a/--apps [app] argument

Commit log: c394099

v1.0.20230621

21 Jun 11:07

Choose a tag to compare

Fixes:

  • Fixes an issue with --pkg-server not actually being set to the correct value
  • Provides a warning when half or more of the content being fetched has an error of some sort (i.e. HTTP 404)
  • Tweaks to output in dry-runs/actual runs when the content being fetched has an error
  • Provides a default retry value and a maximum of one minute for each retry to fail rather than the default curl timeout handling
  • Help for previously hidden command line arguments can now be displayed with the --advanced-help argument; not all of these hidden arguments should be modified though, use these at your own risk
  • Provide a means of discovering the values to use with the -p/--plist argument; use --discover-plists to print out a list of property list files that can be parsed

Full Changelog: v1.0.20230531...v1.0.20230621

loopdown v1.0.20230531

31 May 09:44

Choose a tag to compare

Pre-release

loopdown (and install)

Requirements

This should run on any version of Python 3 after/including 3.9; packaging will need to be installed (a requirements.txt file is included in this repo) as distutils is deprecated.

Build

Run ./build.sh with no additional arguments to create a compressed zipapp version of this utility; please note the default Python interpreter and shebang used is /usr/bin/env python3, if a more specific shebang needs to be used, run ./build.sh /new/shebang/path, for example: ./build.sh /usr/local/bin/python3. This will generate a new "build" in ./dist/zipapp/usr/local/bin/custom/.

Support

This is provided as is. No support provided.

License

Licensed under the Apache License Version 2.0. See LICENSE for the full license.

Usage

usage: loopdown [-h] [-n] [-a [app] [[app] ...] | -p [path|url] [[path|url] ...]] [-m] [-o] [--cache-server [server] | --pkg-server [server]] [--create-mirror [path] | -i]
                [--force] [-s] [--log-level [level]] [--version]

options:
  -h, --help            show this help message and exit
  -n, --dry-run         perform a dry run; no action taken
  -a [app] [[app] ...], --apps [app] [[app] ...]
                        application/s to process package content from; valid values are 'all', 'garageband', 'logicpro', 'mainstage', selecting 'all' will process packages for
                        any/all of the three apps if found on the target device; note that the -p/--plist argument cannot be used with this argument
  -p [path|url] [[path|url] ...], --plist [path|url] [[path|url] ...]
                        property list/s to process package content from in the absence of an installed application; note that the -a/--apps argument cannot be used with this
                        argument
  -m, --mandatory       select all mandatory packages for processing; this and/or the -o/--optional argument is required
  -o, --optional        select all optional packages for processing; this and/or the -m/--mandatory argument is required
  --cache-server [server]
                        the url representing an Apple caching server instance; for example: 'http://example.org:51492'; note that the --pkg-server argument cannot be used with
                        this argument
  --pkg-server [server]
                        the url representing a local mirror of package content; for example: 'https://example.org/' (the mirror must have the same folder structure as the Apple
                        package server; note that the --cache-server argument cannot be used with this argument
  --create-mirror [path]
                        create a local mirror of the content following the same directory structure as the Apple audio content download structure
  -i, --install         install the content on this device; note, this does not override the Apple package install check scripts, installs will still fail if the Apple install
                        checks fail, for example, an unsupported OS version, or no supported application is installed
  --force               forcibly performs the selected options regardless of pre-existing installations/downloads, etc
  -s, --silent          suppresses all output
  --log-level [level]   set the logging level; valid options are 'info', 'debug'
  --version             show program's version number and exit