kostitas Δημοσ. 1 Νοεμβρίου 2012 Δημοσ. 1 Νοεμβρίου 2012 Καλησπέρα, Επειδή μου άρεσε η ιδέα του Lastfm που καταγράφει τα τραγούδια που ακούει ο χρήστης έχω φτιάξει ένα προγραμματάκι σε Python το οποίο καταγράφει το τραγούδι που ακούω από το mpd σε βάση δεδομένων MySQL. Ο πίνακας της βάσης έχει ως εξής >+------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+----------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | artist | char(50) | YES | | NULL | | | album | char(50) | YES | | NULL | | | title | char(50) | YES | | NULL | | | genre | char(20) | YES | | NULL | | | listenedon | datetime | YES | | NULL | | | length | char(5) | YES | | NULL | | +------------+----------+------+-----+---------+----------------+ Για την σύνδεση του προγράμματος με το mpd έχω χρησιμοποιήσει το python-mpd-0.3.0 και για την σύνδεση με την MySQL το mysql-connector-python-1.0.7 Η λειτουργία του έχει ως εξής: 1. Μια φορά το δευτερόλεπτο πάρε τα στοιχεία του τρέχοντος τραγουδιού 2. Έλεγξε αν το τραγούδι έχει αλλάξει και αν παίζει 3. Τότε γράψε τα στοιχεία του τραγουδιού στην βάση δεδομένων, όταν το τραγούδι φτάσει στα μισά. Ο κώδικας είναι: > #!/usr/bin/env python from mpd import MPDClient from threading import Thread from threading import Timer from mysql import connector import time import sys class stats(Thread): HOST = "localhost" PORT = 6600 INTERVAL = 1 FILE = "statistics" olddata = None def __init__(self): super(stats, self).__init__() self._client = MPDClient() self._client.connect(self.HOST, self.PORT) self.db = dbconn() def run(self): while True: stats = self._getstats() if stats: stats = self._validate(stats) state = self._client.status()['state'] if stats != self.olddata and state == 'play': length = self._length()/2 t = Timer(length, self.db.insertstats, [stats]) t.start() self.olddata = stats time.sleep(self.INTERVAL) def _getstats(self): currsong = self._client.currentsong() if currsong != {}: try: stats = [currsong['artist'], currsong['album'], currsong['title'], currsong['genre'], currsong['time']] return stats except: print 'Invalid tags' return None def _length(self): currsong = self._client.currentsong() length=float(currsong['time']) return length def _validate(self, data): for i in range(len(data)): if "'" in data[i]: data[i] = data[i].replace("'", "") return data class dbconn: HOST = 'localhost' DB = 'music' USER = 'user' PASS = 'password' def __init__(self): try: self.con = connector.connect(host=self.HOST, database=self.DB, user=self.USER, password=self.PASS) self.cursor = self.con.cursor() except connector.Error as err: if err.errno == errorcode.ER_ACCESS_DENIED_ERROR: print("Something is wrong your username or password") elif err.errno == errorcode.ER_BAD_DB_ERROR: print("Database does not exists") else: print(err) def insertstats(self, stats): sql = 'INSERT INTO listening(artist, album, title, genre, length, listenedon) VALUES (' for i in stats: sql += "'" + i + "'," sql += 'NOW());' #print sql try: self.cursor.execute(sql) self.con.commit() except: print 'Invalid data' def main(): s = stats() #s.daemon = True s.start() if __name__ == "__main__": try: main() except KeyboardInterrupt: sys.exit() Το πρόγραμμα λειτουργεί καλά όταν απλώς βάζεις να παίζει μουσική με τα τραγούδια να ολοκληρώνονται. Δεν το έχω δοκιμάσει περισσότερο, πχ αν γίνεται συνεχώς play/pause, next κτλ. Θα ήθελα να δώσετε ιδέες, να κάνετε διορθώσεις, αν θέλετε. Ευχαριστώ.
pmav99 Δημοσ. 2 Νοεμβρίου 2012 Δημοσ. 2 Νοεμβρίου 2012 Φτιάξε το indentation και άσε κενά μεταξύ των μεθόδων και των κλάσεων. Καλό θα ήταν να ακολουθήσεις το PEP8 Ίσως θα μπορούσες να βάλεις και ένα counter για το πόσες φορές ακούς το κάθε κομμάτι.
kostitas Δημοσ. 3 Νοεμβρίου 2012 Μέλος Δημοσ. 3 Νοεμβρίου 2012 Το identation το έβγαλε έτσι το block για κώδικα, στο αρχείο είναι οκ. Το στυλ που χρησιμοποιώ είναι το default του IDLE, θα το κοιτάξω πάντως για το PEP8. Το counter για τον αριθμό κομματιών δεν χρειάζεται στον κώδικα μιας και μπορεί να βγει από τα δεδομένα της βάσης. Μόνο που δεν μπορώ να σκεφτώ το κατάλληλο query.
computeras13 Δημοσ. 5 Νοεμβρίου 2012 Δημοσ. 5 Νοεμβρίου 2012 Το query σου μπορεί να είναι κάτι σαν το παρακάτω και διαβάζεις απλά την τελευταία στήλη που σου επιστρέφει. > SELECT artist, album, title, genre, COUNT(*) FROM tracks GROUP BY artist, album, title, genre
kostitas Δημοσ. 6 Νοεμβρίου 2012 Μέλος Δημοσ. 6 Νοεμβρίου 2012 >SELECT artist, COUNT(artist) FROM listening GROUP BY artist; Βασικά τέτοιο query ήθελα, που έβγαινε από το δικό σου. Σε ευχαριστώ. Νόμιζα ότι θα ήθελε εμφωλευμένο query.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα