From 8f60a30d61708f882990b493f74ec53d19e534df Mon Sep 17 00:00:00 2001 From: Jannik Date: Sat, 26 Dec 2020 11:32:01 +0100 Subject: [PATCH] improve media parsing / loadStreams() * fix #20, return 0 as episode number on NumberFormatException * don't crash if a episode can not be parsed * update material components: 1.3.0-alpha04 -> 1.3.0-beta01 --- app/build.gradle | 2 +- .../java/org/mosad/teapod/parser/AoDParser.kt | 64 +++++++++++-------- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index ed80aa9..26df716 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -51,7 +51,7 @@ dependencies { implementation 'androidx.security:security-crypto:1.1.0-alpha03' implementation 'androidx.legacy:legacy-support-v4:1.0.0' - implementation 'com.google.android.material:material:1.3.0-alpha04' + implementation 'com.google.android.material:material:1.3.0-beta01' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.google.android.exoplayer:exoplayer-core:2.12.2' implementation 'com.google.android.exoplayer:exoplayer-hls:2.12.2' diff --git a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt index 98facbb..567cbb8 100644 --- a/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt +++ b/app/src/main/java/org/mosad/teapod/parser/AoDParser.kt @@ -31,6 +31,7 @@ import org.mosad.teapod.preferences.EncryptedPreferences import org.mosad.teapod.util.* import org.mosad.teapod.util.DataTypes.MediaType import java.io.IOException +import java.lang.NumberFormatException import java.util.* import kotlin.random.Random @@ -293,49 +294,42 @@ object AoDParser { val secondaryPlaylist = parsePlaylistAsync(secondary) primaryPlaylist.await().playlist.forEach { ep -> - val epNumber = if (media.type == MediaType.TVSHOW) { - ep.title.substringAfter(", Ep. ").toInt() - } else { - 0 - } - - media.episodes.add( - Episode( + try { + media.episodes.add(Episode( id = ep.mediaid, priStreamUrl = ep.sources.first().file, posterUrl = ep.image, title = ep.title, description = ep.description, - number = epNumber - ) - ) + number = getNumberFromTitle(ep.title, media.type) + )) + } catch (ex: Exception) { + Log.w(javaClass.name, "Could not parse episode information.", ex) + } } Log.i(javaClass.name, "Loading primary playlist finished") secondaryPlaylist.await().playlist.forEach { ep -> - val episode = media.episodes.firstOrNull { it.id == ep.mediaid } + try { + val episode = media.episodes.firstOrNull { it.id == ep.mediaid } - if (episode != null) { - episode.secStreamUrl = ep.sources.first().file - episode.secStreamOmU = secondaryIsOmU - } else { - val epNumber = if (media.type == MediaType.TVSHOW) { - ep.title.substringAfter(", Ep. ").toInt() + // if media contains already a episode with this id, add as secondary, else add as primary + if (episode != null) { + episode.secStreamUrl = ep.sources.first().file + episode.secStreamOmU = secondaryIsOmU } else { - 0 - } - - media.episodes.add( - Episode( + media.episodes.add(Episode( id = ep.mediaid, secStreamUrl = ep.sources.first().file, secStreamOmU = secondaryIsOmU, posterUrl = ep.image, title = ep.title, description = ep.description, - number = epNumber - ) - ) + number = getNumberFromTitle(ep.title, media.type) + )) + } + } catch (ex: Exception) { + Log.w(javaClass.name, "Could not parse episode information.", ex) } } Log.i(javaClass.name, "Loading secondary playlist finished") @@ -416,4 +410,22 @@ object AoDParser { } } + /** + * get the episode number from the title + * @param title the episode title, containing a number after "Ep." + * @param type the media type, if not TVSHOW, return 0 + * @return the episode number, on NumberFormatException return 0 + */ + private fun getNumberFromTitle(title: String, type: MediaType): Int { + return if (type == MediaType.TVSHOW) { + try { + title.substringAfter(", Ep. ").toInt() + } catch (nex: NumberFormatException) { + 0 + } + } else { + 0 + } + } + }