Webserver for å servere podkaster. Se Confluence for generell info (intern link).
This new documentation is written primarily for internal usage and is therefore in Norwegian. The project itself is in English, though, as any code should be, so you may be able to find some details in the embedded documentation.
Hele applikasjonen er reorganisert. Mye av den samme koden er å finne igjen, men med en annen mappe- og filstruktur. Koden fungerer også annerledes, siden informasjon flyter på en måte som kan kalles "trickle down", i den forstand at ingen globale variabler aksesseres direkte, de blir i stedet gitt "ovenfra" gjennom funksjonsparametre. Dette gjør koden mer forutsigbar, lettere å forstå og modulær, man kan f. eks. bytte til en annen måte å hente innstillinger på uten å gjøre store endringer.
Formålet med reorganiseringen er å plassere mye av makta i view-koden som genererer feeden. Dermed kan koden der ta beslutninger som f. eks. hvilken pipeline som skal brukes, som er nødvendig for å lage egen Spotify-feed. Videre er innstillingene endret kraftig, slik at de er mye lettere å handskes med. Mesteparten av innstillingene har vi på Git, så overskriver man det man må lokalt.
For å migrere:
- oppdater filstiene i SystemD unit-fila (
src
som mappe formake
), - crontab (samme som for SystemD) og
- Nginx (static-mappa).
- Lag en ny virtualenv inne i
src
-mappa og - installer avhengighetene i
requirements.txt
-fila. - Migrer de lokale innstillingene fra
generator/settings.py
ogwebserver/settings.py
tilsettings.yaml
, skjønt de fleste er allerede migrert tilsettings.default.yaml
(les deg opp på innstillingene først). - Gi skrivetilgang til
src/static/images
for brukeren applikasjonen kjører som.
sudo yum install libxml2 libxml2-devel postgresql postgresql-server libxslt-devel libjpeg-turbo libjpeg-turbo-devel zlib-devel freetype-devel lcms2-devel libwebp-devel tcl tk postgresql-devel python3-devel
sudo apt install libxml2 libxml2-dev libxslt1.1 libxslt1-dev python3-lxml libpq-dev python3-dev libtiff5-dev libjpeg8-dev zlib1g-dev libfreetype6-dev libwebp-dev tcl8.5-dev tk8.5-dev
Generelt må du bare oppfylle kravene som stilles av pakkene i requirements-to-freeze.txt
.
-
Sett opp et virtualenv kalt
venv
inne isrc
:virtualenv -p python3.4 src/venv
-
Aktiver virtualenv:
. src/venv/bin/activate
-
Installer avhengigheter:
pip install -r src/requirements.txt
-
Lag en tom fil kalt
settings.yaml
, og overskriv følgende innstillinger frasettings.default.yaml
(se sistnevnte for format, du trenger ikke spesifisere andre innstillinger enn akkurat de du overskriver):- rest_api.url
- rest_api.user
- rest_api.password
- db.host
- db.port
- db.database
- db.user
- db.password
-
Sett opp uWSGI-innstillingene: Kopier
podkast.radiorevolt.no.template.ini
, endre filstien tilsocket
så den peker tildata
-mappen og lagre sompodkast.radiorevolt.no.ini
. -
Sett opp PostgreSQL-server ved hjelp av nyeste backup fra forrige eller kjørende instans av podkastapplikasjonen. Det skal også finnes en SQL-fil i dette repoet som kan brukes til utvikling, men bruker du det i prod risikerer vi at noen URLer som folk bruker slutter å fungere.
-
Sett opp egen bruker for podkastsystemet, som du deretter gir skrivetilgang til
data
-mappa ogsrc/static/images
-mappa. -
Bruk filene i
nginx
-mappa til å lage konfigurasjon for Nginx (webserver). -
Konfigurer automatisk oppstart og kjøring av webserver og gjentakende oppgave som prosesserer podkastbilder, gjennom SystemD.
-
Fra
systemd
-mappa, kopier filenpodkast.radiorevolt.no.template.service
tilpodkast.radiorevolt.no.service
, og fyll inn navn på den egne brukeren fra steg 7 og filsti til mappa der programmet er satt opp. -
Kopier filen
podkast.radiorevolt.no-images.template.service
tilpodkast.radiorevolt.no-images.service
og fyll inn på samme måte som i forrige steg. -
Kopier inn filene til SystemD:
sudo cp podkast.radiorevolt.no.service podkast.radiorevolt.no-images.{timer,service} /etc/systemd/system
-
Be SystemD om å laste filer på nytt:
sudo systemctl daemon-reload
-
Aktiver (så ting starter når maskinen starter) og kjør i gang:
sudo systemctl enable --now podkast.radiorevolt.no.service podkast.radiorevolt.no-images.timer
-
For utviklingsformål kan du kjøre app.py
direkte for å få en
utviklingsserver på port 5000 til vanlig (bruk --help
for å se tilgjengelige
innstillinger).
Ellers kan du bruker make
til å kjøre programmene, som aktiverer virtualenv og
kjører programmet i riktig mappe. make
kjører uWSGI-serveren (som Nginx kan
koble seg til), og make images
kjører skriptet som laster ned og behandler
programbilder. Bruk -C sti/til/podkast.radiorevolt.no/src
hvis du kjører make
fra en annen mappe enn
src/
.
En stor andel av Radio Revolts lyttere bruker podkaster til å konsumere innholdet vi lager. Det er derfor viktig for oss å gi dem en god opplevelse når de bruker podkastene. Samtidig flyttet vi fra et system der teknisk selv måtte gjøre manuelle endringer i Feedburner for å oppdatere metadata, og ønsket å tilby lytterne mer oppdaterte metadata.
Denne applikasjonen er skrevet for å kunne være Radio Revolts podkastløsning fra nå og for alltid. Dette er løst ved å ha en rekke filtre som tilføyer metadata til podkastene og deres episoder. Å legge til en ny kilde til metadata er så enkelt som å lage et nytt filter og sette det opp til å bli brukt. Dette er kanskje det som skiller denne podkastapplikasjonen mest fra alle andre.
En annen nyttig funksjon er automatisk omdirigering ved bytte av programnavn. Dette er gjort mulig med en database der alle tidligere URLer ligger inne, slik at vi kan omdirigere lyttere til den nye URLen. Et program kan dermed bytte navn uten at teknisk må røre en finger.
Programbilder lastes ned og serveres fra maskinen applikasjonen kjører på. De får hvit bakgrunn og blir gjort om til kvadrat-format, og skaleres til passende dimensjoner.
- Python v3.4
- uWSGI som lag mellom webserver (nginx) og applikasjonen
- sqlite som database for episode-URLer (dette er tenkt å endres)
- PostgreSQL som database for podkast-URLer
- SystemD for å kjøre tjenesten
- Et python-skript må kjøres jevnlig med cron
- Podkaster genereres med biblioteket PodGen
Utgangspunktet for innstillingene er fila settings.default.yaml
. Denne setter
nesten alle innstillingene som man kan sette, og har forklarende kommentarer.
De aller fleste innstillingene ligger her og skal endres gjennom Git.
Private innstillinger, som f. eks. innloggingsdetaljer til databasen, ligger i
settings.yaml
. Her kan man overskrive individuelle innstillinger fra
settings.default.yaml
. Det er ytterst få innstillinger som trengs å settes her,
men de som trenger det har som regel en tydelig placeholder-verdi i settings.default.yaml
(som f. eks. hackme
som brukernavn). Denne fila er ekskludert fra Git.
For å gi metadata til podkastene og deres episoder, benyttes en "pipe and filter"-arkitektur. Det innebærer at du har en rekke filtre på rad og rekke, og resultatet av det ene filteret gis til det neste.
I denne applikasjonen kalles filtrene for processors
. De prosesserer en
podkast eller en episode, og er arrangert i pipelines
, som er en rekke
processors arrangert i en rekkefølge. Du kan se for deg at du har rør som
podkastene og episodene går gjennom, og at du har processors som en del av
røret som gjør forandringer på innholdet som går gjennom det.
I innstillingene setter man opp disse pipelinene. Du lager ei liste over processors, og kan også inkludere en annen pipeline for å gjenbruke ressurser og innstillinger. Hver processor sine innstillinger kan man også sette globalt, for deretter å overskrive dem lokalt i pipelinen. Du kan også bestemme hvilke episoder og podkaster en pipeline skal arbeide på, ved å sette et dato-intervall og ved å spesifisere URLer eller Digas-IDer som ikke skal røres av processor-en.
Se forklaringen i episode_processors/README.md
for en praktisk tilnærming til
hvordan dette fungerer, og settings.default.yaml
for hvordan du setter opp
pipelines og processors i innstillingene.
- webserver.py
- Hovedapplikasjonens inngang. Orkestrerer og setter alt sammen.
- views/web_feed.py
- Generering av podkastene.
- init_globals.py
- Lager instanser av alle datakildene som brukes av webapplikasjonen. Dette gjøres både ved oppstart og når det har gått lang nok tid (trigges av webserver.py).
- feed_utils/init_pipelines.py
- Setter opp pipelines (pipe-and-filter arkitektur) for å prosessere podkaster og episoder.
- utils/settings_loader.py
- Laster inn innstillingene, by default fra settings.default.yaml og settings.yaml. Har muligheter til å utvides med andre måter å finne innstillinger på.
- process_images.py
- Skript som må kjøres jevnlig for å laste ned og behandle podkastbilder.
- episode_processors
- Processors som behandler episoder og noe infrastruktur rundt dette.
- feed_utils
- Diverse nyttige verktøy for å gjøre ting på feedene.
- show_processors
- Processors som behandler podkaster/programmer og noe infrastruktur rundt dette.
- static
- Diverse filer som serveres av Nginx direkte, under URIet
/static
. - utils
- Nyttige verktøy som ikke er direkte relatert til feeds eller webserveren.
- views
- Moduler og funksjoner som behandler HTTP-forespørsler.
- web_utils
- Nyttige verktøy for å håndtere URLer og webserver-delen av applikasjonen.
Kodestil: Google Python Coding Style Guide, inkludert pylint. Skjønt, sistnevnte har ikke vært brukt så lenge, så mye følger ikke helt standarden. Da tar man gjerne og gjør det finere rundt der man gjør endringer :)
- Jeg opplevde en gang på min lokale maskin at jeg fikk masse feil på feeds som
burde ha eksistert, og som du kunne se i databasen, men som ikke kom opp når du
søkte på navnet (men du fikk feil når programmet prøvde å legge til med samme
navn). Det tydet på at det var noe galt med indeksen, så jeg kjørte
reindex index slug_to_slug_pkey;
eller noe sånt (du kan kjøre\d slug_to_slug
for å se hva indeksen heter). Da funka ting igjen.