Update gems
[CDN/metadata.git] / app.rb
1 require 'sinatra/base'
2 require 'sinatra/json'
3 require 'yajl'
4 require 'yajl/json_gem'
5 require 'csv'
6
7 $set = "2017-05-06"
8 $metafile = "tmp/songtitle"
9 $setfile = "sets/#{$set}/tracklist.csv"
10 $cuefile = "sets/#{$set}/#{$set}.cues"
11
12 def write_metafile(title)
13   File.open($metafile, "a+") do |fp|
14     fp.flock(File::LOCK_EX)
15     fp.seek(0)
16     fp.truncate(0)
17     fp.puts(title)
18     fp.flush()
19     fp.flock(File::LOCK_UN)
20   end
21 end
22
23 def write_cuefile(title)
24   line = [ Time.now.to_i, title ].to_csv
25   File.open($cuefile, "a") do |fp|
26     fp.flock(File::LOCK_EX)
27     fp.write(line)
28     fp.flush()
29     fp.flock(File::LOCK_UN)
30   end
31 end
32
33 def load_tracklist()
34   csv = CSV.read(File.open($setfile), encoding: 'UTF-8')
35   names = csv.shift.map(&:to_sym)
36   csv = csv.reject {|row| row[0].nil? }
37   $tracklist = csv.map do |row|
38     Hash[*names.zip(row).flatten]
39   end
40   $tracklist.unshift({
41     index: "0",
42     title: " - "
43   })
44   $tracklist.sort! {|a,b| a[:index].to_i <=> b[:index].to_i }
45 end
46
47 load_tracklist
48
49 def tracklist_json
50   $tracklist.to_json
51 end
52
53 class App < Sinatra::Base
54   configure do
55     set :protection, :except => :frame_options
56   end
57
58   get '/tracklist.json' do
59     json $tracklist
60   end
61
62   post '/commit' do
63     index = params["index"].to_i
64     if ( index < 0 || index > $tracklist.length )
65       status 404
66       return "No such track index."
67     end
68
69     title = ( index < 1 ) ? "-" : $tracklist.detect{|a| a[:index].to_i == index.to_i }[:title]
70
71     write_metafile(title)
72     write_cuefile(title)
73     "Updated."
74   end
75
76   get '/js/handler.js' do
77     content_type 'text/javascript'
78     erb :handler_js
79   end
80
81   get '/css/meta.css' do
82     content_type 'text/css'
83     erb :meta_css
84   end
85
86   get '/' do
87     erb :index, :locals => { :mixtitle => $set, :tracklist => tracklist_json }
88   end
89 end