#!/usr/bin/bash set -euo pipefail MURL="https://miniflux.i.balki.me" FID=61 TOKEN="${MINIFLUX_TOKEN?token missing}" token_header() { cat <<<"X-Auth-Token: $TOKEN" } process() { local eid="$1" local title="$2" echo "Downloding content. entry: $eid title: $title" # https://miniflux.app/docs/api.html#endpoint-fetch-content curl --fail -o /dev/null -s "$MURL/v1/entries/$eid/fetch-content" \ --url-query update_content=true \ -H @<(token_header) echo "Updating title. entry: $eid title: $title" # https://miniflux.app/docs/api.html#endpoint-update-entry curl --fail -o /dev/null -s -X PUT "$MURL/v1/entries/$eid" \ --json "$(jo title="${title/$/✓}")" \ -H @<(token_header) echo "Marking as unread. entry: $eid title: $title" # https://miniflux.app/docs/api.html#endpoint-update-entries curl --fail -s -X PUT "$MURL/v1/entries" \ --json "$(jo "entry_ids[]=$eid" status=unread)" \ -H @<(token_header) } filter_entries() { # silence 'Expressions don't expand in single quotes' # shellcheck disable=SC2016 mlr --l2n \ + filter '$title =~ "\[\$\]"' \ + filter -s w1="$1" -s w2="$2" '$published_at > @w2 && $published_at < @w1' \ + cut -of id,title \ + tac } main() { local w1 w2 # Script will fail at the first entry that is not available yet w1=$(date --iso-8601=s -d '1 week ago') w2=$(date --iso-8601=s -d '5 weeks ago') echo "Considering articles between w2: $w2 and w1: $w1 " # https://miniflux.app/docs/api.html#endpoint-get-feed-entries curl -s --fail "$MURL/v1/feeds/$FID/entries" \ --url-query limit=150 \ --url-query order=id \ --url-query direction=desc \ -H @<(token_header) | yq -pj -oj '.entries[]' | filter_entries "$w1" "$w2" | while read -r eid title; do echo "processing entry: $eid title: $title" process "$eid" "$title" done } main