fix playlists
This commit is contained in:
parent
4f6779e968
commit
f4477fc68f
3 changed files with 121 additions and 172 deletions
|
|
@ -6,162 +6,84 @@
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
PUBKEY="3f11abb2e235da2d4dda5d6deb2f123173476a745a3ca56895a1d0f632a42f40"
|
PUBKEY="3f11abb2e235da2d4dda5d6deb2f123173476a745a3ca56895a1d0f632a42f40"
|
||||||
RELAY="wss://drops.basspistol.org"
|
RELAY="wss://tortellino.basspistol.org"
|
||||||
DATA_DIR="data/playlists"
|
DATA_DIR="data/playlists"
|
||||||
NAK_BIN="nak"
|
RAW_DIR="data/playlists/raw"
|
||||||
JQ_BIN="jq"
|
|
||||||
|
|
||||||
# Colors for output
|
mkdir -p "$DATA_DIR" "$RAW_DIR"
|
||||||
RED='\033[0;31m'
|
|
||||||
GREEN='\033[0;32m'
|
|
||||||
YELLOW='\033[1;33m'
|
|
||||||
BLUE='\033[0;34m'
|
|
||||||
NC='\033[0m'
|
|
||||||
|
|
||||||
mkdir -p "$DATA_DIR"
|
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }
|
||||||
|
|
||||||
log() { echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1"; }
|
|
||||||
log_success() { echo -e "${GREEN}✅ $1${NC}"; }
|
|
||||||
log_warning() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
|
||||||
log_error() { echo -e "${RED}❌ $1${NC}"; }
|
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Step 1: Fetch playlist events
|
# Step 1: Fetch playlists and tracks
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
log "Fetching playlist events (kind 34139) from $RELAY..."
|
log "Fetching playlist events (kind 34139) from $RELAY..."
|
||||||
|
nak req -k 34139 -a "$PUBKEY" "$RELAY" > "$RAW_DIR/playlists-raw.jsonl"
|
||||||
PLAYLISTS_JSON=$(mktemp)
|
|
||||||
$NAK_BIN req -k 34139 -a "$PUBKEY" "$RELAY" | $JQ_BIN -s '.' > "$PLAYLISTS_JSON"
|
|
||||||
|
|
||||||
if [ ! -s "$PLAYLISTS_JSON" ]; then
|
|
||||||
log_error "No playlist data received."
|
|
||||||
rm -f "$PLAYLISTS_JSON"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
PLAYLIST_COUNT=$(cat "$PLAYLISTS_JSON" | $JQ_BIN 'length')
|
|
||||||
log_success "Found $PLAYLIST_COUNT playlist(s)"
|
|
||||||
|
|
||||||
# ============================================
|
|
||||||
# Step 2: Fetch ALL tracks
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
log "Fetching ALL tracks (kind 36787) from $PUBKEY..."
|
log "Fetching ALL tracks (kind 36787) from $PUBKEY..."
|
||||||
|
nak req -k 36787 -a "$PUBKEY" "$RELAY" > "$RAW_DIR/tracks-raw.jsonl"
|
||||||
ALL_TRACKS_JSON=$(mktemp)
|
|
||||||
$NAK_BIN req -k 36787 -a "$PUBKEY" "$RELAY" | $JQ_BIN -s '.' > "$ALL_TRACKS_JSON"
|
|
||||||
|
|
||||||
TRACK_COUNT=$(cat "$ALL_TRACKS_JSON" | $JQ_BIN 'length' 2>/dev/null || echo "0")
|
|
||||||
log_success "Found $TRACK_COUNT total tracks from pubkey"
|
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Step 3: Build playlist data
|
# Step 2: Convert JSONL to JSON arrays
|
||||||
|
# ============================================
|
||||||
|
|
||||||
|
log "Converting raw data to JSON arrays..."
|
||||||
|
|
||||||
|
# Convert jsonl to json arrays
|
||||||
|
cat "$RAW_DIR/playlists-raw.jsonl" | jq -s '.' > "$RAW_DIR/playlists-raw.json"
|
||||||
|
cat "$RAW_DIR/tracks-raw.jsonl" | jq -s '.' > "$RAW_DIR/tracks-raw.json"
|
||||||
|
|
||||||
|
# ============================================
|
||||||
|
# Step 3: Build playlist data with jq
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
log "Building playlist data structure..."
|
log "Building playlist data structure..."
|
||||||
|
|
||||||
OUTPUT_FILE="$DATA_DIR/playlists.json"
|
# Build the playlists.json using the json files
|
||||||
FLATTENED_OUTPUT="$DATA_DIR/tracks.json"
|
jq -n \
|
||||||
|
--slurpfile playlists "$RAW_DIR/playlists-raw.json" \
|
||||||
# Create a file with track lookup by d-tag
|
--slurpfile tracks "$RAW_DIR/tracks-raw.json" \
|
||||||
TRACK_LOOKUP=$(mktemp)
|
'{
|
||||||
cat "$ALL_TRACKS_JSON" | $JQ_BIN -r '
|
playlists: [
|
||||||
.[] |
|
$playlists[] | .[] |
|
||||||
. as $track |
|
select(.kind == 34139) |
|
||||||
(.tags[] | select(.[0] == "d") | .[1]) as $d_tag |
|
{
|
||||||
"\($d_tag)|\($track | tojson)"
|
id: .id,
|
||||||
' > "$TRACK_LOOKUP"
|
created_at: .created_at,
|
||||||
|
name: (.tags[] | select(.[0] == "title") | .[1] // ""),
|
||||||
# Build the playlists JSON
|
description: (.tags[] | select(.[0] == "description") | .[1] // ""),
|
||||||
echo '{"playlists": []}' > "$OUTPUT_FILE"
|
image: (.tags[] | select(.[0] == "image") | .[1] // ""),
|
||||||
|
tracks: [
|
||||||
# Process each playlist
|
.tags[] |
|
||||||
cat "$PLAYLISTS_JSON" | $JQ_BIN -c '.[]' | while read -r playlist; do
|
select(.[0] == "a") | .[1] as $ref |
|
||||||
# Extract playlist metadata
|
$tracks[] | .[] |
|
||||||
PLAYLIST_ID=$(echo "$playlist" | $JQ_BIN -r '.id')
|
select(
|
||||||
PLAYLIST_CREATED=$(echo "$playlist" | $JQ_BIN -r '.created_at')
|
($ref | split(":")[2]) == (.tags[] | select(.[0] == "d") | .[1])
|
||||||
|
) |
|
||||||
# FIX: Extract name from "title" tag (not "name")
|
{
|
||||||
PLAYLIST_NAME=$(echo "$playlist" | $JQ_BIN -r '.tags[] | select(.[0] == "title") | .[1] // ""')
|
id: .id,
|
||||||
PLAYLIST_DESC=$(echo "$playlist" | $JQ_BIN -r '.tags[] | select(.[0] == "description") | .[1] // ""')
|
created_at: .created_at,
|
||||||
PLAYLIST_IMAGE=$(echo "$playlist" | $JQ_BIN -r '.tags[] | select(.[0] == "image") | .[1] // ""')
|
title: (.tags[] | select(.[0] == "title") | .[1] // "Untitled"),
|
||||||
|
artist: (.tags[] | select(.[0] == "artist") | .[1] // "Unknown Artist"),
|
||||||
# Debug: show what was extracted
|
album: (.tags[] | select(.[0] == "album") | .[1] // ""),
|
||||||
echo " Playlist: '$PLAYLIST_NAME'" >&2
|
url: (.tags[] | select(.[0] == "url") | .[1] // ""),
|
||||||
|
image: (.tags[] | select(.[0] == "image") | .[1] // ""),
|
||||||
# Get track references from 'a' tags
|
duration: (.tags[] | select(.[0] == "duration") | .[1] // ""),
|
||||||
TRACK_REFS=$(echo "$playlist" | $JQ_BIN -r '.tags[] | select(.[0] == "a") | .[1]')
|
tags: [.tags[] | select(.[0] == "t") | .[1]]
|
||||||
|
}
|
||||||
# Build tracks array for this playlist
|
]
|
||||||
TRACKS_JSON="[]"
|
}
|
||||||
|
]
|
||||||
while read -r ref; do
|
}' > "$DATA_DIR/playlists.json"
|
||||||
if [ -n "$ref" ]; then
|
|
||||||
# Extract identifier (the part after the second colon)
|
|
||||||
IDENTIFIER=$(echo "$ref" | cut -d':' -f3-)
|
|
||||||
|
|
||||||
# Find the track in the lookup
|
|
||||||
TRACK_DATA=$(grep "^$IDENTIFIER|" "$TRACK_LOOKUP" | head -1 | cut -d'|' -f2-)
|
|
||||||
|
|
||||||
if [ -n "$TRACK_DATA" ] && [ "$TRACK_DATA" != "null" ]; then
|
|
||||||
# Extract track fields
|
|
||||||
TRACK_TITLE=$(echo "$TRACK_DATA" | $JQ_BIN -r '.tags[] | select(.[0] == "title") | .[1] // "Untitled"')
|
|
||||||
TRACK_ARTIST=$(echo "$TRACK_DATA" | $JQ_BIN -r '.tags[] | select(.[0] == "artist") | .[1] // "Unknown Artist"')
|
|
||||||
TRACK_ALBUM=$(echo "$TRACK_DATA" | $JQ_BIN -r '.tags[] | select(.[0] == "album") | .[1] // ""')
|
|
||||||
TRACK_URL=$(echo "$TRACK_DATA" | $JQ_BIN -r '.tags[] | select(.[0] == "url") | .[1] // ""')
|
|
||||||
TRACK_IMAGE=$(echo "$TRACK_DATA" | $JQ_BIN -r '.tags[] | select(.[0] == "image") | .[1] // ""')
|
|
||||||
TRACK_DURATION=$(echo "$TRACK_DATA" | $JQ_BIN -r '.tags[] | select(.[0] == "duration") | .[1] // ""')
|
|
||||||
TRACK_ID=$(echo "$TRACK_DATA" | $JQ_BIN -r '.id')
|
|
||||||
TRACK_CREATED=$(echo "$TRACK_DATA" | $JQ_BIN -r '.created_at')
|
|
||||||
TRACK_TAGS=$(echo "$TRACK_DATA" | $JQ_BIN -r '[.tags[] | select(.[0] == "t") | .[1]] | join(",")')
|
|
||||||
|
|
||||||
# Build track JSON object
|
|
||||||
TRACK_JSON=$(cat <<EOF
|
|
||||||
{
|
|
||||||
"id": "$TRACK_ID",
|
|
||||||
"created_at": $TRACK_CREATED,
|
|
||||||
"title": "$TRACK_TITLE",
|
|
||||||
"artist": "$TRACK_ARTIST",
|
|
||||||
"album": "$TRACK_ALBUM",
|
|
||||||
"url": "$TRACK_URL",
|
|
||||||
"image": "$TRACK_IMAGE",
|
|
||||||
"duration": "$TRACK_DURATION",
|
|
||||||
"tags": [$(echo "$TRACK_TAGS" | sed 's/,/","/g' | sed 's/^/"/' | sed 's/$/"/')]
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
TRACKS_JSON=$(echo "$TRACKS_JSON" | $JQ_BIN --argjson track "$TRACK_JSON" '. += [$track]')
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
done <<< "$TRACK_REFS"
|
|
||||||
|
|
||||||
# Build the full playlist JSON
|
|
||||||
PLAYLIST_JSON=$(cat <<EOF
|
|
||||||
{
|
|
||||||
"id": "$PLAYLIST_ID",
|
|
||||||
"created_at": $PLAYLIST_CREATED,
|
|
||||||
"name": "$PLAYLIST_NAME",
|
|
||||||
"description": "$PLAYLIST_DESC",
|
|
||||||
"image": "$PLAYLIST_IMAGE",
|
|
||||||
"track_refs": [$(echo "$TRACK_REFS" | paste -sd, - | sed 's/^/"/' | sed 's/$/"/' | sed 's/,/","/g')],
|
|
||||||
"tracks": $TRACKS_JSON
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
)
|
|
||||||
|
|
||||||
# Append to the output file
|
|
||||||
cat "$OUTPUT_FILE" | $JQ_BIN --argjson playlist "$PLAYLIST_JSON" '.playlists += [$playlist]' > "${OUTPUT_FILE}.tmp"
|
|
||||||
mv "${OUTPUT_FILE}.tmp" "$OUTPUT_FILE"
|
|
||||||
done
|
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Step 4: Flattened tracks file
|
# Step 4: Generate flattened tracks file
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
log "Generating flattened tracks file..."
|
log "Generating flattened tracks file..."
|
||||||
|
|
||||||
cat "$ALL_TRACKS_JSON" | $JQ_BIN '
|
cat "$RAW_DIR/tracks-raw.json" | jq '
|
||||||
.[] | {
|
.[] | {
|
||||||
id: .id,
|
id: .id,
|
||||||
created_at: .created_at,
|
created_at: .created_at,
|
||||||
|
|
@ -174,41 +96,34 @@ cat "$ALL_TRACKS_JSON" | $JQ_BIN '
|
||||||
tags: [.tags[] | select(.[0] == "t") | .[1]],
|
tags: [.tags[] | select(.[0] == "t") | .[1]],
|
||||||
d_tag: (.tags[] | select(.[0] == "d") | .[1] // "")
|
d_tag: (.tags[] | select(.[0] == "d") | .[1] // "")
|
||||||
}
|
}
|
||||||
' | $JQ_BIN -s '.' > "$FLATTENED_OUTPUT"
|
' | jq -s '.' > "$DATA_DIR/tracks.json"
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Step 5: Save raw data
|
# Step 5: Cleanup raw jsonl files
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
cp "$PLAYLISTS_JSON" "$DATA_DIR/playlists-raw.json"
|
rm -f "$RAW_DIR"/*.jsonl
|
||||||
cp "$ALL_TRACKS_JSON" "$DATA_DIR/tracks-raw.json"
|
|
||||||
|
|
||||||
# ============================================
|
# ============================================
|
||||||
# Step 6: Cleanup
|
# Step 6: Summary
|
||||||
# ============================================
|
# ============================================
|
||||||
|
|
||||||
rm -f "$PLAYLISTS_JSON" "$ALL_TRACKS_JSON" "$TRACK_LOOKUP"
|
PLAYLIST_COUNT=$(cat "$DATA_DIR/playlists.json" | jq '.playlists | length' 2>/dev/null || echo "0")
|
||||||
|
TRACK_COUNT=$(cat "$DATA_DIR/tracks.json" | jq 'length' 2>/dev/null || echo "0")
|
||||||
# ============================================
|
|
||||||
# Step 7: Summary
|
|
||||||
# ============================================
|
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${BLUE}========================================${NC}"
|
echo "========================================"
|
||||||
echo -e "${GREEN}📊 Playlist Summary${NC}"
|
echo "📊 Playlist Summary"
|
||||||
echo -e "${BLUE}========================================${NC}"
|
echo "========================================"
|
||||||
echo -e " 📀 Playlists: $PLAYLIST_COUNT"
|
echo " 📀 Playlists: $PLAYLIST_COUNT"
|
||||||
echo -e " 🎵 Total tracks found: $TRACK_COUNT"
|
echo " 🎵 Total tracks found: $TRACK_COUNT"
|
||||||
echo -e " 📁 Data saved to: $DATA_DIR/"
|
echo " 📁 Data saved to: $DATA_DIR/"
|
||||||
echo -e "${BLUE}========================================${NC}"
|
echo "========================================"
|
||||||
|
|
||||||
# Show playlist names
|
|
||||||
echo ""
|
echo ""
|
||||||
echo -e "${BLUE}📝 Playlist Names:${NC}"
|
echo "📝 Playlist Names:"
|
||||||
cat "$OUTPUT_FILE" | $JQ_BIN -r '.playlists[].name' 2>/dev/null | while read -r name; do
|
cat "$DATA_DIR/playlists.json" | jq -r '.playlists[].name' 2>/dev/null | while read -r name; do
|
||||||
if [ -n "$name" ]; then
|
if [ -n "$name" ]; then
|
||||||
echo " 🎵 $name"
|
echo " 🎵 $name"
|
||||||
else
|
|
||||||
echo " ⚠️ (unnamed)"
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
@ -13,6 +13,12 @@ if [ ! -f "$DATA_FILE" ]; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check if data file has content
|
||||||
|
if [ ! -s "$DATA_FILE" ]; then
|
||||||
|
echo "❌ Error: $DATA_FILE is empty. Run fetch-playlist.sh first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Create content directory
|
# Create content directory
|
||||||
mkdir -p "$CONTENT_DIR"
|
mkdir -p "$CONTENT_DIR"
|
||||||
|
|
||||||
|
|
@ -26,35 +32,63 @@ EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Clear old playlist pages (keep _index.md)
|
# Clear old playlist pages (keep _index.md)
|
||||||
|
echo "Clearing old playlist pages..."
|
||||||
find "$CONTENT_DIR" -maxdepth 1 -type f -name "*.md" ! -name "_index.md" -delete
|
find "$CONTENT_DIR" -maxdepth 1 -type f -name "*.md" ! -name "_index.md" -delete
|
||||||
|
|
||||||
# Process each playlist
|
echo "Generating playlist pages..."
|
||||||
cat "$DATA_FILE" | jq -c '.playlists[]' | while read -r playlist; do
|
|
||||||
NAME=$(echo "$playlist" | jq -r '.name // "Untitled Playlist"')
|
|
||||||
SLUG=$(echo "$NAME" | tr ' ' '-' | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9-]//g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
|
|
||||||
|
|
||||||
# If slug is empty, use the ID
|
# Function to escape YAML strings
|
||||||
if [ -z "$SLUG" ] || [ "$SLUG" = "untitled-playlist" ]; then
|
escape_yaml() {
|
||||||
SLUG=$(echo "$playlist" | jq -r '.id' | head -c 12)
|
echo "$1" | sed 's/"/\\"/g' | sed 's/:/\\:/g' | tr -d '\n\r'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Process each playlist
|
||||||
|
cat "$DATA_FILE" | jq -c '.playlists[]' 2>/dev/null | while read -r playlist; do
|
||||||
|
# Skip if playlist is empty
|
||||||
|
if [ -z "$playlist" ] || [ "$playlist" == "null" ]; then
|
||||||
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Extract fields
|
||||||
|
NAME=$(echo "$playlist" | jq -r '.name // "Untitled Playlist"')
|
||||||
|
PLAYLIST_ID=$(echo "$playlist" | jq -r '.id // ""')
|
||||||
DESCRIPTION=$(echo "$playlist" | jq -r '.description // ""')
|
DESCRIPTION=$(echo "$playlist" | jq -r '.description // ""')
|
||||||
IMAGE=$(echo "$playlist" | jq -r '.image // ""')
|
IMAGE=$(echo "$playlist" | jq -r '.image // ""')
|
||||||
TRACKS=$(echo "$playlist" | jq -c '.tracks')
|
CREATED_AT=$(echo "$playlist" | jq -r '.created_at // 0')
|
||||||
PLAYLIST_ID=$(echo "$playlist" | jq -r '.id')
|
TRACKS=$(echo "$playlist" | jq -c '.tracks // []')
|
||||||
CREATED_AT=$(echo "$playlist" | jq -r '.created_at')
|
|
||||||
|
# Escape YAML strings
|
||||||
|
NAME_ESC=$(echo "$NAME" | sed 's/"/\\"/g')
|
||||||
|
DESCRIPTION_ESC=$(echo "$DESCRIPTION" | sed 's/"/\\"/g' | tr -d '\n\r')
|
||||||
|
IMAGE_ESC=$(echo "$IMAGE" | sed 's/"/\\"/g')
|
||||||
|
|
||||||
|
# Skip if no name
|
||||||
|
if [ -z "$NAME" ] || [ "$NAME" == "null" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create URL-friendly slug
|
||||||
|
SLUG=$(echo "$NAME" | tr '[:upper:]' '[:lower:]' | sed 's/[^a-z0-9]/-/g' | sed 's/--*/-/g' | sed 's/^-//;s/-$//')
|
||||||
|
if [ -z "$SLUG" ]; then
|
||||||
|
SLUG="${PLAYLIST_ID:0:12}"
|
||||||
|
fi
|
||||||
|
|
||||||
# Convert created_at to date
|
# Convert created_at to date
|
||||||
|
if [ "$CREATED_AT" != "null" ] && [ "$CREATED_AT" -gt 0 ] 2>/dev/null; then
|
||||||
CREATED_DATE=$(date -d "@$CREATED_AT" "+%Y-%m-%d" 2>/dev/null || echo $(date "+%Y-%m-%d"))
|
CREATED_DATE=$(date -d "@$CREATED_AT" "+%Y-%m-%d" 2>/dev/null || echo $(date "+%Y-%m-%d"))
|
||||||
|
else
|
||||||
|
CREATED_DATE=$(date "+%Y-%m-%d")
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Write the markdown file with escaped values
|
||||||
cat > "$CONTENT_DIR/$SLUG.md" <<EOF
|
cat > "$CONTENT_DIR/$SLUG.md" <<EOF
|
||||||
---
|
---
|
||||||
title: "$NAME"
|
title: "$NAME_ESC"
|
||||||
date: $CREATED_DATE
|
date: $CREATED_DATE
|
||||||
draft: false
|
draft: false
|
||||||
playlist_id: "$PLAYLIST_ID"
|
playlist_id: "$PLAYLIST_ID"
|
||||||
playlist_description: "$DESCRIPTION"
|
playlist_description: "$DESCRIPTION_ESC"
|
||||||
playlist_image: "$IMAGE"
|
playlist_image: "$IMAGE_ESC"
|
||||||
playlist_tracks: $TRACKS
|
playlist_tracks: $TRACKS
|
||||||
playlist_created_at: $CREATED_AT
|
playlist_created_at: $CREATED_AT
|
||||||
---
|
---
|
||||||
|
|
@ -64,4 +98,4 @@ EOF
|
||||||
done
|
done
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "📊 Generated $(find "$CONTENT_DIR" -maxdepth 1 -type f -name "*.md" ! -name "_index.md" | wc -l) playlist pages"
|
echo "📊 Generated playlist pages"
|
||||||
|
|
@ -96,7 +96,7 @@
|
||||||
<div class="playlist-meta">
|
<div class="playlist-meta">
|
||||||
<span class="playlist-track-count">🎵 {{ len $tracks }} tracks</span>
|
<span class="playlist-track-count">🎵 {{ len $tracks }} tracks</span>
|
||||||
{{ if $created_at }}
|
{{ if $created_at }}
|
||||||
<span class="playlist-created">📅 {{ dateFormat "January 2, 2006" (time $created_at) }}</span>
|
<span class="playlist-track-count">📅 {{ dateFormat "January 2, 2006" (time $created_at) }}</span>
|
||||||
{{ end }}
|
{{ end }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue