warbo-utilities: 9ae0fa441d325c15c919f60403de869556b45122

     1: #!/usr/bin/env bash
     2: set -euo pipefail
     3: 
     4: ## For getting Meetup data
     5: 
     6: function getPage() {
     7:     FILE="$HOME/.meetup"
     8:     [[ -e "$FILE" ]] || {
     9:         echo "No '$FILE' file found, for meetup.com query URL" 1>&2
    10:         exit 1
    11:     }
    12:     QUERY=$(cat "$FILE")
    13:     [[ -n "$QUERY" ]] || {
    14:         echo "Couldn't find meetup.com search URL in '$FILE'" 1>&2
    15:         exit 2
    16:     }
    17:     wget -q -O- "$QUERY"
    18: }
    19: 
    20: function getEvents() {
    21:     GETRESULT='ul[contains(@class,"searchResults")]'
    22:     GETEVENT='div[@class="chunk"]//a[contains(@class, "event")]'
    23:     xidel -s - -e "//$GETRESULT//$GETEVENT/@href"
    24: }
    25: 
    26: function eventPage() {
    27:     SHA256=$(echo "$1" | sha256sum | cut -d ' ' -f1)
    28:     DIR="$HOME/.cache/meetup"
    29:     [[ -e "$DIR" ]] || mkdir -p "$DIR"
    30:     [[ -e "$DIR/$SHA256" ]] || {
    31:         wget -q -O "$DIR/$SHA256" "$1"
    32:     }
    33:     [[ -e "$DIR/$SHA256" ]] || {
    34:         echo "Couldn't get page '$1', aborting" 1>&2
    35:         exit 1
    36:     }
    37:     cat "$DIR/$SHA256"
    38: }
    39: 
    40: function getGroup() {
    41:     xidel - -s -e '//span[contains(@class, "event-info-group--groupName")]'
    42: }
    43: 
    44: function getName() {
    45:     xidel - -s -e '//h1'
    46: }
    47: 
    48: function getDate() {
    49:     MILLIS=$(xidel - -s -e '//time/@dateTime' | head -n1)
    50:     [[ -n "$MILLIS" ]] || {
    51:         echo "Couldn't get date in milliseconds since epoch" 1>&2
    52:         exit 1
    53:     }
    54:     echo $(( MILLIS / 1000 ))
    55: }
    56: 
    57: function getDetails() {
    58:     xidel - -s -e '//div[contains(@class, "event-description")]'
    59: }
    60: 
    61: ## Render RSS
    62: 
    63: function xmlEscape() {
    64:     # From https://stackoverflow.com/a/12873723/884682
    65:     sed 's/&/\&/g; s/</\</g; s/>/\>/g; s/"/\"/g; s/'"'"'/\'/g'
    66: }
    67: 
    68: function rssHeader() {
    69:     echo '<?xml version="1.0" encoding="utf-8"?>'
    70:     echo '<rss version="2.0">'
    71:       echo '<channel>'
    72:         echo '<title>MeetUp</title>'
    73:         echo '<link>https://meetup.com/</link>'
    74:         echo '<description>Scraped from MeetUp.com.</description>'
    75:         echo '<language>en</language>'
    76: }
    77: 
    78: function rssFooter() {
    79:       echo '</channel>'
    80:     echo '</rss>'
    81: }
    82: 
    83: function rssItem() {
    84:     # Arguments are:
    85:     #  $1 Event URL
    86:     #  $2 Event name
    87:     #  $3 Event group
    88:     #  $4 Event time (seconds since epoch)
    89:     #  $5 Event details
    90:       XURL=$(echo "$1"        | xmlEscape)
    91:     XTITLE=$(echo "$2"        | xmlEscape)
    92:     XGROUP=$(echo "$3"        | xmlEscape)
    93:      XTIME=$(date -R -d "@$4" | xmlEscape)
    94:      XDESC=$(echo "$5"        | xmlEscape)
    95: 
    96:     echo '<item>'
    97:       echo "<title>$XTITLE</title>"
    98:       echo "<link>$XURL</link>"
    99:       echo "<description>$XDESC</description>"
   100:       echo "<pubDate>$XTIME</pubDate>"
   101:       echo "<guid>$XURL</guid>"
   102:       echo "<author>$XGROUP</author>"
   103:     echo '</item>'
   104: }
   105: 
   106: ## Go!
   107: 
   108: EVENTS=$(getPage | getEvents)
   109: 
   110: rssHeader
   111: 
   112: while read -r EVENT
   113: do
   114:      PAGE=$(eventPage "$EVENT")
   115:     GROUP=$(echo "$PAGE" | getGroup  )
   116:      NAME=$(echo "$PAGE" | getName   )
   117:      DATE=$(echo "$PAGE" | getDate   )
   118:      DESC=$(echo "$PAGE" | getDetails)
   119: 
   120:     rssItem "$EVENT" "$NAME" "$GROUP" "$DATE" "$DESC"
   121: done < <(echo "$EVENTS")
   122: 
   123: rssFooter

Generated by git2html.