diff --git a/app.py b/app.py index 7c93615..ae3039a 100644 --- a/app.py +++ b/app.py @@ -1,6 +1,8 @@ #!/usr/bin/env python2 import sqlite3 +import re +import os from flask import Flask, g, jsonify app = Flask(__name__) @@ -21,6 +23,42 @@ def query_db(query, args=(), one=False): return (rv[0] if rv else None) if one else rv +def parse_osu(osu): + osu_lines = open(osu, 'r').read().replace('\x00', '').split('\n') + sections = {} + current_section = (None, []) + + for line in osu_lines: + line = line.strip() + secm = re.match('^\[(\w+)\]$', line) + if secm: + if current_section: + sections[current_section[0]] = current_section[1] + current_section = (secm.group(1), []) + else: + if current_section: + current_section[1].append(line) + else: + current_section = ('Default', [line]) + + if current_section: + sections[current_section[0]] = current_section[1] + + return sections + + +def get_osu_key(osu, section, key, default=None): + sec = osu[section] + for line in sec: + ok = line.split(':', 1)[0].strip() + ov = line.split(':', 1)[1].strip() + + if ok.lower() == key.lower(): + return ov + + return default + + @app.teardown_appcontext def close_connection(exception): db = getattr(g, '_database', None) @@ -30,19 +68,25 @@ def close_connection(exception): @app.route('/api/songs') def route_api_songs(): - songs = query_db('select * from songs where enabled = 1') - songs_out = [] - for song in songs: - print song - songs_out.append( - {'id': song[0], 'title': song[1], 'title_en': song[2], 'stars': { - 'easy': song[3], 'normal': song[4], - 'hard': song[5], 'oni': song[6] - }} - ) + songs = query_db('select * from songs where enabled = 1') + songs_out = [] + for song in songs: + osus = [osu for osu in os.listdir('songs/%s' % song[0]) if osu in ['easy.osu', 'normal.osu', 'hard.osu', 'oni.osu']] + if osus: + osud = parse_osu('songs/%s/%s' % (song[0], osus[0])) + preview = int(get_osu_key(osud, 'General', 'PreviewTime', 0)) + else: + preview = 0 - return jsonify(songs_out) + songs_out.append( + {'id': song[0], 'title': song[1], 'title_en': song[2], 'stars': { + 'easy': song[3], 'normal': song[4], + 'hard': song[5], 'oni': song[6] + }, 'preview': preview} + ) + + return jsonify(songs_out) if __name__ == '__main__': - app.run(port=34801) + app.run(port=34801) diff --git a/src/js/songselect.js b/src/js/songselect.js index ca37626..792ef2b 100644 --- a/src/js/songselect.js +++ b/src/js/songselect.js @@ -7,7 +7,7 @@ function SongSelect(){ var _preview; var _preview_to; - this.startPreview = function(id, first_open=true) { + this.startPreview = function(id, prvtime, first_open=true) { var start = Date.now(); setTimeout(function(){ bgm.pause(); @@ -19,11 +19,11 @@ function SongSelect(){ var delay = end - start; var no_delay = first_open ? 0 : 300; - _preview.currentTime = _preview.duration/2-10; + _preview.currentTime = prvtime/1000; _preview.volume = 0.5; _preview.addEventListener('ended', function(){ - this.currentTime = this.duration/2-10; + this.currentTime = prvtime/1000; this.play(); }, false); @@ -99,7 +99,7 @@ function SongSelect(){ if(!$('.opened').length) { - _this.startPreview($(this).data('song-id')); + _this.startPreview($(this).data('song-id'), $(this).data('preview')); assets.sounds["don"].play(); assets.sounds["song-select"].pause(); assets.sounds["song-select"].currentTime = 0; @@ -113,7 +113,7 @@ function SongSelect(){ }); } else { _preview.pause(); - _this.startPreview($(this).data('song-id'), false); + _this.startPreview($(this).data('song-id'), $(this).data('preview'), false); assets.sounds["ka"].play(); } }; @@ -146,8 +146,9 @@ function SongSelect(){ var songID = song.id; var songTitle = song.title; var songTitleSpace = songTitle.replace(/ /g, ' '); + var songPreview = song.preview; - _code += "