-
Notifications
You must be signed in to change notification settings - Fork 0
/
mpdPlayer.py
114 lines (99 loc) · 3.86 KB
/
mpdPlayer.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
import subprocess
import time
import sqlite3
import createSearchTree
import settings
import votedb
currentTopSongs = []
oldCurrentTopSongs = []
lasttrackid = []
def isNotPlaying():
output = subprocess.Popen(['mpc'], stdout=subprocess.PIPE).communicate()[0]
if output.find('playing') > 0:
return False
else:
return True
def nowPlaying():
connection = sqlite3.connect("mucke.db")
cursor = connection.cursor()
currentfile = subprocess.Popen(['mpc','-f','"%file%"','current'], stdout=subprocess.PIPE).communicate()[0].replace('"','').rstrip()
# execute can't handle simple strings for substitution so lets put it in a tuple
currentpath = [settings.musicfolder + "/" + unicode(currentfile, "utf-8") ]
cursor.execute("""SELECT artist, title, album, albumart, tracklength FROM musiclib WHERE path == ?;""", currentpath )
nowPlayingTuple = cursor.fetchall()
connection.close()
return nowPlayingTuple
# reset votes to zero and write to db which time this track was played
def resetVotes():
global lasttrackid
if not isNotPlaying():
connection = sqlite3.connect("mucke.db")
cursor = connection.cursor()
currentfile = subprocess.Popen(['mpc','-f','"%file%"','current'], stdout=subprocess.PIPE).communicate()[0].replace('"','').rstrip()
# execute can't handle simple strings for substitution so lets put it in a tuple
currentpath = [settings.musicfolder + "/" + unicode(currentfile, "utf-8") ]
cursor.execute("""SELECT id FROM musiclib WHERE path==?;""",currentpath)
idTuple = cursor.fetchall()
if len(idTuple) == 1 :
trackid = idTuple[0]
if trackid != lasttrackid:
print "## resetting votes"
#reset ip/trackid counter
votedb.resetVotes(trackid)
# reset votes for current song
cursor.execute("""UPDATE musiclib SET votes= 0 WHERE id==?;""",(trackid))
# set current time to last time played column
currenttime = [time.time() , trackid[0]]
cursor.execute("""UPDATE musiclib SET lastplayed= ? WHERE id==?;""",currenttime)
connection.commit()
lasttrackid = trackid
connection.close()
def initMPD():
retcode = subprocess.call(['mpc','-q','clear'])
retcode = subprocess.call(['mpc','-q','crossfade','5'])
def manager():
initMPD()
while(True):
# TODO das reset muss woanders hin, sonst haben wir staendig db zugriffe
resetVotes()
getTopVotedSongs()
if len(currentTopSongs) > 0:
addSongs()
if isNotPlaying():
startPlaylist()
# just for debugging
#print nowPlaying()
# don't let the script eat up all system ressources
time.sleep(5)
else:
print "top 10 is empty! waiting for incoming votes"
time.sleep(10)
def addSongs():
global currentTopSongs
global oldCurrentTopSongs
# remove previous top hit in playlist, but keep playing current song
if subprocess.Popen(['mpc','playlist'], stdout=subprocess.PIPE).communicate()[0].count('\n') >= 1 and isNotPlaying():
retcode = subprocess.call(['mpc','-q','clear'])
if currentTopSongs != oldCurrentTopSongs:
print "## updating playlist"
if subprocess.Popen(['mpc','playlist'], stdout=subprocess.PIPE).communicate()[0].count('\n') > 1:
retcode = subprocess.call(['mpc','-q','crop'])
for currentSongPath in currentTopSongs:
# make currentsongpath relative to music folder
mpdSongPath = currentSongPath[0][len(settings.musicfolder)+1:len(currentSongPath[0])]
retcode = subprocess.call(['mpc','-q','add',mpdSongPath])
oldCurrentTopSongs = currentTopSongs
currentTopSongs = []
def startPlaylist():
retcode = subprocess.call(['mpc','-q','play'])
# lookup the song with most votes in database
def getTopVotedSongs():
global currentTopSongs
# open sqlite db connection
connection = sqlite3.connect("mucke.db")
cursor = connection.cursor()
# get current top songs
cursor.execute("""SELECT path FROM musiclib WHERE votes > '0' ORDER BY votes DESC, votetime ASC LIMIT 10;""")
currentTopSongs = cursor.fetchall()
#print currentTopSongs
connection.close()