require 'sinatra/base' require 'sinatra/json' require 'yajl' require 'yajl/json_gem' require 'csv' $set = "2017-05-06" $metafile = "tmp/songtitle" $setfile = "sets/#{$set}/tracklist.csv" $cuefile = "sets/#{$set}/#{$set}.cues" def write_metafile(title) File.open($metafile, "a+") do |fp| fp.flock(File::LOCK_EX) fp.seek(0) fp.truncate(0) fp.puts(title) fp.flush() fp.flock(File::LOCK_UN) end end def write_cuefile(title) line = [ Time.now.to_i, title ].to_csv File.open($cuefile, "a") do |fp| fp.flock(File::LOCK_EX) fp.write(line) fp.flush() fp.flock(File::LOCK_UN) end end def load_tracklist() csv = CSV.read(File.open($setfile), encoding: 'UTF-8') names = csv.shift.map(&:to_sym) csv = csv.reject {|row| row[0].nil? } $tracklist = csv.map do |row| Hash[*names.zip(row).flatten] end $tracklist.unshift({ index: "0", title: " - " }) $tracklist.sort! {|a,b| a[:index].to_i <=> b[:index].to_i } end load_tracklist def tracklist_json $tracklist.to_json end class App < Sinatra::Base configure do set :protection, :except => :frame_options end get '/tracklist.json' do json $tracklist end post '/commit' do index = params["index"].to_i if ( index < 0 || index > $tracklist.length ) status 404 return "No such track index." end title = ( index < 1 ) ? "-" : $tracklist.detect{|a| a[:index].to_i == index.to_i }[:title] write_metafile(title) write_cuefile(title) "Updated." end get '/js/handler.js' do content_type 'text/javascript' erb :handler_js end get '/css/meta.css' do content_type 'text/css' erb :meta_css end get '/' do erb :index, :locals => { :mixtitle => $set, :tracklist => tracklist_json } end end