dots


dots / scripts / Scripts
xxwhirlpool  ·  2026-04-09

schedulebot.rb

 1#!/usr/bin/env ruby
 2#
 3# written by ryan of miyaku media
 4# https://miyaku.media/
 5
 6require 'erb'
 7require 'securerandom'
 8require 'mediainfo'
 9
10def print_usage_and_exit
11  $stderr.puts "usage:\n  ./schedulebot.rb 20251207T201500 'title1' title1.mp4 'title2' title2.mp4 [...]"
12  exit 1
13end
14
15debug = false
16url = 'https://miru.miyaku.media'
17
18if ARGV.empty?
19  print_usage_and_exit
20end
21
22arguments = ARGV.dup
23start_time = arguments.shift
24if arguments.empty? || arguments.length.odd?
25  print_usage_and_exit
26end
27
28$stderr.puts "Got start time: #{start_time}" if debug
29current_time = Time.strptime(start_time, "%Y%m%dT%H%M%S")
30$stderr.puts "Reparsed: #{current_time.strftime("%Y%m%dT%H%M%S")}" if debug
31until arguments.empty? do
32  title = arguments.shift
33  filename = arguments.shift
34  $stderr.puts "Generating block for #{title} from #{filename}" if debug
35  media_info = MediaInfo.from(filename)
36  duration = media_info.video.duration
37  $stderr.puts "#{duration / 1000} seconds" if debug
38  event = ERB.new(<<-EVENTBLOCK).result(binding)
39BEGIN:VEVENT
40UID:<%= SecureRandom.uuid.upcase %>
41DTSTAMP:<%= Time.now.utc.strftime('%Y%m%dT%H%M%SZ') %>
42DTSTART;TZID=America/New_York:<%= current_time.strftime("%Y%m%dT%H%M%S") %>
43DURATION:P0DT<%= Time.at(duration / 1000).utc.strftime("%HH%MM%SS") %>
44SUMMARY:<%= title %>
45DESCRIPTION:Livestream at: <%= url %>
46URL:<%= url %>
47END:VEVENT
48EVENTBLOCK
49
50  puts event
51
52  current_time += (duration / 1000)
53end