Add transcribe task that shells out to sous_chef
Assisted-by: Claude Opus 4.6 via pi
diff --git a/Rakefile b/Rakefile
index 5d1cca2..c5c4f67 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,6 +5,8 @@ require_relative "lib/feed"
require_relative "lib/sync"
CACHE_DIR = "cache"
+AUDIO_DIR = "audio"
+TRANSCRIPTS_DIR = "transcripts"
HRN_FEED = File.join(CACHE_DIR, "hrn_feed.xml")
HRN_FEED_URL = "https://rss.art19.com/cooking-issues"
@@ -19,11 +21,22 @@ file HRN_FEED => CACHE_DIR do
File.write(HRN_FEED, response.body)
end
+def feed
+ @feed ||= CookingIssues::Feed.new(HRN_FEED)
+end
+
+def find_episode(number)
+ ep = feed.episodes.find { |e| e.number == number.to_i }
+ abort "Episode #{number} not found in feed." unless ep
+ ep
+end
+
+# --- Tasks ---
+
task default: :sync
desc "Fetch the feed, download episodes missing transcripts"
task sync: HRN_FEED do
- feed = CookingIssues::Feed.new(HRN_FEED)
episodes = feed.episodes
puts "Found #{episodes.size} episodes in feed."
@@ -33,9 +46,27 @@ end
desc "List all episodes from the feed"
task episodes: HRN_FEED do
- feed = CookingIssues::Feed.new(HRN_FEED)
feed.episodes.sort_by(&:number).each do |ep|
- status = Dir.glob(File.join("transcripts", "#{ep.slug}.*")).any? ? "✓" : " "
+ status = Dir.glob(File.join(TRANSCRIPTS_DIR, "#{ep.slug}.*")).any? ? "✓" : " "
puts "[#{status}] #{ep.number}. #{ep.title}"
end
end
+
+desc "Transcribe an episode by number (e.g., rake transcribe[42])"
+task :transcribe, [:number] => HRN_FEED do |_t, args|
+ abort "Usage: rake transcribe[NUMBER]" unless args[:number]
+
+ ep = find_episode(args[:number])
+ audio = File.join(AUDIO_DIR, "#{ep.slug}.mp3")
+ abort "Audio not found: #{audio}\nRun `rake sync` first." unless File.exist?(audio)
+
+ transcript = File.join(TRANSCRIPTS_DIR, "#{ep.slug}.json")
+ if File.exist?(transcript)
+ puts "Already transcribed: #{ep.slug}"
+ exit
+ end
+
+ FileUtils.mkdir_p(TRANSCRIPTS_DIR)
+ puts "Transcribing #{ep.number}. #{ep.title}..."
+ sh "sous_chef/build/release/sous_chef", audio, transcript
+end