/* * The GPLv3 licence : * ----------------- * Copyright (c) 2009 Ricardo Dias * * This file is part of MuVis. * * MuVis is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * MuVis is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with MuVis. If not, see <http://www.gnu.org/licenses/>. */ package muvis.similarity; import java.io.IOException; import java.util.ArrayList; import jdbm.btree.BTree; import jdbm.helper.Tuple; import jdbm.helper.TupleBrowser; import muvis.Elements; import muvis.Environment; import muvis.NBTreeManager; import muvis.database.MusicLibraryDatabaseManager; import nbtree.NBPoint; import nbtree.NBTree; import nbtree.exceptions.NBTreeException; /** * Class that handles the similarity between tracks, albums and artists * @author Ricardo */ public class SimilarityManager { public enum SimilarityMode { SIMILAR, NON_SIMILAR } public static ArrayList<Integer> getSimilarTracks(int[] trackIds, int numberSimilarTracks, SimilarityMode mode) { ArrayList<Integer> tracks = new ArrayList(); NBTreeManager nbtreeManager = Environment.getEnvironmentInstance().getNbtreesManager(); MusicLibraryDatabaseManager dbManager = Environment.getEnvironmentInstance().getDatabaseManager(); for (int i = 0; i < trackIds.length; i++) { try { NBTree trackNBTree = nbtreeManager.getNBTree(Elements.TRACKS_NBTREE); double trackKey = dbManager.getTrackKey(trackIds[i]); if (trackKey < 0) { //Util.displayErrorMessage(Environment.getEnvironmentInstance().getRootFrame(), "Similarity Filter", "Can't get non-similar tracks!Try later!"); break; } NBPoint trackPoint = trackNBTree.lookupPoint(trackKey); BTree resultTree = trackNBTree.knnQuery(trackPoint, dbManager.getCountTracks()); TupleBrowser browser = resultTree.browse(); Tuple tuple = new Tuple(); if (mode.equals(SimilarityMode.NON_SIMILAR)) while (browser.getNext(tuple)); for (int j = 0; ((mode.equals(SimilarityMode.NON_SIMILAR))? browser.getPrevious(tuple) : browser.getNext(tuple)) && j < numberSimilarTracks; j++) { if (tuple.getValue() instanceof NBPoint) { NBPoint point = (NBPoint) tuple.getValue(); int track = dbManager.getTrackId(point.norm()); tracks.add(track); } } } catch (IOException ex) { ex.printStackTrace(); } catch (NBTreeException ex) { ex.printStackTrace(); } } return tracks; } public static ArrayList<Integer> getSimilarAlbums(int[] trackIds, int numberSimilarAlbums, SimilarityMode mode) { ArrayList<Integer> tracks = new ArrayList(); NBTreeManager nbtreeManager = Environment.getEnvironmentInstance().getNbtreesManager(); MusicLibraryDatabaseManager dbManager = Environment.getEnvironmentInstance().getDatabaseManager(); NBTree albumsNBTree = nbtreeManager.getNBTree(Elements.ALBUMS_NBTREE); for (int i = 0; i < trackIds.length; i++) { try { double albumKey = dbManager.getAlbumTrackKey(trackIds[i]); if (albumKey < 0) { //Util.displayErrorMessage(parent, "Similarity Filter", "Can't get non-similar albums!Try later!"); break; } NBPoint albumPoint = albumsNBTree.lookupPoint(albumKey); BTree resultTree = albumsNBTree.knnQuery(albumPoint, dbManager.getCountAlbums()); TupleBrowser browser = resultTree.browse(); Tuple tuple = new Tuple(); if (mode.equals(SimilarityMode.NON_SIMILAR)) while (browser.getNext(tuple)); for (int j = 0; ((mode.equals(SimilarityMode.NON_SIMILAR))? browser.getPrevious(tuple) : browser.getNext(tuple)) && j < numberSimilarAlbums; j++) { if (tuple.getValue() instanceof NBPoint) { NBPoint point = (NBPoint) tuple.getValue(); int albumId = dbManager.getAlbumId(point.norm()); ArrayList<Integer> albumTracks = dbManager.getAlbumTracksIds(albumId); tracks.addAll(albumTracks); } } } catch (IOException ex) { ex.printStackTrace(); } catch (NBTreeException ex) { ex.printStackTrace(); } } return tracks; } public static ArrayList<Integer> getSimilarArtists(int[] trackIds, int numberSimilarArtists, SimilarityMode mode) { ArrayList<Integer> tracks = new ArrayList(); NBTreeManager nbtreeManager = Environment.getEnvironmentInstance().getNbtreesManager(); MusicLibraryDatabaseManager dbManager = Environment.getEnvironmentInstance().getDatabaseManager(); NBTree artistNBTree = nbtreeManager.getNBTree(Elements.ARTISTS_NBTREE); for (int i = 0; i < trackIds.length; i++) { try { double artistKey = dbManager.getArtistTrackKey(trackIds[i]); if (artistKey < 0) { //Util.displayErrorMessage(Environment.getEnvironmentInstance().getRootFrame(), "Similarity Filter", "Can't get non-similar artists!Try later!"); continue; } NBPoint artistPoint = artistNBTree.lookupPoint(artistKey); BTree resultTree = artistNBTree.knnQuery(artistPoint, dbManager.getCountArtists()); TupleBrowser browser = resultTree.browse(); Tuple tuple = new Tuple(); if (mode.equals(SimilarityMode.NON_SIMILAR)) while (browser.getNext(tuple)); for (int j = 0; ((mode.equals(SimilarityMode.NON_SIMILAR))? browser.getPrevious(tuple) : browser.getNext(tuple)) && j < numberSimilarArtists; j++) { if (tuple.getValue() instanceof NBPoint) { NBPoint point = (NBPoint) tuple.getValue(); String artistName = dbManager.getArtistName(point.norm()); ArrayList<Integer> artistTracks = dbManager.getArtistTracksIds(artistName); tracks.addAll(artistTracks); } } } catch (IOException ex) { ex.printStackTrace(); } catch (NBTreeException ex) { ex.printStackTrace(); } } return tracks; } public static ArrayList<Integer> getSimilarArtists(ArrayList<String> artistsName, int numSimilarArtists, SimilarityMode similarityMode) { ArrayList<Integer> tracks = new ArrayList(); NBTreeManager nbtreeManager = Environment.getEnvironmentInstance().getNbtreesManager(); MusicLibraryDatabaseManager dbManager = Environment.getEnvironmentInstance().getDatabaseManager(); NBTree artistNBTree = nbtreeManager.getNBTree(Elements.ARTISTS_NBTREE); for (String artistName : artistsName){ try { double artistKey = dbManager.getArtistKey(artistName); if (artistKey < 0) { //cannot retrive similarity information for this element continue; } NBPoint artistPoint = artistNBTree.lookupPoint(artistKey); BTree resultTree = artistNBTree.knnQuery(artistPoint, dbManager.getCountArtists()); TupleBrowser browser = resultTree.browse(); Tuple tuple = new Tuple(); if (similarityMode.equals(SimilarityMode.NON_SIMILAR)) while (browser.getNext(tuple)); for (int j = 0; ((similarityMode.equals(SimilarityMode.NON_SIMILAR))? browser.getPrevious(tuple) : browser.getNext(tuple)) && j < numSimilarArtists; j++) { if (tuple.getValue() instanceof NBPoint) { ArrayList<Integer> artistTracks = dbManager.getArtistTracksIds(artistName); tracks.addAll(artistTracks); } } } catch (IOException ex) { ex.printStackTrace(); } catch (NBTreeException ex) { ex.printStackTrace(); } } return tracks; } }