ampartwork-viewer.sh




Der AMPArtwork-Folder liegt unter ~/Library/Containers/com.apple.AMPArtworkAgent/Data/Documents/artwork und füllt sich durch die bloße Benutzung von der Music.app. Darin befinden sich alle Albumcover als Thumbnails. In meinem Fall waren das über 12000 Jpegs mit über 900 MB. Der AMPArtwork-Agent sammelt diese Daten ein, den kann man in den Prozessen identifizieren. Der Artwork-Folder dient auch als Quelle für den Apple Screensaver „Album Artwork“: wer Apple Music nicht nutzt, für den ist auch dieser Screensaver nicht verfügbar. Der AMPArtwork-Ordner enthält auch Thumbnails von den in Music.app verwaltenden Musikvideos, Filmen und TV-Shows, bedeutet, es gibt auch Bilddaten, die nicht quadratisch sind und dann ein bisschen aus der Reihe fallen, positiv gesehen. Die Basis ist von Moodboards entlehnt, mit ähnlichem Bildergebnis. Die wesentliche Änderung ist #MAX_IMAGES und #LAYOUT_SETTINGS um ein anderes Grid zu erzeugen. Der Messy-Faktor wird mit #RANDOM_POSITION gesteuert.


#!/bin/bash
# === Configuration ===

# AMPA Folder (macOS Tahoe)
IMAGE_DIR="/users/user/Library/Containers/com.apple.AMPArtworkAgent/Data/Documents/artwork"

# Base project directory
BASE_DIR="/users/user/Desktop"

# Derived directories
DUPLICATE_DIR="$BASE_DIR/ampa-dupl"
FINAL_DIR="$BASE_DIR/ampa-comps"

# Ensure necessary directories exist
mkdir -p "$IMAGE_DIR" "$DUPLICATE_DIR" "$FINAL_DIR"

echo "📂 Output directories prepared."
echo "🌍 Source URL: $URL"
echo "🚀 Starting script..."

# SORT IMAGES ->
#mkdir -p "$dst"
cd "$IMAGE_DIR" || exit 1

# Find all unique base names (strip -WIDTHxHEIGHT and extensions like .jpg.1 or .jpeg.1)
find . -maxdepth 1 -type f \( -iname "*.jpg.*" -o -iname "*.jpeg.*" \) \
| sed -E 's|^\./||' \
| sed -E 's/-[0-9]+x[0-9]+.*//; s/\.(jpg|jpeg)(\.1)?$//' \
| sort -u \
| while read -r base; do
    # Collect all variations
    matches=( "${base}"*.jpg* "${base}"*.jpeg* )

    # Skip if none found
    [[ ! -e "${matches[0]}" ]] && continue
    [[ ${#matches[@]} -le 1 ]] && continue

    # Find largest by file size
    largest=$(ls -S "${matches[@]}" 2>/dev/null | head -n 1)

    echo "Keeping: $largest"
    for f in "${matches[@]}"; do
        [[ "$f" == "$largest" ]] && continue
        if [[ -e "$f" ]]; then
            echo "Moving duplicate: $f"
            mv "$f" "$dst"/ || echo "⚠️ Could not move $f"
        fi
    done
done

# COUNT IMAGES
ls "$IMAGE_DIR" | wc -l && echo "Images available"

# IMAGEMAGICK PART
# --- Image Canvas ---
#MAX_IMAGES
WIDTH=1280
HEIGHT=720
MAX_IMAGES=24

# --- Prepare temp dir ---
TMP_DIR=$(mktemp -d)
TIMESTAMP=$(date +%s)
OUT_FILE="${FINAL_DIR}/${TIMESTAMP}.jpg"

# --- Pick random JPEG images ---
echo "🎲 Picking $MAX_IMAGES random JPEG images from: $IMAGE_DIR"

FILES=()
while IFS= read -r f; do
  FILES+=("$f")
done < <(find "$IMAGE_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) | shuf | head -n "$MAX_IMAGES")

echo "📸 Selected images:"
for f in "${FILES[@]}"; do
  echo " - $f"
done

# --- Create white background --- or black --
magick -size ${WIDTH}x${HEIGHT} canvas:black -colorspace sRGB "$TMP_DIR/base.png"

#LAYOUT_SETTINGS (change this and MAX_IMAGES above)
COLS=6
ROWS=4
CELL_W=$((WIDTH / COLS))
CELL_H=$((HEIGHT / ROWS))

echo "🧩 Compositing $MAX_IMAGES images..."
i=0
for f in "${FILES[@]}"; do
  ((i++))
  [ -f "$f" ] || continue

  # Resize proportionally to fit in a cell
  magick "$f" -colorspace sRGB -resize "${CELL_W}x${CELL_H}>" "$TMP_DIR/img_${i}.png"

  # Random rotation (-10° to +10°)
  ANGLE=$((RANDOM % 21 - 10))
  magick "$TMP_DIR/img_${i}.png" -colorspace sRGB -background none -rotate "$ANGLE" "$TMP_DIR/rot_${i}.png"

  # Random position with slight overlap (Lower numbers → cleaner grid, Higher numbers → messier collage)
  row=$(( (i-1) / COLS ))
  col=$(( (i-1) % COLS ))
  XPOS=$(( col * CELL_W + RANDOM % 161 - 80 ))
  YPOS=$(( row * CELL_H + RANDOM % 161 - 80 ))

  # Composite onto base
  magick "$TMP_DIR/base.png" "$TMP_DIR/rot_${i}.png" \
        -geometry +${XPOS}+${YPOS} -colorspace sRGB -compose over -composite "$TMP_DIR/base.png"
done

# Version Color
magick "$TMP_DIR/base.png" -colorspace sRGB "$OUT_FILE"

# Cleanup
rm -rf "$TMP_DIR"

# End
echo "✅ Created: $OUT_FILE"
	

rss-center

rss-center schreibt RSS-Daten in ein JPEG. Dieses Script läuft permanent aller 5 Minuten auf einem Raspberry und zwar mit mehreren Instanzen für diverse Feeds. Die 10 neuesten Nachrichten werden aus der RSS-Datei extraiert (Ordner „rss_data“), danach werden diese 10 Nachrichten plus Zeit in eine txt-Datei geschrieben (Ordner „rss_final“). Diese Datei wird dann in imagemagick geladen und gerendert. Die Resultate (Ordner „output“) werden bei mir per rsync auf meinen Mac übertragen und dienen dort als Quellordner für den Bildschirmschoner (Bild 2), der mir also vollkommen passiv die entsprechenden Schlagzeilen liefert. Das Logo oben rechts (optional) dient zur Unterscheidung der Quellen, also „S“ für „Spiegel“, „T“ für „Tagesschau“ usw.


#!/bin/bash
set -e
echo "Requires Imagemagick 7.0"
convert --version | grep "Version:"
magick --version | grep "Version:"
# ---------------- VARIABLES ----------------
BASE_DIR="/home/pi/test"
cd "$BASE_DIR" || exit 1

rss_url="https://www.spiegel.de/schlagzeilen/index.rss"
IN_DIR="./rss_data"
OUT_DIR="./rss_final"
FINAL_DIR="./output"
FONT="/usr/share/fonts/truetype/noto/NotoMono-Regular.ttf"

WIDTH=1280
HEIGHT=832
COLOR="#FFFFFF"
BACKGROUND="black"

LEFT_MARGIN=50   # distance from left edge
TOP_MARGIN=50    # distance from top edge
FONT_SIZE=35     # ✅ fixed font size

mkdir -p "$IN_DIR" "$OUT_DIR" "$FINAL_DIR"

echo "📡 Downloading RSS feed from: $rss_url"
wget -q "$rss_url" -O "$BASE_DIR/rss.txt"

if [[ ! -s "$BASE_DIR/rss.txt" ]]; then
  echo "❌ Error: Failed to download RSS feed"
  exit 1
fi

domain=$(echo "$rss_url" | sed -E 's@https?://(www\.)?([^/]+).*@\2@' | cut -d'.' -f1)
today=$(date +"%Y-%m-%d")

# ---------------- CLEANUP ----------------
rm -f "$IN_DIR"/title_*.txt "$IN_DIR"/date_*.txt "$OUT_DIR"/message_*.txt "$OUT_DIR"/all_messages.txt
rm -f "$FINAL_DIR"/*.jpg

# ---------------- EXTRACT TITLES + DATES ----------------
pairs=$(awk '
  BEGIN { RS="</item>"; FS="\n" }
  {
    title=""; date="";
    for (i=1; i<=NF; i++) {
      if ($i ~ /<title>/) {
        line=$i
        gsub(/<title><!\[CDATA\[/, "", line)
        gsub(/\]\]><\/title>/, "", line)
        gsub(/<title>/, "", line)
        gsub(/<\/title>/, "", line)
        title=line
      }
      if ($i ~ /<pubDate>/) {
        gsub(/.*<pubDate>/, "", $i)
        gsub(/<\/pubDate>.*/, "", $i)
        date=$i
      }
    }
    if (title != "" && date != "") print title "\x1f" date;
  }
' "$BASE_DIR/rss.txt" | head -n 10)

index=1
echo "$pairs" | while IFS=$'\x1f' read -r title pubdate; do
  formatted_date=$(date -d "$pubdate" "+%d.%m.%Y, %H:%M Uhr")

  formatted_title=$(echo "$title" | sed \
    -e 's/\\/\\\\/g' \
    -e 's/&quot;/"/g' \
    -e 's/&amp;/\&/g' \
    -e 's/&#[0-9]*;//g' \
    -e 's/:/ /g' \
    -e 's/,/ /g' \
    -e "s/'/'/g" \
    -e 's/?/ /g' \
    -e 's/\"/\"/g')

  wrapped_title=$(echo "$formatted_title" | fold -s -w 120)
  echo "$wrapped_title" > "$IN_DIR/title_${index}.txt"
  echo "$domain - $formatted_date" > "$IN_DIR/date_${index}.txt"

  ((index++))
done

# ---------------- CREATE MESSAGES ----------------
wordcount1=20
for i in {1..10}; do
  date_part=$(cut -c23-27 "$IN_DIR/date_$i.txt" 2>/dev/null || echo "")
  title_part=$(awk -v n="$wordcount1" '{for(i=1;i<=n && i<=NF;i++) printf "%s%s",$i,(i<n && i<NF?OFS:""); print ""}' "$IN_DIR/title_$i.txt" 2>/dev/null || echo "")
  printf "%s %s\n\n" "$date_part" "$title_part" >> "$OUT_DIR/all_messages.txt"
done

# ---------------- IMAGEMAGICK PART ----------------
TMP_DIR=$(mktemp -d)
OUT_FILE="${FINAL_DIR}/news-spiegel.jpg"
#OUT_FILE="${FINAL_DIR}/$(date +%s).jpg"
LINE_SPACING=8     # ← adjust this value for line height

# 1️⃣ Create background
magick -size ${WIDTH}x${HEIGHT} canvas:$BACKGROUND -colorspace sRGB "$TMP_DIR/base.png"

# 2️⃣ Generate caption image (auto-wrap width minus margins)
magick -size $((WIDTH - LEFT_MARGIN * 2))x${HEIGHT} \
  -background none -fill "$COLOR" -font "$FONT" -pointsize "$FONT_SIZE" -interline-spacing $LINE_SPACING \
  caption:@"$OUT_DIR/all_messages.txt" "$TMP_DIR/text.png"

# 3️⃣ Composite caption image with top/left margins
magick "$TMP_DIR/base.png" "$TMP_DIR/text.png" \
  -geometry +${LEFT_MARGIN}+${TOP_MARGIN} -compose over -composite "$OUT_FILE"

# 4️⃣ Overlay logo - optional
#LOGO_PATH="./logos/logo.png"
#LOGO_WIDTH=130
#MARGIN=0
#TMP_LOGO="$TMP_DIR/logo_resized.png"
#magick "$LOGO_PATH" -resize ${LOGO_WIDTH} "$TMP_LOGO"
#magick "$OUT_FILE" "$TMP_LOGO" -colorspace sRGB \

magick "$OUT_FILE" -colorspace sRGB "$OUT_FILE"

rm -rf "$TMP_DIR"
echo "✅ Created image: $OUT_FILE"

/) {<br /><br> line=$i<br /><br> gsub(/<title><!\[CDATA\[/, „“, line)<br> gsub(/\]\]><\/title>/, „“, line)<br /><br> gsub(/<title>/, „“, line)<br /><br> gsub(/<\/title>/, „“, line)<br /><br> title=line<br /><br> }<br /><br> if ($i ~ /<pubDate>/) {<br /><br> gsub(/.*<pubDate>/, „“, $i)<br /><br> gsub(/<\/pubDate>.*/, „“, $i)<br /><br> date=$i<br /><br> }<br /><br> }<br /><br> if (title != „“ && date != „“) print title „\x1f“ date;<br /><br> }<br /><br>‘ „$BASE_DIR/rss.txt“ | head -n 10)</p><br><p>index=1<br /><br>echo „$pairs“ | while IFS=$’\x1f‘ read -r title pubdate; do<br /><br> formatted_date=$(date -d „$pubdate“ „+%d.%m.%Y, %H:%M Uhr“)</p><br><p> formatted_title=$(echo „$title“ | sed \<br /><br> -e ’s/\\/\\\\/g‘ \<br /><br> -e ’s/“/“/g‘ \<br /><br> -e ’s/&/\&/g‘ \<br /><br> -e ’s/&#[0-9]*;//g‘ \<br /><br> -e ’s/:/ /g‘ \<br /><br> -e ’s/,/ /g‘ \<br /><br> -e „s/’/’/g“ \<br /><br> -e ’s/?/ /g‘ \<br /><br> -e ’s/\“/\“/g‘)</p><br><p> wrapped_title=$(echo „$formatted_title“ | fold -s -w 120)<br /><br> echo „$wrapped_title“ > „$IN_DIR/title_${index}.txt“<br /><br> echo „$domain – $formatted_date“ > „$IN_DIR/date_${index}.txt“</p><br><p> ((index++))<br /><br>done</p><br><p># —————- CREATE MESSAGES —————-<br /><br>wordcount1=20<br /><br>for i in {1..10}; do<br /><br> date_part=$(cut -c23-27 „$IN_DIR/date_$i.txt“ 2>/dev/null || echo „“)<br /><br> title_part=$(awk -v n=“$wordcount1″ ‚{for(i=1;i<=n && i<=NF;i++) printf „%s%s“,$i,(i<n && i<NF?OFS:““); print „“}‘ „$IN_DIR/title_$i.txt“ 2>/dev/null || echo „“)<br /><br> printf „%s %s\n\n“ „$date_part“ „$title_part“ >> „$OUT_DIR/all_messages.txt“<br /><br>done</p><br><p># —————- IMAGEMAGICK PART —————-<br /><br>TMP_DIR=$(mktemp -d)<br /><br>OUT_FILE=“${FINAL_DIR}/news-spiegel.jpg“<br /><br>#OUT_FILE=“${FINAL_DIR}/$(date +%s).jpg“<br /><br>LINE_SPACING=8 # ← adjust this value for line height</p><br><p># 1️⃣ Create background<br /><br>magick -size ${WIDTH}x${HEIGHT} canvas:$BACKGROUND -colorspace sRGB „$TMP_DIR/base.png“</p><br><p># 2️⃣ Generate caption image (auto-wrap width minus margins)<br /><br>magick -size $((WIDTH – LEFT_MARGIN * 2))x${HEIGHT} \<br /><br> -background none -fill „$COLOR“ -font „$FONT“ -pointsize „$FONT_SIZE“ -interline-spacing $LINE_SPACING \<br /><br> caption:@“$OUT_DIR/all_messages.txt“ „$TMP_DIR/text.png“</p><br><p># 3️⃣ Composite caption image with top/left margins<br /><br>magick „$TMP_DIR/base.png“ „$TMP_DIR/text.png“ \<br /><br> -geometry +${LEFT_MARGIN}+${TOP_MARGIN} -compose over -composite „$OUT_FILE“</p><br><p># 4️⃣ Overlay logo – optional<br /><br>#LOGO_PATH=“./logos/logo.png“<br /><br>#LOGO_WIDTH=130<br /><br>#MARGIN=0<br /><br>#TMP_LOGO=“$TMP_DIR/logo_resized.png“<br /><br>#magick „$LOGO_PATH“ -resize ${LOGO_WIDTH} „$TMP_LOGO“<br /><br>#magick „$OUT_FILE“ „$TMP_LOGO“ -colorspace sRGB \</p><br><p>magick „$OUT_FILE“ -colorspace sRGB „$OUT_FILE“</p><br><p>rm -rf „$TMP_DIR“<br /><br>echo „✅ Created image: $OUT_FILE“</p>

TXT-Graphics-Converter

Random Typography Project: jeder einzelne Charakter wird in eine zufällig ausgesuchte Schrift konvertiert. Da Schrift-Daten nicht nur Buchstaben, sondern auch Grafiken enthalten können, ergibt sich eine typographische Collage mit den entsprechenden Schriften, deren Parameter (size, kerning, leading) alle geändert werden können. Alle Fonts von dafont.com



#!/bin/bash
# Random Font Typography Script
# Each character from the text file is rendered with a random font from the list below

OFILE="$RANDOM"

# --- Input / Output (Hardwired) ---
INPUT="./input.txt"
OUTPUT="./$OFILE.png"

# --- Fonts (Full Paths) ---
FONTS=(
  "./fonts/EmojiFont.ttf"
  "./fonts/LEDLIGHT.otf"
  "./fonts/Logos tfb.ttf"
  "./fonts/BluetagBoldItalic_PERSONAL_USE_ONLY.otf"
  "./fonts/Positive System.otf"
  "./fonts/ArabTVlogos.ttf"
  "./fonts/clothing logos.ttf"
  "./fonts/Sci-Fi-Logos.ttf"
  "./fonts/the world-'s best logos.ttf"
  "./fonts/WarnerLogoFontNine.TTF"
  "./fonts/code128.ttf"
  "./fonts/Eau de rose.ttf"
  "./fonts/Grunge Strokes 01.ttf"
  "./fonts/Logos I love.ttf"
  "./fonts/openlogos.ttf"
  "./fonts/THEBOMB.TTF"
  "./fonts/WC_Rhesus_B_Bta.ttf"
  "./fonts/Dripping.ttf"
  "./fonts/meeksa.ttf"
  "./fonts/RFX Splatz.ttf"
  "./fonts/Sneakers.ttf"
  "./fonts/splatter.ttf"
)

# --- Config ---
FONT_SIZE=80
BG_COLOR="black"
TEXT_COLOR="white"
KERNING=-8
LEADING=-25
CHARS_PER_LINE=12
TMPDIR=$(mktemp -d)

# --- Read text file ---
if [[ ! -f "$INPUT" ]]; then
  echo "❌ Text file not found: $INPUT"
  exit 1
fi
TEXT=$(cat "$INPUT" | tr -d '\r')

# --- Split text into lines ---
LINES=()
while IFS= read -r LINE; do
  while [[ -n "$LINE" ]]; do
    LINES+=("${LINE:0:$CHARS_PER_LINE}")
    LINE="${LINE:$CHARS_PER_LINE}"
  done
done <<< "$TEXT"

# --- Function: render a single line ---
render_line() {
  local LINE="$1"
  local OUTFILE="$2"
  local x_offset=0
  local TMP_CANVAS="$TMPDIR/canvas.miff"

  magick -size 2000x2000 xc:none "$TMP_CANVAS"

  for (( c=0; c<${#LINE}; c++ )); do
    CHAR="${LINE:$c:1}"

    # Handle spaces and special characters safely
    if [[ "$CHAR" == " " ]]; then
      CHAR=" "   # just skip drawing empty glyph
    fi
    SAFE_CHAR=$(printf '%s' "$CHAR" | sed "s/'/\\\\'/g; s/\"/\\\\\"/g")

    FONT="${FONTS[$((RANDOM % ${#FONTS[@]}))]}"

    # Only try to render printable characters
    if [[ "$CHAR" =~ [[:print:]] ]]; then
      magick -background none -fill "$TEXT_COLOR" \
              -font "$FONT" -pointsize "$FONT_SIZE" \
              label:"$SAFE_CHAR" "$TMPDIR/char_$c.png" 2>/dev/null || continue
      composite -geometry +$x_offset+0 "$TMPDIR/char_$c.png" "$TMP_CANVAS" "$TMP_CANVAS"
    fi

    x_offset=$((x_offset + FONT_SIZE + KERNING))
  done

  mv "$TMP_CANVAS" "$OUTFILE"
}

# --- Render all lines ---
line_y=0
magick -size 1000x1000 xc:"$BG_COLOR" "$TMPDIR/final.miff"

for (( i=0; i<${#LINES[@]}; i++ )); do
  render_line "${LINES[$i]}" "$TMPDIR/line_$i.miff"
  composite -geometry +0+$line_y "$TMPDIR/line_$i.miff" "$TMPDIR/final.miff" "$TMPDIR/final.miff"
  line_y=$((line_y + FONT_SIZE + LEADING))
done

# --- Output ---
magick "$TMPDIR/final.miff" "$OUTPUT"
rm -rf "$TMPDIR"

echo "✅ Done! Created overlapping typography at: $OUTPUT"

Automatically create moodboards

Moodboards, aber automatisch. Collage-Erstellung mit imagemagick. Aussehen ist abhängig von den Quelldaten, so, es kann auch ein messy Familienalbum sein, oder ein RSS-Nachrichtensystem, its up to you.



1760814789.jpg

1760813686.jpg


1760813230.jpg


#!/bin/bash
# Create a colorful random moodboard with reduced overlap (ImageMagick v7)
# Output files are timestamped and stored in ./moodboards/

SRC_DIR="/home/pi/imagefolder"
OUT_DIR="/home/pi/moodboards"
mkdir -p "$OUT_DIR"

WIDTH=1280
HEIGHT=720
MAX_IMAGES=8

# Timestamped output filename
TIMESTAMP=$(date +%s)
OUT_FILE="${OUT_DIR}/moodboard_${TIMESTAMP}.jpg"

TMP_DIR=$(mktemp -d)

# Pick random JPEG images
mapfile -t FILES < <(find "$SRC_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" \) | shuf -n $MAX_IMAGES)

# Create RGB white canvas
magick -size ${WIDTH}x${HEIGHT} canvas:white -colorspace sRGB "$TMP_DIR/base.png"

# Determine layout grid positions (2x4 grid for up to 8 images)
COLS=4
ROWS=2
CELL_W=$((WIDTH / COLS))
CELL_H=$((HEIGHT / ROWS))

i=0
for f in "${FILES[@]}"; do
  ((i++))

  # Resize proportionally to fit in a cell
  magick "$f" -colorspace sRGB -resize "${CELL_W}x${CELL_H}>" "$TMP_DIR/img_${i}.png"

  # Random small rotation (-10 to +10)
  ANGLE=$((RANDOM % 21 - 10))
  magick "$TMP_DIR/img_${i}.png" -background none -rotate "$ANGLE" "$TMP_DIR/rot_${i}.png"

  # Grid position with a *wider* random offset (±80 px for more overlap)
  row=$(( (i-1) / COLS ))
  col=$(( (i-1) % COLS ))
  XPOS=$(( col * CELL_W + RANDOM % 161 - 80 ))
  YPOS=$(( row * CELL_H + RANDOM % 161 - 80 ))

  # Composite with minimal overlap
  magick "$TMP_DIR/base.png" "$TMP_DIR/rot_${i}.png" \
        -colorspace sRGB -geometry +${XPOS}+${YPOS} -compose over -composite "$TMP_DIR/base.png"
done

# Save final moodboard
magick "$TMP_DIR/base.png" -colorspace sRGB "$OUT_FILE"

rm -rf "$TMP_DIR"
echo "✅ Moodboard created: $OUT_FILE"