# 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. [![Release](https://jitpack.io/v/TalbotGooday/Android-Oembed-Video.svg)](https://jitpack.io/#TalbotGooday/Android-Oembed-Video) [![Platform](https://img.shields.io/badge/platforms-Android-green.svg)]() [![Languages](https://img.shields.io/badge/languages-Kotlin-F18E33.svg)]() ## 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: ```java allprojects { repositories { ... maven { url 'https://jitpack.io' } } } ``` Add the dependency ```java dependencies { implementation 'com.github.TalbotGooday:Android-Oembed-Video:Tag' } ``` ## Work Flow 1. Create your OkHttpClient and add it to the VideoService.Builder ```kotlin 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) } ``` 2. Get VideoPreviewModel ```kotlin videoService.loadVideoPreview( url, onSuccess = { video -> //handle a video model }, onError = { url, error -> //handle an error }) ``` 3. Enable/disable caching ```kotlin val videoService = VideoService.build { enableCache(true) } ``` 4. Enable/disable logging ```kotlin val videoService = VideoService.build { enableLog(BuildConfig.DEBUG) } ``` ## Play Video from VideoPreviewModel The BottomVideoController allows to run any oembed video in WebView. ```kotlin 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 1. Add the `Gson` library to your project 2. Create the `Gson` data class from the embed response of the video service. Make this class a subclass of `VideoInfoModel`, implement the` toPreview` function, and override it: ```kotlin override fun toPreview(url: String?, linkToPlay: String, hostingName: String, videoId: String): VideoPreviewModel { return VideoPreviewModel(url, linkToPlay, hostingName, videoId).apply { this.thumbnailUrl = this@UltimediaResponse.thumbnailUrl this.videoTitle = this@UltimediaResponse.authorName this.width = this@UltimediaResponse.width.toInt() this.height = this@UltimediaResponse.height.toInt() } } ``` 3. Create a subclass of `VideoInfoModel`, implement members and override them: ```kotlin class UltimediaVideoInfoModel: VideoInfoModel() { 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 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: ```kotlin 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](LICENSE) file for details