Podcastit ja digitaalisen perinnön säilyminen

You are currently viewing Podcastit ja digitaalisen perinnön säilyminen

Ratkaisin, jollain tavalla, digitaalisen perinnön ja työn säilyvyyden viemällä Katiska.eu tekstisisällön GitHubiin. Mutta podcastien kohtaloa oli vielä työn alla. Mediasisällöille on keksittävä toinen tapa.

Hetzner ei ole vaihtoehto, ja podcastien MP3-tiedostot ovat jo siellä. Digitaalisen perinnön suhteen ongelma on tismalleen sama kuin sivuston kanssa: kuukausi siitä kun maksuja ei tule, niin kaikki tuhoutuu.

Valinnan vähyys

Koska media-tiedostot voivat olla suuria, niin säilytysvalikoima on heikko. Ainoat jotka minulle tulevat mieleen ovat SoundCloud ja Youtube. Eivät nekään ikuisia ole, ja palveluita kaatuu, puhumattakaan että Google on tunnettu nopeista liikkeistä palvelujen lopettamisessa.

SoundCloud on iso, mutta sen talous ei välttämättä ole vahvin mahdollinen. Youtube ja Google ovat giganttisia, eikä niiden loppuminen ole näköpiirissä.

SoundCloudiin saisi audiot suoraan ja Youtubeen ne olisi ensin muutettava videoiksi.

Podcast-palvelut, Spotify jne. eivät ole todellakaan vaihtoehto.

Mutta tarkoitukseni ei ole luoda suoraan käytettävää podcast-sivustoa. Haluan ne vain talteen, jos jotakuta joskus kiinnostaisi.

Joten laajensin etsintää.

Netin ja webin arkistot

Archive.org on tehty nimenomaan digitaalisen historian säilyttämiseen. Sinne voi tallentaa myös audioita, monen muun asian lisäksi — se oli yhtenä vaihtoehtona Katiskan sisällön tallentamiselle.

Minulla on Internet Archiven kanssa yksi periaatteellinen ongelma, joka ei sinällään liity mitenkään sen toimintaan. Se on siltä osin täysin oikeutettu ja tarpeellinen. Mutta se on kuitenkin sidottu Yhdysvaltojen poliittiseen tilanteeseen ja Trumpin aika on opettanut, että siellä mikä tahansa on mahdollista.

Joten alkoi kiinnostamaan enemmän eurooppalainen julkisrahoitettu vaihtoehto. Pidin mahdollisena, että moinen minun käyttööni sopiva olisi olemassa. EU pyrkii melkoisen aktiivisesti rikkomaan amerikkalaisten yksinvaltaisten giga-korporaatioiden monopiolia.

Zenado

EU-rahoitteisten palveluiden löytäminen ei kuitenkaan ole kovinkaan helppoa. Mutta yhden potentiaalisen vaihtoehdon löysin, Zenado.org. Hiukan mietitytti, että se vaikutti olevan vahvasti tiedejournalismiin kykeytyvä.

En ole koskaan kuullut siitä sanaakaan, joten ei sekään kovin vakuuttavaa kuvaa antanut. Mutta taas — se, että jokin ei näy kuplassani ei sinällään tarkoita mitään muuta kuin että en ole kuullut.

Hieman pintaa syvemmältä raapaisu osoitti, että tuon Cernin tekemän ja EU:n rahoittaman projektin tarkoitus on juurikin tiedon arkistointi, ei sen suora käyttö tai olla suoraan käyttövalmis sivustopalvelu sisällön kulutukselle. Hyvin erilainen lähestymistapa kuin amerikkalaisilla suuryrityksillä.

En ollut yllättynyt. Eurooppalaisilla on kuitenkin vahvempi henkinen asenne arkistointiin sekä säilyttämiseen kuin amerikkalaisilla. Tuo lienee perua siitä, että Yhdysvaltojen historia on hieman yli 200 vuotta, kun Euroopassa historia on huomattavasti pidempi, reippaasti yli 2000 vuotta, ja näkyy arkisesti kaduilla ja rakennuksissa.

Nakitin tekoälyn tekemään koosteen Zenodosta.

🔹 Perustiedot:

•	Omistaja: CERN (Euroopan ydinfysiikan tutkimuslaitos), Sveitsissä.
•	Rahoittajat: Euroopan komissio, OpenAIRE
•	Missio: Tukea avointa tiedettä, arkistoida tutkimusdataa ja julkaisua pitkäkestoisesti.
•	Yhteensopivuus: Soveltuu täydellisesti audioiden ja muun ei-tieteellisen sisällön tallentamiseen.
Ominaisuus Kuvaus
Ilmainen käyttö Ei maksuja, ei käyttörajoituksia
50 Gt per julkaisu Yksittäinen tallennuserä voi olla jopa 50 Gt
DOI-tunniste Joka julkaisulle tulee vakaa, viitattava DOI
Lisenssituki Tukee Creative Commons -lisenssejä ja avoimuuspolitiikkaa
Metadatatuki Kirjoittajat, kuvaus, avainsanat, päivämäärät, jne.
Pitkäikäisyys OpenAIREn ja CERNin pitkäaikainen sitoumus säilyttää sisällöt
Eurooppalainen laillisuus Ei USA:n juridiikan alaisuudessa

Minulle helpottava tieto oli, että Zenodon käyttötapa ei rajoitu tiedeyhteisöön, vaan sitä voi hyödyntää kuka tahansa.

Vaikka Zenodo alun perin syntyi tutkimusten julkaisuun, he ovat erikseen todenneet, että:

Zenodo welcomes uploads from any field of research, as well as citizen science, cultural heritage, software, datasets, presentations, audio, video and more.

Eli myös tiedotus, aineistot ja kulttuuriperintö ovat hyväksyttyjä sisältöjä.

Kummallista kyllä: vaikka Zenodo ei ole monelle tuttu, se on ehkä turvallisin paikka eurooppalaiselle pitkäikäiselle digitaaliselle arkistolle. Ja se, että me maallikot emme ole kuulleet siitä, ei kerro sen huonoudesta — vaan ehkäpä enemmän siitä, että EU on huono markkinoinnissa.

Maailmalta Zenodolle

Joten aloin selvittämään syvemmin Zenodon teknistä puolta.

Tein tilin https://zenodo.org/ Tuo on pakko, tietenkin, ja jo yksistään sen takia, että saa automatisointiin vaadittavan API-avaimen. En suostu tekemään kaikkea web-liittymän kautta, vaikka sekin on mahdollista

Käsitöiltä ei kuitenkaan pysty välttymään. Jokaisesta podcast-jaksosta täytyy tehdä erillinen yaml-muotoinen tiedosto, jossa on vaadittavat meta-tiedot.

Kenttien järjestys ei ole ehkä looginen, mutta rakensin sitä ns. lennosta matkan varrella. Ehkä sen voisi muokata hieman parempaan järjestykseen. Toki käytän sitä GitHubissa antamaan podcast-postauksille metatiedot, mutta ei sitä silti kukaan lue. Joten muutan joskus, ehtiessäni. Ehkä.

title: Koiran ruokinta – kokemusten harhat
publication_date: 2025-03-11
language: fi
author: Jakke Lehtonen
license: cc-by-nc-sa-4.0
description: >
  Podcast-jaksossa aiheena on koirien ns. luonnollisen ruokinnan suhtautuminen lihaan ja sen nostaminen superfood-asemaan ja kaiken parantavaksi ratkaisuksi.
  Se, että lihapohjainen ruokinta korjaa monia kuivamuonien aiheuttamia ongelmia, johtuu kuivamuonien reseptiikkaongelmista. Niissä on liian vähän lihaa. Koiralle karnivorena liha on silti "vain" tavallista perusruokaa.
keywords:
  - koira
  - koiran ruokinta
  - raakaruokinta
  - luonnollinen ruokinta
  - podcast
  - kokemustieto
  - lemmikkieläimet
audio_url: https://podcast.katiska.eu/kaffepaussi/podcast_159.mp3
source_url: https://www.katiska.eu/podcastit/159-liha-koirien-superfood-vai-perusfood/
zenodo_doi:
  • audio_url on vain siksi, että saan ladattua äänitiedoston väliaikaisesti serverille, ja siitä sitten Zenodolle
    • zenodo_doi täytetään myöhemmin, kun siirto ja julkaisu on valmis; se on vain GitHubin suuntaan tarkoitettu

Minulla on Katiskan arkisto serverilläni. Päivitän muutokset ja tiedostot gitillä Gitahubiin. Joten oli aika loogiselta tuntuvaa hyödyntää samaa tähän projektiin.

On makuasia millaista polkurakennetta käyttää, mutta minulla se oli

~/katiska-heritage/podcastit/yaml/kaffepaussin_aika

Tuo on työrakenne prosessointia varten. Hakemistossa kaffepaussin_aika on joka jaksosta vapaavalintaisella nimellä tehty metatiedosto. Itse käytän muotoa

159-liha-koiran-superfood-vai-perusfood.md

Ennen kuin työ alkaa, niin tarvitaan API-avain ja se haetaan tietysti Zenodolta. Oikeuksissa täytyy olla sallittuna upload ja publish.

Tallennetaan se kotihakemiston juureen.

echo "API-AVAIN" > ~/.zenodo_token
chmod 600 ~/.zenodo_token

Samalla kun olet Zenodossa, niin luo itsellesi community. Tarvitset sitä julkaisua varten. Oma on Katiska ja sen ID on mielikuvituksellisesti katiska

Ennen scriptiä varmistetaan, että tarvittavat kirjastot ovat saatavilla.

pip install requests pyyaml

Tämä tekee kaiken taian.

#!/usr/bin/env python3
from pathlib import Path
import yaml
import json
import requests
import tempfile
import shutil
from datetime import date

API_URL = "https://zenodo.org/api/deposit/depositions"

# Lue token kotihakemistosta
with open(Path.home() / ".zenodo_token") as f:
    TOKEN = f.read().strip()

HEADERS = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {TOKEN}",
}

YAML_DIR = Path.home() / "katiska-heritage/podcastit/yaml/kaffepaussin_aika"
PROCESSED_DIR = Path.home() / "katiska-heritage/podcastit/zenodo_meta"

def upload_to_zenodo(file_path):
    print(f"\n📄 Käsitellään: {file_path.name}")

    with open(file_path, "r", encoding="utf-8") as f:
        metadata = yaml.safe_load(f)

    audio_url = metadata.get("audio_url")
    if not audio_url:
        print("⚠️ audio_url puuttuu, ohitetaan...")
        return

    print(f"🎧 Ladataan audio {audio_url}...")
    tmp_dir = tempfile.mkdtemp()
    local_audio = Path(tmp_dir) / Path(audio_url).name
    try:
        r = requests.get(audio_url, stream=True)
        with open(local_audio, "wb") as f:
            shutil.copyfileobj(r.raw, f)
    except Exception as e:
        print(f"⚠️ Audion lataus epäonnistui: {e}")
        return

    print("📄 Luodaan uusi julkaisu...")
    r = requests.post(API_URL, headers=HEADERS, json={})
    if r.status_code != 201:
        print(f"⚠️ Julkaisun luonti epäonnistui: {r.status_code} {r.text}")
        return

    deposition = r.json()
    deposition_id = deposition["id"]

    print("📤 Ladataan audio Zenodoon...")
    files_url = f"{API_URL}/{deposition_id}/files"
    with open(local_audio, "rb") as fp:
        r = requests.post(files_url, headers={"Authorization": f"Bearer {TOKEN}"}, files={"file": fp})
    if r.status_code != 201:
        print(f"⚠️ Audion siirto epäonnistui: {r.status_code} {r.text}")
        return

    print("📝 Päivitetään metadata...")
    payload = {
        "metadata": {
            "title": metadata.get("title"),
            "upload_type": "video",
            "publication_date": metadata["publication_date"].isoformat() if isinstance(metadata["publication_date"], date) else metadata["publication_date"],
            "description": metadata.get("description"),
            "creators": [{"name": metadata.get("author", "Jakke Lehtonen")}],
            "language": metadata.get("language", "fi"),
            "license": metadata.get("license", "cc-by-nc-sa-4.0"),
            "keywords": metadata.get("keywords", []),
            "resource_type": "video",
            "communities": [{"identifier": "katiska"}],
        }
    }

    r = requests.put(f"{API_URL}/{deposition_id}", headers=HEADERS, json=payload)
    if r.status_code != 200:
        print(f"⚠️ Metadata-lähetys epäonnistui tiedostolle {file_path.name}")
        print(f"↳ Zenodon vastaus: {r.status_code} {r.text}")
        return

    print("🚀 Julkaistaan...")
    r = requests.post(f"{API_URL}/{deposition_id}/actions/publish", headers=HEADERS)
    if r.status_code != 202:
        print(f"⚠️ Julkaisu epäonnistui tiedostolle {file_path.name}")
        print(f"↳ Zenodon vastaus: {r.status_code} {r.text}")
        return

    final_doi = r.json().get("doi")
    if final_doi:
        metadata["zenodo_doi"] = final_doi
        with open(file_path, "w", encoding="utf-8") as f:
            yaml.dump(metadata, f, allow_unicode=True)
        print(f"✅ DOI lisätty YAML-tiedostoon: {final_doi}")

    PROCESSED_DIR.mkdir(parents=True, exist_ok=True)
    shutil.move(str(file_path), str(PROCESSED_DIR / file_path.name))
    print(f"📦 Siirretty kansioon: {PROCESSED_DIR}")

    shutil.rmtree(tmp_dir)

for file in YAML_DIR.glob("*.md"):
    upload_to_zenodo(file)

Kaikessa yksinkertaisuudessaan sen hakee Hetznerin S3:sta mp3-tiedoston ja siirtää sen Zenodoon. Samalla se luo yaml-tiedostosta vaaditun payloadin ja laittaa tiedot paikalla. Siinä vaiheessa Zenodo julkaisee tehdyn dokumentin. Julkaisun jälkeen saatu DOI siirretään yaml-tiedostoon, joka muuttaa loppusijoituspaikkaansa polkuun ~/katiska-heritage/podcastit/zenodo_meta

Huomaa: minulla on tuossa vaiheessa joku virhe jossain DOI:n liittäminen rikkoo yaml-rakenteen. Joten ne muutama, jotka olen tätä kirjoitettaessa tehnyt, on korjattu lukukelpoiseksi enterien avulla. Se ei kuitenkaan ole haluttua, koska moinen estää mahdollisen muun jatkokäytön.

Lopputulos on tämän kaltainen:

https://zenodo.org/records/15737809

Lopputyö

Sen jälkeen tarkistan, että kaikki on siellä missä kuuluukin ja teen git push kuviot. Silloin meta-tiedot löytyvät GitHubistakin.

Kierros alkaa alusta, kun teen uudet yaml-tiedostot — se on työvaiheena aikaa vievin, eikä sitä oikein saa automatisoitua. Tai saa, mutta silloin kuvausten luominen jäisi tekoälyn harteille, ja sitä en halua.

Tuleepahan samalla tarkistettua, että kaikki on muutoinkin kuten kuuluu. Nimittäin ensimmäisessä kolmikossa yhdellä oli edelleen Amazonin linkitys, ja niitä saattaa olla enemmänkin; olin noita siirtäessäni unohtanut täysin yhden käyttämäni osoitemallin.

Mitä saavutettiin?

Nyt podcast-jaksoilleni on loppuiän koti sille hetkelle, että Katiska.eu lakkaa olemasta. Tallennukset kuitenkin löytää, jos tietää mistä hakee. Saatu DOI johtaa suoraan oikeaan paikkaan ja jos tajuaa hakea Katiskaa yhteisönä, niin saa listauksen siirretyistä.

Niin sanotusti Katiskan podcasteistä tuli osa säilytettävää eurooppalaista kulttuuriperintöä.

Nyt vaivaa enää yksi asia… GitHubin repon saa Zenodoon jollain tavalla. Silloin myös Katiskan tekstisisällöt olisivat samassa paikassa.

Jakke Lehtonen

Teen B2B-markkinoille sisällöntuottoa sekä UX-testauksia. Samaan liittyy myös koulutukset yrityksille ja webmaailman kanssa muutoin painiville. Serverien sielunelämää on joutunut ohessa opettelmaan. Toinen puoli toiminnasta on koirien ravitsemuksen ja ruokinnan suunnittelua sekä varsinkin omistajien kouluttamista hoitamaan koiriaan oikein ja vielä paremmin. Profiili: Jakke Lehtonen

Keskustele foorumilla Katiskan foorumi

WordPressin kommentit:

Tällä artikkelilla on yksi kommentti

  1. Ville 'cos' R

    @Jagster hyvä että löysit ratkaisun, mutta lisäisin vielä että fediversumin vastineet Soundcloudille ja Youtubelle ovat Funkwhale ja Peertube. Niitä kannattaa suosia jos haluat sisällöt helposti nautittavaan muotoon federoidusti.

    Varsinkin Soundcloud on alkanut spämmäämään viimeaikoina ja ajattelin poistaa sisältöni ja tilini sieltä lopullisesti.

Kommentointi ei ole käytössä.