com.janoz.tvapilib.fanarttv.impl.FanartTvImpl.java Source code

Java tutorial

Introduction

Here is the source code for com.janoz.tvapilib.fanarttv.impl.FanartTvImpl.java

Source

/*******************************************************************************
 * Copyright (c) 2010 Gijs de Vries aka Janoz.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     Gijs de Vries aka Janoz - initial API and implementation
 ******************************************************************************/
package com.janoz.tvapilib.fanarttv.impl;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.simple.JSONObject;
import org.json.simple.JSONValue;

import com.janoz.tvapilib.fanarttv.FanartTv;
import com.janoz.tvapilib.model.Art;
import com.janoz.tvapilib.model.IEpisode;
import com.janoz.tvapilib.model.ISeason;
import com.janoz.tvapilib.model.IShow;
import com.janoz.tvapilib.support.TvApiException;

/**
 * @author Gijs de Vries aka Janoz
 *
 * @param <Sh> Show type
 * @param <Se> Season type
 * @param <Ep> Episode type
 *
 */
public class FanartTvImpl<Sh extends IShow<Sh, Se, Ep>, Se extends ISeason<Sh, Se, Ep>, Ep extends IEpisode<Sh, Se, Ep>>
        implements FanartTv<Sh, Se, Ep> {

    private static final Log LOG = LogFactory.getLog(FanartTvImpl.class);

    private String apiKey;

    public FanartTvImpl(String apiKey) {
        this.apiKey = apiKey;
    }

    @Override
    public void addFanart(Sh show) {
        int theTvDbId = show.getTheTvDbId();
        Reader r = new InputStreamReader(openStream(getUrl(theTvDbId)));
        JSONObject showArt = (JSONObject) JSONValue.parse(r);
        //validate
        String receivedTvDbId = (String) showArt.get("thetvdb_id");
        if (!receivedTvDbId.equals("" + theTvDbId)) {
            throw new TvApiException("Unexpected result. Wrong TVDB id.");
        }

        for (String key : (Set<String>) showArt.keySet()) {
            if (artMapping.containsKey(key)) {
                List<JSONObject> artArray = (List<JSONObject>) showArt.get(key);
                parsArtArray(show, key, artArray);
            }
        }
    }

    private void parsArtArray(Sh show, String key, List<JSONObject> artArray) {
        for (JSONObject jsonArt : artArray) {
            if (!"en".equals(jsonArt.get("lang")))
                continue;
            //only english for now
            Art art = artConstructor(key);
            art.setId(Integer.parseInt((String) jsonArt.get("id")));
            art.setRatingCount(Integer.parseInt((String) jsonArt.get("likes")));
            art.setUrl((String) jsonArt.get("url"));
            art.setThumbUrl(art.getUrl() + "/preview");
            if (jsonArt.containsKey("season")) {
                String strSeason = (String) jsonArt.get("season");
                int season = "all".equals(strSeason) ? -1 : "".equals(strSeason) ? 0 : Integer.parseInt(strSeason);
                show.getSeason(season).addArt(art);
            } else {
                show.addArt(art);
            }
        }
    }

    private Art artConstructor(String key) {
        if (artMapping.containsKey(key)) {
            Art result = new Art();
            result.setHd(key.startsWith("hd"));
            result.setType(artMapping.get(key));
            return result;
        }
        return null;
    }

    private static Map<String, Art.Type> artMapping;
    static {
        artMapping = new HashMap<String, Art.Type>();
        artMapping.put("clearart", Art.Type.CLEARART);
        artMapping.put("clearlogo", Art.Type.CLEARLOGO);
        artMapping.put("showbackground", Art.Type.BACKDROP);
        artMapping.put("tvbanner", Art.Type.BANNER);
        artMapping.put("hdtvlogo", Art.Type.CLEARLOGO);
        artMapping.put("tvthumb", Art.Type.THUMB);
        artMapping.put("hdclearart", Art.Type.CLEARART);
        artMapping.put("seasonthumb", Art.Type.THUMB);
    }

    /*
     * Package accessible so it can be mocked for test purposes.
     */
    String getUrl(int theTvDbId) {
        return "http://webservice.fanart.tv/v3/tv/" + theTvDbId + "?api_key=" + apiKey;
    }

    private InputStream openStream(String url) {
        try {
            return new URL(url).openStream();
        } catch (IOException e) {
            LOG.info("Unable to open JSON data.", e);
            throw new TvApiException("Unable to open JSON data.", e);
        }
    }

}