Skip to content

plexdo build concatenated

github-actions[bot] edited this page Oct 5, 2026 · 1 revision

NAME

plexdo-build-concatenated - join several playlists end to end into a new one

SYNOPSIS

plexdo build-concatenated USER NAME PLAYLIST... [--unique] [-o] [--m3u PATH [-p PREFIX]] [-u TARGET | -a] [GLOBAL OPTIONS]

DESCRIPTION

Joins several of USER's playlists end to end into a new playlist titled NAME: all of the first, then all of the second, and so on, each keeping its own order. The playlists joined are left as they were.

Every playlist is read before anything is written, so a playlist may be both joined and replaced: naming one of the sources as NAME with -o appends the others to it.

By default the result keeps any item that appears more than once, as a plain concatenation should and as Plex permits; --unique keeps only each item's first appearance. An empty playlist among the sources is reported with a warning, since a mistyped name that matched the wrong playlist looks exactly like one that happens to be empty, and contributes nothing.

The whole list is built before anything is created, then shown as a numbered preview, and the playlist is created in a single request. Nothing is created when every source is empty.

By default NAME is created on USER's own account. -u creates it for another user instead, and -a for every user. See USERS below.

ARGUMENTS

USER

Whose playlists are joined, by numeric user ID or title; 0 is the admin account. See plexdo-conventions(7).

NAME

The title of the new playlist.

PLAYLIST...

One or more playlists, by title or ratingKey, in the order they should appear. A value made only of digits is always taken as a ratingKey. The same playlist may be named more than once, and appears that many times.

OPTIONS

--unique

Skip an item an earlier playlist already contributed, so an item appearing in two playlists is listed once, where it first appeared. Items are matched by ratingKey rather than title, so two episodes sharing a title are both kept. A repeat within one playlist is skipped too.

-o, --overwrite

Replace an existing playlist titled NAME. Without it, a taken name is refused: see OPTION INTERACTIONS.

--m3u PATH

Also write the joined items to an M3U file at PATH, replacing any file already there. A leading ~ is expanded. Each entry carries the item's length in seconds (-1 when unknown), its title, and the path of its file.

-p, --prefix PREFIX

Rewrite the paths written by --m3u so the server's library root is replaced by PREFIX. See REWRITING EXPORTED PATHS in plexdo-conventions(7).

-u, --user TARGET

Create NAME for this user rather than for USER, by numeric user ID or title; 0 is the admin account. The playlists are still read from USER.

-a, --all-users

Create NAME for every user on the server, the admin account included. The playlists are still read from USER.

USERS

With -u or -a, the joined list is printed once, followed by one line per user as each completes: created, replaced, skipped (the title is taken, or the server will not act for that user), or failed. Nothing that goes wrong for one user stops the others.

GLOBAL OPTIONS

-f, --format FORMAT; --json

Choose the format of the preview. With -u or -a, a machine-readable format carries one record per user instead: user, id, status, playlist, and detail.

-W, --wide

Never truncate the preview table; titles are what would shrink.

--throttle SECONDS

Paces the reading of the playlists when more than 50 are named, and -a when there are more than 50 users. 0 turns pacing off.

-v, --verbose; --debug

--verbose reports each playlist's size as it is read, how many repeats --unique skipped, the size of the result, its creation or replacement, and under -a how many users were served.

--dry-run

Read, join, and preview, check NAME as usual, and stop without creating or replacing anything. Under -u or -a, each user's line says what would have happened. --m3u still writes its file.

-V, --version; -h, --help

Print the version, or this command's help, and exit.

OPTION INTERACTIONS

·

-u and -a are mutually exclusive; giving both is an error.

·

USER always names where the playlists are read from; -u and -a only change where NAME is created.

·

Without -o, a playlist already titled NAME is refused. On USER's account, the default, that is an error, reported before the preview, and nothing is created or removed. Under -u or -a it makes that user skipped, and the others carry on.

·

-o replaces the existing playlist, which may be one of the sources: every source is read first, so its items are not lost.

·

--unique applies across all the sources together, and within each.

·

--prefix only changes the paths written by --m3u; without --m3u it has no effect.

·

--m3u is written once, whichever users the playlist is created for, and is written under --dry-run too.

EXIT STATUS

0 on success. Under -u or -a, 0 even when some users were skipped or failed; their lines say so. 1 when USER or any PLAYLIST is not found, when every source is empty, when USER has nothing shared and cannot be acted on, or when NAME is taken without -o on USER's account. 2 when -u and -a are both given. See plexdo-conventions(7).

EXAMPLES

Join two playlists into a new one:

plexdo build-concatenated 0 "Season Run" "Part 1" "Part 2"

Append one playlist to another, in place:

plexdo build-concatenated 0 Mix Mix "New Finds" -o

Merge two overlapping playlists without repeats, checking the result first:

plexdo build-concatenated 0 Favourites "Alice's picks" "Bob's picks" \
    --unique --dry-run

Join playlists by ratingKey, and give the result to every user:

plexdo build-concatenated 0 "Holiday Films" 9001 9017 9022 -a

Read the playlists from Alice's account and create the result on Bob's:

plexdo build-concatenated Alice "From Alice" "Road Trip" "Comfort TV" \
    -u Bob

SEE ALSO

plexdo-append-playlist(1), plexdo-build-randomize(1), plexdo-list-playlists(1), plexdo-conventions(7), plexdo(1)

Clone this wiki locally