Corrected for timezones and event duration. The script is now functional.
This commit is contained in:
parent
d5592be0cc
commit
ff2a0fd82b
12
README.md
12
README.md
@ -2,7 +2,13 @@
|
|||||||
|
|
||||||
## What does it do ?
|
## What does it do ?
|
||||||
|
|
||||||
_This short scripts parses an HTML page from the official WAOFF schedule webpage (http://www.weareoneglobalfestival.com/schedule) and parses it to create an iCalendar-formatted file, that you can directly import in your calendar app._
|
_This short scripts parses HTML pages from the official WAOFF schedule webpage (http://www.weareoneglobalfestival.com/schedule) in order to create an iCalendar-formatted file, that you can directly import in your calendar app._
|
||||||
|
|
||||||
|
Usage :
|
||||||
|
```bash
|
||||||
|
python3 parser.py
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
**Note** : the webpage is JS-based, which means you can't just `wget` it to extract the HTML page. You'll need to browse to the schedule page you want, go to the console, and type :
|
**Note** : the webpage is JS-based, which means you can't just `wget` it to extract the HTML page. You'll need to browse to the schedule page you want, go to the console, and type :
|
||||||
```js
|
```js
|
||||||
@ -10,7 +16,3 @@ console.log(document.getElementsByTagName('html')[0].innerHTML);
|
|||||||
```
|
```
|
||||||
, then copy-paste it to and html file locally, that you'll browse with the script.
|
, then copy-paste it to and html file locally, that you'll browse with the script.
|
||||||
|
|
||||||
## TODO
|
|
||||||
- [ ] fix the start time problem in the ICS file
|
|
||||||
- [ ] handle timezone (the time on the website is EST)
|
|
||||||
- [ ] interactive choice of HTML page and name of calendar
|
|
||||||
|
5
html/friday_05th.html
Normal file
5
html/friday_05th.html
Normal file
File diff suppressed because one or more lines are too long
13
html/friday_30th.html
Normal file
13
html/friday_30th.html
Normal file
File diff suppressed because one or more lines are too long
5
html/monday_01st.html
Normal file
5
html/monday_01st.html
Normal file
File diff suppressed because one or more lines are too long
9
html/saturday_06th.html
Normal file
9
html/saturday_06th.html
Normal file
File diff suppressed because one or more lines are too long
11
html/sunday_07th.html
Normal file
11
html/sunday_07th.html
Normal file
File diff suppressed because one or more lines are too long
9
html/sunday_31st.html
Normal file
9
html/sunday_31st.html
Normal file
File diff suppressed because one or more lines are too long
15
html/thursday_04th.html
Normal file
15
html/thursday_04th.html
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
7
html/tuesday_02nd.html
Normal file
7
html/tuesday_02nd.html
Normal file
File diff suppressed because one or more lines are too long
7
html/wednesday_03rd.html
Normal file
7
html/wednesday_03rd.html
Normal file
File diff suppressed because one or more lines are too long
49
parser.py
49
parser.py
@ -1,37 +1,56 @@
|
|||||||
from datetime import datetime
|
from datetime import datetime, timedelta
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
from icalendar import Calendar, Event
|
from icalendar import Calendar, Event
|
||||||
import pytz
|
from pytz import timezone
|
||||||
|
from os import listdir
|
||||||
|
|
||||||
|
html_dirname = input("In which dir are the html files ? (default : html/)")
|
||||||
|
html_dirname = html_dirname if html_dirname != "" else "html"
|
||||||
|
ics_filename = input("To which ICS file should I output ? (default : ./waoff-calendar.ics)")
|
||||||
|
ics_filename = ics_filename if ics_filename != "" else "waoff-calendar.ics"
|
||||||
|
local_tz = input("Which timezone should I place the events to ? (default : Europe/Paris)")
|
||||||
|
local_tz = timezone(local_tz) if local_tz != "" else timezone("Europe/Paris")
|
||||||
|
|
||||||
file = open('index.html', 'r')
|
|
||||||
page = file.read()
|
|
||||||
cal = Calendar()
|
cal = Calendar()
|
||||||
|
|
||||||
|
# takes an EST timezone and converts it to the local one
|
||||||
|
def convert_timezone(est_dt):
|
||||||
|
# if local timezone is Paris, correct for daylight saving time
|
||||||
|
if(local_tz == timezone("Europe/Paris")):
|
||||||
|
return est_dt.astimezone(local_tz) - timedelta(hours = 1)
|
||||||
|
return est_dt.astimezone(local_tz)
|
||||||
|
|
||||||
|
# adds calendar event for each film
|
||||||
def handleFilm(p) :
|
def handleFilm(p) :
|
||||||
title = p.find('a', {'class':'Film_title'})
|
title = p.find('a', {'class':'Film_title'})
|
||||||
print(title.string)
|
|
||||||
runtime = p.find('div', {'class':'Film_runtime'})
|
runtime = p.find('div', {'class':'Film_runtime'})
|
||||||
|
summary = p.find('div', {'class' : 'Film_summary'})
|
||||||
|
|
||||||
time = p.find('span', {'class': 'start_time'})
|
time = p.find('span', {'class': 'start_time'})
|
||||||
# Starts at 05:15 PM EST on May 29
|
|
||||||
time_formatted = datetime.strptime(time.string, "Starts at %I:%M %p EST on %B %d")
|
time_formatted = datetime.strptime(time.string, "Starts at %I:%M %p EST on %B %d")
|
||||||
time_formatted = time_formatted.replace(year=2020)
|
time_formatted = time_formatted.replace(year=2020)
|
||||||
tz_time = pytz.timezone('US/Eastern')
|
time_formatted = time_formatted.replace(tzinfo = timezone("EST"))
|
||||||
tz_time.localize(time_formatted)
|
time_formatted = convert_timezone(time_formatted)
|
||||||
print(time_formatted)
|
|
||||||
print("Europe : " + str(tz_time))
|
|
||||||
summary = p.find('div', {'class' : 'Film_summary'})
|
|
||||||
|
|
||||||
event = Event()
|
event = Event()
|
||||||
event.add('description', summary.string)
|
event.add('description', summary.string)
|
||||||
event.add('summary', title.string)
|
event.add('summary', title.string)
|
||||||
event.add('dtstart', time_formatted)
|
event.add('dtstart', time_formatted)
|
||||||
|
event.add('dtend', time_formatted + timedelta(hours = 1))
|
||||||
|
|
||||||
cal.add_component(event)
|
cal.add_component(event)
|
||||||
|
|
||||||
soup = BeautifulSoup(page)
|
# read every html file in the html directory
|
||||||
for p in soup.find_all('div', {'class': 'Film'}):
|
for filename in listdir(html_dirname):
|
||||||
handleFilm(p)
|
file = open(html_dirname + '/' + filename, 'r')
|
||||||
|
page = file.read()
|
||||||
|
soup = BeautifulSoup(page)
|
||||||
|
for p in soup.find_all('div', {'class': 'Film'}):
|
||||||
|
handleFilm(p)
|
||||||
|
|
||||||
f = open("waoff-calendar.ics", 'wb')
|
# write events to ics file
|
||||||
|
f = open(ics_filename, 'wb')
|
||||||
f.write(cal.to_ical())
|
f.write(cal.to_ical())
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
print("Done !")
|
||||||
|
@ -1,273 +0,0 @@
|
|||||||
BEGIN:VCALENDAR
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Alteration
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:When Alexandro volunteered for a dream experiment\, he never i
|
|
||||||
magined that he would be subjected to a form of Artificial Intelligence wh
|
|
||||||
o aims to digitize his subconscious.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Annecy Shorts for Families
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:None
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Bilby
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:This sweet short from DreamWorks Animation Studios finds a lon
|
|
||||||
esome bilby tangled up with a helpless baby bird in the deadly desert of A
|
|
||||||
ustralia.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Bird Karma
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:A crafty\, long-legged bird chases a mesmerizing fish through
|
|
||||||
a foggy pond in this sprightly short\, produced by DreamWorks Animation St
|
|
||||||
udios.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Bloodless
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:Portraying the final moments of a sex worker murdered by a US
|
|
||||||
soldier in South Korea\, this piece brings historical atrocities to light
|
|
||||||
through a concrete personal experience.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Crow: The Legend
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:The carefree animals imagine spring is endless. But when the v
|
|
||||||
ery first winter arrives\, can Crow (John Legend) make the ultimate sacrif
|
|
||||||
ice to save his friends?\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Daughters of Chibok
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:This VR experience deals with the aftermath of the kidnapping
|
|
||||||
of 276 schoolgirls in 2014 in Nigeria\, and explores topical global issues
|
|
||||||
of gender rights and the right to education.\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Extravaganza
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:A busy executive (Paul Scheer) tests a VR headset that promise
|
|
||||||
s to be the future of entertainment...but is actually anything but forward
|
|
||||||
thinking.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Ghost Fleet VR
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:This harrowing look at slavery in the Thai fishing industry is
|
|
||||||
told through the experience of one man's harrowing ordeal to escape a pri
|
|
||||||
son of water after 10 years at sea.\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Isle of the Dead
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:A timeless voyage from an everyday apartment toward our final
|
|
||||||
destination\, guided by Charon\, ferryman of the Underworld.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Ivory Burn
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:This film bears witness to the burning of over 100 tons of ele
|
|
||||||
phant tusks and rhinoceros horn: a symbolic and visceral clarion call to t
|
|
||||||
he poaching and illegal trade syndicates.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Jaws — Assembling a Top-Tier Team (feat. TierZoo)
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:This video essay by YouTube creators of Lessons From The Scree
|
|
||||||
nplay analyzes the classic blockbuster Jaws to examine how a screenwriter
|
|
||||||
can craft a dynamic team of characters.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Marooned
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:In this stylized DreamWorks Animation Studios short set in the
|
|
||||||
not-too-distant future\, a cantankerous and selfish robot is put to the t
|
|
||||||
est while stranded on an abandoned lunar outpost.\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Minotaur
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:A mythical passage through the archetypal hero’s journey. Th
|
|
||||||
rough abstractions\, we experience their corresponding emotional states: c
|
|
||||||
alm\, love\, joy\, surprise\, fear\, anger/hate\, and death/rebirth\, lead
|
|
||||||
ing again to calm.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:My Africa
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:This mixed-reality experience transports viewers to an elephan
|
|
||||||
t sanctuary in Kenya\, where a community is reknitting the bonds that have
|
|
||||||
long enabled people and wildlife to coexist.\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:On/Off
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:Behind the closed doors of an intensive care unit\, ON/OFF loo
|
|
||||||
ks at how difficult it is for healthcare professionals to confront and “
|
|
||||||
manage” death on a daily basis. \n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Passenger
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:This abstracted and dreamlike experience places you in the bac
|
|
||||||
kseat of a taxi\, and recreates the geographic and visual dislocation of f
|
|
||||||
inding a new home in a foreign land.\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Sébastien Tellier on Paris’ rooftop | A Take Away Show
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:French artist Sébastien Tellier serenades Paris from one of i
|
|
||||||
ts highest point of view: the roof of Le Théâtre du Châtelet\, in the h
|
|
||||||
eart of the city
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Step To The Line
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:Shot entirely in a maximum security prison\, this piece shows
|
|
||||||
how release from incarceration can be just as jarring as intake and how pa
|
|
||||||
rallel lives diverge when someone serves time.\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:The Stories That Prepared Us
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:A telling of the story of Coronavirus through moments in criti
|
|
||||||
cally-acclaimed film and television.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Traveling While Black
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:Confronting the way we understand and talk about race in Ameri
|
|
||||||
ca\, Traveling While Black immerses the viewer in the long history of rest
|
|
||||||
ricted movement for Black Americans. \n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:The Waiting Room
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T070000
|
|
||||||
DESCRIPTION:An unflinching record of Victoria Mapplebeck’s journey from
|
|
||||||
breast cancer diagnosis to recovery\, The Waiting Room considers what we c
|
|
||||||
an or can’t control when our bodies fail us. \n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:And Then The Bear
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T080000
|
|
||||||
DESCRIPTION:Houses will burn. Men and women will tremble. But the children
|
|
||||||
will come together and howl as they dance on the ashes like wild bears in
|
|
||||||
this vivid animation.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:The Distance Between Us And The Sky
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T080000
|
|
||||||
DESCRIPTION:In this Short Film Palme d’Or winner\, two strangers (Ioko I
|
|
||||||
oannis Kotidis\, Nikos Zeginogolu) meet one night at a gas station. One is
|
|
||||||
there to refuel\; the other is stranded.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:The Short Film Selection in Competition at the 72nd Festival de Ca
|
|
||||||
nnes: Program 2
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T080000
|
|
||||||
DESCRIPTION:None
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:White Echo
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T080000
|
|
||||||
DESCRIPTION:Chloë Sevigny’s ethereal séance-story sees a young woman\,
|
|
||||||
Carla (Kate Lyn Sheil)\, explore and wield her inner power while on vacat
|
|
||||||
ion with friends.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Cinema Cafe with Jackie Chan
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T093000
|
|
||||||
DESCRIPTION:Recorded live from the Sundance Film Festival\, each Cinema Ca
|
|
||||||
fé invigorates the culture of conversation. Our informal chats round up s
|
|
||||||
pecial guests for thought-provoking discussions between Festival filmmaker
|
|
||||||
s and journalists. Cinema Cafe with Jac...
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Losing Alice
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T104500
|
|
||||||
DESCRIPTION:Fascination spirals into Faustian bargain after an ambitious f
|
|
||||||
emale film director meets—and obsesses over—a younger femme-fatale scr
|
|
||||||
eenwriter.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Electric Swan
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T130000
|
|
||||||
DESCRIPTION:An apartment building in Buenos Aires begins to tremble and pr
|
|
||||||
ovokes an otherworldly nausea throughout the city in this magical realist
|
|
||||||
skewering of its class divisions.\n\n
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Crazy World
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T140000
|
|
||||||
DESCRIPTION:Pint-sized kung fu masters face off with the evil Tiger Mafia
|
|
||||||
in this action flick from Uganda's no-budget\, gonzo super-studio\, Wakali
|
|
||||||
wood.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Rudeboy: The Story of Trojan Records
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T153000
|
|
||||||
DESCRIPTION:Featuring Jamaican reggae and ska legends like Lee “Scratch
|
|
||||||
” Perry and Marcia Griffiths\, Rudeboy chronicles a multicultural revolu
|
|
||||||
tion on the dancefloors of late ’60s and early ’70s Britain.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Cru - Raw
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:A young chef (Jeanne Werne) must learn that in this kitchen\,
|
|
||||||
a lot of blood\, sweat\, and tears go into making every dish.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Egg
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:An action-packed romance and Americana western adventure about
|
|
||||||
an egg's epic Hollywood journey from farm to table.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:The Light Side
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:An aging Sith Lord must come to grips with his past and discov
|
|
||||||
er why humility may be the greatest force in the galaxy.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Motorcycle Drive By
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:Third Eye Blind cannot finish their new album in time for a ma
|
|
||||||
ssive tour. Their fans still show\, breaking attendance records\, and high
|
|
||||||
lighting the importance of the band's deep cuts.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:No More Wings
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:At a divergent point in their lives\, two lifelong friends (Iv
|
|
||||||
anno Jeremiah\, Parys Jordon) meet at their favorite South London fried ch
|
|
||||||
icken shop.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:TOTO
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:Rosa Forlano\, a 90 year old Nonna\, falls in love with a robo
|
|
||||||
t while teaching it how to make spaghetti. Unfortunately\, her family reci
|
|
||||||
pe is erased by a software update.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Tribeca 2020 Shorts Program
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:None
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:When I Write It
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T171500
|
|
||||||
DESCRIPTION:Two Oakland teens (Leila Mottley\, Ajai Kasim) explore what it
|
|
||||||
means to be young\, Black and committed to making art in their rapidly ch
|
|
||||||
anging city.
|
|
||||||
END:VEVENT
|
|
||||||
BEGIN:VEVENT
|
|
||||||
SUMMARY:Circus Person
|
|
||||||
DTSTART;VALUE=DATE-TIME:20200529T190500
|
|
||||||
DESCRIPTION:Left by her fiancé for another woman\, a grieving painter (Br
|
|
||||||
itt Lower) joins a one-ring circus to reclaim her forgotten wildness.
|
|
||||||
END:VEVENT
|
|
||||||
END:VCALENDAR
|
|
Loading…
Reference in New Issue
Block a user