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