This is a small script transforming and overcast export into a markdown table.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /bin/bash | |
# overcast.opml to text or markdown table | |
# this script makes use of yq (https://github.com/mikefarah/yq) to parse the overcast.opml file which is xml | |
# Basicaly there are two option to parse the overcast.opml file | |
## standard overcast.opml | |
# | |
# parse_standard "md|txt" overcast.opml | |
## --- | |
## parse extended overcast.opml | |
# | |
# parse_extended "md|txt" overcast.opml | |
parse_standard(){ | |
OUTPUT=$1 | |
FILENAME=$2 | |
while IFS=$'\t' read -r TITLE TEXT HTMLURL XMLURL _; do | |
if [ "$OUTPUT" == "txt" ] ; then | |
echo "Title: $TITLE" | |
echo "Text: $TEXT" | |
echo "htmlURL: $HTMLURL" | |
echo "xmlURL: $XMLURL" | |
fi | |
if [ "$OUTPUT" == "md" ] ; then | |
echo "1. [$TITLE]($HTMLURL) - [Feed]($XMLURL)" | |
fi | |
done < <(yq -p=xml ' .opml.body.outline.outline[] | [.+title, .+text, .+htmlUrl, .+xmlUrl ] | @tsv ' "$FILENAME" ) | |
} | |
get_podcast_by_id(){ | |
PODCAST_ID=$1 | |
FILENAME=$2 | |
# get a podcast based on its ID | |
PODCAST_DATA=$(yq -p=xml " .opml.body.outline[].outline[] | select ( .+type == \"rss\") | select ( .+overcastId == \"$PODCAST_ID\") | [ .+title, .+text, .+htmlUrl, .+xmlUrl ] | @tsv " "$FILENAME") | |
echo "${PODCAST_DATA}" | |
} | |
parse_extended(){ | |
OUTPUT=$1 | |
FILENAME=$2 | |
# get all playlists | |
while IFS=$'\t' read -r TITLE SMART SORTING INCLUDED_PODCAST_IDS PRIORITY_PODCAST_IDS INCLUDE_EPISODE_IDS SORTED_EPISODE_IDS _; do | |
if [ "$OUTPUT" == "txt" ] ; then | |
echo "Title: $TITLE" | |
echo "Smart: $SMART" | |
echo "Sorting: $SORTING" | |
echo "included Podcast IDs: $INCLUDED_PODCAST_IDS" | |
echo "priority Podcast IDs: $PRIORITY_PODCAST_IDS" | |
echo "included Episode IDs: $INCLUDE_EPISODE_IDS" | |
echo "sorted Epidsode IDs: $SORTED_EPISODE_IDS" | |
echo "Podcasts:" | |
for PODCAST_ID in ${INCLUDED_PODCAST_IDS//,/ } | |
do | |
IFS=$'\t' read -r TITLE TEXT HTMLURL XMLURL <<< "$(get_podcast_by_id "$PODCAST_ID" "$FILENAME")" | |
echo " Title: $TITLE" | |
echo " Text: $TEXT" | |
echo " htmlURL: $HTMLURL" | |
echo " xmlURL: $XMLURL" | |
done | |
fi | |
if [ "$OUTPUT" == "md" ] ; then | |
echo "" | |
echo "## Playlist: $TITLE" | |
echo "" | |
for PODCAST_ID in ${INCLUDED_PODCAST_IDS//,/ } | |
do | |
IFS=$'\t' read -r TITLE TEXT HTMLURL XMLURL <<< "$(get_podcast_by_id "$PODCAST_ID" "$FILENAME")" | |
echo "1. [$TITLE]($HTMLURL) - [Feed]($XMLURL)" | |
done | |
fi | |
done < <(yq -p=xml ' .opml.body.outline[].outline[] | select ( .+type == "podcast-playlist") | select ( .+smart == "1") | [ .+title, .+smart, .+sorting, .+includePodcastIds, .+priorityPodcastIds, .+includeEpisodeIds, .+sortedEpisodeIds ] | @tsv ' "$FILENAME" | tee overcast2.yml ) | |
} | |
#parse_standard "md" overcast.opml | |
parse_extended "md" overcast.opml |