This is a small script transforming and overcast export into a markdown table.

#! /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