def getByYear(self, anio):
     self.canciones = ListaDato()
     aux = self.matriz.getRaiz().getAbajo()
     auxC = aux.getArriba().getSiguiente()
     while aux != None:
         if aux.getDato() == anio:
             aux = aux.getSiguiente()
             for col in xrange(1, self.matriz.getAnchura()):
                 if aux.getDato() != 0:
                     genero = auxC.getDato()
                     self.roamAB(genero, anio, aux.getArtistas().getRaiz().getPrimero())
                 aux = aux.getSiguiente()
                 auxC = auxC.getSiguiente()
         if aux != None:
             aux = aux.getAbajo()
 def getByAlbum(self, nombreAlbum):
     self.canciones = ListaDato()
     auxFila = self.matriz.getRaiz().getAbajo()
     auxCol = auxFila.getArriba().getSiguiente()
     for i in xrange(1, self.matriz.getAltura()):
         auxG = auxCol
         aux = auxFila.getSiguiente()
         for j in xrange(1, self.matriz.getAnchura()):
             if aux.getDato() != 0:
                 anio = auxFila.getDato()
                 genero = auxG.getDato()
                 self.roamABAlbum(genero, anio, aux.getArtistas().getRaiz().getPrimero(), nombreAlbum)
             auxG = auxG.getSiguiente()
             aux = aux.getSiguiente()
         auxFila = auxFila.getAbajo()
 def getByGender(self, genero):
     self.canciones = ListaDato()
     aux = self.matriz.getRaiz().getSiguiente()
     auxF = aux.getAnterior().getAbajo()
     while aux != None:
         if aux.getDato() == genero:
             aux = aux.getAbajo()
             for fila in xrange(1, self.matriz.getAltura()):
                 if aux.getDato() != 0:
                     anio = auxF.getDato()
                     self.roamAB(genero, anio, aux.getArtistas().getRaiz().getPrimero())
                 aux = aux.getAbajo()
                 auxF = auxF.getAbajo()
         if aux != None:
             aux = aux.getSiguiente()
 def getByArtist(self, nombreArtista):
     self.canciones = ListaDato()
     auxFila = self.matriz.getRaiz().getAbajo()
     auxCol = auxFila.getArriba().getSiguiente()
     for i in xrange(1, self.matriz.getAltura()):
         auxG = auxCol
         aux = auxFila.getSiguiente()
         for j in xrange(1, self.matriz.getAnchura()):
             artista = aux.getArtistas().search(nombreArtista)
             if artista != None and aux.getDato() != 0:
                 anio = auxFila.getDato()
                 genero = auxG.getDato()
                 self.roamABBArtista(genero, anio, nombreArtista, artista.getAlbumes().getRaiz())
             auxG = auxG.getSiguiente()
             aux = aux.getSiguiente()
         auxFila = auxFila.getAbajo()
 def getByArtistAlbumSong(self, name):
     self.canciones = ListaDato()
     auxFila = self.matriz.getRaiz().getAbajo()
     auxCol = auxFila.getArriba().getSiguiente()
     for i in xrange(1, self.matriz.getAltura()):
         auxG = auxCol
         aux = auxFila.getSiguiente()
         for j in xrange(1, self.matriz.getAnchura()):
             anio = auxFila.getDato()
             genero = auxG.getDato()
             artista = aux.getArtistas().search(name)
             if aux.getDato() != 0:
                 if artista != None:
                     self.roamABBArtista(genero, anio, name, artista.getAlbumes().getRaiz())
                 else:
                     self.roamBT(genero, anio, aux.getArtistas().getRaiz().getPrimero(), name)                
             auxG = auxG.getSiguiente()
             aux = aux.getSiguiente()
         auxFila = auxFila.getAbajo()
class CargaMasiva:
    correlativo = 1

    def __init__(self):
        self.usuarios = ListaUsuarios()
        self.datos = ListaDato()
        self.matriz = None
        self.engeneros = None
        self.enanios = None

    def cargarUsuarios(self, root):
        coleccionUsuarios = root.findall('usuarios')
        for usuarios in coleccionUsuarios:
            coleccionUsuario = usuarios.findall('usuario')
            for usuario in coleccionUsuario:
                self.usuarios.pushUsuario(usuario.find('nombre').text, usuario.find('pass').text)

    def crearMatriz(self, root):
        self.engeneros = []
        self.enanios = []
        generos = ['--- Matriz ---']
        anios = ['--- Matriz ---']
        coleccionArtistas = root.findall('artistas')
        for artistas in coleccionArtistas:
            coleccionArtista = artistas.findall('artista')
            for artista in coleccionArtista:
                coleccionAlbumes = artista.findall('albumes')
                for albumes in coleccionAlbumes:
                    coleccionAlbum = albumes.findall('album')
                    for album in coleccionAlbum:
                        gen = album.find('genero').text
                        anio = album.find('anio').text
                        if not(gen in generos):
                            generos.append(gen)
                            self.engeneros.append({'genero':gen})
                        if not(anio in anios):
                            anios.append(anio)
                            self.enanios.append({'anio':anio})
        altura = len(anios)
        anchura = len(generos)
        anios.sort()
        self.engeneros.sort()
        self.enanios.sort()
        self.matriz = Matriz(altura, anchura)
        for x in xrange(0, altura):
            self.matriz.setDato(anios[x], x, 0)
        for y in xrange(0, anchura):
            self.matriz.setDato(generos[y], 0, y)

    def llenarMatriz(self, root):
        coleccionArtistas = root.findall('artistas')
        for artistas in coleccionArtistas:
            coleccionArtista = artistas.findall('artista')
            for artista in coleccionArtista:
                nombreArtista = artista.find('nombre').text
                #abbAlbumes = ArbolAlbum()
                coleccionAlbumes = artista.findall('albumes')
                for albumes in coleccionAlbumes:
                    coleccionAlbum = albumes.findall('album')
                    for album in coleccionAlbum:
                        nombreAlbum = album.find('nombre').text
                        gen = album.find('genero').text
                        anio = album.find('anio').text
                        if anio == '':
                            anio = 'None'
                        if gen == '':
                            gen = 'None'
                        if nombreArtista == '':
                            nombreArtista = 'artista' + CargaMasiva.correlativo
                            CargaMasiva.correlativo += 1
                        if nombreAlbum == '':
                            nombreAlbum = 'album' + CargaMasiva.correlativo
                            CargaMasiva.correlativo += 1
                        self.matriz.addArtista(anio, gen, nombreArtista)
                        self.matriz.getArtistas(anio, gen).search(nombreArtista).getAlbumes().add(nombreAlbum)
                        #listaCanciones = ListaCanciones()
                        coleccionCanciones = album.findall('canciones')
                        for canciones in coleccionCanciones:
                            coleccionCancion = canciones.findall('cancion')
                            for cancion in coleccionCancion:
                                can = cancion.find('nombre').text
                                path = cancion.find('path').text
                                if can == '':
                                    can = 'cancion' + CargaMasiva.correlativo
                                    CargaMasiva.correlativo += 1
                                try:
                                    self.matriz.getArtistas(anio, gen).search(nombreArtista).getAlbumes().getAlbum(nombreAlbum).getCanciones().add(can, path)
                                except:
                                    print 'Error'
                                #listaCanciones.add(can, path)
                                try:
                                    self.datos.insert(can, nombreArtista, nombreAlbum, gen, anio, path)
                                except:
                                    print 'Error'
                        #abbAlbumes.add(nombreAlbum, listaCanciones)
                #self.datos.insertar("", "", "", "", "")
                #self.matriz.addArtista(anio, gen, nombreArtista, abbAlbumes)
                #self.matriz.getArtistas(anio, gen).printArtista(self.matriz.getArtistas(anio, gen).search(nombreArtista))

    def analizarXML(self, cadena):
        full_file = os.path.abspath(cadena)
        with codecs.open(full_file, "r", errors='ignore') as fdata:
            contenido = fdata.read().replace('\n', '')
        root = ElementTree.fromstring(contenido)
        self.cargarUsuarios(root)
        self.crearMatriz(root)
        self.llenarMatriz(root)

    def getUsuario(self):
        return self.usuarios

    def getMatriz(self):
        return self.matriz

    def getDatos(self):
        return self.datos

    def getEncabezadoAnios(self):
        return self.enanios

    def getEncabezadoGeneros(self):
        return self.engeneros
 def __init__(self, matriz):
     self.canciones = ListaDato()
     self.matriz = matriz
class Buscador:

    def __init__(self, matriz):
        self.canciones = ListaDato()
        self.matriz = matriz

    def getByArtistAlbumSong(self, name):
        self.canciones = ListaDato()
        auxFila = self.matriz.getRaiz().getAbajo()
        auxCol = auxFila.getArriba().getSiguiente()
        for i in xrange(1, self.matriz.getAltura()):
            auxG = auxCol
            aux = auxFila.getSiguiente()
            for j in xrange(1, self.matriz.getAnchura()):
                anio = auxFila.getDato()
                genero = auxG.getDato()
                artista = aux.getArtistas().search(name)
                if aux.getDato() != 0:
                    if artista != None:
                        self.roamABBArtista(genero, anio, name, artista.getAlbumes().getRaiz())
                    else:
                        self.roamBT(genero, anio, aux.getArtistas().getRaiz().getPrimero(), name)                
                auxG = auxG.getSiguiente()
                aux = aux.getSiguiente()
            auxFila = auxFila.getAbajo()

    def roamBT(self, genero, anio, nodo, nombre):
        if nodo.getIzquierda() != None:
            self.roamBT(genero, anio, nodo.getIzquierda().getPrimero(), nombre)
        nodoAlbum = nodo.getAlbumes().getAlbum(nombre)
        if nodoAlbum != None:
            cancion = nodoAlbum.getCanciones().head
            while True:
                self.canciones.insert(cancion.getNombre(), nodo.getNombre(), nodoAlbum.getNombre(), genero, anio, cancion.getPath())
                cancion = cancion.getSiguiente()
                if cancion == nodoAlbum.getCanciones().head:
                    break
        else:
            self.roamBBT(genero, anio, nodo.getNombre(), nodo.getAlbumes().getRaiz(), nombre)
        if nodo.getSiguiente() != None:
            self.roamBT(genero, anio, nodo.getSiguiente(), nombre)
        elif nodo.getDerecha() != None:
            self.roamBT(genero, anio, nodo.getDerecha().getPrimero(), nombre)

    def roamBBT(self, genero, anio, artista, nodo, nombre):
        if nodo != None:
            cancion = nodo.getCanciones().find(nombre)
            if cancion != None:
                print cancion.getNombre()
                self.canciones.insert(cancion.getNombre(), artista, nodo.getNombre(), genero, anio, cancion.getPath())
            if nodo.getHijoIzq() != None:
                self.roamBBT(genero, anio, artista, nodo.getHijoIzq(), nombre)
            if nodo.getHijoDer() != None:
                self.roamBBT(genero, anio, artista, nodo.getHijoDer(), nombre)

    def getByArtist(self, nombreArtista):
        self.canciones = ListaDato()
        auxFila = self.matriz.getRaiz().getAbajo()
        auxCol = auxFila.getArriba().getSiguiente()
        for i in xrange(1, self.matriz.getAltura()):
            auxG = auxCol
            aux = auxFila.getSiguiente()
            for j in xrange(1, self.matriz.getAnchura()):
                artista = aux.getArtistas().search(nombreArtista)
                if artista != None and aux.getDato() != 0:
                    anio = auxFila.getDato()
                    genero = auxG.getDato()
                    self.roamABBArtista(genero, anio, nombreArtista, artista.getAlbumes().getRaiz())
                auxG = auxG.getSiguiente()
                aux = aux.getSiguiente()
            auxFila = auxFila.getAbajo()

    def roamABBArtista(self, genero, anio, artista, nodo):
        if nodo != None:
            cancion = nodo.getCanciones().head
            while True:
                self.canciones.insert(cancion.getNombre(), artista, nodo.getNombre(), genero, anio, cancion.getPath())
                cancion = cancion.getSiguiente()
                if cancion == nodo.getCanciones().head:
                    break
            if nodo.getHijoIzq() != None:
                self.roamABBArtista(genero, anio, artista, nodo.getHijoIzq())
            if nodo.getHijoDer() != None:
                self.roamABBArtista(genero, anio, artista, nodo.getHijoDer())

    def getByAlbum(self, nombreAlbum):
        self.canciones = ListaDato()
        auxFila = self.matriz.getRaiz().getAbajo()
        auxCol = auxFila.getArriba().getSiguiente()
        for i in xrange(1, self.matriz.getAltura()):
            auxG = auxCol
            aux = auxFila.getSiguiente()
            for j in xrange(1, self.matriz.getAnchura()):
                if aux.getDato() != 0:
                    anio = auxFila.getDato()
                    genero = auxG.getDato()
                    self.roamABAlbum(genero, anio, aux.getArtistas().getRaiz().getPrimero(), nombreAlbum)
                auxG = auxG.getSiguiente()
                aux = aux.getSiguiente()
            auxFila = auxFila.getAbajo()

    def roamABAlbum(self, genero, anio, nodo, album):
        if nodo.getIzquierda() != None:
            self.roamABAlbum(genero, anio, nodo.getIzquierda().getPrimero(), album)
        nodoAlbum = nodo.getAlbumes().getAlbum(album)
        if nodoAlbum != None:
            cancion = nodoAlbum.getCanciones().head
            while True:
                self.canciones.insert(cancion.getNombre(), nodo.getNombre(), nodoAlbum.getNombre(), genero, anio, cancion.getPath())
                cancion = cancion.getSiguiente()
                if cancion == nodoAlbum.getCanciones().head:
                    break
        if nodo.getSiguiente() != None:
            self.roamABAlbum(genero, anio, nodo.getSiguiente(), album)
        elif nodo.getDerecha() != None:
            self.roamABAlbum(genero, anio, nodo.getDerecha().getPrimero(), album)

    def getByGender(self, genero):
        self.canciones = ListaDato()
        aux = self.matriz.getRaiz().getSiguiente()
        auxF = aux.getAnterior().getAbajo()
        while aux != None:
            if aux.getDato() == genero:
                aux = aux.getAbajo()
                for fila in xrange(1, self.matriz.getAltura()):
                    if aux.getDato() != 0:
                        anio = auxF.getDato()
                        self.roamAB(genero, anio, aux.getArtistas().getRaiz().getPrimero())
                    aux = aux.getAbajo()
                    auxF = auxF.getAbajo()
            if aux != None:
                aux = aux.getSiguiente()

    def getByYear(self, anio):
        self.canciones = ListaDato()
        aux = self.matriz.getRaiz().getAbajo()
        auxC = aux.getArriba().getSiguiente()
        while aux != None:
            if aux.getDato() == anio:
                aux = aux.getSiguiente()
                for col in xrange(1, self.matriz.getAnchura()):
                    if aux.getDato() != 0:
                        genero = auxC.getDato()
                        self.roamAB(genero, anio, aux.getArtistas().getRaiz().getPrimero())
                    aux = aux.getSiguiente()
                    auxC = auxC.getSiguiente()
            if aux != None:
                aux = aux.getAbajo()

    def roamAB(self, genero, anio, nodo):
        if nodo != None:
            if nodo.getIzquierda() != None:
                self.roamAB(genero, anio, nodo.getIzquierda().getPrimero())
            self.roamABB(genero, anio, nodo.getNombre(), nodo.getAlbumes().getRaiz())
            if nodo.getSiguiente() != None:
                self.roamAB(genero, anio, nodo.getSiguiente())
            elif nodo.getDerecha() != None:
                self.roamAB(genero, anio, nodo.getDerecha().getPrimero())

    def roamABB(self, genero, anio, artista, nodo):
        if nodo != None:
            cancion = nodo.getCanciones().head
            while True:
                self.canciones.insert(cancion.getNombre(), artista, nodo.getNombre(), genero, anio, cancion.getPath())
                cancion = cancion.getSiguiente()
                if cancion == nodo.getCanciones().head:
                    break
            if nodo.getHijoIzq() != None:
                self.roamABB(genero, anio, artista, nodo.getHijoIzq())
            if nodo.getHijoDer() != None:
                self.roamABB(genero, anio, artista, nodo.getHijoDer())

    def getCanciones(self):
        return self.canciones
 def __init__(self):
     self.usuarios = ListaUsuarios()
     self.datos = ListaDato()
     self.matriz = None
     self.engeneros = None
     self.enanios = None