Add transcribe task that shells out to sous_chef
Assisted-by: Claude Opus 4.6 via pi
change wzupyxrxvylkposvxrnpsonurxtozkyz
commit a5bc176dbf94c4e33417341b0ed70f1fcff92eeb
author Alpha Chen <alpha@kejadlen.dev>
date
parent xtmypsrx
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