/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.apache.streams.youtube.serializer; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.JsonNode; import com.google.api.client.util.DateTime; import com.google.api.services.youtube.model.Channel; import com.google.api.services.youtube.model.ChannelContentDetails; import com.google.api.services.youtube.model.ChannelLocalization; import com.google.api.services.youtube.model.ChannelSnippet; import com.google.api.services.youtube.model.ChannelStatistics; import com.google.api.services.youtube.model.ChannelTopicDetails; import com.google.api.services.youtube.model.Thumbnail; import com.google.api.services.youtube.model.ThumbnailDetails; import java.io.IOException; import java.util.LinkedList; import java.util.List; /** * YoutubeChannelDeserializer is a JsonDeserializer for Channel. */ public class YoutubeChannelDeserializer extends JsonDeserializer<Channel> { @Override public Channel deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException { JsonNode node = jp.getCodec().readTree(jp); try { Channel channel = new Channel(); if (node.findPath("etag") != null) { channel.setEtag(node.get("etag").asText()); } if (node.findPath("kind") != null) { channel.setKind(node.get("kind").asText()); } channel.setId(node.get("id").asText()); channel.setTopicDetails(setTopicDetails(node.findValue("topicDetails"))); channel.setStatistics(setChannelStatistics(node.findValue("statistics"))); channel.setContentDetails(setContentDetails(node.findValue("contentDetails"))); channel.setSnippet(setChannelSnippet(node.findValue("snippet"))); return channel; } catch (Throwable throwable) { throw new IOException(throwable); } } protected ChannelSnippet setChannelSnippet(JsonNode node) { ChannelSnippet snippet = new ChannelSnippet(); snippet.setTitle(node.get("title").asText()); snippet.setDescription(node.get("description").asText()); snippet.setPublishedAt(new DateTime(node.get("publishedAt").get("value").longValue())); snippet.setLocalized(setLocalized(node.findValue("localized"))); snippet.setThumbnails(setThumbnails(node.findValue("thumbnails"))); return snippet; } protected ThumbnailDetails setThumbnails(JsonNode node) { ThumbnailDetails details = new ThumbnailDetails(); if (node == null) { return details; } details.setDefault(new Thumbnail().setUrl(node.get("default").get("url").asText())); details.setHigh(new Thumbnail().setUrl(node.get("high").get("url").asText())); details.setMedium(new Thumbnail().setUrl(node.get("medium").get("url").asText())); return details; } protected ChannelLocalization setLocalized(JsonNode node) { if (node == null) { return new ChannelLocalization(); } ChannelLocalization localization = new ChannelLocalization(); localization.setDescription(node.get("description").asText()); localization.setTitle(node.get("title").asText()); return localization; } protected ChannelContentDetails setContentDetails(JsonNode node) { ChannelContentDetails contentDetails = new ChannelContentDetails(); if (node == null) { return contentDetails; } if (node.findValue("googlePlusUserId") != null) { contentDetails.setGooglePlusUserId(node.get("googlePlusUserId").asText()); } contentDetails.setRelatedPlaylists(setRelatedPlaylists(node.findValue("relatedPlaylists"))); return contentDetails; } protected ChannelContentDetails.RelatedPlaylists setRelatedPlaylists(JsonNode node) { ChannelContentDetails.RelatedPlaylists playlists = new ChannelContentDetails.RelatedPlaylists(); if (node == null) { return playlists; } if (node.findValue("favorites") != null) { playlists.setFavorites(node.get("favorites").asText()); } if (node.findValue("likes") != null) { playlists.setLikes(node.get("likes").asText()); } if (node.findValue("uploads") != null) { playlists.setUploads(node.get("uploads").asText()); } return playlists; } protected ChannelStatistics setChannelStatistics(JsonNode node) { ChannelStatistics stats = new ChannelStatistics(); if (node == null) { return stats; } stats.setCommentCount(node.get("commentCount").bigIntegerValue()); stats.setHiddenSubscriberCount(node.get("hiddenSubscriberCount").asBoolean()); stats.setSubscriberCount(node.get("subscriberCount").bigIntegerValue()); stats.setVideoCount(node.get("videoCount").bigIntegerValue()); stats.setViewCount(node.get("viewCount").bigIntegerValue()); return stats; } protected ChannelTopicDetails setTopicDetails(JsonNode node) { ChannelTopicDetails details = new ChannelTopicDetails(); if (node == null) { return details; } List<String> topicIds = new LinkedList<>(); for (JsonNode jsonNode : node.get("topicIds")) { topicIds.add(jsonNode.asText()); } details.setTopicIds(topicIds); return details; } }