commit fe1e17ac89ccf8c6bf63d845158cc6c3779a26be Author: Marcel Kapfer Date: Wed Sep 30 11:33:49 2015 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..0264fa3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Marcel Kapfer (mmk2410) + +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. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1e75a39 --- /dev/null +++ b/Makefile @@ -0,0 +1,6 @@ +all: + +install: + install scorelib /usr/bin +uninstall: + rm /usr/bin/scorelib diff --git a/README.md b/README.md new file mode 100644 index 0000000..f655a71 --- /dev/null +++ b/README.md @@ -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) diff --git a/scorelib b/scorelib new file mode 100755 index 0000000..5279411 --- /dev/null +++ b/scorelib @@ -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) + +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)