From 27ae3b64040f8b27d8f3eebbe0d5a397faa8dff2 Mon Sep 17 00:00:00 2001 From: Fey Naomi Schrewe Date: Fri, 3 Oct 2025 13:24:15 +0200 Subject: [PATCH] feat: add conservation effort from edn --- conservation.edn | 1 + deps.edn | 3 +- src/core.clj | 132 +++++++++++++++++++++++++++-------------------- src/wikidata.clj | 1 - 4 files changed, 79 insertions(+), 58 deletions(-) create mode 100644 conservation.edn diff --git a/conservation.edn b/conservation.edn new file mode 100644 index 0000000..4e5c734 --- /dev/null +++ b/conservation.edn @@ -0,0 +1 @@ +{"Serinus serinus" {:neobiota false, :status :common, :name {:de "Girlitz"}}, "Chlidonias hybrida" {:neobiota false, :status :extremely-rare, :name {:de "Weißbart-Seeschwalbe"}}, "Circaetus gallicus" {:neobiota false, :status :extinct, :name {:de "Schlangenadler"}}, "Coturnix coturnix" {:neobiota false, :status :somewhat-common, :name {:de "Wachtel"}}, "Carpodacus erythrinus" {:neobiota false, :status :very-rare, :name {:de "Karmingimpel"}}, "Parus caeruleus Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Blaumeise"}}, "Arenaria interpres" {:neobiota false, :status :extremely-rare, :name {:de "Steinwälzer"}}, "Anthus trivialis" {:neobiota false, :status :common, :name {:de "Baumpieper"}}, "Anas crecca Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Krickente"}}, "Tetrao tetrix Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Birkhuhn"}}, "Botaurus stellaris" {:neobiota false, :status :rare, :name {:de "Rohrdommel"}}, "Coracias garrulus Linnaeus, 1758" {:neobiota false, :status :extinct, :name {:de "Blauracke"}}, "Anas strepera Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Schnatterente"}}, "Pica pica" {:neobiota false, :status :common, :name {:de "Elster"}}, "Larus canus Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Sturmmöwe"}}, "Tetrastes bonasia" {:neobiota false, :status :rare, :name {:de "Haselhuhn"}}, "Parus palustris Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Sumpfmeise"}}, "Sylvia curruca" {:neobiota false, :status :common, :name {:de "Klappergrasmücke"}}, "Coccothraustes coccothraustes" {:neobiota false, :status :common, :name {:de "Kernbeißer"}}, "Aythya ferina" {:neobiota false, :status :rare, :name {:de "Tafelente"}}, "Sylvia borin" {:neobiota false, :status :common, :name {:de "Gartengrasmücke"}}, "Hirundo rustica Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Rauchschwalbe"}}, "Asio flammeus" {:neobiota false, :status :very-rare, :name {:de "Sumpfohreule"}}, "Certhia familiaris Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Waldbaumläufer"}}, "Carduelis spinus" {:neobiota false, :status :somewhat-common, :name {:de "Erlenzeisig"}}, "Regulus ignicapilla" {:neobiota false, :status :common, :name {:de "Sommergoldhähnchen"}}, "Dendrocopos leucotos" {:neobiota false, :status :very-rare, :name {:de "Weißrückenspecht"}}, "Phoenicurus ochruros" {:neobiota false, :status :common, :name {:de "Hausrotschwanz"}}, "Sylvia atricapilla" {:neobiota false, :status :common, :name {:de "Mönchsgrasmücke"}}, "Fringilla coelebs Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Buchfink"}}, "Aythya fuligula" {:neobiota false, :status :somewhat-common, :name {:de "Reiherente"}}, "Haliaeetus albicilla" {:neobiota false, :status :very-rare, :name {:de "Seeadler"}}, "Tringa totanus" {:neobiota false, :status :somewhat-common, :name {:de "Rotschenkel"}}, "Circus cyaneus" {:neobiota false, :status :extremely-rare, :name {:de "Kornweihe"}}, "Oenanthe oenanthe" {:neobiota false, :status :rare, :name {:de "Steinschmätzer"}}, "Lanius senator Linnaeus, 1758" {:neobiota false, :status :extremely-rare, :name {:de "Rotkopfwürger"}}, "Charadrius alexandrinus Linnaeus, 1758" {:neobiota false, :status :extremely-rare, :name {:de "Seeregenpfeifer"}}, "Phoenicopterus ruber Linnaeus, 1758" {:neobiota true, :status :not-evaluated, :name {:de "Kubaflamingo"}}, "Corvus frugilegus Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Saatkrähe"}}, "Sterna sandvicensis Latham, 1787" {:neobiota false, :status :extremely-rare, :name {:de "Brandseeschwalbe"}}, "Uria aalge" {:neobiota false, :status :extremely-rare, :name {:de "Trottellumme"}}, "Locustella fluviatilis" {:neobiota false, :status :rare, :name {:de "Schlagschwirl"}}, "Sterna hirundo Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Flussseeschwalbe"}}, "Ardea purpurea Linnaeus, 1766" {:neobiota false, :status :extremely-rare, :name {:de "Purpurreiher"}}, "Passer montanus" {:neobiota false, :status :common, :name {:de "Feldsperling"}}, "Picus canus J.F. Gmelin, 1788" {:neobiota false, :status :somewhat-common, :name {:de "Grauspecht"}}, "Phylloscopus trochiloides" {:neobiota false, :status :extremely-rare, :name {:de "Grünlaubsänger"}}, "Athene noctua" {:neobiota false, :status :rare, :name {:de "Steinkauz"}}, "Prunella modularis" {:neobiota false, :status :common, :name {:de "Heckenbraunelle"}}, "Podiceps grisegena" {:neobiota false, :status :rare, :name {:de "Rothalstaucher"}}, "Columba livia f. domestica J.F. Gmelin, 1789" {:neobiota true, :status :not-evaluated, :name {:de "Straßentaube"}}, "Loxia curvirostra Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Fichtenkreuzschnabel"}}, "Larus melanocephalus Temminck, 1820" {:neobiota false, :status :very-rare, :name {:de "Schwarzkopfmöwe"}}, "Delichon urbicum" {:neobiota false, :status :common, :name {:de "Mehlschwalbe"}}, "Sylvia nisoria" {:neobiota false, :status :rare, :name {:de "Sperbergrasmücke"}}, "Phylloscopus trochilus" {:neobiota false, :status :common, :name {:de "Fitis"}}, "Emberiza cia Linnaeus, 1766" {:neobiota false, :status :very-rare, :name {:de "Zippammer"}}, "Parus montanus Conrad von Baldenstein, 1827" {:neobiota false, :status :common, :name {:de "Weidenmeise"}}, "Meleagris gallopavo Linnaeus, 1758" {:neobiota true, :status :not-evaluated, :name {:de "Truthuhn"}}, "Fratercula arctica" {:neobiota false, :status :extinct, :name {:de "Papageitaucher"}}, "Lanius collurio Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Neuntöter"}}, "Lanius excubitor Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Raubwürger"}}, "Falco peregrinus Tunstall, 1771" {:neobiota false, :status :rare, :name {:de "Wanderfalke"}}, "Chlidonias niger" {:neobiota false, :status :very-rare, :name {:de "Trauerseeschwalbe"}}, "Larus marinus Linnaeus, 1758" {:neobiota false, :status :very-rare, :name {:de "Mantelmöwe"}}, "Rallus aquaticus Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Wasserralle"}}, "Tringa glareola Linnaeus, 1758" {:neobiota false, :status :extremely-rare, :name {:de "Bruchwasserläufer"}}, "Aegolius funereus" {:neobiota false, :status :rare, :name {:de "Raufußkauz"}}, "Alopochen aegyptiaca" {:neobiota true, :status :not-evaluated, :name {:de "Nilgans"}}, "Gallinago media" {:neobiota false, :status :extinct, :name {:de "Doppelschnepfe"}}, "Podiceps auritus" {:neobiota false, :status :extremely-rare, :name {:de "Ohrentaucher"}}, "Emberiza cirlus Linnaeus, 1766" {:neobiota false, :status :very-rare, :name {:de "Zaunammer"}}, "Apus apus" {:neobiota false, :status :common, :name {:de "Mauersegler"}}, "Motacilla cinerea Tunstall, 1771" {:neobiota false, :status :somewhat-common, :name {:de "Gebirgsstelze"}}, "Ficedula albicollis" {:neobiota false, :status :rare, :name {:de "Halsbandschnäpper"}}, "Haematopus ostralegus Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Austernfischer"}}, "Picoides tridactylus" {:neobiota false, :status :very-rare, :name {:de "Dreizehenspecht"}}, "Caprimulgus europaeus Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Ziegenmelker"}}, "Apus melba" {:neobiota false, :status :extremely-rare, :name {:de "Alpensegler"}}, "Fulica atra Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Blässhuhn"}}, "Acrocephalus schoenobaenus" {:neobiota false, :status :somewhat-common, :name {:de "Schilfrohrsänger"}}, "Netta rufina" {:neobiota false, :status :very-rare, :name {:de "Kolbenente"}}, "Gelochelidon nilotica J.F. Gmelin, 1789" {:neobiota false, :status :extremely-rare, :name {:de "Lachseeschwalbe"}}, "Merops apiaster" {:neobiota false, :status :very-rare, :name {:de "Bienenfresser"}}, "Phoenicopterus chilensis Molina, 1782" {:neobiota true, :status :not-evaluated, :name {:de "Chileflamingo"}}, "Calidris alpina" {:neobiota false, :status :extremely-rare, :name {:de "Alpenstrandläufer"}}, "Alcedo atthis" {:neobiota false, :status :somewhat-common, :name {:de "Eisvogel"}}, "Vanellus vanellus" {:neobiota false, :status :somewhat-common, :name {:de "Kiebitz"}}, "Hydroprogne caspia" {:neobiota false, :status :extremely-rare, :name {:de "Raubseeschwalbe"}}, "Glaucidium passerinum" {:neobiota false, :status :rare, :name {:de "Sperlingskauz"}}, "Anas clypeata Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Löffelente"}}, "Tachybaptus ruficollis" {:neobiota false, :status :somewhat-common, :name {:de "Zwergtaucher"}}, "Garrulus glandarius" {:neobiota false, :status :common, :name {:de "Eichelhäher"}}, "Mergus merganser Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Gänsesäger"}}, "Carduelis cannabina" {:neobiota false, :status :common, :name {:de "Bluthänfling"}}, "Emberiza hortulana Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Ortolan"}}, "Anthus spinoletta" {:neobiota false, :status :rare, :name {:de "Bergpieper"}}, "Aix galericulata" {:neobiota true, :status :not-evaluated, :name {:de "Mandarinente"}}, "Turdus merula Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Amsel"}}, "Streptopelia decaocto" {:neobiota false, :status :common, :name {:de "Türkentaube"}}, "Sitta europaea Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Kleiber"}}, "Locustella naevia" {:neobiota false, :status :somewhat-common, :name {:de "Feldschwirl"}}, "Carduelis citrinella" {:neobiota false, :status :very-rare, :name {:de "Zitronenzeisig"}}, "Ficedula parva" {:neobiota false, :status :rare, :name {:de "Zwergschnäpper"}}, "Locustella luscinioides" {:neobiota false, :status :rare, :name {:de "Rohrschwirl"}}, "Columba oenas Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Hohltaube"}}, "Regulus regulus" {:neobiota false, :status :common, :name {:de "Wintergoldhähnchen"}}, "Motacilla yarrellii Gould, 1837" {:neobiota false, :status :extremely-rare, :name {:de "Trauerbachstelze"}}, "Anser caerulescens" {:neobiota true, :status :not-evaluated, :name {:de "Schneegans"}}, "Riparia riparia" {:neobiota false, :status :common, :name {:de "Uferschwalbe"}}, "Alca torda Linnaeus, 1758" {:neobiota false, :status :extremely-rare, :name {:de "Tordalk"}}, "Psittacula krameri" {:neobiota true, :status :not-evaluated, :name {:de "Halsbandsittich"}}, "Lullula arborea" {:neobiota false, :status :somewhat-common, :name {:de "Heidelerche"}}, "Nucifraga caryocatactes" {:neobiota false, :status :rare, :name {:de "Tannenhäher"}}, "Emberiza calandra Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Grauammer"}}, "Scolopax rusticola Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Waldschnepfe"}}, "Ciconia nigra" {:neobiota false, :status :very-rare, :name {:de "Schwarzstorch"}}, "Cuculus canorus Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Kuckuck"}}, "Somateria mollissima" {:neobiota false, :status :rare, :name {:de "Eiderente"}}, "Fulmarus glacialis" {:neobiota false, :status :extremely-rare, :name {:de "Eissturmvogel"}}, "Aquila pomarina C.L. Brehm, 1831" {:neobiota false, :status :very-rare, :name {:de "Schreiadler"}}, "Pandion haliaetus" {:neobiota false, :status :very-rare, :name {:de "Fischadler"}}, "Lagopus muta" {:neobiota false, :status :extremely-rare, :name {:de "Alpenschneehuhn"}}, "Gallinula chloropus" {:neobiota false, :status :somewhat-common, :name {:de "Teichhuhn"}}, "Crex crex" {:neobiota false, :status :rare, :name {:de "Wachtelkönig"}}, "Platalea leucorodia Linnaeus, 1758" {:neobiota false, :status :extremely-rare, :name {:de "Löffler"}}, "Philomachus pugnax" {:neobiota false, :status :extremely-rare, :name {:de "Kampfläufer"}}, "Grus grus" {:neobiota false, :status :rare, :name {:de "Kranich"}}, "Dendrocopos medius" {:neobiota false, :status :somewhat-common, :name {:de "Mittelspecht"}}, "Larus cachinnans Pallas, 1811" {:neobiota false, :status :extremely-rare, :name {:de "Steppenmöwe"}}, "Branta leucopsis" {:neobiota false, :status :very-rare, :name {:de "Weißwangengans"}}, "Psittacula eupatria" {:neobiota true, :status :not-evaluated, :name {:de "Alexandersittich"}}, "Erithacus rubecula" {:neobiota false, :status :common, :name {:de "Rotkehlchen"}}, "Burhinus oedicnemus" {:neobiota false, :status :extinct, :name {:de "Triel"}}, "Podiceps nigricollis C.L. Brehm, 1831" {:neobiota false, :status :rare, :name {:de "Schwarzhalstaucher"}}, "Remiz pendulinus" {:neobiota false, :status :rare, :name {:de "Beutelmeise"}}, "Motacilla flava Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Wiesenschafstelze"}}, "Sternula albifrons" {:neobiota false, :status :very-rare, :name {:de "Zwergseeschwalbe"}}, "Aix sponsa" {:neobiota true, :status :not-evaluated, :name {:de "Brautente"}}, "Petronia petronia" {:neobiota false, :status :extinct, :name {:de "Steinsperling"}}, "Sturnus vulgaris Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Star"}}, "Aegithalos caudatus" {:neobiota false, :status :common, :name {:de "Schwanzmeise"}}, "Pernis apivorus" {:neobiota false, :status :rare, :name {:de "Wespenbussard"}}, "Sterna dougallii Montagu, 1813" {:neobiota false, :status :extinct, :name {:de "Rosenseeschwalbe"}}, "Emberiza citrinella Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Goldammer"}}, "Motacilla alba Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Bachstelze"}}, "Tadorna ferruginea" {:neobiota true, :status :not-evaluated, :name {:de "Rostgans"}}, "Rhea americana" {:neobiota true, :status :not-evaluated, :name {:de "Nandu"}}, "Muscicapa striata" {:neobiota false, :status :common, :name {:de "Grauschnäpper"}}, "Anser indicus" {:neobiota true, :status :not-evaluated, :name {:de "Streifengans"}}, "Monticola saxatilis" {:neobiota false, :status :extremely-rare, :name {:de "Steinrötel"}}, "Porzana pusilla" {:neobiota false, :status :extremely-rare, :name {:de "Zwergsumpfhuhn"}}, "Pluvialis apricaria" {:neobiota false, :status :extremely-rare, :name {:de "Goldregenpfeifer"}}, "Ptyonoprogne rupestris" {:neobiota false, :status :extremely-rare, :name {:de "Felsenschwalbe"}}, "Sylvia communis Latham, 1787" {:neobiota false, :status :common, :name {:de "Dorngrasmücke"}}, "Luscinia megarhynchos C.L. Brehm, 1831" {:neobiota false, :status :somewhat-common, :name {:de "Nachtigall"}}, "Bucephala clangula" {:neobiota false, :status :rare, :name {:de "Schellente"}}, "Carduelis flammea" {:neobiota false, :status :somewhat-common, :name {:de "Birkenzeisig"}}, "Limosa limosa" {:neobiota false, :status :rare, :name {:de "Uferschnepfe"}}, "Turdus pilaris Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Wacholderdrossel"}}, "Dryobates minor" {:neobiota false, :status :somewhat-common, :name {:de "Kleinspecht"}}, "Emberiza schoeniclus" {:neobiota false, :status :common, :name {:de "Rohrammer"}}, "Acrocephalus scirpaceus" {:neobiota false, :status :common, :name {:de "Teichrohrsänger"}}, "Strix uralensis Pallas, 1771" {:neobiota false, :status :extremely-rare, :name {:de "Habichtskauz"}}, "Motacilla flavissima" {:neobiota false, :status :extremely-rare, :name {:de "Gelbkopf-Schafstelze"}}, "Aythya marila" {:neobiota false, :status :extremely-rare, :name {:de "Bergente"}}, "Alectoris graeca" {:neobiota false, :status :extremely-rare, :name {:de "Steinhuhn"}}, "Milvus migrans" {:neobiota false, :status :rare, :name {:de "Schwarzmilan"}}, "Hippolais icterina" {:neobiota false, :status :common, :name {:de "Gelbspötter"}}, "Phylloscopus bonelli" {:neobiota false, :status :rare, :name {:de "Berglaubsänger"}}, "Cygnus olor" {:neobiota false, :status :somewhat-common, :name {:de "Höckerschwan"}}, "Certhia brachydactyla C.L. Brehm, 1820" {:neobiota false, :status :common, :name {:de "Gartenbaumläufer"}}, "Galerida cristata" {:neobiota false, :status :rare, :name {:de "Haubenlerche"}}, "Ciconia ciconia" {:neobiota false, :status :rare, :name {:de "Weißstorch"}}, "Panurus biarmicus" {:neobiota false, :status :rare, :name {:de "Bartmeise"}}, "Luscinia luscinia" {:neobiota false, :status :somewhat-common, :name {:de "Sprosser"}}, "Anser anser" {:neobiota false, :status :somewhat-common, :name {:de "Graugans"}}, "Buteo buteo" {:neobiota false, :status :common, :name {:de "Mäusebussard"}}, "Carduelis carduelis" {:neobiota false, :status :common, :name {:de "Stieglitz"}}, "Lanius minor J.F. Gmelin, 1788" {:neobiota false, :status :extinct, :name {:de "Schwarzstirnwürger"}}, "Recurvirostra avosetta Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Säbelschnäbler"}}, "Picus viridis Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Grünspecht"}}, "Phylloscopus collybita" {:neobiota false, :status :common, :name {:de "Zilpzalp"}}, "Chlidonias leucopterus" {:neobiota false, :status :extremely-rare, :name {:de "Weißflügel-Seeschwalbe"}}, "Cygnus atratus" {:neobiota true, :status :not-evaluated, :name {:de "Schwarzschwan"}}, "Larus michahellis J.F. Naumann, 1840" {:neobiota false, :status :very-rare, :name {:de "Mittelmeermöwe"}}, "Aquila clanga Pallas, 1811" {:neobiota false, :status :extremely-rare, :name {:de "Schelladler"}}, "Anthus campestris" {:neobiota false, :status :rare, :name {:de "Brachpieper"}}, "Pyrrhula pyrrhula" {:neobiota false, :status :common, :name {:de "Gimpel"}}, "Gallinago gallinago" {:neobiota false, :status :rare, :name {:de "Bekassine"}}, "Cinclus cinclus" {:neobiota false, :status :somewhat-common, :name {:de "Wasseramsel"}}, "Geronticus eremita" {:neobiota false, :status :extinct, :name {:de "Waldrapp"}}, "Ixobrychus minutus" {:neobiota false, :status :very-rare, :name {:de "Zwergdommel"}}, "Turdus torquatus Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Ringdrossel"}}, "Porzana porzana" {:neobiota false, :status :rare, :name {:de "Tüpfelsumpfhuhn"}}, "Podiceps cristatus" {:neobiota false, :status :somewhat-common, :name {:de "Haubentaucher"}}, "Perdix perdix" {:neobiota false, :status :somewhat-common, :name {:de "Rebhuhn"}}, "Luscinia svecica" {:neobiota false, :status :somewhat-common, :name {:de "Blaukehlchen"}}, "Mergus serrator Linnaeus, 1758" {:neobiota false, :status :very-rare, :name {:de "Mittelsäger"}}, "Corvus cornix Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Nebelkrähe"}}, "Falco subbuteo Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Baumfalke"}}, "Tetrax tetrax" {:neobiota false, :status :extinct, :name {:de "Zwergtrappe"}}, "Phoenicopterus roseus Pallas, 1811" {:neobiota true, :status :not-evaluated, :name {:de "Rosaflamingo"}}, "Otus scops" {:neobiota false, :status :extremely-rare, :name {:de "Zwergohreule"}}, "Parus major Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Kohlmeise"}}, "Circus pygargus" {:neobiota false, :status :very-rare, :name {:de "Wiesenweihe"}}, "Gyps fulvus" {:neobiota false, :status :extinct, :name {:de "Gänsegeier"}}, "Parus ater Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Tannenmeise"}}, "Tichodroma muraria" {:neobiota false, :status :extremely-rare, :name {:de "Mauerläufer"}}, "Strix aluco Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Waldkauz"}}, "Corvus corone Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Rabenkrähe"}}, "Circus aeruginosus" {:neobiota false, :status :rare, :name {:de "Rohrweihe"}}, "Cygnus cygnus" {:neobiota false, :status :extremely-rare, :name {:de "Singschwan"}}, "Acrocephalus arundinaceus" {:neobiota false, :status :somewhat-common, :name {:de "Drosselrohrsänger"}}, "Aquila chrysaetos" {:neobiota false, :status :extremely-rare, :name {:de "Steinadler"}}, "Accipiter gentilis" {:neobiota false, :status :somewhat-common, :name {:de "Habicht"}}, "Pyrrhocorax graculus" {:neobiota false, :status :extremely-rare, :name {:de "Alpendohle"}}, "Dryocopus martius" {:neobiota false, :status :somewhat-common, :name {:de "Schwarzspecht"}}, "Jynx torquilla Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Wendehals"}}, "Rissa tridactyla" {:neobiota false, :status :extremely-rare, :name {:de "Dreizehenmöwe"}}, "Oriolus oriolus" {:neobiota false, :status :somewhat-common, :name {:de "Pirol"}}, "Hydrocoloeus minutus" {:neobiota false, :status :extremely-rare, :name {:de "Zwergmöwe"}}, "Anthus pratensis" {:neobiota false, :status :somewhat-common, :name {:de "Wiesenpieper"}}, "Anas acuta Linnaeus, 1758" {:neobiota false, :status :very-rare, :name {:de "Spießente"}}, "Ficedula hypoleuca" {:neobiota false, :status :somewhat-common, :name {:de "Trauerschnäpper"}}, "Charadrius morinellus Linnaeus, 1758" {:neobiota false, :status :extinct, :name {:de "Mornellregenpfeifer"}}, "Accipiter nisus" {:neobiota false, :status :somewhat-common, :name {:de "Sperber"}}, "Branta canadensis" {:neobiota true, :status :not-evaluated, :name {:de "Kanadagans"}}, "Acrocephalus paludicola" {:neobiota false, :status :extremely-rare, :name {:de "Seggenrohrsänger"}}, "Phasianus colchicus Linnaeus, 1758" {:neobiota true, :status :not-evaluated, :name {:de "Jagdfasan"}}, "Larus ridibundus Linnaeus, 1766" {:neobiota false, :status :common, :name {:de "Lachmöwe"}}, "Phylloscopus sibilatrix" {:neobiota false, :status :common, :name {:de "Waldlaubsänger"}}, "Nycticorax nycticorax" {:neobiota false, :status :extremely-rare, :name {:de "Nachtreiher"}}, "Phalacrocorax carbo" {:neobiota false, :status :somewhat-common, :name {:de "Kormoran"}}, "Larus argentatus Pontoppidan, 1763" {:neobiota false, :status :somewhat-common, :name {:de "Silbermöwe"}}, "Tyto alba" {:neobiota false, :status :somewhat-common, :name {:de "Schleiereule"}}, "Phoenicurus phoenicurus" {:neobiota false, :status :somewhat-common, :name {:de "Gartenrotschwanz"}}, "Acrocephalus palustris" {:neobiota false, :status :common, :name {:de "Sumpfrohrsänger"}}, "Numenius arquata" {:neobiota false, :status :rare, :name {:de "Großer Brachvogel"}}, "Aythya nyroca" {:neobiota false, :status :extremely-rare, :name {:de "Moorente"}}, "Charadrius dubius Scopoli, 1786" {:neobiota false, :status :rare, :name {:de "Flussregenpfeifer"}}, "Sula bassana" {:neobiota false, :status :extremely-rare, :name {:de "Basstölpel"}}, "Anas penelope Linnaeus, 1758" {:neobiota false, :status :extremely-rare, :name {:de "Pfeifente"}}, "Milvus milvus" {:neobiota false, :status :somewhat-common, :name {:de "Rotmilan"}}, "Bubo bubo" {:neobiota false, :status :rare, :name {:de "Uhu"}}, "Corvus corax Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Kolkrabe"}}, "Ardea cinerea Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Graureiher"}}, "Asio otus" {:neobiota false, :status :somewhat-common, :name {:de "Waldohreule"}}, "Sterna paradisaea Pontoppidan, 1763" {:neobiota false, :status :rare, :name {:de "Küstenseeschwalbe"}}, "Parus cristatus Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Haubenmeise"}}, "Dendrocopos major" {:neobiota false, :status :common, :name {:de "Buntspecht"}}, "Turdus viscivorus Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Misteldrossel"}}, "Carduelis chloris" {:neobiota false, :status :common, :name {:de "Grünfink"}}, "Anas platyrhynchos Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Stockente"}}, "Tetrao urogallus Linnaeus, 1758" {:neobiota false, :status :very-rare, :name {:de "Auerhuhn"}}, "Anser cygnoides" {:neobiota true, :status :not-evaluated, :name {:de "Schwanengans"}}, "Coloeus monedula" {:neobiota false, :status :common, :name {:de "Dohle"}}, "Larus fuscus Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Heringsmöwe"}}, "Alauda arvensis Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Feldlerche"}}, "Upupa epops Linnaeus, 1758" {:neobiota false, :status :very-rare, :name {:de "Wiedehopf"}}, "Streptopelia turtur" {:neobiota false, :status :somewhat-common, :name {:de "Turteltaube"}}, "Columba palumbus Linnaeus, 1758" {:neobiota false, :status :common, :name {:de "Ringeltaube"}}, "Hippolais polyglotta" {:neobiota false, :status :very-rare, :name {:de "Orpheusspötter"}}, "Amazona oratrix Ridgway, 1887" {:neobiota true, :status :not-evaluated, :name {:de "Gelbkopfamazone"}}, "Troglodytes troglodytes" {:neobiota false, :status :common, :name {:de "Zaunkönig"}}, "Turdus philomelos C.L. Brehm, 1831" {:neobiota false, :status :common, :name {:de "Singdrossel"}}, "Montifringilla nivalis" {:neobiota false, :status :extremely-rare, :name {:de "Schneesperling"}}, "Tadorna tadorna" {:neobiota false, :status :rare, :name {:de "Brandgans"}}, "Anas querquedula Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Knäkente"}}, "Prunella collaris" {:neobiota false, :status :extremely-rare, :name {:de "Alpenbraunelle"}}, "Actitis hypoleucos" {:neobiota false, :status :very-rare, :name {:de "Flussuferläufer"}}, "Otis tarda Linnaeus, 1758" {:neobiota false, :status :extremely-rare, :name {:de "Großtrappe"}}, "Alectoris rufa" {:neobiota false, :status :extinct, :name {:de "Rothuhn"}}, "Tringa ochropus Linnaeus, 1758" {:neobiota false, :status :rare, :name {:de "Waldwasserläufer"}}, "Passer domesticus" {:neobiota false, :status :common, :name {:de "Haussperling"}}, "Falco tinnunculus Linnaeus, 1758" {:neobiota false, :status :somewhat-common, :name {:de "Turmfalke"}}, "Callonetta leucophrys" {:neobiota true, :status :not-evaluated, :name {:de "Rotschulterente"}}, "Charadrius hiaticula Linnaeus, 1758" {:neobiota false, :status :very-rare, :name {:de "Sandregenpfeifer"}}, "Saxicola rubicola" {:neobiota false, :status :somewhat-common, :name {:de "Schwarzkehlchen"}}, "Saxicola rubetra" {:neobiota false, :status :somewhat-common, :name {:de "Braunkehlchen"}}, "Porzana parva" {:neobiota false, :status :very-rare, :name {:de "Kleines Sumpfhuhn"}}} \ No newline at end of file diff --git a/deps.edn b/deps.edn index 9ed0707..6405881 100644 --- a/deps.edn +++ b/deps.edn @@ -9,7 +9,8 @@ hiccup/hiccup {:mvn/version "2.0.0"} cheshire/cheshire {:mvn/version "6.1.0"} camel-snake-kebab/camel-snake-kebab {:mvn/version "0.4.3"} - io.github.paintparty/bling {:mvn/version "0.8.8"}} + io.github.paintparty/bling {:mvn/version "0.8.8"} + borkdude/edamame {:mvn/version "1.4.32"}} :aliases {:repl/conjure {:extra-deps {nrepl/nrepl {:mvn/version "1.0.0"} cider/cider-nrepl {:mvn/version "0.42.1"}} diff --git a/src/core.clj b/src/core.clj index 6db4309..97df23f 100644 --- a/src/core.clj +++ b/src/core.clj @@ -1,22 +1,27 @@ (ns core (:require - [bling.core :as bling] - [bling.hifi] - [cheshire.core :as json] - [clojure.java.io :refer [reader]] - [clojure.math :as math] - [clojure.string :refer [lower-case]] - [ebird] - [hiccup.page :refer [html5]] - [reitit.ring :as ring] - [ring.adapter.jetty] - [ring.logger :refer [wrap-with-logger]] - [ring.middleware.reload] - [wikidata :as wd])) + [bling.core :as bling] + [bling.hifi] + [cheshire.core :as json] + [clojure.java.io :refer [reader]] + [clojure.math :as math] + [clojure.string :refer [lower-case]] + [ebird] + [hiccup.page :refer [html5]] + [reitit.ring :as ring] + [ring.adapter.jetty] + [ring.logger :refer [wrap-with-logger]] + [ring.middleware.reload] + [edamame.core :as soy :refer [parse-next]] + [wikidata :as wd] + [clojure.core :as c])) (def known-species (atom {})) (def observations (atom [])) (def nearby (atom {})) +(def last-update (atom nil)) + +(def conservation-info (with-open [f (reader "./conservation.edn")] (parse-next (soy/reader f)))) (defn get-nearby [species] (let [species (lower-case (species :latin)) @@ -50,6 +55,7 @@ (let [body (json/parse-stream (reader (:body request)) true) birds (:birds body) now (java.time.LocalDateTime/now)] + (reset! last-update now) (add-observations birds now) {:status 200})) @@ -59,6 +65,7 @@ :certainty (apply max (map :certainty s)) :count (count s) :nearby (get-nearby bird) + :rote-liste (get-in conservation-info [(:latin bird) :status]) :first-seen (apply min (map #(.toEpochSecond (.atZone (:time %) (java.time.ZoneId/of "Europe/Berlin"))) s))})) (defn summarise-observations [observations since] @@ -104,51 +111,62 @@ "li.open::marker {content: '⚝ '; font-size: 1.2em; color:" (colours :blue) "}")] [:script {:type "text/javascript"} script] [:title "🐦 Vogel-Himbeere 🍓"]]) + +(defn template-concern* + ([colour-name key] (template-concern* colour-name nil key)) + ([colour-name ?background-colour key] + [:span {:style (str "color:" (colours colour-name) ";" (when ?background-colour (str "background-color:" (colours ?background-colour))))} + (str "(" key ")")])) (def template-concern - {:least-concern [:span {:style (str "color:" (colours :dark-green))} "(♪♪)"] - :near-threatened [:span {:style (str "color:" (colours :green))} "(♪)"] - :vulnerable [:span {:style (str "color:" (colours :yellow))} "(〜)"] - :endangered [:span {:style (str "color:" (colours :light-orange))} "(!)"] - :critical [:span {:style (str "color:" (colours :orange))} "(!!)"]}) -(defn template-observation [{bird :bird certainty :certainty count :count nearby :nearby}] + (-> {:common [:dark-green "♪♪"] + :least-concern [:dark-green "lc"] + :somewhat-common [:green "♪"] + :near-threatened [:green "nt"] + :rare [:text :yellow "〜"] + :vulnerable [:text :yellow "v"] + :very-rare [:light-orange "!"] + :endangered [:light-orange "e"] + :extremely-rare [:orange "!!"] + :critical [:orange "c"]} + (update-vals (partial apply template-concern*)))) +(defn template-observation [{bird :bird certainty :certainty count :count nearby :nearby concern :rote-liste}] (let [observation-count (:observation-count nearby)] - [:li.closed - {:onclick "onExpand(this)" - } - [:span {:style (when (or (not observation-count) (= 0 observation-count)) - "text-decoration-style:double;text-decoration-line:underline;text-decoration-skip-ink:all;")} - (or (get-in bird [:name :de]) - (ebird/get-name (:latin bird)) - (get-in bird [:name :en]))] - " " - [:span.latin - {:style (str - "font-variant: small-caps;" - "font-family: Cinzel;" - "font-weight: 600;" - "text-decoration-style: dashed;" - "text-decoration-line: underline;" - "color:" (:brown colours) ";")} - (:latin bird)] - " " - (template-concern (:iucn bird)) - [:div.info {:style "display: none;font-size: 0.8em;"} - (str (or observation-count "no") " nearby observations")] - [:br] - [:span.certainty - {:style (str - "font-size: 0.8em;" - "font-style: italic;")} - (str "Seen " count " times with maximum likelihood ") - [:span {:style (condp < certainty - 0.8 (str "color:" (:orange colours) ";") - 0.5 (str "color:" (:light-orange colours) ";") - nil)} (double (/ (math/round (* 10000 certainty)) 100.0))] - " %"]])) + [:li.closed + {:onclick "onExpand(this)"} + [:span {:style (when (or (not observation-count) (= 0 observation-count)) + "text-decoration-style:double;text-decoration-line:underline;text-decoration-skip-ink:all;")} + (or (get-in bird [:name :de]) + (ebird/get-name (:latin bird)) + (get-in bird [:name :en]))] + " " + [:span.latin + {:style (str + "font-variant: small-caps;" + "font-family: Cinzel;" + "font-weight: 600;" + "text-decoration-style: dashed;" + "text-decoration-line: underline;" + "color:" (:brown colours) ";")} + (:latin bird)] + " " + (template-concern (if (contains? template-concern concern) concern (:iucn bird))) + [:div.info {:style "display: none;font-size: 0.8em;"} + (str (or observation-count "no") " nearby observations")] + [:br] + [:span.certainty + {:style (str + "font-size: 0.8em;" + "font-style: italic;")} + (str "Seen " count " times with maximum likelihood ") + [:span {:style (condp < certainty + 0.8 (str "color:" (:orange colours) ";") + 0.5 (str "color:" (:light-orange colours) ";") + nil)} (double (/ (math/round (* 10000 certainty)) 100.0))] + " %"]])) +(def date-formatter (java.time.format.DateTimeFormatter/ofPattern "dd MMM HH:mm")) (defn list-observation [_] (let [since (.minusDays (java.time.LocalDateTime/now) 1) observations (summarise-observations @observations since)] - (print @nearby) {:status 200 :headers {"charset" "utf-8" "Content-Type" "text/html; charset=utf-8"} @@ -162,9 +180,11 @@ "font-family: \"B612 Mono\";" "background-color:" (:background colours) ";" "color:" (:text colours) ";")} - [:h1 "Birds today 🐦"] - [:ul - (map template-observation observations)]]))})) + [:h1 "Birds today 🐦" + [:span {:style (str "font-size:0.3em;margin-left:3em;color:" (colours :brown))} + (str "last updated " (if @last-update (.format @last-update date-formatter) "never"))]] + [:ul + (map template-observation observations)]]))})) (def router (wrap-with-logger diff --git a/src/wikidata.clj b/src/wikidata.clj index e2c5ff4..31072cb 100644 --- a/src/wikidata.clj +++ b/src/wikidata.clj @@ -39,7 +39,6 @@ (json/parse-string true) (:results) (:bindings))] - (print bindings) {:name (apply hash-map (flatten (map (fn [{name :name}] [(keyword (:xml:lang name)) (:value name)]) bindings))) :latin latin :iucn (concerns (get-in (first bindings) [:concern :value]))}))