All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jvmMain.com.prof18.rssparser.internal.rss.RssFeedHandler.kt Maven / Gradle / Ivy

package com.prof18.rssparser.internal.rss

import com.prof18.rssparser.internal.ChannelFactory
import com.prof18.rssparser.internal.FeedHandler
import com.prof18.rssparser.internal.RssKeyword
import com.prof18.rssparser.model.RssChannel
import org.xml.sax.Attributes

internal class RssFeedHandler : FeedHandler {

    private var isInsideItem = false
    private var isInsideChannel = true
    private var isInsideChannelImage = false
    private var isInsideItunesOwner = false
    private var isInsideItemImage = false

    private var channelFactory = ChannelFactory()

    override fun onStartRssElement(
        qName: String?,
        attributes: Attributes?,
    ) {
        when (qName) {
            RssKeyword.Channel.Channel.value -> isInsideChannel = true
            RssKeyword.Item.Item.value -> isInsideItem = true
            RssKeyword.Channel.Itunes.Owner.value -> isInsideItunesOwner = true
            RssKeyword.Image.value -> {
                when {
                    isInsideItem -> {
                        isInsideItemImage = true
                    }
                    isInsideChannel -> isInsideChannelImage = true
                }
            }

            RssKeyword.Item.MediaContent.value -> {
                if (isInsideItem) {
                    val url = attributes?.getValue(RssKeyword.Url.value)
                    channelFactory.articleBuilder.image(url)
                }
            }

            RssKeyword.Item.Thumbnail.value -> {
                if (isInsideItem) {
                    val url = attributes?.getValue(RssKeyword.Url.value)
                    channelFactory.articleBuilder.image(url)
                }
            }

            RssKeyword.Item.Enclosure.value -> {
                if (isInsideItem) {
                    val type = attributes?.getValue(RssKeyword.Item.Type.value)

                    when {
                        type != null && type.contains("image") -> {
                            // If there are multiple elements, we take only the first
                            channelFactory.articleBuilder.image(
                                attributes.getValue(RssKeyword.Url.value)
                            )
                        }

                        type != null && type.contains("audio") -> {
                            // If there are multiple elements, we take only the first
                            channelFactory.articleBuilder.audioIfNull(
                                attributes.getValue(RssKeyword.Url.value)
                            )
                        }

                        type != null && type.contains("video") -> {
                            // If there are multiple elements, we take only the first
                            channelFactory.articleBuilder.videoIfNull(
                                attributes.getValue(RssKeyword.Url.value)
                            )
                        }
                    }
                }
            }

            RssKeyword.Itunes.Image.value -> {
                val url = attributes?.getValue(RssKeyword.Href.value)
                when {
                    isInsideItem -> channelFactory.itunesArticleBuilder.image(url)
                    isInsideChannel -> channelFactory.itunesChannelBuilder.image(url)
                }
            }

            RssKeyword.Item.Source.value -> {
                if (isInsideItem) {
                    val sourceUrl = attributes?.getValue(RssKeyword.Url.value)
                    channelFactory.articleBuilder.sourceUrl(sourceUrl)
                }
            }

            RssKeyword.Channel.Itunes.Category.value -> {
                if (isInsideChannel) {
                    val category = attributes?.getValue(RssKeyword.Channel.Itunes.Text.value)
                    channelFactory.itunesChannelBuilder.addCategory(category)
                }
            }
        }
    }

    override fun endElement(
        qName: String?,
        text: String,
    ) {
        when {
            isInsideItemImage -> {
                when (qName) {
                    RssKeyword.Link.value -> {
                        channelFactory.articleBuilder.image(text)
                    }
                    RssKeyword.Image.value -> {
                        channelFactory.articleBuilder.image(text)
                        isInsideItemImage = false
                    }
                }
            }

            isInsideItem -> {
                when (qName) {
                    RssKeyword.Item.Author.value -> channelFactory.articleBuilder.author(text)
                    RssKeyword.Item.Category.value -> channelFactory.articleBuilder.addCategory(text)
                    RssKeyword.Item.Source.value -> channelFactory.articleBuilder.sourceName(text)
                    RssKeyword.Item.Time.value -> channelFactory.articleBuilder.pubDate(text)
                    RssKeyword.Item.Guid.value -> channelFactory.articleBuilder.guid(text)
                    RssKeyword.Item.Content.value -> {
                        channelFactory.articleBuilder.content(text)
                        channelFactory.setImageFromContent(text)
                    }

                    RssKeyword.Item.PubDate.value -> {
                        channelFactory.articleBuilder.pubDate(text)
                    }

                    RssKeyword.Item.News.Image.value -> channelFactory.articleBuilder.image(text)
                    RssKeyword.Item.Comments.value -> channelFactory.articleBuilder.commentUrl(text)
                    RssKeyword.Image.value -> channelFactory.articleBuilder.image(text)
                    RssKeyword.Title.value -> channelFactory.articleBuilder.title(text)
                    RssKeyword.Link.value -> {
                        if (!isInsideItemImage) {
                            channelFactory.articleBuilder.link(text)
                        }
                    }
                    RssKeyword.Description.value -> {
                        channelFactory.setImageFromContent(text)
                        channelFactory.articleBuilder.description(text)
                    }

                    RssKeyword.Item.Enclosure.value -> {
                        channelFactory.articleBuilder.image(text)
                    }

                    RssKeyword.Item.Thumb.value -> {
                        channelFactory.articleBuilder.image(text)
                    }

                    RssKeyword.Item.Itunes.EpisodeType.value -> {
                        channelFactory.itunesArticleBuilder.episodeType(text)
                    }

                    RssKeyword.Item.Itunes.Episode.value -> {
                        channelFactory.itunesArticleBuilder.episode(text)
                    }

                    RssKeyword.Item.Itunes.Season.value -> {
                        channelFactory.itunesArticleBuilder.season(text)
                    }

                    RssKeyword.Itunes.Explicit.value -> {
                        channelFactory.itunesArticleBuilder.explicit(text)
                    }

                    RssKeyword.Itunes.Subtitle.value -> {
                        channelFactory.itunesArticleBuilder.subtitle(text)
                    }

                    RssKeyword.Itunes.Summary.value -> {
                        channelFactory.itunesArticleBuilder.summary(text)
                    }

                    RssKeyword.Itunes.Author.value -> {
                        channelFactory.itunesArticleBuilder.author(text)
                    }

                    RssKeyword.Itunes.Duration.value -> {
                        channelFactory.itunesArticleBuilder.duration(text)
                    }

                    RssKeyword.Itunes.Keywords.value -> channelFactory.setArticleItunesKeywords(text)

                    RssKeyword.Item.Item.value -> {
                        channelFactory.buildArticle()
                        isInsideItem = false
                    }
                }
            }

            isInsideItunesOwner -> {
                when (qName) {
                    RssKeyword.Channel.Itunes.OwnerName.value -> {
                        channelFactory.itunesOwnerBuilder.name(text)
                    }

                    RssKeyword.Channel.Itunes.OwnerEmail.value -> {
                        channelFactory.itunesOwnerBuilder.email(text)
                    }

                    RssKeyword.Channel.Itunes.Owner.value -> {
                        channelFactory.buildItunesOwner()
                        isInsideItunesOwner = false
                    }
                }
            }

            isInsideChannelImage -> {
                when (qName) {
                    RssKeyword.Url.value -> channelFactory.channelImageBuilder.url(text)
                    RssKeyword.Title.value -> channelFactory.channelImageBuilder.title(text)
                    RssKeyword.Link.value -> channelFactory.channelImageBuilder.link(text)
                    RssKeyword.Description.value -> {
                        channelFactory.channelImageBuilder.description(text)
                    }

                    RssKeyword.Image.value -> isInsideChannelImage = false
                }
            }

            isInsideChannel -> {
                when (qName) {
                    RssKeyword.Title.value -> channelFactory.channelBuilder.title(text)
                    RssKeyword.Link.value -> channelFactory.channelBuilder.link(text)
                    RssKeyword.Description.value -> channelFactory.channelBuilder.description(text)
                    RssKeyword.Channel.LastBuildDate.value -> {
                        channelFactory.channelBuilder.lastBuildDate(text)
                    }

                    RssKeyword.Channel.UpdatePeriod.value -> {
                        channelFactory.channelBuilder.updatePeriod(text)
                    }

                    RssKeyword.Channel.Itunes.Type.value -> {
                        channelFactory.itunesChannelBuilder.type(text)
                    }

                    RssKeyword.Itunes.Explicit.value -> {
                        channelFactory.itunesChannelBuilder.explicit(text)
                    }

                    RssKeyword.Itunes.Subtitle.value -> {
                        channelFactory.itunesChannelBuilder.subtitle(text)
                    }

                    RssKeyword.Itunes.Summary.value -> {
                        channelFactory.itunesChannelBuilder.summary(text)
                    }

                    RssKeyword.Itunes.Author.value -> {
                        channelFactory.itunesChannelBuilder.author(text)
                    }

                    RssKeyword.Itunes.Duration.value -> {
                        channelFactory.itunesChannelBuilder.duration(text)
                    }

                    RssKeyword.Itunes.Keywords.value -> {
                        channelFactory.setChannelItunesKeywords(text)
                    }

                    RssKeyword.Channel.Itunes.NewFeedUrl.value -> {
                        channelFactory.itunesChannelBuilder.newsFeedUrl(text)
                    }

                    RssKeyword.Channel.Channel.value -> isInsideChannel = false
                }
            }
        }
    }

    override fun buildRssChannel(): RssChannel =
        channelFactory.build()

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy