Android-Oembed-Video
Android-Oembed-Video copied to clipboard
A simple library for parsing and playing links from YouTube, YouTube Music, Vimeo and Rutube in the WebView without the need to connect API data services
Android Oembed Video
A simple library for parsing and playing links from YouTube, YouTube Music, Vimeo and Rutube and others in the WebView without the need to connect data API services.
Supported Video Hostings
-
YouTube
-
YouTube Music
-
Vimeo
-
Rutube
-
Facebook (is no longer available due to API restrictions)
-
Dailymotion
-
Wistia
-
~~Vzaar~~ (it's Dacast now)
-
Hulu
-
Ustream
-
Ted Talks
-
Coub
-
Streamable
-
Loom
Screenshots
Add it in your root build.gradle at the end of repositories:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Add the dependency
dependencies {
implementation 'com.github.TalbotGooday:Android-Oembed-Video:Tag'
}
Work Flow
- Create your OkHttpClient and add it to the VideoService.Builder
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.build()
val videoService = VideoService.build{
with(this@MainActivity)
httpClient(okHttpClient)
enableCache(true)
enableLog(true)
}
- Get VideoPreviewModel
videoService.loadVideoPreview(
url,
onSuccess = { video ->
//handle a video model
},
onError = { url, error ->
//handle an error
})
- Enable/disable caching
val videoService = VideoService.build {
enableCache(true)
}
- Enable/disable logging
val videoService = VideoService.build {
enableLog(BuildConfig.DEBUG)
}
Play Video from VideoPreviewModel
The BottomVideoController allows to run any oembed video in WebView.
val host = model.videoHosting
val linkToPlay = model.linkToPlay
val title = model.videoTitle
val initUrl = model.url
BottomVideoController.build(this) {
setListener(object : BottomVideoController.Listener() {
override fun openLinkIn(link: String) {
openLink(link)
}
override fun copyLink(link: String) {
copyLinkToClipboard(link)
}
})
setHostText(host)
setPlayLink(linkToPlay)
setSize(model.width, model.height)
setTitle(title)
setVideoUrl(initUrl)
setProgressView(TextView(this@MainActivity).apply { text = "Loading" })
show()
}
How to add some other video hosting
- Add the
Gson
library to your project - Create the
Gson
data class from the embed response of the video service. Make this class a subclass ofVideoInfoModel
, implement thetoPreview
function, and override it:
override fun toPreview(url: String?, linkToPlay: String, hostingName: String, videoId: String): VideoPreviewModel {
return VideoPreviewModel(url, linkToPlay, hostingName, videoId).apply {
this.thumbnailUrl = [email protected]
this.videoTitle = [email protected]
this.width = [email protected]()
this.height = [email protected]()
}
}
- Create a subclass of
VideoInfoModel
, implement members and override them:
class UltimediaVideoInfoModel: VideoInfoModel<UltimediaResponse>() {
override val baseUrl: String
get() = "https://www.ultimedia.com"
//https://regex101.com/r/2AsrOc/1
override val pattern: String
get() = "(?:http[s]?:\\/\\/)?(?:www)?\\.?ultimedia\\.com\\/(?:deliver|default|api)\\/.*\\/([_a-zA-Z0-9]+)\\S*"
override val idPattern: String
get() = pattern //or some another video id search pattern
override val type: Class<UltimediaResponse>
get() = UltimediaResponse::class.java
override val hostingName: String
get() = "Ultimedia"
override fun getInfoUrl(incomingUrl: String?): String? {
return "$baseUrl/api/search/oembed?$FORMAT=$FORMAT_JSON&$URL=$incomingUrl"
}
override fun getPlayLink(videoId: String): String {
return "https://www.ultimedia.com/deliver/generic/iframe/src/$videoId/"
}
}
Note: By default, the index of the Regex
group should be 1. If your idPattern
does not fulfill this condition, then override the parseVideoId
method:
override fun parseVideoId(url: String?): String? {
url ?: return null
return idPattern.toRegex().find(url)?.groups?.get(**someIndex**)?.value
}
License
This project is licensed under the Apache License 2.0 - see the LICENSE file for details