/* * Created on December 4, 2009 * Created by Olivier Chalouhi * * Copyright 2008 Vuze, Inc. All rights reserved. * * This program 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; version 2 of the License only. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. */ package com.aelitis.azureus.core.messenger.config; import java.util.*; import com.aelitis.azureus.core.messenger.PlatformMessengerException; public class PlatformMetaDataMessenger { private static final PlatformMessengerConfig dispatcher = new PlatformMessengerConfig( "metadata", false ); private static final String OP_LOOKUP = "lookup"; private static final String OP_SEARCH = "search"; private static final String OP_SUBMIT = "submit"; public static Association getAssociation( String hash) throws PlatformMessengerException { Map reply = dispatcher.syncInvoke( OP_LOOKUP, getParameter( hash ) ); Association assoc = getAssociation( reply ); if ( assoc == null ){ throw( new PlatformMessengerException( "Invalid reply: " + reply )); } return assoc; } private static Association getAssociation(Map reply) { try { Map result = (Map) reply.get("result"); return getAssociationFromMap(result); } catch (Exception e) { e.printStackTrace(); return null; } } private static Association getAssociationFromMap(Map assoc) { try { String title = (String) assoc.get("title"); String db = (String) assoc.get("db"); String db_id = (String) assoc.get("db_id"); String hash = (String) assoc.get("hash"); String type = (String) assoc.get("type"); if(type == null) { EmptyAssociation result = new EmptyAssociation(); result.hash = hash; return result; } if("movie".equals(type)) { String quality = (String) assoc.get("quality"); String language = (String) assoc.get("language"); MovieAssociation association = new MovieAssociation(); association.db = db; association.db_id = db_id; association.title = title; association.quality = VideoQuality.fromString(quality); association.language = new Locale(language); association.hash = hash; return association; } if("tv".equals(type)) { String quality = (String) assoc.get("quality"); String language = (String) assoc.get("language"); TvShowAssociation association = new TvShowAssociation(); association.db = db; association.db_id = db_id; association.title = title; association.quality = VideoQuality.fromString(quality); association.language = new Locale(language); association.hash = hash; return association; } if("music".equals(type)) { String quality = (String) assoc.get("quality"); MusicAssociation association = new MusicAssociation(); association.db = db; association.db_id = db_id; association.title = title; association.quality = AudioQuality.fromString(quality); association.hash = hash; return association; } return null; } catch (Exception e) { e.printStackTrace(); return null; } } private static Map<String,Association> getAssociations(Map reply) { try { Map<String,Map> result = (Map<String,Map>) reply.get("results"); Map<String,Association> results = new HashMap<String, Association>(); for(String key : result.keySet()) { results.put(key, getAssociationFromMap(result.get(key))); } return results; } catch (Exception e) { e.printStackTrace(); return new HashMap<String,Association>(); } } public static Map<String,Association> getAssociations( String[] hashes ) throws PlatformMessengerException { Map<String,Association> result = new HashMap<String, Association>(); if( hashes.length == 0 ){ return result; } Map reply = dispatcher.syncInvoke( OP_LOOKUP, getParameters(hashes) ); return( getAssociations( reply )); } public static void addSubmission(Association assoc) throws PlatformMessengerException { Map<String,Object> parameters = new HashMap<String,Object>(); Map<String,Object> submission = new HashMap<String,Object>(); submission.put("hash",assoc.hash); submission.put("db", assoc.db); submission.put("db_id",assoc.db_id); if(assoc instanceof MovieAssociation) { submission.put("type", "movie"); submission.put("quality", ((MovieAssociation)assoc).quality.quality); submission.put("language", ((MovieAssociation)assoc).language.getLanguage()); } if(assoc instanceof TvShowAssociation) { submission.put("type", "tv"); submission.put("quality", ((MovieAssociation)assoc).quality.quality); submission.put("language", ((MovieAssociation)assoc).language.getLanguage()); } if(assoc instanceof MusicAssociation) { submission.put("type", "music"); submission.put("quality", ((MovieAssociation)assoc).quality.quality); } parameters.put("submission", submission); dispatcher.syncInvoke( OP_SUBMIT, parameters ); } public static SearchResult[] search(String title) throws PlatformMessengerException { Map<String,String> parameters = new HashMap<String, String>(); parameters.put("title", title); Map reply = dispatcher.syncInvoke( OP_SEARCH, parameters ); List<Map> results = (List<Map>)reply.get("results"); SearchResult[] searchResults = new SearchResult[results.size()]; int i = 0; for(Map result : results) { SearchResult searchResult = new SearchResult(); searchResult.title = (String)result.get("title"); searchResult.db = (String)result.get("db"); searchResult.db_id = (String)result.get("db_id"); searchResults[i++] = searchResult; } return searchResults; } public static class SearchResult { String title; String db; String db_id; @Override public String toString() { return db + "." + db_id + " : " + title; } } protected static Map getParameter( String hash ) { Map parameters = new HashMap(); parameters.put( "hash", hash ); return( parameters ); } protected static Map getParameters( String[] hashes ) { Map parameters = new HashMap(); parameters.put( "hashes", hashes); return( parameters ); } public static abstract class Association { public String hash; public String db; public String db_id; //Cached but not stored public String title; @Override public String toString() { return hash + " > " + db + "." + db_id + " : " + title; } } public static class EmptyAssociation extends Association { } public static abstract class VideoAssociation extends Association { public VideoQuality quality; public Locale language; } public static class MovieAssociation extends VideoAssociation { } public static class TvShowAssociation extends VideoAssociation { } public static class MusicAssociation extends Association { public AudioQuality quality; } public static enum VideoQuality { LOW("low"),DVD("dvd"),HD_720p("720p"),HD_1080p("1080p"); String quality; private VideoQuality(String quality) { this.quality = quality; } public static VideoQuality fromString(String quality) { quality = quality.toLowerCase(); if(LOW.quality.equals(quality)) return LOW; if(DVD.quality.equals(quality)) return DVD; if(HD_720p.quality.equals(quality)) return HD_720p; if(HD_1080p.quality.equals(quality)) return HD_1080p; return null; } } public static enum AudioQuality { LOW("low"),HIGH("high"),LOSSLESS("lossless"); String quality; private AudioQuality(String quality) { this.quality = quality; } public static AudioQuality fromString(String quality) { quality = quality.toLowerCase(); if(LOW.quality.equals(quality)) return LOW; if(HIGH.quality.equals(quality)) return HIGH; if(LOSSLESS.quality.equals(quality)) return LOSSLESS; return null; } } public static void main(String[] args) throws Exception { SearchResult[] results = search("Dark Knight"); for(SearchResult result : results) { System.out.println(result); } MovieAssociation assoc = new MovieAssociation(); assoc.db = "tmdb"; assoc.db_id = "155"; assoc.hash = "test"; assoc.quality = VideoQuality.DVD; assoc.language = new Locale("en"); addSubmission(assoc); Association assocL = getAssociation("test"); System.out.println(assocL); } }