README.md

ATOMO Station #

Bluesky のカスタムフィードを毎日集め、テレビ欄のように並べるサイトです。

https://station.soiree.blue

しくみ #

  • Cloudflare Worker と D1 で動きます。5分ごとに app.bsky.unspecced.getPopularFeedGenerators を語で検索し、フィードを集めます。認証は要りません
  • 名前か説明にかなを含むものを国内、ほかを海外(いいね20以上)とします
  • チャンネル(11本)は、名前と説明の語で決めます(src/genres.js)。1本ずつ直すときは src/overrides.js に書きます
  • 成人向けのラベルが付いたものは出しません
  • いいねの数は順番を決めるのにだけ使い、画面にも API にも出しません
  • さがすの一覧は Worker が JSON に作り置き、ブラウザが Cache Storage に残して手元で探します
  • ログイン(AT Protocol の OAuth)は鍵をブラウザが持ちます。Worker は client metadata を配るだけで、だれがログインしたかを知りません
  • D1 に1日に書く行の数に上限を決めてあります(wrangler.example.jsonc の D1_WRITE_BUDGET、src/d1-budget.js)。超えた日は集めるのをやめ、読むだけで動きます
  • 声の番組(public/radio.js)は、番組表のおすすめから台本を作り、聞く人のブラウザの中で ZEN-TTS が声にします。Worker は何もしません

声の番組 #

音声モデル:Blueskyちゃん(https://github.com/kojira/zen-tts-models )/ ZEN-TTS(https://zenryokukikai.com )

ZEN-TTS と声のモデルは再配布できないので、このリポジトリには入っていません。動かすときは、ZEN-TTS v1.1.0(https://github.com/zenryokukikai/zen-tts )を組んで public/tts/ に、bluesky.ztm を public/voices/ に置きます。画面には「音声合成:ZEN-TTS(https://zenryokukikai.com )」を出します。

動かす #

  1. wrangler.example.jsonc を wrangler.jsonc に写し、名前・ドメイン・database_id を自分のものにします
  2. wrangler d1 create <名前> で D1 を作り、wrangler d1 execute <名前> --remote --file schema.sql で表を作ります
  3. wrangler deploy で出します

手元では wrangler dev --ip 127.0.0.1 で開きます。ログインは 127.0.0.1 でだけ動きます。/api/sweep を開くと1回分を集め、/api/build で番組表と一覧を作ります。どちらも 127.0.0.1 でだけ開きます。

リンクカードの画像(public/og/)は og/作る.sh で作り直します(macOS の Google Chrome を使います)。

ライセンス #

コードは MIT です(LICENSE)。public/vendor/oauth.js に入っているものの許諾は THIRD_PARTY.md と THIRD_PARTY_LICENSES.txt にあります。