forked from mod-audio/mod-ui
-
Notifications
You must be signed in to change notification settings - Fork 3
/
bank.py
120 lines (96 loc) · 4.13 KB
/
bank.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# -*- coding: utf-8 -*-
# Copyright 2012-2013 AGR Audio, Industria e Comercio LTDA. <[email protected]>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import os, json
from mod import safe_json_load, TextFileFlusher
from mod.settings import BANKS_JSON_FILE, LAST_STATE_JSON_FILE
# return list of banks
def list_banks(brokenpedals = []):
banks = safe_json_load(BANKS_JSON_FILE, list)
if len(banks) == 0:
return []
changed = False
checkbroken = len(brokenpedals) > 0
validbanks = []
for bank in banks:
validpedals = []
for pb in bank['pedalboards']:
if 'bundle' not in pb.keys() or not pb['bundle']:
title = pb['title'].encode("ascii", "ignore").decode("ascii")
print("Auto-removing pedalboard '%s' from bank (missing bundle)" % title)
changed = True
continue
if not os.path.exists(pb['bundle']):
bundle = pb['bundle'].encode("ascii", "ignore").decode("ascii")
print("ERROR in banks.py: referenced pedalboard does not exist:", bundle)
changed = True
continue
if checkbroken and os.path.abspath(pb['bundle']) in brokenpedals:
title = pb['title'].encode("ascii", "ignore").decode("ascii")
print("Auto-removing pedalboard '%s' from bank (it's broken)" % title)
changed = True
continue
validpedals.append(pb)
if len(validpedals) == 0:
title = bank['title'].encode("ascii", "ignore").decode("ascii")
print("Auto-deleting bank with name '%s', as it does not contain any pedalboards" % title)
changed = True
continue
bank['pedalboards'] = validpedals
validbanks.append(bank)
if changed:
save_banks(validbanks)
return validbanks
# save banks to disk
def save_banks(banks):
with TextFileFlusher(BANKS_JSON_FILE) as fh:
json.dump(banks, fh)
# save last bank id and pedalboard path to disk
def save_last_bank_and_pedalboard(bank, pedalboard):
if bank is None:
return
try:
with TextFileFlusher(LAST_STATE_JSON_FILE) as fh:
json.dump({
'bank': bank-1,
'pedalboard': pedalboard
}, fh)
except OSError:
return
# get last bank id and pedalboard path
def get_last_bank_and_pedalboard():
data = safe_json_load(LAST_STATE_JSON_FILE, dict)
keys = data.keys()
if len(keys) == 0 or "bank" not in keys or "pedalboard" not in keys or not isinstance(data['bank'], int):
print("last state file does not exist or is corrupt")
return (-1, None)
return (data['bank']+1, data['pedalboard'])
# Remove a pedalboard from banks, and banks that are or will become empty
def remove_pedalboard_from_banks(pedalboard):
newbanks = []
banks = safe_json_load(BANKS_JSON_FILE, list)
for bank in banks:
newpedalboards = []
for oldpedalboard in bank['pedalboards']:
if os.path.abspath(oldpedalboard['bundle']) != os.path.abspath(pedalboard):
newpedalboards.append(oldpedalboard)
# if there's no pedalboards left ignore this bank (ie, delete it)
if len(newpedalboards) == 0:
title = bank['title'].encode("ascii", "ignore").decode("ascii")
print("Auto-deleting bank with name '%s', as it does not contain any pedalboards" % title)
continue
bank['pedalboards'] = newpedalboards
newbanks.append(bank)
save_banks(newbanks)