Initial commit
This commit is contained in:
commit
fe1e17ac89
5 changed files with 458 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
__pycache__
|
21
LICENSE
Normal file
21
LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
6
Makefile
Normal file
6
Makefile
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
all:
|
||||||
|
|
||||||
|
install:
|
||||||
|
install scorelib /usr/bin
|
||||||
|
uninstall:
|
||||||
|
rm /usr/bin/scorelib
|
46
README.md
Normal file
46
README.md
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# Scorelib
|
||||||
|
|
||||||
|
A program for managing your music score collection. It runs on Linux and is written for the holy command line.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
There are two different modes: the normal mode and the edit mode. When you start the program you start out in the normal mode with the prompt ` > ` and you can run the following commands:
|
||||||
|
|
||||||
|
| Command | Description |
|
||||||
|
|------------------|:--------------------------:|
|
||||||
|
| help, usage, ? | print the help text |
|
||||||
|
| add, new, a | add a new piece |
|
||||||
|
| list, l | list all pieces |
|
||||||
|
| edit, e | edit a piece |
|
||||||
|
| search, s | search for a piece |
|
||||||
|
| init | initialize the database |
|
||||||
|
| kill | destroy the database |
|
||||||
|
| quit, exit, x, q | close Scorelib |
|
||||||
|
|
||||||
|
If you switch to the editing mode your prompt will look like this: ` (edit) > ` and you can run these commands:
|
||||||
|
|
||||||
|
| Commands | Description |
|
||||||
|
|--------------------|:-------------------------------------------:|
|
||||||
|
| help, usage, ? | Print the help text |
|
||||||
|
| done, q | Done editing piece, back to normal mode |
|
||||||
|
| print, p | Print piece information |
|
||||||
|
| delete, d | Delete this item and go back to normal mode |
|
||||||
|
| edit, change, c, e | Change the values of the item |
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
The program is licensed under MIT license. If you want to contribute just follow these steps:
|
||||||
|
|
||||||
|
1. Fork it
|
||||||
|
2. Create your feature branch (`git chechout -b my-new-feature`)
|
||||||
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
||||||
|
4. Push to the branch (`git push origin my-new-feature`)
|
||||||
|
5. Create new pull request
|
||||||
|
|
||||||
|
You can also add yourself to the CONTRIBUTORS.md file. (Create it if it doesn't exist)
|
||||||
|
|
||||||
|
## Social
|
||||||
|
|
||||||
|
Twitter: [@mmk2410](https://twitter.com/mmk2410)
|
||||||
|
|
||||||
|
Google+: [+MarcelMichaelKapfer](https://plus.google.com/+MarcelMichaelKapfer)
|
384
scorelib
Executable file
384
scorelib
Executable file
|
@ -0,0 +1,384 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Scorelib - A score library management programm"""
|
||||||
|
import sqlite3
|
||||||
|
import readline
|
||||||
|
import getpass
|
||||||
|
import os
|
||||||
|
|
||||||
|
user = getpass.getuser()
|
||||||
|
dbdir = "/home/" + user + "/.scorelib/"
|
||||||
|
dbpath = dbdir + "scorelib.db"
|
||||||
|
|
||||||
|
class Piece:
|
||||||
|
""" A class for working with scores """
|
||||||
|
|
||||||
|
def __init__(self, piece):
|
||||||
|
self.pieceid = piece['id']
|
||||||
|
self.name = piece['name']
|
||||||
|
self.composer = piece['composer']
|
||||||
|
self.opus = piece['opus']
|
||||||
|
self.key = piece['key']
|
||||||
|
self.book = piece['book']
|
||||||
|
|
||||||
|
def get_list(self):
|
||||||
|
""" Returns a list for sending to the database """
|
||||||
|
piece = (self.name, self.composer, self.opus, self.key, self.book, self.pieceid)
|
||||||
|
return piece
|
||||||
|
|
||||||
|
def print_piece(self):
|
||||||
|
""" prints the current piece """
|
||||||
|
print(
|
||||||
|
"""
|
||||||
|
Name: {}
|
||||||
|
Composer: {}
|
||||||
|
Opus: {}
|
||||||
|
Key: {}
|
||||||
|
Book: {}
|
||||||
|
""".format(self.name, self.composer, self.opus, self.key, self.book))
|
||||||
|
|
||||||
|
def delete(self):
|
||||||
|
"""
|
||||||
|
Delete a item
|
||||||
|
"""
|
||||||
|
con = None
|
||||||
|
try:
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
cur = con.cursor()
|
||||||
|
sqlcmd = "DELETE FROM Scores WHERE id = " + str(self.pieceid)
|
||||||
|
cur.execute(sqlcmd)
|
||||||
|
con.commit()
|
||||||
|
except sqlite3.Error as err:
|
||||||
|
print("Error: %s" % err.args[0])
|
||||||
|
finally:
|
||||||
|
if con:
|
||||||
|
con.close()
|
||||||
|
|
||||||
|
def change(self):
|
||||||
|
""")
|
||||||
|
Change a item
|
||||||
|
"""
|
||||||
|
# Updating the values
|
||||||
|
name = rlinput("Name: ", self.name)
|
||||||
|
self.name = name or self.name
|
||||||
|
self.composer = rlinput("Composer: ", self.composer)
|
||||||
|
self.opus = rlinput("Opus: ", self.opus)
|
||||||
|
self.key = rlinput("Key: ", self.key)
|
||||||
|
self.book = rlinput("Book: ", self.book)
|
||||||
|
# Pushing changes to the database
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
print(self.get_list)
|
||||||
|
with con:
|
||||||
|
cur = con.cursor()
|
||||||
|
cur.execute("UPDATE Scores SET Name=?, Composer=?, Opus=?, Key=?, Book=? WHERE Id=?",\
|
||||||
|
self.get_list())
|
||||||
|
con.commit()
|
||||||
|
|
||||||
|
|
||||||
|
def rlinput(prompt, prefill=''):
|
||||||
|
""" Function for advanced input (preset user input) """
|
||||||
|
readline.set_startup_hook(lambda: readline.insert_text(prefill))
|
||||||
|
try:
|
||||||
|
return input(prompt)
|
||||||
|
finally:
|
||||||
|
readline.set_startup_hook()
|
||||||
|
|
||||||
|
def initialize():
|
||||||
|
"""
|
||||||
|
Initializing the database by creating a table
|
||||||
|
"""
|
||||||
|
|
||||||
|
print("Initializing the database...")
|
||||||
|
|
||||||
|
os.mkdir(dbdir, 0o755)
|
||||||
|
|
||||||
|
con = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
|
||||||
|
cur = con.cursor()
|
||||||
|
|
||||||
|
cur.execute(
|
||||||
|
"CREATE TABLE Scores( \
|
||||||
|
Id INTEGER PRIMARY KEY ASC NOT NULL, \
|
||||||
|
Name TEXT NOT NULL, \
|
||||||
|
Composer TEXT, \
|
||||||
|
Opus TEXT, \
|
||||||
|
Key TEXT, \
|
||||||
|
Book TEXT);"
|
||||||
|
)
|
||||||
|
|
||||||
|
except sqlite3.Error as err:
|
||||||
|
print("Error: %s" % err.args[0])
|
||||||
|
return 1
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if con:
|
||||||
|
con.close()
|
||||||
|
|
||||||
|
def destroy():
|
||||||
|
"""
|
||||||
|
Destroys the table.
|
||||||
|
"""
|
||||||
|
print("Destroying all informations...")
|
||||||
|
|
||||||
|
con = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
|
||||||
|
cur = con.cursor()
|
||||||
|
|
||||||
|
cur.execute("DROP TABLE IF EXISTS Scores")
|
||||||
|
|
||||||
|
except sqlite3.Error as err:
|
||||||
|
print("Error: %s" % err.args[0])
|
||||||
|
return 1
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if con:
|
||||||
|
con.close()
|
||||||
|
|
||||||
|
def add():
|
||||||
|
""" Add a entry to the database """
|
||||||
|
while True:
|
||||||
|
title = input("Title: ")
|
||||||
|
if title:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("You have to enter the name of the piece")
|
||||||
|
piece = {"id": 0, "name":title}
|
||||||
|
piece['composer'] = input("Composer: ")
|
||||||
|
piece['opus'] = input("Opus: ")
|
||||||
|
piece['key'] = input("Key: ")
|
||||||
|
piece['book'] = input("Book: ")
|
||||||
|
|
||||||
|
newPiece = Piece(piece)
|
||||||
|
|
||||||
|
newPiece.print_piece()
|
||||||
|
|
||||||
|
con = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
|
||||||
|
cur = con.cursor()
|
||||||
|
|
||||||
|
sqlcmd = "INSERT INTO Scores VALUES(NULL,'"\
|
||||||
|
+ piece['name'] + "','" \
|
||||||
|
+ piece['composer'] + "','" \
|
||||||
|
+ piece['opus'] + "','" \
|
||||||
|
+ piece['key'] + "','" \
|
||||||
|
+ piece['book'] + "')"
|
||||||
|
|
||||||
|
cur.execute(sqlcmd)
|
||||||
|
|
||||||
|
con.commit()
|
||||||
|
|
||||||
|
except sqlite3.Error as err:
|
||||||
|
print("Error: %s" % err.args[0])
|
||||||
|
return 1
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if con:
|
||||||
|
con.close()
|
||||||
|
|
||||||
|
def list_scores():
|
||||||
|
"""
|
||||||
|
List all available scores
|
||||||
|
"""
|
||||||
|
|
||||||
|
con = None
|
||||||
|
|
||||||
|
try:
|
||||||
|
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
|
||||||
|
cur = con.cursor()
|
||||||
|
|
||||||
|
cur.execute("SELECT * FROM Scores")
|
||||||
|
|
||||||
|
print()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
|
||||||
|
row = cur.fetchone()
|
||||||
|
|
||||||
|
if row == None:
|
||||||
|
break
|
||||||
|
|
||||||
|
print(
|
||||||
|
"""
|
||||||
|
Piece number: {}
|
||||||
|
Name: {}
|
||||||
|
Composer: {}
|
||||||
|
Opus: {}
|
||||||
|
Key: {}
|
||||||
|
Book: {}
|
||||||
|
""".format(row[0], row[1], row[2], row[3], row[4], row[5])
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
except sqlite3.Error as err:
|
||||||
|
print("Error: %s" % err.args[0])
|
||||||
|
|
||||||
|
finally:
|
||||||
|
if con:
|
||||||
|
con.close()
|
||||||
|
|
||||||
|
|
||||||
|
def edit():
|
||||||
|
"""
|
||||||
|
Function for editing the pieces
|
||||||
|
"""
|
||||||
|
pieceid = None
|
||||||
|
# Ask piece id from user
|
||||||
|
while True:
|
||||||
|
pieceid = input("Enter the piece number: ")
|
||||||
|
if pieceid == 'quit':
|
||||||
|
return 0
|
||||||
|
elif pieceid and pieceid.isdigit():
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
piecerow = None
|
||||||
|
with con:
|
||||||
|
cur = con.cursor()
|
||||||
|
cur.execute("SELECT * FROM Scores WHERE Id=" + str(pieceid))
|
||||||
|
piecerow = cur.fetchone()
|
||||||
|
if piecerow == None:
|
||||||
|
print("No Piece with this number available.")
|
||||||
|
else:
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("Input must be a number!")
|
||||||
|
|
||||||
|
# Getting the piece information
|
||||||
|
piecedata = {"id": piecerow[0], "name": piecerow[1], "composer": piecerow[2],\
|
||||||
|
"opus": piecerow[3], "key": piecerow[4], "book": piecerow[5]}
|
||||||
|
piece = Piece(piecedata)
|
||||||
|
print("Piece Information:")
|
||||||
|
piece.print_piece()
|
||||||
|
|
||||||
|
# edit prompt
|
||||||
|
while True:
|
||||||
|
edtcmd = input(" (edit) > ")
|
||||||
|
if edtcmd in ['help', '?', 'usage']:
|
||||||
|
helpedittext(False)
|
||||||
|
elif edtcmd in ['done', 'q']:
|
||||||
|
return 0
|
||||||
|
elif edtcmd in ['print', 'p']:
|
||||||
|
piece.print_piece()
|
||||||
|
elif edtcmd in ['delete', 'd']:
|
||||||
|
piece.delete()
|
||||||
|
return 0
|
||||||
|
elif edtcmd in ['edit', 'change', 'c', 'e']:
|
||||||
|
piece.change()
|
||||||
|
else:
|
||||||
|
helpedittext(True)
|
||||||
|
|
||||||
|
def search():
|
||||||
|
""" Search through the database """
|
||||||
|
term = input("Search for: ")
|
||||||
|
con = sqlite3.connect(dbpath)
|
||||||
|
with con:
|
||||||
|
cur = con.cursor()
|
||||||
|
cur.execute("SELECT * FROM Scores")
|
||||||
|
rows = cur.fetchall()
|
||||||
|
for x in range(1,6):
|
||||||
|
if x == 1:
|
||||||
|
print("By name\n")
|
||||||
|
elif x == 2:
|
||||||
|
print("By Composer\n")
|
||||||
|
elif x == 3:
|
||||||
|
print("By Opus\n")
|
||||||
|
elif x == 4:
|
||||||
|
print("By Key\n")
|
||||||
|
elif x == 5:
|
||||||
|
print("By Book\n")
|
||||||
|
for row in rows:
|
||||||
|
if term in row[x]:
|
||||||
|
piecedata = {"id": row[0], "name": row[1], "composer": row[2],\
|
||||||
|
"opus": row[3], "key": row[4], "book": row[5]}
|
||||||
|
piece = Piece(piecedata)
|
||||||
|
print("Piece number: %s" % str(row[0]))
|
||||||
|
piece.print_piece()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def helpedittext(doneshit):
|
||||||
|
""" print the edit help text """
|
||||||
|
if doneshit:
|
||||||
|
print("The entered command ist not available.")
|
||||||
|
print(
|
||||||
|
"""
|
||||||
|
Edit help text:
|
||||||
|
|
||||||
|
help, ?, usage Print edit help
|
||||||
|
done, q Done editing piece; back to main menu
|
||||||
|
print, p Print piece information
|
||||||
|
delete, d Delete this item and go back to main menu
|
||||||
|
edit, change, c, e Change the values of the item
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
def helptext(doneshit):
|
||||||
|
""" print the help text """
|
||||||
|
if doneshit:
|
||||||
|
print("The entered command is not available.")
|
||||||
|
print(
|
||||||
|
"""
|
||||||
|
Scorelib v0.1.0
|
||||||
|
A program for managing your music score collection
|
||||||
|
|
||||||
|
Author:
|
||||||
|
Marcel Kapfer (mmk2410) <marcelmichaelkapfer@yahoo.co.nz>
|
||||||
|
|
||||||
|
License:
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Help:
|
||||||
|
|
||||||
|
help, usage, ? prints this text
|
||||||
|
add, new, a add a new piece
|
||||||
|
list, l list all pieces
|
||||||
|
edit, e edit a piece (piece number required)
|
||||||
|
search, s search for a piece
|
||||||
|
init initializes the database
|
||||||
|
kill destroys the database
|
||||||
|
quit, exit, x, q close Scorelib
|
||||||
|
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
print(
|
||||||
|
"""
|
||||||
|
Welcome to Scorelib - A program for managing your music score collection
|
||||||
|
|
||||||
|
If you use this program the first time you have to initialize the database \
|
||||||
|
before you can use it.
|
||||||
|
|
||||||
|
Type 'help' to see a list of commands
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
cmd = input(" > ")
|
||||||
|
|
||||||
|
if cmd in ['usage', 'help', '?']:
|
||||||
|
helptext(False)
|
||||||
|
elif cmd in ['quit', 'exit', 'x', 'q']:
|
||||||
|
print("Good Bye!")
|
||||||
|
exit(0)
|
||||||
|
elif cmd == 'init':
|
||||||
|
initialize()
|
||||||
|
elif cmd == 'kill':
|
||||||
|
destroy()
|
||||||
|
elif cmd in ['add', 'new', 'a']:
|
||||||
|
add()
|
||||||
|
elif cmd in ['list', 'l']:
|
||||||
|
list_scores()
|
||||||
|
elif cmd in ['edit', 'e']:
|
||||||
|
edit()
|
||||||
|
elif cmd in ['search', 's']:
|
||||||
|
search()
|
||||||
|
else:
|
||||||
|
helptext(True)
|
Reference in a new issue