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.