Skip to content

Commit 5fbbb7f

Browse files
committed
Support parsing media:content with type and medium attributes
1 parent 329c766 commit 5fbbb7f

20 files changed

Lines changed: 562 additions & 42 deletions

File tree

rssparser/api/jvm/rssparser.api

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,21 @@ public final class com/prof18/rssparser/model/RawEnclosure {
129129
public fun toString ()Ljava/lang/String;
130130
}
131131

132+
public final class com/prof18/rssparser/model/RawMediaContent {
133+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
134+
public final fun component1 ()Ljava/lang/String;
135+
public final fun component2 ()Ljava/lang/String;
136+
public final fun component3 ()Ljava/lang/String;
137+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lcom/prof18/rssparser/model/RawMediaContent;
138+
public static synthetic fun copy$default (Lcom/prof18/rssparser/model/RawMediaContent;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lcom/prof18/rssparser/model/RawMediaContent;
139+
public fun equals (Ljava/lang/Object;)Z
140+
public final fun getMedium ()Ljava/lang/String;
141+
public final fun getType ()Ljava/lang/String;
142+
public final fun getUrl ()Ljava/lang/String;
143+
public fun hashCode ()I
144+
public fun toString ()Ljava/lang/String;
145+
}
146+
132147
public final class com/prof18/rssparser/model/RssChannel {
133148
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/prof18/rssparser/model/RssImage;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesChannelData;Lcom/prof18/rssparser/model/YoutubeChannelData;)V
134149
public final fun component1 ()Ljava/lang/String;
@@ -174,7 +189,8 @@ public final class com/prof18/rssparser/model/RssImage {
174189
}
175190

176191
public final class com/prof18/rssparser/model/RssItem {
177-
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesItemData;Ljava/lang/String;Lcom/prof18/rssparser/model/YoutubeItemData;Lcom/prof18/rssparser/model/RawEnclosure;)V
192+
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesItemData;Ljava/lang/String;Lcom/prof18/rssparser/model/YoutubeItemData;Lcom/prof18/rssparser/model/RawEnclosure;Lcom/prof18/rssparser/model/RawMediaContent;)V
193+
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesItemData;Ljava/lang/String;Lcom/prof18/rssparser/model/YoutubeItemData;Lcom/prof18/rssparser/model/RawEnclosure;Lcom/prof18/rssparser/model/RawMediaContent;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
178194
public final fun component1 ()Ljava/lang/String;
179195
public final fun component10 ()Ljava/lang/String;
180196
public final fun component11 ()Ljava/lang/String;
@@ -184,6 +200,7 @@ public final class com/prof18/rssparser/model/RssItem {
184200
public final fun component15 ()Ljava/lang/String;
185201
public final fun component16 ()Lcom/prof18/rssparser/model/YoutubeItemData;
186202
public final fun component17 ()Lcom/prof18/rssparser/model/RawEnclosure;
203+
public final fun component18 ()Lcom/prof18/rssparser/model/RawMediaContent;
187204
public final fun component2 ()Ljava/lang/String;
188205
public final fun component3 ()Ljava/lang/String;
189206
public final fun component4 ()Ljava/lang/String;
@@ -192,8 +209,8 @@ public final class com/prof18/rssparser/model/RssItem {
192209
public final fun component7 ()Ljava/lang/String;
193210
public final fun component8 ()Ljava/lang/String;
194211
public final fun component9 ()Ljava/lang/String;
195-
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesItemData;Ljava/lang/String;Lcom/prof18/rssparser/model/YoutubeItemData;Lcom/prof18/rssparser/model/RawEnclosure;)Lcom/prof18/rssparser/model/RssItem;
196-
public static synthetic fun copy$default (Lcom/prof18/rssparser/model/RssItem;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesItemData;Ljava/lang/String;Lcom/prof18/rssparser/model/YoutubeItemData;Lcom/prof18/rssparser/model/RawEnclosure;ILjava/lang/Object;)Lcom/prof18/rssparser/model/RssItem;
212+
public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesItemData;Ljava/lang/String;Lcom/prof18/rssparser/model/YoutubeItemData;Lcom/prof18/rssparser/model/RawEnclosure;Lcom/prof18/rssparser/model/RawMediaContent;)Lcom/prof18/rssparser/model/RssItem;
213+
public static synthetic fun copy$default (Lcom/prof18/rssparser/model/RssItem;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lcom/prof18/rssparser/model/ItunesItemData;Ljava/lang/String;Lcom/prof18/rssparser/model/YoutubeItemData;Lcom/prof18/rssparser/model/RawEnclosure;Lcom/prof18/rssparser/model/RawMediaContent;ILjava/lang/Object;)Lcom/prof18/rssparser/model/RssItem;
197214
public fun equals (Ljava/lang/Object;)Z
198215
public final fun getAudio ()Ljava/lang/String;
199216
public final fun getAuthor ()Ljava/lang/String;
@@ -207,6 +224,7 @@ public final class com/prof18/rssparser/model/RssItem {
207224
public final fun getLink ()Ljava/lang/String;
208225
public final fun getPubDate ()Ljava/lang/String;
209226
public final fun getRawEnclosure ()Lcom/prof18/rssparser/model/RawEnclosure;
227+
public final fun getRawMediaContent ()Lcom/prof18/rssparser/model/RawMediaContent;
210228
public final fun getSourceName ()Ljava/lang/String;
211229
public final fun getSourceUrl ()Ljava/lang/String;
212230
public final fun getTitle ()Ljava/lang/String;

rssparser/api/rssparser.klib.api

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,25 @@ final class com.prof18.rssparser.model/RawEnclosure { // com.prof18.rssparser.mo
157157
final fun toString(): kotlin/String // com.prof18.rssparser.model/RawEnclosure.toString|toString(){}[0]
158158
}
159159

160+
final class com.prof18.rssparser.model/RawMediaContent { // com.prof18.rssparser.model/RawMediaContent|null[0]
161+
constructor <init>(kotlin/String?, kotlin/String?, kotlin/String?) // com.prof18.rssparser.model/RawMediaContent.<init>|<init>(kotlin.String?;kotlin.String?;kotlin.String?){}[0]
162+
163+
final val medium // com.prof18.rssparser.model/RawMediaContent.medium|{}medium[0]
164+
final fun <get-medium>(): kotlin/String? // com.prof18.rssparser.model/RawMediaContent.medium.<get-medium>|<get-medium>(){}[0]
165+
final val type // com.prof18.rssparser.model/RawMediaContent.type|{}type[0]
166+
final fun <get-type>(): kotlin/String? // com.prof18.rssparser.model/RawMediaContent.type.<get-type>|<get-type>(){}[0]
167+
final val url // com.prof18.rssparser.model/RawMediaContent.url|{}url[0]
168+
final fun <get-url>(): kotlin/String? // com.prof18.rssparser.model/RawMediaContent.url.<get-url>|<get-url>(){}[0]
169+
170+
final fun component1(): kotlin/String? // com.prof18.rssparser.model/RawMediaContent.component1|component1(){}[0]
171+
final fun component2(): kotlin/String? // com.prof18.rssparser.model/RawMediaContent.component2|component2(){}[0]
172+
final fun component3(): kotlin/String? // com.prof18.rssparser.model/RawMediaContent.component3|component3(){}[0]
173+
final fun copy(kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ...): com.prof18.rssparser.model/RawMediaContent // com.prof18.rssparser.model/RawMediaContent.copy|copy(kotlin.String?;kotlin.String?;kotlin.String?){}[0]
174+
final fun equals(kotlin/Any?): kotlin/Boolean // com.prof18.rssparser.model/RawMediaContent.equals|equals(kotlin.Any?){}[0]
175+
final fun hashCode(): kotlin/Int // com.prof18.rssparser.model/RawMediaContent.hashCode|hashCode(){}[0]
176+
final fun toString(): kotlin/String // com.prof18.rssparser.model/RawMediaContent.toString|toString(){}[0]
177+
}
178+
160179
final class com.prof18.rssparser.model/RssChannel { // com.prof18.rssparser.model/RssChannel|null[0]
161180
constructor <init>(kotlin/String?, kotlin/String?, kotlin/String?, com.prof18.rssparser.model/RssImage?, kotlin/String?, kotlin/String?, kotlin.collections/List<com.prof18.rssparser.model/RssItem>, com.prof18.rssparser.model/ItunesChannelData?, com.prof18.rssparser.model/YoutubeChannelData?) // com.prof18.rssparser.model/RssChannel.<init>|<init>(kotlin.String?;kotlin.String?;kotlin.String?;com.prof18.rssparser.model.RssImage?;kotlin.String?;kotlin.String?;kotlin.collections.List<com.prof18.rssparser.model.RssItem>;com.prof18.rssparser.model.ItunesChannelData?;com.prof18.rssparser.model.YoutubeChannelData?){}[0]
162181

@@ -217,7 +236,7 @@ final class com.prof18.rssparser.model/RssImage { // com.prof18.rssparser.model/
217236
}
218237

219238
final class com.prof18.rssparser.model/RssItem { // com.prof18.rssparser.model/RssItem|null[0]
220-
constructor <init>(kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin.collections/List<kotlin/String>, com.prof18.rssparser.model/ItunesItemData?, kotlin/String?, com.prof18.rssparser.model/YoutubeItemData?, com.prof18.rssparser.model/RawEnclosure?) // com.prof18.rssparser.model/RssItem.<init>|<init>(kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.collections.List<kotlin.String>;com.prof18.rssparser.model.ItunesItemData?;kotlin.String?;com.prof18.rssparser.model.YoutubeItemData?;com.prof18.rssparser.model.RawEnclosure?){}[0]
239+
constructor <init>(kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin/String?, kotlin.collections/List<kotlin/String>, com.prof18.rssparser.model/ItunesItemData?, kotlin/String?, com.prof18.rssparser.model/YoutubeItemData?, com.prof18.rssparser.model/RawEnclosure?, com.prof18.rssparser.model/RawMediaContent? = ...) // com.prof18.rssparser.model/RssItem.<init>|<init>(kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.collections.List<kotlin.String>;com.prof18.rssparser.model.ItunesItemData?;kotlin.String?;com.prof18.rssparser.model.YoutubeItemData?;com.prof18.rssparser.model.RawEnclosure?;com.prof18.rssparser.model.RawMediaContent?){}[0]
221240

222241
final val audio // com.prof18.rssparser.model/RssItem.audio|{}audio[0]
223242
final fun <get-audio>(): kotlin/String? // com.prof18.rssparser.model/RssItem.audio.<get-audio>|<get-audio>(){}[0]
@@ -243,6 +262,8 @@ final class com.prof18.rssparser.model/RssItem { // com.prof18.rssparser.model/R
243262
final fun <get-pubDate>(): kotlin/String? // com.prof18.rssparser.model/RssItem.pubDate.<get-pubDate>|<get-pubDate>(){}[0]
244263
final val rawEnclosure // com.prof18.rssparser.model/RssItem.rawEnclosure|{}rawEnclosure[0]
245264
final fun <get-rawEnclosure>(): com.prof18.rssparser.model/RawEnclosure? // com.prof18.rssparser.model/RssItem.rawEnclosure.<get-rawEnclosure>|<get-rawEnclosure>(){}[0]
265+
final val rawMediaContent // com.prof18.rssparser.model/RssItem.rawMediaContent|{}rawMediaContent[0]
266+
final fun <get-rawMediaContent>(): com.prof18.rssparser.model/RawMediaContent? // com.prof18.rssparser.model/RssItem.rawMediaContent.<get-rawMediaContent>|<get-rawMediaContent>(){}[0]
246267
final val sourceName // com.prof18.rssparser.model/RssItem.sourceName|{}sourceName[0]
247268
final fun <get-sourceName>(): kotlin/String? // com.prof18.rssparser.model/RssItem.sourceName.<get-sourceName>|<get-sourceName>(){}[0]
248269
final val sourceUrl // com.prof18.rssparser.model/RssItem.sourceUrl|{}sourceUrl[0]
@@ -263,6 +284,7 @@ final class com.prof18.rssparser.model/RssItem { // com.prof18.rssparser.model/R
263284
final fun component15(): kotlin/String? // com.prof18.rssparser.model/RssItem.component15|component15(){}[0]
264285
final fun component16(): com.prof18.rssparser.model/YoutubeItemData? // com.prof18.rssparser.model/RssItem.component16|component16(){}[0]
265286
final fun component17(): com.prof18.rssparser.model/RawEnclosure? // com.prof18.rssparser.model/RssItem.component17|component17(){}[0]
287+
final fun component18(): com.prof18.rssparser.model/RawMediaContent? // com.prof18.rssparser.model/RssItem.component18|component18(){}[0]
266288
final fun component2(): kotlin/String? // com.prof18.rssparser.model/RssItem.component2|component2(){}[0]
267289
final fun component3(): kotlin/String? // com.prof18.rssparser.model/RssItem.component3|component3(){}[0]
268290
final fun component4(): kotlin/String? // com.prof18.rssparser.model/RssItem.component4|component4(){}[0]
@@ -271,7 +293,7 @@ final class com.prof18.rssparser.model/RssItem { // com.prof18.rssparser.model/R
271293
final fun component7(): kotlin/String? // com.prof18.rssparser.model/RssItem.component7|component7(){}[0]
272294
final fun component8(): kotlin/String? // com.prof18.rssparser.model/RssItem.component8|component8(){}[0]
273295
final fun component9(): kotlin/String? // com.prof18.rssparser.model/RssItem.component9|component9(){}[0]
274-
final fun copy(kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin.collections/List<kotlin/String> = ..., com.prof18.rssparser.model/ItunesItemData? = ..., kotlin/String? = ..., com.prof18.rssparser.model/YoutubeItemData? = ..., com.prof18.rssparser.model/RawEnclosure? = ...): com.prof18.rssparser.model/RssItem // com.prof18.rssparser.model/RssItem.copy|copy(kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.collections.List<kotlin.String>;com.prof18.rssparser.model.ItunesItemData?;kotlin.String?;com.prof18.rssparser.model.YoutubeItemData?;com.prof18.rssparser.model.RawEnclosure?){}[0]
296+
final fun copy(kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin/String? = ..., kotlin.collections/List<kotlin/String> = ..., com.prof18.rssparser.model/ItunesItemData? = ..., kotlin/String? = ..., com.prof18.rssparser.model/YoutubeItemData? = ..., com.prof18.rssparser.model/RawEnclosure? = ..., com.prof18.rssparser.model/RawMediaContent? = ...): com.prof18.rssparser.model/RssItem // com.prof18.rssparser.model/RssItem.copy|copy(kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.String?;kotlin.collections.List<kotlin.String>;com.prof18.rssparser.model.ItunesItemData?;kotlin.String?;com.prof18.rssparser.model.YoutubeItemData?;com.prof18.rssparser.model.RawEnclosure?;com.prof18.rssparser.model.RawMediaContent?){}[0]
275297
final fun equals(kotlin/Any?): kotlin/Boolean // com.prof18.rssparser.model/RssItem.equals|equals(kotlin.Any?){}[0]
276298
final fun hashCode(): kotlin/Int // com.prof18.rssparser.model/RssItem.hashCode|hashCode(){}[0]
277299
final fun toString(): kotlin/String // com.prof18.rssparser.model/RssItem.toString|toString(){}[0]

rssparser/src/androidMain/kotlin/com/prof18/rssparser/internal/atom/AtomParser.kt

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,14 @@ package com.prof18.rssparser.internal.atom
2020
import com.prof18.rssparser.internal.AtomKeyword
2121
import com.prof18.rssparser.internal.ChannelFactory
2222
import com.prof18.rssparser.internal.ParserInput
23+
import com.prof18.rssparser.internal.RssKeyword
2324
import com.prof18.rssparser.internal.attributeValue
2425
import com.prof18.rssparser.internal.contains
2526
import com.prof18.rssparser.internal.nextTrimmedText
2627
import com.prof18.rssparser.model.RssChannel
2728
import kotlinx.coroutines.CoroutineScope
2829
import kotlinx.coroutines.isActive
2930
import org.xmlpull.v1.XmlPullParser
30-
import org.xmlpull.v1.XmlPullParserException
3131

3232
internal fun CoroutineScope.extractAtomContent(
3333
xmlPullParser: XmlPullParser,
@@ -203,10 +203,33 @@ internal fun CoroutineScope.extractAtomContent(
203203
}
204204
}
205205

206-
xmlPullParser.contains(AtomKeyword.YOUTUBE_MEDIA_GROUP_CONTENT) -> {
207-
if (insideItem && insideYoutubeMediaGroup) {
208-
val videoUrl = xmlPullParser.attributeValue(AtomKeyword.YOUTUBE_MEDIA_GROUP_CONTENT_URL)
209-
channelFactory.youtubeItemDataBuilder.videoUrl(videoUrl)
206+
xmlPullParser.contains(AtomKeyword.MEDIA_GROUP_CONTENT) -> {
207+
if (insideItem) {
208+
if (insideYoutubeMediaGroup) {
209+
val videoUrl = xmlPullParser.attributeValue(AtomKeyword.YOUTUBE_MEDIA_GROUP_CONTENT_URL)
210+
channelFactory.youtubeItemDataBuilder.videoUrl(videoUrl)
211+
} else {
212+
val url = xmlPullParser.attributeValue(RssKeyword.URL)
213+
val type = xmlPullParser.attributeValue(RssKeyword.ITEM_TYPE)
214+
val medium = xmlPullParser.attributeValue(RssKeyword.ITEM_MEDIUM)
215+
216+
channelFactory.rawMediaContentBuilder.url(url)
217+
channelFactory.rawMediaContentBuilder.type(type)
218+
channelFactory.rawMediaContentBuilder.medium(medium)
219+
220+
when {
221+
!medium.isNullOrBlank() -> when {
222+
medium.equals("image", ignoreCase = true) -> channelFactory.articleBuilder.image(url)
223+
medium.equals("audio", ignoreCase = true) -> channelFactory.articleBuilder.audioIfNull(url)
224+
medium.equals("video", ignoreCase = true) -> channelFactory.articleBuilder.videoIfNull(url)
225+
}
226+
!type.isNullOrBlank() -> when {
227+
type.contains("image", ignoreCase = true) -> channelFactory.articleBuilder.image(url)
228+
type.contains("audio", ignoreCase = true) -> channelFactory.articleBuilder.audioIfNull(url)
229+
type.contains("video", ignoreCase = true) -> channelFactory.articleBuilder.videoIfNull(url)
230+
}
231+
}
232+
}
210233
}
211234
}
212235

0 commit comments

Comments
 (0)