#!/usr/bin/env python
#
# $Source: /home/blais/repos/cvsroot/arubomu/adm/convert_listen,v $
# $Id: convert_listen,v 1.8 2004/02/14 00:01:49 blais Exp $
#

"""Convert old listened list into the new format."""

__version__ = "$Revision: 1.8 $"
__author__ = "Martin Blais <blais@furius.ca>"


import sys, os
from os.path import isdir, join
import re
import xml.dom.minidom

from album import SongRef
from pprint import pprint




thediridmap = {}

def getdiridmap(jbdir):
    "Returns a map from dir id to real, full directory path."

    if not thediridmap:
        # note: hard-coded for 2 levels only
        dirs = os.listdir(jbdir)
        dirs = filter(lambda x: isdir(join(jbdir,x)), dirs)
        dirs = filter(lambda x: not x.startswith('__'), dirs)
        dirs = filter(lambda x: x not in ['duplicates', 'lost+found'], dirs)
        for d in dirs:
            sdirs = os.listdir(join(jbdir,d))
            #sdirs = filter(lambda x: isdir(join(jbdir,d,x)), sdirs)
            # optimized by removing check...
            for sd in sdirs:
                thediridmap[sd] = join(d,sd)
    return thediridmap

def getlistenedmap(listenfn):
    
    try:
        dom = xml.dom.minidom.parse( listenfn )
        songlist = dom.documentElement
    except IOError:
        print >> sys.stderr, '  Error: cannot open file "%s"' % listenfn
        raise
    
    listened_map = {}
    for songxml in songlist.getElementsByTagName('songref'):
        songref = SongRef(songxml)
    
        listened_map.setdefault(songref.dir, []).append(songref.no)
    
    dom.unlink()
    
    return listened_map


# get all dirs
jbdir = '/mnt/jukebox'
diridmap = getdiridmap(jbdir)

# for each dir get list of all files
outmap = {}
vbre = re.compile('^(\d\d)(.*)\.mp3$')
for id, dir in diridmap.items():
    files = os.listdir(join(jbdir, dir))
    mos = filter(None, map(vbre.match, files))
    for mo in mos:
        no = int(mo.group(1))
        outmap.setdefault(id, {})[no] = 0

listenfn = os.environ['JUKEBOX_PLAYFILE']
listened_map = getlistenedmap(listenfn)
for id, nos in listened_map.items():
    assert(id in outmap)
    for no in nos:
        assert(no in outmap[id])
        outmap[id][no] += 1

print """
<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>
<!DOCTYPE playfile SYSTEM \"http://furius.ca/jukebox/share/dtd/playfile.dtd\">
<playmon-index>

"""

dirfmt = '<dir id="%s">'
dirend = '</dir>'
songfmt0 = '   <song no="%d" />'
songfmt1 = '   <song no="%d" listen="%d"/>'

ids = outmap.keys()
ids.sort()
for id in ids:
    print dirfmt % id
    for no, listen in outmap[id].items():
        if listen == 0:
            print songfmt0 % no
        else:
            print songfmt1 % (no, listen)
    print dirend

print """
</playmon-index>
"""
