Skip to content

Instantly share code, notes, and snippets.

@tfrisk-old
Created February 3, 2017 11:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tfrisk-old/11d0c3f91f0a1ba827ecae8a378d7661 to your computer and use it in GitHub Desktop.
Save tfrisk-old/11d0c3f91f0a1ba827ecae8a378d7661 to your computer and use it in GitHub Desktop.
Finnkinon API-rajapinnan käsittelyä Clojurella
; Clojure-harjoituskoodi Finnkinon XML-rajapinnan lukemiseen.
; Tarkoitettu alunperin ClojureBridgeen osallistuneille oppilaille
; ohjelmoinnin jatkoharjoittelua varten.
(ns finnkino-api-lukija.core
(:require [clojure.xml :as xml])
(:gen-class))
; Käytettävän rajapinnan osoitteet
(def teatterit-api "http://www.finnkino.fi/xml/TheatreAreas/")
(def näytökset-api "http://www.finnkino.fi/xml/Schedule/")
; Apufunktio xml-parsintaan
(defn lue-raaka-xml [osoite]
(get (xml/parse osoite) :content))
; ##############################################################
; Lue teatterien tunnus/tekstitieto raaka-xml:stä
; XML on hieman työläs tiedostomuoto
;
; <TheatreArea><ID>1014</ID><Name>Pääkaupunkiseutu</Name></TheatreArea>
;
(defn lue-teatteri-tieto [teatteri]
(hash-map
:tunnus
(first (get (first (get teatteri :content)) :content))
:teatteri
(first (get (second (get teatteri :content)) :content))))
(def teatterit
(map lue-teatteri-tieto (lue-raaka-xml teatterit-api)))
(defn hae-teatteri [tunnus]
(filter
#(= (:tunnus %) tunnus)
teatterit))
(hae-teatteri "1019")
; ##############################################################
; Leffanäytökset
; Apufunktio xml:n datan parsintaan, helpottaa tietojen lukua lue-näytös-tieto funktiossa
(defn hae-elementti [data paikka]
(first (get (nth (get data :content) paikka) :content)))
; Luo genreistä Clojuren set-tietotyyppi, josta on myöhemmin helppo etsiä genrejä
; Alkuperäinen teksti pilkotaan pilkkujen kohdalta ja sen jälkeen trimmataan
; (poistetaan välilyönnit lopusta ja alusta)
(defn pilko-genret [teksti]
(set (map clojure.string/trim ; poista turhat välilyönnit
(clojure.string/split teksti #",")))) ; pilko ensin pilkkujen kohdalta
; Käsittele yksittäinen näytöstieto ja poimi vain tarvittavat xml-kentät
(defn lue-näytös-tieto [näytös]
(hash-map
:tunnus
(first (get (first (get näytös :content)) :content))
:pituus
(Integer/parseInt (hae-elementti näytös 18))
:nimi
(first (get (nth (get näytös :content) 15) :content))
:ikäraja
(hae-elementti näytös 20)
:teatteri
(hae-elementti näytös 27)
:genret
(pilko-genret (hae-elementti näytös 24))))
; Luetaan näytöstiedot yhteen "näytökset" muuttujaan
(def näytökset
(map lue-näytös-tieto (:content (second (lue-raaka-xml näytökset-api)))))
; Näytöksistä voidaan nyt suodattaa halutuilla hakutekijöillä
(filter
#(contains? (:genret %) "Perhe-elokuva") ; onko genret-setissä haluttu genre?
näytökset)
(filter
#(= (:teatteri %) "Flamingo, Vantaa")
näytökset)
; Suodatuksia voidaan myös yhdistää and-komennolla
(filter
#(and
(contains? (:genret %) "Perhe-elokuva")
(= (:teatteri %) "Tennispalatsi, Helsinki")
(< (:pituus %) 80)) ; pituus vähemmän kuin 80 minuuttia
näytökset)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment