Ignore empty tracklist rows
[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 = "2015-12-19"
8 $metafile = "tmp/songtitle"
9 $cuefile = "cue/#{$set}.cues"
10
11 def write_metafile(title)
12   File.open($metafile, "a+") do |fp|
13     fp.flock(File::LOCK_EX)
14     fp.seek(0)
15     fp.truncate(0)
16     fp.puts(title)
17     fp.flush()
18     fp.flock(File::LOCK_UN)
19   end
20 end
21
22 def write_cuefile(title)
23   line = [ Time.now.to_i, title ].to_csv
24   File.open($cuefile, "a") do |fp|
25     fp.flock(File::LOCK_EX)
26     fp.write(line)
27     fp.flush()
28     fp.flock(File::LOCK_UN)
29   end
30 end
31
32 def load_tracklist()
33   file = "sets/#{$set}/tracklist.csv"
34   csv = CSV.read(File.open(file), 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     length: "0",
44     bpm: "0",
45     notes: nil
46   })
47   $tracklist.sort! {|a,b| a[:index].to_i <=> b[:index].to_i }
48 end
49
50 load_tracklist
51
52 def tracklist_json
53   $tracklist.to_json
54 end
55
56 class App < Sinatra::Base
57   configure do
58     set :protection, :except => :frame_options
59   end
60
61   get '/tracklist.json' do
62     json $tracklist
63   end
64
65   post '/commit' do
66     index = params["index"].to_i
67     if ( index < 0 || index > $tracklist.length )
68       status 404
69       return "No such track index."
70     end
71
72     title = ( index < 1 ) ? "-" : $tracklist.detect{|a| a[:index].to_i == index.to_i }[:title]
73
74     write_metafile(title)
75     write_cuefile(title)
76     "Updated."
77   end
78
79   get '/js/handler.js' do
80     content_type 'text/javascript'
81     erb :handler_js
82   end
83
84   get '/css/meta.css' do
85     content_type 'text/css'
86     erb :meta_css
87   end
88
89   get '/' do
90     erb :index, :locals => { :mixtitle => $set, :tracklist => tracklist_json }
91   end
92 end