Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα,

 

Επειδή μου άρεσε η ιδέα του 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 κτλ.

 

Θα ήθελα να δώσετε ιδέες, να κάνετε διορθώσεις, αν θέλετε.

 

Ευχαριστώ.

Δημοσ.

Φτιάξε το indentation και άσε κενά μεταξύ των μεθόδων και των κλάσεων. Καλό θα ήταν να ακολουθήσεις το PEP8

 

Ίσως θα μπορούσες να βάλεις και ένα counter για το πόσες φορές ακούς το κάθε κομμάτι.

Δημοσ.

Το identation το έβγαλε έτσι το block για κώδικα, στο αρχείο είναι οκ. Το στυλ που χρησιμοποιώ είναι το default του IDLE, θα το κοιτάξω πάντως για το PEP8.

Το counter για τον αριθμό κομματιών δεν χρειάζεται στον κώδικα μιας και μπορεί να βγει από τα δεδομένα της βάσης. Μόνο που δεν μπορώ να σκεφτώ το κατάλληλο query.

Δημοσ.

Το query σου μπορεί να είναι κάτι σαν το παρακάτω και διαβάζεις απλά την τελευταία στήλη που σου επιστρέφει.

 

>
SELECT artist, album, title, genre, COUNT(*) FROM tracks GROUP BY artist, album, title, genre

Δημοσ.

>SELECT artist, COUNT(artist) FROM listening GROUP BY artist;

Βασικά τέτοιο query ήθελα, που έβγαινε από το δικό σου. Σε ευχαριστώ.

Νόμιζα ότι θα ήθελε εμφωλευμένο query.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...