Sure, I wrote a previous email to Rob about how we could concievably
do something like that.
To get bitrate, I used id3 directly:
from mmpython.audio import eyeD3
id3 = eyeD3.Mp3AudioFile( filename )
vbr,br = id3.getBitRate()
comment = id3.tag.getComment()
On Wed, Oct 27, 2004 at 12:43:06AM -0700, m voncken wrote:
> --- Aubin Paul <[EMAIL PROTECTED]> wrote:
>
> > No objection from me; I always had iTunes in mind
> > when I was looking
> > into the music db.
> >
> > Aubin
>
> Hi,
> It was a bit more work than i thought.
>
> And are stil some open issues:
> -I need a table-versioning scheme.
> I saw something about that in the epg mails.
> minimal version in dbutil patch.
>
> -mmpython(eyeD3) will return genre but no bitrate and
> comment.(on my id3v1.1 files)
> I used a modified version of mmpython and mp3info.py
> to
> extract the data.
> no patch supplied.
>
> -There needs to ba a way to detect a file has
> changed(tag update),so the database gets updated too.
> Add add_date and file_date fields to music table?
>
>
>
>
> Index: extendedmeta.py
> ===================================================================
> RCS file:
> /cvsroot/freevo/freevo/src/util/extendedmeta.py,v
> retrieving revision 1.13
> diff -u -r1.13 extendedmeta.py
> --- extendedmeta.py 10 Jul 2004 12:33:42 -0000 1.13
> +++ extendedmeta.py 26 Oct 2004 19:53:26 -0000
> @@ -59,8 +59,22 @@
> dbschema = """CREATE TABLE music (id INTEGER PRIMARY
> KEY, dirtitle VARCHAR(255), path VARCHAR(255),
> filename VARCHAR(255), type VARCHAR(3),
> artist VARCHAR(255), title VARCHAR(255), album
> VARCHAR(255),
> year VARCHAR(255), track NUMERIC(3),
> track_total NUMERIC(3), bpm NUMERIC(3), last_play
> float,
> - play_count NUMERIC, start_time NUMERIC,
> end_time NUMERIC, rating NUMERIC, eq VARCHAR)"""
> + play_count NUMERIC, start_time NUMERIC,
> end_time NUMERIC, rating NUMERIC, eq VARCHAR,
> + bitrate NUMERIC,genre VARCHAR(255),comment
> VARCHAR(255)
> + )"""
> +
> +#sequence of sql statements for db-update:
> +dbupdate_sql = {}
> +dbupdate_sql[(1,2)] = [ #v1->v2
> +dbschema.replace('CREATE TABLE music','CREATE
> TEMPORARY TABLE tt_music')
> +,"insert into tt_music select *,0,'','' from music"
> +,'DROP TABLE music'
> +,dbschema
> +,'insert into music select * from tt_music'
> +,'DROP TABLE tt_music'
> +]
>
> +
> def make_query(filename,dirtitle):
> if not os.path.exists(filename):
> print "File %s does not exist" % (filename)
> @@ -68,38 +82,113 @@
>
> a = mediainfo.get(filename)
> t = tracknum(a['trackno'])
> -
> - VALUES =
> "(null,\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',%i,%i,%i,\'%s\',%f,%i,\'%s\',\'%s\',%i,\'%s\')"
> \
> - %
> (util.escape(dirtitle),util.escape(os.path.dirname(filename)),util.escape(os.path.basename(filename)),
> \
> -
> 'mp3',util.escape(a['artist']),util.escape(a['title']),util.escape(a['album']),inti(a['date']),t[0],
> \
> - t[1],
> 100,0,0,'0',inti(a['length']),0,'null')
> -
> + try:
> + bitrate = int(a['bitrate'])
> + except:
> + bitrate = 1 #some tags are really bad.
> + if bitrate > 1000: #? returns bitrate*1000?
> + bitrate = bitrate / 1000
> + try: #id3v1 permits invalid years.
> + year = int(['date'])
> + except:
> + year = 0
> + length = inti(a['length'])
> + if length == '':
> + length = 0
> +
> + VALUES = "(null,'%s','%s','%s','%s','%s'\
> + ,'%s','%s',%i,%i,%i,'%s',%f,%i,'%s'\
> + ,'%s',%i,'%s',%i,'%s','%s')\
> + " % (util.escape(dirtitle)
> + ,util.escape(os.path.dirname(filename))
> + ,util.escape(os.path.basename(filename)),
>
> +
> 'mp3',util.escape(a['artist']),util.escape(a['title'])
> + ,util.escape(a['album']),year,t[0]
> + ,t[1], 100,0,0,'0',a['length'],0,'null'
> +
> ,bitrate,util.escape(a['genre']),util.escape(a['comment']))
> +
> SQL = 'INSERT OR IGNORE INTO music VALUES ' +
> VALUES
> return SQL
>
> -def addPathDB(path, dirtitle, type='*.mp3',
> verbose=True):
> +def make_query_update(filename,dirtitle):
> + #file changed or database updated.
> + #todo:file changed,important for changed id3
> tags.
> + #this version:only updates id3-tags+bitrate
> + if not os.path.exists(filename):
> + print "File %s does not exist" % (filename)
> + return None
>
> + a = mediainfo.get(filename)
> + t = tracknum(a['trackno'])
> + try:
> + bitrate = int(a['bitrate'])
> + except:
> + bitrate = 1 #some tags are really bad.
> + if bitrate > 1000: #? returns bitrate*1000?
> + bitrate = bitrate / 1000
> + try: #id3v1 permits invalid years.
> + year = int(['date'])
> + except:
> + year = 0
> +
> + SQL = """update music set
> artist='%s',album='%s',track=%i,title='%s'
> + ,year=%i,bitrate=%i,genre='%s',comment='%s'
> + where path='%s' and filename='%s'
> + """ % (util.escape(a['artist'])
> + ,util.escape(a['album'])
> + ,t[0]
> + ,util.escape(a['title'])
> + ,year
> + ,bitrate
> + ,util.escape(a['genre'])
> + ,util.escape(a['comment'])
> + ,util.escape(os.path.dirname(filename))
> + ,util.escape(os.path.basename(filename)),
>
> + )
> +
> + return SQL
> +
> +def addPathDB(path, dirtitle, type='*.mp3',
> verbose=True):
> + dbupdate = False
> # Get some stuff ready
> count = 0
> + updcount = 0
> db = MetaDatabase();
> - if not db.checkTable('music'):
> + version = db.checkTableVersion('music')
> + if not version:
> db.runQuery(dbschema)
> + elif version <> 2:
> + if verbose:
> + print 'updating database
> definitions...................'
> + dbupdate = True
> + for sql in dbupdate_sql[(version,2)]:
> + db.runQuery(sql,close=False)
> + db.commit()
> +
>
> # Compare and contrast the db to the disc
> songs = util.recursefolders(path,1,type,1)
> - for row in db.runQuery('SELECT path, filename
> FROM music'):
> - try:
> -
> songs.remove(os.path.join(row['path'],row['filename']))
> + updsongs = []
> + for row in db.runQuery('SELECT path, filename
> FROM music'):
> + filename =
> os.path.join(row['path'],row['filename'])
>
> + if filename in songs:
> + if dbupdate: #todo:or file changed!
> + updsongs.append(filename)
> + updcount +=1
> +
> + songs.remove(filename)
>
> count = count + 1
> - except ValueError:
> - # Why doesn't it just give a return code
> - pass
>
> if count > 0 and verbose:
> print " Skipped %i songs already in the
> database..." % (count)
>
> for song in songs:
> db.runQuery(make_query(song,dirtitle))
> +
> + if updcount > 0 and verbose:
> + print " Updating %i songs..." % (count)
> + for song in updsongs:
> + db.runQuery(make_query_update(song,dirtitle))
>
> db.close()
>
>
> Index: dbutil.py
> ===================================================================
> RCS file: /cvsroot/freevo/freevo/src/util/dbutil.py,v
> retrieving revision 1.6
> diff -u -r1.6 dbutil.py
> --- dbutil.py 10 Jul 2004 12:33:42 -0000 1.6
> +++ dbutil.py 26 Oct 2004 20:03:28 -0000
> @@ -83,7 +83,6 @@
>
> # defines:
> DATABASE = os.path.join(config.FREEVO_CACHEDIR,
> 'freevo.sqlite')
> -
> try:
> import sqlite
> except:
> @@ -99,7 +98,7 @@
> self.cursor = self.db.cursor()
>
> def runQuery(self,query, close=False):
> - try:
> + try:
> self.cursor.execute(query)
> except TypeError:
> traceback.print_exc()
> @@ -131,4 +130,24 @@
> return None
> return table
>
> + def checkTableVersion(self,table=None):
> + """
> + returns version of a table as an integer
> + or None if none exists
> + """
> + #Todo:better versioning scheme.
> + self.cursor.execute('SELECT sql FROM
> sqlite_master where \
> + name="%s" and
> type="table"' % table)
> + sql = self.cursor.fetchone()
> + if not sql:
> + return None
> + sql = sql[0]
> + if table == 'music':
> + version = 1
> + if sql.find('bitrate') > 0:
> + version = 2
> + else:
> + raise NotImplementedError('No versioning
> scheme for '+table)
> + return version
> +
>
>
>
>
> __________________________________
> Do you Yahoo!?
> Yahoo! Mail - Helps protect you from nasty viruses.
> http://promotions.yahoo.com/new_mail
>
>
> -------------------------------------------------------
> This SF.Net email is sponsored by:
> Sybase ASE Linux Express Edition - download now for FREE
> LinuxWorld Reader's Choice Award Winner for best database on Linux.
> http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
> _______________________________________________
> Freevo-devel mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/freevo-devel
-------------------------------------------------------
This SF.Net email is sponsored by:
Sybase ASE Linux Express Edition - download now for FREE
LinuxWorld Reader's Choice Award Winner for best database on Linux.
http://ads.osdn.com/?ad_id=5588&alloc_id=12065&op=click
_______________________________________________
Freevo-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/freevo-devel