<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tokyo-livehouse-events, branch master</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/'/>
<entry>
<title>Add navigation progress bar for client-side transitions</title>
<updated>2026-07-14T14:09:27+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-07-14T14:09:27+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=7370e6c128b819bf51260783c6ffbe47be8e0b47'/>
<id>7370e6c128b819bf51260783c6ffbe47be8e0b47</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix day-of-week bug in recap mail: getDay()→getUTCDay() on noon UTC</title>
<updated>2026-07-11T11:34:45+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-07-11T11:34:45+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=c0f61ba314bb2ed0503ec1a00cda0e8e15f89e2d'/>
<id>c0f61ba314bb2ed0503ec1a00cda0e8e15f89e2d</id>
<content type='text'>
+09:00 midnight をパースすると内部では前日15:00UTCになり、
getDay()がシステムタイムゾーン(UTC)で前日の曜日を返していた。

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
+09:00 midnight をパースすると内部では前日15:00UTCになり、
getDay()がシステムタイムゾーン(UTC)で前日の曜日を返していた。

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>recap mail: remove price column, make title a link</title>
<updated>2026-07-11T11:27:16+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-07-11T11:27:16+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=baf91fb9f8ce918c3c10e89710605176539136ed'/>
<id>baf91fb9f8ce918c3c10e89710605176539136ed</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix scraper restart loop: MARZ 500 on unpublished month + set -e</title>
<updated>2026-07-11T07:47:37+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-07-11T07:47:37+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=55bb044b7deadd1fe5055078274651ce6402589f'/>
<id>55bb044b7deadd1fe5055078274651ce6402589f</id>
<content type='text'>
新宿MARZ翌月スケジュールのHTTP 500がスクレイパー全体を失敗させ、
set -e によりentrypointがcron起動前に終了→再起動ループを引き起こしていた。

- marz-shinjuku: 404/500は未掲載扱いで空配列を返すよう変更
- scraper-entrypoint.sh: set -e を削除し初回スクレイプ失敗でもcronを起動

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
新宿MARZ翌月スケジュールのHTTP 500がスクレイパー全体を失敗させ、
set -e によりentrypointがcron起動前に終了→再起動ループを引き起こしていた。

- marz-shinjuku: 404/500は未掲載扱いで空配列を返すよう変更
- scraper-entrypoint.sh: set -e を削除し初回スクレイプ失敗でもcronを起動

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Add scrapers for 新宿MARZ and 東高円寺U.F.O.CLUB</title>
<updated>2026-07-03T01:23:41+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-07-03T01:23:41+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=44f9ef0d9caa0d9cce06635f6c0c7e045fef2796'/>
<id>44f9ef0d9caa0d9cce06635f6c0c7e045fef2796</id>
<content type='text'>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix HTML entity leakage in FAD scraper and Pitbar _clone date bug</title>
<updated>2026-06-18T03:51:55+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-06-18T03:51:55+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=272f7d079cbac81c9af86b9f210ace8cabc0e98c'/>
<id>272f7d079cbac81c9af86b9f210ace8cabc0e98c</id>
<content type='text'>
fad-yokohama: replace innerHTML manipulation with Cheerio .clone().text()
so that HTML entities (&amp;nbsp; etc.) are decoded before storing titles.

pitbar-nishiogikubo: strip non-numeric suffix from day part of element ID
to handle _clone-suffixed IDs that freecalend.com generates after JS renders.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
fad-yokohama: replace innerHTML manipulation with Cheerio .clone().text()
so that HTML entities (&amp;nbsp; etc.) are decoded before storing titles.

pitbar-nishiogikubo: strip non-numeric suffix from day part of element ID
to handle _clone-suffixed IDs that freecalend.com generates after JS renders.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix image proxy 400 for application/octet-stream responses</title>
<updated>2026-06-17T13:41:55+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-06-17T13:41:55+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=243d222c35f4607ac13a400e827333f44a0f44c7'/>
<id>243d222c35f4607ac13a400e827333f44a0f44c7</id>
<content type='text'>
GCS-backed Active Storage (omatsuri.tech, used by rinky.info venues)
returns application/octet-stream instead of image/*. Detect actual image
type from magic bytes (JPEG/PNG/GIF/WebP) and serve with correct
Content-Type. Also add X-Content-Type-Options: nosniff.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
GCS-backed Active Storage (omatsuri.tech, used by rinky.info venues)
returns application/octet-stream instead of image/*. Detect actual image
type from magic bytes (JPEG/PNG/GIF/WebP) and serve with correct
Content-Type. Also add X-Content-Type-Options: nosniff.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Add image proxy endpoint to avoid mixed content issues</title>
<updated>2026-06-17T13:27:47+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-06-17T13:27:47+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=5f653a4c9f7c76d461ee4377fb4e025771cff872'/>
<id>5f653a4c9f7c76d461ee4377fb4e025771cff872</id>
<content type='text'>
Serve external event images through /api/image?url=&lt;encoded&gt; so HTTP
image URLs from venue sites are fetched server-side and delivered over
HTTPS. Validates Content-Type is image/*, blocks private IPs (SSRF),
and caches responses in memory (24h TTL, 200-entry LRU).

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Serve external event images through /api/image?url=&lt;encoded&gt; so HTTP
image URLs from venue sites are fetched server-side and delivered over
HTTPS. Validates Content-Type is image/*, blocks private IPs (SSRF),
and caches responses in memory (24h TTL, 200-entry LRU).

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Use Postfix container for recap mail; add Message-ID header</title>
<updated>2026-06-08T16:34:07+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-06-08T16:34:07+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=b323ad4824cc62cf54a9bfa4f9f68dda4b783323'/>
<id>b323ad4824cc62cf54a9bfa4f9f68dda4b783323</id>
<content type='text'>
Port 25 outbound unblocked: send-recap.ts now routes through the
mail container (Postfix + OpenDKIM) for direct MX delivery with
DKIM signing. Removes inline MX lookup logic added in the previous
workaround. Also adds Message-ID header (required by Gmail) and
updates default RECAP_TO to mazideyabai@gmail.com.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Port 25 outbound unblocked: send-recap.ts now routes through the
mail container (Postfix + OpenDKIM) for direct MX delivery with
DKIM signing. Removes inline MX lookup logic added in the previous
workaround. Also adds Message-ID header (required by Gmail) and
updates default RECAP_TO to mazideyabai@gmail.com.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
<entry>
<title>Fix cron PATH: use absolute path for node in /etc/cron.d/scraper</title>
<updated>2026-06-04T11:26:33+00:00</updated>
<author>
<name>yyamashita</name>
<email>yyamashita@hetzner.yyamashita.com</email>
</author>
<published>2026-06-04T11:26:33+00:00</published>
<link rel='alternate' type='text/html' href='http://git.yyamashita.com/tokyo-livehouse-events/commit/?id=f9cc6d3f2dc884739ea640ef54adaeb35d117220'/>
<id>f9cc6d3f2dc884739ea640ef54adaeb35d117220</id>
<content type='text'>
cron runs with a minimal PATH that excludes /usr/local/bin, causing
'node: not found' errors for both scrape and recap jobs.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
cron runs with a minimal PATH that excludes /usr/local/bin, causing
'node: not found' errors for both scrape and recap jobs.

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</pre>
</div>
</content>
</entry>
</feed>
