about summary refs log tree commit diff stats
path: root/pkgs/sources/scripts/source/specific
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/sources/scripts/source/specific')
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/neorg_id_function.sh16
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/add.sh23
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/context.sh43
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/dmenu.sh14
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/f_start.sh7
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/f_stop.sh7
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/list.sh8
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/project.sh41
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/review.sh12
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/utils.sh40
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/functions/workspace.sh9
-rwxr-xr-xpkgs/sources/scripts/source/specific/neorg/sh/main.sh164
-rwxr-xr-xpkgs/sources/scripts/source/specific/spodi/sh/download.sh58
-rwxr-xr-xpkgs/sources/scripts/source/specific/spodi/sh/update.sh52
-rwxr-xr-xpkgs/sources/scripts/source/specific/spodi/spodi.sh71
-rwxr-xr-xpkgs/sources/scripts/source/specific/ytcc/description.sh8
16 files changed, 573 insertions, 0 deletions
diff --git a/pkgs/sources/scripts/source/specific/neorg/neorg_id_function.sh b/pkgs/sources/scripts/source/specific/neorg/neorg_id_function.sh
new file mode 100755
index 00000000..865ecacf
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/neorg_id_function.sh
@@ -0,0 +1,16 @@
+#! /usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+
+context="$(task _get rc.context)"
+if [ "$context" ]; then
+    filter="project:$context"
+else
+    filter="0-10000"
+fi
+tasks="$(task "$filter" _ids)"
+
+if [ "$tasks" ]; then
+    echo "$tasks" | xargs task _zshids | awk -F: -v q="'" '{gsub(/'\''/, q "\\" q q ); print $1 ":" q $2 q}'
+fi
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/add.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/add.sh
new file mode 100755
index 00000000..5a830a10
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/add.sh
@@ -0,0 +1,23 @@
+#!/usr/bin/env dash
+
+add0open_taskwarrior_project_file() {
+    task_project_file="%TASK_PROJECT_FILE"
+
+    cd "$(dirname $task_project_file)" || die "BUG: task_project_file ('$task_project_file') can't be accessed"
+
+    git_dir="$(search_flake_base_dir)"
+    [ "$git_dir" ] || die "(BUG): No git directory?"
+    cd "$git_dir" || die "Unreachable, this MUST exists"
+
+    nvim "$task_project_file"
+    git add "$task_project_file"
+
+    base_task_project_file_path="$(awk "{ gsub(\"$git_dir/\", \"\", \$0); print }" "$(ptmp "$task_project_file")")"
+    git add $task_project_file
+
+    # Check that only the project file has been added (and that our file is actually
+    # modified)
+    if git status --porcelain=v2 | awk -v path="$base_task_project_file_path" 'BEGIN { hit = 0 } { if ($2 ~ /A./ || $2 ~ /M./) { if ($NF ~ path) { hit = 1 } else { hit = 0; exit 1 } } } END { if (hit == 1) { exit 0 } else { exit 1 } }'; then
+        git commit --verbose --message="chore($(dirname "$base_task_project_file_path")): Update"
+    fi
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/context.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/context.sh
new file mode 100755
index 00000000..7095847d
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/context.sh
@@ -0,0 +1,43 @@
+#!/usr/bin/env dash
+
+context0open_current_task_context() {
+    current_context="$(utils0get_current_context)"
+
+    if [ "$current_context" ]; then
+        context_path="$(utils0get_current_context_path "$current_context")"
+
+        extended_neorg_project_dir="$(utils0get_neorg_project_dir)"
+        cd "$extended_neorg_project_dir" || die "(BUG?): Can not access the project dir: $extended_neorg_project_dir"
+
+        nvim "$extended_neorg_project_dir/$context_path"
+
+        git add .
+        git commit --message="chore($(dirname "$context_path")): Update" --no-gpg-sign
+    else
+        warn "No context active"
+    fi
+}
+
+context0open_current_task_context_at_task_id() {
+    task_id="$1"
+    current_context="$(utils0get_current_context)"
+
+    if [ "$current_context" ]; then
+        context_path="$(utils0get_current_context_path "$current_context")"
+        extended_neorg_project_dir="$(utils0get_neorg_project_dir)"
+        task_uuid="$(task "$task_id" uuids)"
+
+        cd "$extended_neorg_project_dir" || die "(BUG?): Can not access the project dir: $extended_neorg_project_dir"
+
+        if ! grep -q "% $task_uuid" "$extended_neorg_project_dir/$context_path"; then
+            echo "* TITLE (% $task_uuid)" >>"$extended_neorg_project_dir/$context_path"
+        fi
+
+        nvim "$extended_neorg_project_dir/$context_path" -c "/% $task_uuid"
+
+        git add .
+        git commit --message="chore($(dirname "$context_path")): Update" --no-gpg-sign
+    else
+        warn "No context active"
+    fi
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/dmenu.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/dmenu.sh
new file mode 100755
index 00000000..5a138982
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/dmenu.sh
@@ -0,0 +1,14 @@
+#!/usr/bin/env dash
+
+dmenu0open_context_in_browser() {
+    project="$(echo "%ALL_PROJECTS_PIPE" | rofi -sep "|" -dmenu)"
+
+    if [ "$project" ]; then
+        [ -d "%NEORG_REVIEW_PATH" ] || mkdir --parents "%NEORG_REVIEW_PATH"
+        [ -f "%NEORG_REVIEW_PATH/$project.lock" ] || touch "%NEORG_REVIEW_PATH/$project.lock"
+        project0open_project_in_browser "$project"
+    else
+        notify-send "(neorg/dmenu) No project selected"
+        exit 1
+    fi
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/f_start.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/f_start.sh
new file mode 100755
index 00000000..2423dd44
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/f_start.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env dash
+
+fstart0start_new_task() {
+    task_id="$1"
+    fstop0stop_current_task
+    task start "$task_id"
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/f_stop.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/f_stop.sh
new file mode 100755
index 00000000..e4ff0b94
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/f_stop.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env dash
+
+fstop0stop_current_task() {
+    # we ensured that only one task may be active
+    active="$(task +ACTIVE _ids)"
+    [ "$active" ] && task stop "$active"
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/list.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/list.sh
new file mode 100755
index 00000000..10659457
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/list.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env dash
+
+list0list_all_contexts_newline() {
+    print "%ALL_PROJECTS_NEWLINE"
+}
+list0list_all_contexts_comma() {
+    print "%ALL_PROJECTS_COMMA"
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/project.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/project.sh
new file mode 100755
index 00000000..64591850
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/project.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env dash
+
+project0open_current_context_in_browser() {
+    current_context="$(utils0get_current_context)"
+    [ "$current_context" ] || die "No current context to use"
+    project0open_context_in_browser "$(utils0context2project "$current_context")"
+}
+
+project0open_project_in_browser() {
+    project="$1"
+    [ "$project" ] || die "BUG: No context supplied to project0open_context_in_browser"
+
+    old_context="$(utils0get_current_context)"
+    # We have ensured that only one task may be active
+    old_started_task="$(task +ACTIVE _ids)"
+
+    tracking="$(mktmp)"
+    task "project:$project" _ids | xargs --no-run-if-empty task _zshids >"$tracking"
+    task context "$(utils0project2context "$project")"
+
+    while read -r description; do
+        desc="$(echo "$description" | awk -F: '{print $2}')"
+        if [ "$desc" = "tracking" ]; then
+            task_id="$(echo "$description" | awk -F: '{print $1}')"
+            notify-send "(Neorg)" "Starting task $project -> $desc"
+            task start "$task_id"
+            break
+        fi
+    done <"$tracking"
+
+    firefox -P "$project"
+
+    task stop "$task_id"
+    [ "$old_started_task" ] && task start "$old_started_task"
+
+    if [ "$old_context" ]; then
+        task context "$old_context"
+    else
+        task context none
+    fi
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/review.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/review.sh
new file mode 100755
index 00000000..a0a9ab8d
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/review.sh
@@ -0,0 +1,12 @@
+#!/usr/bin/env dash
+
+review0start() {
+    for project in $(list0list_all_contexts_newline); do
+        if [ -f "%NEORG_REVIEW_PATH/$project.lock" ]; then
+            msg "Reviewing '$project'"
+            notify-send "Neorg" "Reviewing '$project'"
+            firefox -P "$project"
+            rm "%NEORG_REVIEW_PATH/$project.lock"
+        fi
+    done
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/utils.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/utils.sh
new file mode 100755
index 00000000..c3843e8e
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/utils.sh
@@ -0,0 +1,40 @@
+#!/usr/bin/env dash
+
+# Runs it's first argument and then the second, regardless if the first failed or
+# succeeded
+utils0chain() {
+    eval "$1"
+    eval "$2"
+}
+
+utils0get_current_context() {
+    current_context="$(task _get rc.context)"
+    printf "%s\n" "$current_context"
+}
+
+utils0get_current_context_path() {
+    current_context="$1"
+    context_path="$(task _get rc.context."$current_context".rc.neorg_path 2>/dev/null)"
+    if ! [ "$context_path" ]; then
+        context_path="$(grep "context.$current_context.rc.neorg_path" "%HOME_TASKRC" | awk 'BEGIN {FS="="} {print $2}')"
+        [ "$context_path" ] || die "All contexts should have a 'neorg_path' set!"
+    fi
+    printf "%s\n" "$context_path"
+}
+
+utils0get_neorg_project_dir() {
+    # Perform shell expansion of Tilde
+    neorg_project_dir="$(sed "s|^~|$HOME|" "$(ptmp "%DEFAULT_NEORG_PROJECT_DIR")")"
+    printf "%s\n" "$neorg_project_dir"
+}
+
+utils0project2context() {
+    project="$1"
+    context="$(sed 's|\.|_|g' "$(ptmp "$project")")"
+    printf "%s\n" "$context"
+}
+utils0context2project() {
+    context="$1"
+    project="$(sed 's|_|\.|g' "$(ptmp "$context")")"
+    printf "%s\n" "$project"
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/functions/workspace.sh b/pkgs/sources/scripts/source/specific/neorg/sh/functions/workspace.sh
new file mode 100755
index 00000000..d5eb2fca
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/functions/workspace.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env dash
+
+workspace0open_neorg_workspace() {
+    workspace="$1"
+    nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace $workspace\n")"
+}
+workspace0open_neorg_workspace_prompt() {
+    nvim -c "NeorgStart" -s "$(ptmp ":Neorg workspace ")"
+}
diff --git a/pkgs/sources/scripts/source/specific/neorg/sh/main.sh b/pkgs/sources/scripts/source/specific/neorg/sh/main.sh
new file mode 100755
index 00000000..559351b9
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/neorg/sh/main.sh
@@ -0,0 +1,164 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+
+# load dependencies
+. ./functions/add.sh
+. ./functions/context.sh
+. ./functions/dmenu.sh
+. ./functions/f_start.sh
+. ./functions/f_stop.sh
+. ./functions/list.sh
+. ./functions/project.sh
+. ./functions/utils.sh
+. ./functions/workspace.sh
+. ./functions/review.sh
+
+# these are used in version()
+# shellcheck disable=2034
+AUTHORS="Soispha"
+# shellcheck disable=2034
+YEARS="2023"
+
+NAME="neorg"
+
+help() {
+    cat <<EOF
+This is the core interface to the system-integrated task management
+
+USAGE:
+    $NAME [OPTIONS] [COMMAND]
+
+OPTIONS:
+    --help      | -h
+                            Display this help and exit.
+
+    --version   | -v
+                            Display version and copyright information and exit.
+COMMANDS:
+    task [ID]
+                            Open the neorg context associated with the current context and
+                            the uuid of the task with id ID. Without ID, it'll open the
+                            current context's norg file.
+                            If no context is set, drops you to the selection prompt
+
+    dmenu
+                            Select a project in dmenu mode. This will give you all projects
+                            and exectute the selected one as in 'neorg projects <selected>'
+
+    workspace [WS]
+                            The neorg workspace (WS) to open at startup, an empty value drops
+                            you at a prompt to enter the workspace yourself.
+
+    project [P]
+                            Opens the webbrowser with either the context (P) or
+                            the current active context as argument if no context is supplied
+
+    list
+                            Lists all available contexts
+
+    add
+                            Allows you to quickly add projects
+
+    fstart ID
+                            Starts the task (ID) but only after it stooped
+                            the previous active task, if it existed.
+
+    fstop
+                            Stops the current active task
+
+    review
+                            Review all firefox tabs
+ARGUMENTS:
+    ID | *([0-9]) := [[%ID_GENERATION_FUNCTION]]
+                            The function displays all possible IDs of the eligable tasks.
+
+    WS := %ALL_WORKSPACES
+                            All possible workspaces
+
+    P := %ALL_PROJECTS_PIPE
+                            The possible project
+
+EOF
+}
+
+for arg in "$@"; do
+    case "$arg" in
+    "--help" | "-h")
+        help
+        exit 0
+        ;;
+    "--version" | "-v")
+        version
+        exit 0
+        ;;
+    esac
+done
+
+while [ "$#" -ne 0 ]; do
+    case "$1" in
+    "t"*) # task
+        shift 1
+        task_id="$1"
+        [ "$task_id" ] || utils0chain context0open_current_task_context "exit 0"
+        context0open_current_task_context_at_task_id "$task_id"
+        exit 0
+        ;;
+    "w"*) # workspace
+        shift 1
+        workspace_to_open="$1"
+        # TODO: Exit with 1 on error, instead of the 0 <2023-10-20>
+        [ "$workspace_to_open" ] || utils0chain workspace0open_neorg_workspace_prompt "exit 0"
+        workspace0open_neorg_workspace "$workspace_to_open"
+        exit 0
+        ;;
+    "p"*) # project
+        shift 1
+        project_to_open="$1"
+        # TODO: Exit with 1 on error, instead of the 0 <2023-10-20>
+        [ "$project_to_open" ] || utils0chain project0open_current_context_in_browser "exit 0"
+        if ! grep -q "$project_to_open" "$(ptmp "%ALL_PROJECTS_NEWLINE")"; then
+            die "Your project ('$project_to_open') is not in the list of available projects:
+%ALL_PROJECTS_COMMA"
+        fi
+        project0open_project_in_browser "$project_to_open"
+        exit 0
+        ;;
+    "l"*) # list
+        list0list_all_contexts_newline
+        exit 0
+        ;;
+    "a"*) # add-project
+        add0open_taskwarrior_project_file
+        exit 0
+        ;;
+    "d"*) # dmenu
+        dmenu0open_context_in_browser
+        exit 0
+        ;;
+    "fsta"*) # fstart
+        shift 1
+        task_id="$1"
+        [ "$task_id" ] || die "No task id provided to fstart"
+        fstart0start_new_task "$task_id"
+        exit 0
+        ;;
+    "fsto"*) # fstop
+        fstop0stop_current_task
+        exit 0
+        ;;
+    "r"*) # review
+        shift 1
+        review0start
+        exit 0
+        ;;
+    *)
+        die "Command '$1' does not exist! Please look at:\n $NAME --help"
+        exit 0
+        ;;
+    esac
+done
+
+context0open_current_task_context
+# vim: ft=sh
diff --git a/pkgs/sources/scripts/source/specific/spodi/sh/download.sh b/pkgs/sources/scripts/source/specific/spodi/sh/download.sh
new file mode 100755
index 00000000..fe9746c8
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/spodi/sh/download.sh
@@ -0,0 +1,58 @@
+#!/usr/bin/env dash
+
+download_to_down() {
+    DOWNLOAD_DIRECTORY="%XDG_MUSIC_DIR/down/spotify"
+
+    already_downloaded_files="$(mktmp)"
+    fd . "$DOWNLOAD_DIRECTORY" --exclude spotdl.log --exclude spotdl-errors.log >"$already_downloaded_files"
+    if [ -z "$NO_CHECK" ] && [ "$(wc -l <"$already_downloaded_files")" -ne 0 ]; then
+        die "something is already downloaded"
+    fi
+    # [ -e "$DOWNLOAD_DIRECTORY/spotdl.log" ] && rm "$DOWNLOAD_DIRECTORY/spotdl.log"
+
+    download "$1" "$DOWNLOAD_DIRECTORY"
+}
+
+download() {
+    download_url="$1"
+    output_path="$2"
+
+    config="$(mktmp)"
+    cat <<EOF | clean >"$config"
+# Main options
+--audio slider-kz bandcamp youtube-music piped youtube soundcloud
+--lyrics genius musixmatch azlyrics synced
+
+# FFmpeg options
+--ffmpeg ffmpeg
+--threads 16
+--bitrate 256k
+
+# Spotify options
+--cache-path %XDG_CACHE_HOME/spotdl/.spotipy
+
+# Output options
+--preload
+--format opus
+--output {artists}_-_{title}
+--print-errors
+--save-errors $output_path/spotdl-errors.log
+# TODO: Reactive whence spotdl support for these has improved <2023-12-19>
+# --generate-lrc
+--overwrite skip
+
+# Misc options
+--log-level INFO
+EOF
+
+    cd "$output_path" || die "BUG: no $output_path"
+    touch "$output_path/spotdl-errors.log"
+
+    # The sub shell needs to be unquoted, as the arguments may not be treated as one.
+    # shellcheck disable=2046
+    unbuffer spotdl $(cat "$config") download "$download_url" | tee "$output_path/spotdl.log"
+
+    [ -d ~/.spotdl ] && rm -r ~/.spotdl
+}
+
+# vim: ft=sh
diff --git a/pkgs/sources/scripts/source/specific/spodi/sh/update.sh b/pkgs/sources/scripts/source/specific/spodi/sh/update.sh
new file mode 100755
index 00000000..a289cf58
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/spodi/sh/update.sh
@@ -0,0 +1,52 @@
+#!/usr/bin/env dash
+
+update() {
+    UPDATE_DIRECTORY="%XDG_MUSIC_DIR/artists"
+    UPDATE_CONFIG_FILE="%XDG_MUSIC_DIR/artists/update.conf"
+
+    if ! [ -f "$UPDATE_CONFIG_FILE" ]; then
+        error="$(
+            cat <<EOF
+Please provide an update config file at: '$UPDATE_CONFIG_FILE'.
+
+The 'update.conf' file should follow this pattern:
+<path_to_artist>/<artist_name>|<spotify_url>
+
+All comments and empty lines are ignored
+EOF
+        )"
+        die "$error"
+    fi
+
+    config_file="$(mktmp)"
+    clean "$UPDATE_CONFIG_FILE" >"$config_file"
+
+    while IFS="|" read -r artist url; do
+        full_artist="$UPDATE_DIRECTORY/$artist"
+        [ -d "$full_artist" ] || mkdir --parents "$full_artist"
+        [ -d "$full_artist/update" ] || mkdir --parents "$full_artist/update"
+        [ -d "$full_artist/all" ] || mkdir --parents "$full_artist/all"
+        [ -d "$full_artist/filtered" ] || mkdir --parents "$full_artist/filtered"
+
+        while read -r file; do
+            ln --symbolic --relative "$file" "$full_artist/update/$(basename "$file")"
+        done <"$(tmp fd --type file --extension opus . "$full_artist/all")"
+
+        msg2 "Updating $artist with url: '$url'"
+        download "$url" "$full_artist/update"
+
+        while read -r file; do
+            mv "$file" "$full_artist/all"
+            ln --symbolic --relative "$full_artist/all/$(basename "$file")" "$full_artist/filtered/$(basename "$file")"
+        done <"$(tmp fd --type file --extension opus . "$full_artist/update")"
+
+        while read -r file; do
+            rm "$file"
+        done <"$(tmp fd --type symlink --extension opus . "$full_artist/update")"
+
+        cp "$full_artist/update/spotdl.log" "$full_artist/all/spotdl.$(date +%Y_%m_%d).log"
+        cp "$full_artist/update/spotdl-errors.log" "$full_artist/all/spotdl-errors.$(date +%Y_%m_%d).log"
+    done <"$config_file"
+}
+
+# vim: ft=sh
diff --git a/pkgs/sources/scripts/source/specific/spodi/spodi.sh b/pkgs/sources/scripts/source/specific/spodi/spodi.sh
new file mode 100755
index 00000000..475fd48a
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/spodi/spodi.sh
@@ -0,0 +1,71 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+
+# these are used in version()
+# shellcheck disable=2034
+AUTHORS="Soispha"
+# shellcheck disable=2034
+YEARS="2023"
+
+# load dependencies
+. ./sh/update.sh
+. ./sh/download.sh
+
+help() {
+    cat <<EOF
+This is a small wrapper around downloading things from spotify
+
+USAGE:
+    $NAME [OPTIONS] COMMAND
+
+OPTIONS:
+    --help      | -h
+                            Display this help and exit.
+
+    --version   | -v
+                            Display version and copyright information and exit.
+COMMANDS:
+    update
+                            Read the artist.conf file and download all newly released things
+
+    download URL
+                            Download a specific url to the DOWNLOAD_DIRECTORY
+EOF
+}
+
+for arg in "$@"; do
+    case "$arg" in
+    "--help" | "-h")
+        help
+        exit 0
+        ;;
+    "--version" | "-v")
+        version
+        exit 0
+        ;;
+    esac
+done
+
+case "$1" in
+"update")
+    shift 1
+    update
+    exit 0
+    ;;
+"download")
+    shift 1
+    download_url="$1"
+    [ -z "$download_url" ] && die "You need to provide a download url"
+    download_to_down "$download_url"
+    exit 0
+    ;;
+*)
+    die "Command '$1' is not know"
+    help
+    exit 1
+    ;;
+esac
+
+# vim: ft=sh
diff --git a/pkgs/sources/scripts/source/specific/ytcc/description.sh b/pkgs/sources/scripts/source/specific/ytcc/description.sh
new file mode 100755
index 00000000..ae9107b9
--- /dev/null
+++ b/pkgs/sources/scripts/source/specific/ytcc/description.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env dash
+
+# shellcheck source=/dev/null
+SHELL_LIBRARY_VERSION="2.1.2" . %SHELL_LIBRARY_PATH
+
+jq --raw-output '.description' "$XDG_RUNTIME_DIR/ytcc/running" | fmt -u -s | less
+
+# vim: ft=sh