/* * Copyright (C) 2008-2021, Juick * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.juick.www.rss; import com.juick.model.ResponseReply; import com.juick.util.MessageUtils; import com.rometools.modules.mediarss.MediaEntryModuleImpl; import com.rometools.modules.mediarss.MediaModule; import com.rometools.modules.mediarss.MediaModuleImpl; import com.rometools.modules.mediarss.types.MediaContent; import com.rometools.modules.mediarss.types.Metadata; import com.rometools.modules.mediarss.types.Thumbnail; import com.rometools.modules.mediarss.types.UrlReference; import com.rometools.rome.feed.rss.Channel; import com.rometools.rome.feed.rss.Description; import com.rometools.rome.feed.rss.Guid; import com.rometools.rome.feed.rss.Item; import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.view.feed.AbstractRssFeedView; import javax.annotation.Nonnull; import java.net.URI; import java.net.URISyntaxException; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * Created by vitalyster on 13.12.2016. */ public class RepliesView extends AbstractRssFeedView { private static final Logger logger = LoggerFactory.getLogger(RepliesView.class); @PostConstruct public void init() { setContentType("application/rss+xml;charset=UTF-8"); } @SuppressWarnings("unchecked") @Override protected @Nonnull List<Item> buildFeedItems(Map<String, Object> model, HttpServletRequest request, HttpServletResponse response) { List<ResponseReply> msgs = (List<ResponseReply>)model.get("messages"); return msgs.stream().map(this::createRssItem).toList(); } @Override protected void buildFeedMetadata(Map<String, Object> model, Channel feed, HttpServletRequest request) { feed.setTitle("Juick"); feed.setLink("https://juick.com/"); feed.setDescription("The latest comments at Juick"); MediaModule mediaModule = new MediaModuleImpl(); feed.getModules().add(mediaModule); } private Item createRssItem(ResponseReply msg) { Item item = new Item(); String messageUrl = String.format("https://juick.com/m/%d#%d", msg.getMid(), msg.getRid()); String messageTitle = String.format("@%s:", msg.getUname()); String messageDescription = msg.isHtml() ? msg.getDescription() : MessageUtils.formatMessage(msg.getDescription()); item.setLink(messageUrl); Guid guid = new Guid(); guid.setPermaLink(true); guid.setValue(messageUrl); item.setGuid(guid); item.setTitle(messageTitle); Description description = new Description(); description.setType("text/html"); description.setValue(messageDescription); item.setDescription(description); item.setPubDate(msg.getPubDate()); if (StringUtils.isNotEmpty(msg.getAttachmentType())) { String type = msg.getAttachmentType().equals("jpg") ? "image/jpeg" : "image/png"; MediaEntryModuleImpl module = new MediaEntryModuleImpl(); try { UrlReference reference = new UrlReference( String.format("https://i.juick.com/photos-1024/%d-%d.%s", msg.getMid(), msg.getRid(), type)); MediaContent mediaContent = new MediaContent(reference); mediaContent.setType(type); Metadata metadata = new Metadata(); metadata.setThumbnail(new Thumbnail[]{new Thumbnail( new URI(String.format("https://i.juick.com/ps/%d-%d.%s", msg.getMid(), msg.getRid(), type)))}); module.setMetadata(metadata); module.setMediaContents(new MediaContent[]{mediaContent}); item.getModules().add(module); } catch (URISyntaxException e) { logger.error("Invalid URI", e); } } return item; } }