├── pizza.png ├── Huhu ├── tv.png ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ ├── res │ │ ├── values │ │ │ └── strings.xml │ │ ├── drawable │ │ │ ├── save_icon.xml │ │ │ └── outline.xml │ │ └── layout │ │ │ └── settings.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── HuhuPlugin.kt │ │ └── Huhu.kt └── build.gradle.kts ├── IPTV ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ ├── res │ │ ├── drawable │ │ │ ├── edit_icon.xml │ │ │ ├── outline.xml │ │ │ ├── telegram.xml │ │ │ ├── delete_icon.xml │ │ │ └── settings_icon.xml │ │ └── layout │ │ │ ├── manager.xml │ │ │ ├── add_link.xml │ │ │ └── list_link.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── Util.kt │ │ ├── IPTVPlugin.kt │ │ └── IPTVParser.kt └── build.gradle.kts ├── repo_icon.png ├── Nebula ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ └── NebulaPlugin.kt └── build.gradle.kts ├── TV ├── television.png ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ ├── res │ │ ├── values │ │ │ └── strings.xml │ │ ├── drawable │ │ │ ├── save_icon.xml │ │ │ └── outline.xml │ │ └── layout │ │ │ └── settings.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── TVPlugin.kt │ │ └── TV.kt └── build.gradle.kts ├── AnimeWorld ├── img.png ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ ├── res │ │ ├── values │ │ │ └── strings.xml │ │ ├── drawable │ │ │ ├── save_icon.xml │ │ │ └── outline.xml │ │ └── layout │ │ │ └── settings.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── AnimeWorldSub.kt │ │ ├── AnimeWorldDub.kt │ │ ├── AnimeWorldDTOs.kt │ │ ├── AnimeWorldPlugin.kt │ │ ├── VidguardExtractor.kt │ │ └── Settings.kt └── build.gradle.kts ├── ExampleProvider ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── ExamplePlugin.kt │ │ └── ExampleProvider.kt └── build.gradle.kts ├── DaddyLive ├── daddylive.jpg ├── live-streaming.png ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ └── DaddyLivePlugin.kt └── build.gradle.kts ├── Arte ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ ├── res │ │ ├── values │ │ │ └── strings.xml │ │ ├── drawable │ │ │ ├── save_icon.xml │ │ │ └── outline.xml │ │ └── layout │ │ │ └── settings.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── ArtePlugin.kt │ │ └── Settings.kt └── build.gradle.kts ├── CB01 ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── extractors │ │ ├── MixDropExtractor.kt │ │ └── MaxStreamExtractor.kt │ │ └── CB01Plugin.kt └── build.gradle.kts ├── Torrentio ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── TorrentioPlugin.kt │ │ └── TorrentioDTO.kt └── build.gradle.kts ├── YouTube ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ ├── res │ │ ├── drawable │ │ │ ├── delete_icon.xml │ │ │ ├── add_icon.xml │ │ │ ├── save_icon.xml │ │ │ ├── outline.xml │ │ │ └── settings_icon.xml │ │ ├── values │ │ │ └── strings.xml │ │ └── layout │ │ │ ├── localization_settings.xml │ │ │ ├── settings_fragment.xml │ │ │ └── homepage_settings.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── YouTubePlaylistsProvider.kt │ │ ├── YouTubeChannelProvider.kt │ │ ├── YouTubePlugin.kt │ │ ├── YouTubeExtractor.kt │ │ ├── NewPipeDownloader.kt │ │ ├── YouTubeProvider.kt │ │ └── settings │ │ ├── LocalizationSettings.kt │ │ └── SettingsFragment.kt └── build.gradle.kts ├── AltaDefinizione ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── extractors │ │ ├── MyDroploadExtractor.kt │ │ └── DroploadExtractor.kt │ │ ├── AltaDefinizionePlugin.kt │ │ └── AltaDefinizioneDTO.kt └── build.gradle.kts ├── AnimeUnity ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── AnimeUnityPlugin.kt │ │ ├── VixCloudExtractor.kt │ │ └── AnimeUnityDTOs.kt └── build.gradle.kts ├── CalcioStreaming ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── CalcioStreamingPlugin.kt │ │ └── CalcioStreaming.kt └── build.gradle.kts ├── CorsaroNero ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ └── CorsaroNeroPlugin.kt └── build.gradle.kts ├── OnlineSerieTV ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── OnlineSerieTVPlugin.kt │ │ └── extractors │ │ ├── StreamTapeExtractor.kt │ │ └── MaxStreamExtractor.kt └── build.gradle.kts ├── SimklProvider ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── SimklPlugin.kt │ │ └── SimklProvider.kt └── build.gradle.kts ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── StreamingCommunity ├── src │ └── main │ │ ├── AndroidManifest.xml │ │ └── kotlin │ │ └── it │ │ └── dogior │ │ └── hadEnough │ │ ├── StreamingCommunityPlugin.kt │ │ ├── VixCloudExtractor.kt │ │ ├── VixSrcExtractor.kt │ │ └── StreamingCommunityDTOs.kt └── build.gradle.kts ├── .gitignore ├── settings.gradle.kts ├── gradle.properties ├── .github └── workflows │ └── build.yml ├── gradlew.bat └── README.md /pizza.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/pizza.png -------------------------------------------------------------------------------- /Huhu/tv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/Huhu/tv.png -------------------------------------------------------------------------------- /IPTV/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /repo_icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/repo_icon.png -------------------------------------------------------------------------------- /Nebula/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /TV/television.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/TV/television.png -------------------------------------------------------------------------------- /AnimeWorld/img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/AnimeWorld/img.png -------------------------------------------------------------------------------- /ExampleProvider/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DaddyLive/daddylive.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/DaddyLive/daddylive.jpg -------------------------------------------------------------------------------- /Arte/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CB01/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DaddyLive/live-streaming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/DaddyLive/live-streaming.png -------------------------------------------------------------------------------- /Huhu/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /TV/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /AnimeWorld/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /DaddyLive/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /Torrentio/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /YouTube/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /AltaDefinizione/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /AnimeUnity/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CalcioStreaming/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /CorsaroNero/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /OnlineSerieTV/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /SimklProvider/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/doGior/doGiorsHadEnough/HEAD/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /StreamingCommunity/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea 5 | .DS_Store 6 | /build 7 | **/build 8 | /captures 9 | .externalNativeBuild 10 | .cxx 11 | *.properties 12 | .vscode -------------------------------------------------------------------------------- /Arte/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | ARTE Settings 4 | Change language 5 | -------------------------------------------------------------------------------- /TV/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | TV Settings 4 | Select the playlists you want to load 5 | -------------------------------------------------------------------------------- /CB01/src/main/kotlin/it/dogior/hadEnough/extractors/MixDropExtractor.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough.extractors 2 | 3 | import com.lagradost.cloudstream3.extractors.MixDrop 4 | 5 | class MixDropExtractor : MixDrop(){ 6 | override var mainUrl = "https://mixdrop.ps" 7 | } -------------------------------------------------------------------------------- /AltaDefinizione/src/main/kotlin/it/dogior/hadEnough/extractors/MyDroploadExtractor.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough.extractors 2 | 3 | import com.lagradost.cloudstream3.extractors.Supervideo 4 | 5 | class MySupervideoExtractor : Supervideo() { 6 | override var mainUrl = "supervideo.cc" 7 | } -------------------------------------------------------------------------------- /Huhu/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | HUHU Settings 4 | Select the countries you want to enable 5 | Change domain 6 | -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Mon Aug 25 20:28:16 CEST 2025 2 | distributionBase=GRADLE_USER_HOME 3 | distributionPath=wrapper/dists 4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip 5 | networkTimeout=10000 6 | validateDistributionUrl=true 7 | zipStoreBase=GRADLE_USER_HOME 8 | zipStorePath=wrapper/dists 9 | -------------------------------------------------------------------------------- /AnimeWorld/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Impostazioni AnimeWorld 4 | Divisione plugin 5 | AnimeWorld Sub 6 | AnimeWorld Dub 7 | -------------------------------------------------------------------------------- /CB01/src/main/kotlin/it/dogior/hadEnough/CB01Plugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class CB01Plugin: Plugin() { 9 | override fun load(context: Context) { 10 | registerMainAPI(CB01()) 11 | } 12 | } -------------------------------------------------------------------------------- /AnimeUnity/src/main/kotlin/it/dogior/hadEnough/AnimeUnityPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import android.content.Context 4 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 5 | import com.lagradost.cloudstream3.plugins.Plugin 6 | 7 | @CloudstreamPlugin 8 | class AnimeUnityPlugin : Plugin() { 9 | override fun load(context: Context) { 10 | registerMainAPI(AnimeUnity()) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /YouTube/src/main/res/drawable/delete_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Nebula/src/main/kotlin/it/dogior/hadEnough/NebulaPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class NebulaPlugin: Plugin() { 9 | override fun load(context: Context) { 10 | // All providers should be added in this manner 11 | registerMainAPI(Nebula()) 12 | } 13 | } -------------------------------------------------------------------------------- /Torrentio/src/main/kotlin/it/dogior/hadEnough/TorrentioPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class TorrentioPlugin: Plugin() { 9 | override fun load(context: Context) { 10 | // All providers should be added in this manner 11 | registerMainAPI(Torrentio()) 12 | } 13 | } -------------------------------------------------------------------------------- /CorsaroNero/src/main/kotlin/it/dogior/hadEnough/CorsaroNeroPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class CorsaroNeroPlugin: Plugin() { 9 | override fun load(context: Context) { 10 | // All providers should be added in this manner 11 | registerMainAPI(CorsaroNero()) 12 | } 13 | } -------------------------------------------------------------------------------- /ExampleProvider/src/main/kotlin/it/dogior/hadEnough/ExamplePlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class ExamplePlugin: Plugin() { 9 | override fun load(context: Context) { 10 | // All providers should be added in this manner 11 | registerMainAPI(ExampleProvider()) 12 | } 13 | } -------------------------------------------------------------------------------- /IPTV/src/main/res/drawable/edit_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /YouTube/src/main/res/drawable/add_icon.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /OnlineSerieTV/src/main/kotlin/it/dogior/hadEnough/OnlineSerieTVPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class OnlineSerieTVPlugin: Plugin() { 9 | override fun load(context: Context) { 10 | // All providers should be added in this manner 11 | registerMainAPI(OnlineSerieTV()) 12 | } 13 | } -------------------------------------------------------------------------------- /CalcioStreaming/src/main/kotlin/it/dogior/hadEnough/CalcioStreamingPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class CalcioStreamingPlugin: Plugin() { 9 | 10 | override fun load(context: Context) { 11 | // All providers should be added in this manner 12 | registerMainAPI(CalcioStreaming()) 13 | } 14 | } -------------------------------------------------------------------------------- /SimklProvider/src/main/kotlin/it/dogior/hadEnough/SimklPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class SimklPlugin : Plugin() { 9 | 10 | override fun load(context: Context) { 11 | // All providers should be added in this manner. Please don't edit the providers list directly. 12 | registerMainAPI(SimklProvider()) 13 | } 14 | } -------------------------------------------------------------------------------- /StreamingCommunity/src/main/kotlin/it/dogior/hadEnough/StreamingCommunityPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import android.content.Context 4 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 5 | import com.lagradost.cloudstream3.plugins.Plugin 6 | 7 | @CloudstreamPlugin 8 | class StreamingCommunityPlugin : Plugin() { 9 | override fun load(context: Context) { 10 | registerMainAPI(StreamingCommunity()) 11 | registerExtractorAPI(VixCloudExtractor()) 12 | registerExtractorAPI(VixSrcExtractor()) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /DaddyLive/src/main/kotlin/it/dogior/hadEnough/DaddyLivePlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | 7 | @CloudstreamPlugin 8 | class DaddyLivePlugin: Plugin() { 9 | override fun load(context: Context) { 10 | // All providers should be added in this manner 11 | registerMainAPI(DaddyLiveTVProvider()) 12 | registerMainAPI(DaddyLiveScheduleProvider()) 13 | registerExtractorAPI(DaddyLiveExtractor()) 14 | } 15 | } -------------------------------------------------------------------------------- /AltaDefinizione/src/main/kotlin/it/dogior/hadEnough/AltaDefinizionePlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | import it.dogior.hadEnough.extractors.DroploadExtractor 7 | 8 | @CloudstreamPlugin 9 | class AltaDefinizionePlugin: Plugin() { 10 | override fun load(context: Context) { 11 | // All providers should be added in this manner 12 | registerMainAPI(AltaDefinizione()) 13 | registerExtractorAPI(DroploadExtractor()) 14 | } 15 | } -------------------------------------------------------------------------------- /settings.gradle.kts: -------------------------------------------------------------------------------- 1 | rootProject.name = "CloudstreamPlugins" 2 | 3 | // This file sets what projects are included. Every time you add a new project, you must add it 4 | // to the includes below. 5 | 6 | // Plugins are included like this 7 | include( 8 | "AltaDefinizione", 9 | "AnimeUnity", 10 | "AnimeWorld", 11 | "Arte", 12 | "CalcioStreaming", 13 | "CB01", 14 | "CorsaroNero", 15 | "DaddyLive", 16 | "Huhu", 17 | "IPTV", 18 | // "OnlineSerieTV", 19 | "Nebula", 20 | "SimklProvider", 21 | "StreamingCommunity", 22 | "TV", 23 | "Torrentio" 24 | // "YouTube" 25 | ) 26 | -------------------------------------------------------------------------------- /ExampleProvider/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 1 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Stuff" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | 20 | tvTypes = listOf("Movie", "TvSeries") 21 | 22 | requiresResources = false 23 | language = "it" 24 | 25 | iconUrl = "https://github.githubassets.com/favicons/favicon-dark.svg" 26 | } 27 | -------------------------------------------------------------------------------- /Nebula/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 1 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Plugin to watch the free videos and ONLY THE FREE VIDEOS from nebula.tv" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | 20 | tvTypes = listOf("Others") 21 | 22 | requiresResources = false 23 | language = "en" 24 | 25 | iconUrl = "https://nebula.tv/apple-touch-icon.png" 26 | } 27 | -------------------------------------------------------------------------------- /AnimeUnity/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 15 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Anime from AnimeUnity" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | tvTypes = listOf( 20 | "AnimeMovie", 21 | "Anime", 22 | "OVA", 23 | ) 24 | 25 | language = "it" 26 | requiresResources = false 27 | 28 | iconUrl = "https://www.animeunity.so/apple-touch-icon.png" 29 | } 30 | -------------------------------------------------------------------------------- /AltaDefinizione/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 4 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Movies and Tv Series from Altadefinizione" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | 20 | tvTypes = listOf("Movie", "TvSeries", "Documentary") 21 | 22 | requiresResources = false 23 | language = "it" 24 | 25 | iconUrl = "https://altadefinizionegratis.group/templates/Dark/img/favicon.ico" 26 | } 27 | -------------------------------------------------------------------------------- /AnimeWorld/src/main/kotlin/it/dogior/hadEnough/AnimeWorldSub.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.* 4 | 5 | class AnimeWorldSub(isSplit: Boolean) : AnimeWorldCore(isSplit) { 6 | override var name = "AnimeWorld Sub" 7 | override var lang = "jp" 8 | override val currentExtension = CurrentExtension.SUB 9 | 10 | override val mainPage = super.mainPage + mainPageOf( 11 | "$mainUrl/filter?status=0&language=jp&sort=1" to "In Corso", 12 | "$mainUrl/filter?language=jp&sort=1" to "Ultimi aggiunti", 13 | "$mainUrl/filter?language=jp&sort=6" to "Più Visti", 14 | "$mainUrl/tops/all?sort=1" to "Top Anime", 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /AnimeWorld/src/main/kotlin/it/dogior/hadEnough/AnimeWorldDub.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.* 4 | 5 | class AnimeWorldDub(isSplit: Boolean) : AnimeWorldCore(isSplit) { 6 | override var name = "AnimeWorld Dub" 7 | override var lang = "it" 8 | override val currentExtension = CurrentExtension.DUB 9 | 10 | override val mainPage = super.mainPage + mainPageOf( 11 | "$mainUrl/filter?status=0&language=it&sort=1" to "In Corso", 12 | "$mainUrl/filter?language=it&sort=1" to "Ultimi aggiunti", 13 | "$mainUrl/filter?language=it&sort=6" to "Più Visti", 14 | "$mainUrl/tops/dubbed?sort=1" to "Top 100 Anime", 15 | ) 16 | } 17 | -------------------------------------------------------------------------------- /Arte/src/main/res/drawable/save_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /Huhu/src/main/res/drawable/save_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /TV/src/main/res/drawable/save_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /AnimeWorld/src/main/res/drawable/save_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /OnlineSerieTV/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 3 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Movies and Shows from OnlineSerieTV" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 0 19 | 20 | tvTypes = listOf("Movie", "TvSeries", "Cartoon", "Anime", "Documentary") 21 | 22 | requiresResources = false 23 | language = "it" 24 | 25 | iconUrl = "https://onlineserietv.com/wp-content/uploads/2023/01/cropped-tv-1.png" 26 | } 27 | -------------------------------------------------------------------------------- /YouTube/src/main/res/drawable/save_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /TV/src/main/res/drawable/outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Arte/src/main/res/drawable/outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /Huhu/src/main/res/drawable/outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /IPTV/src/main/res/drawable/outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /YouTube/src/main/res/drawable/outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /AnimeWorld/src/main/res/drawable/outline.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /CB01/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 13 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Movies and Shows from CB01" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | 20 | tvTypes = listOf("Movie", "TvSeries", "Cartoon") 21 | 22 | requiresResources = false 23 | language = "it" 24 | 25 | iconUrl = "https://cb01.uno/apple-icon-180x180px.png" 26 | } 27 | dependencies{ 28 | implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1") 29 | } -------------------------------------------------------------------------------- /IPTV/src/main/res/layout/manager.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 12 | 13 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /IPTV/src/main/res/drawable/telegram.xml: -------------------------------------------------------------------------------- 1 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /StreamingCommunity/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 23 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "TV Shows and Movies from StreamingCommunity (now StreamingUnity)" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | tvTypes = listOf( 20 | "TvSeries", 21 | "Movie", 22 | "Documentary", 23 | "Cartoon" 24 | ) 25 | 26 | requiresResources = false 27 | language = "it" 28 | 29 | iconUrl = "https://streamingunity.co/apple-touch-icon.png?v=2" 30 | } 31 | -------------------------------------------------------------------------------- /CalcioStreaming/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 6 3 | 4 | 5 | cloudstream { 6 | language = "it" 7 | // All of these properties are optional, you can safely remove them 8 | 9 | description = "Live streams from the CalcioStreaming. Forked from the CalcioStreaming plugin in the ItalianProvider repo" 10 | authors = listOf("Gian-Fr","Adippe","doGior") 11 | 12 | /** 13 | * Status int as the following: 14 | * 0: Down 15 | * 1: Ok 16 | * 2: Slow 17 | * 3: Beta only 18 | * */ 19 | status = 1 // will be 3 if unspecified 20 | tvTypes = listOf( 21 | "Live", 22 | ) 23 | 24 | iconUrl = "https://guarda.direttecommunity.online/templates/calciostreaming1/images/icons/apple-touch-icon.png" 25 | } 26 | -------------------------------------------------------------------------------- /DaddyLive/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 16 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Live TV from DaddyLive. You might need a VPN" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | 20 | tvTypes = listOf("Live") 21 | 22 | requiresResources = false 23 | 24 | iconUrl = "https://raw.githubusercontent.com/doGior/doGiorsHadEnough/refs/heads/master/DaddyLive/live-streaming.png" 25 | } 26 | //dependencies{ 27 | // implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.1") 28 | //} 29 | -------------------------------------------------------------------------------- /Huhu/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 3 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "TV channels from huhu.to" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | 20 | tvTypes = listOf("Live") 21 | 22 | requiresResources = true 23 | 24 | iconUrl = "https://huhu.to/favicon.ico" 25 | } 26 | 27 | android { 28 | buildFeatures { 29 | buildConfig = true 30 | viewBinding = true 31 | } 32 | } 33 | 34 | dependencies { 35 | implementation("com.google.android.material:material:1.12.0") 36 | } 37 | -------------------------------------------------------------------------------- /AnimeWorld/src/main/kotlin/it/dogior/hadEnough/AnimeWorldDTOs.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty 4 | 5 | data class SearchJson( 6 | @JsonProperty("animes") val animes: List 7 | ) 8 | 9 | data class AnimeJson( 10 | @JsonProperty("name") val name: String, 11 | @JsonProperty("image") val image: String, 12 | @JsonProperty("link") val link: String, 13 | @JsonProperty("animeTypeName") val type: String, 14 | @JsonProperty("language") val language: String, 15 | @JsonProperty("jtitle") val otherTitle: String, 16 | @JsonProperty("identifier") val id: String 17 | ) 18 | 19 | data class Json( 20 | @JsonProperty("grabber") val grabber: String, 21 | @JsonProperty("name") val name: String, 22 | @JsonProperty("target") val target: String, 23 | ) -------------------------------------------------------------------------------- /SimklProvider/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 1 3 | 4 | 5 | cloudstream { 6 | language = "en" 7 | // All of these properties are optional, you can safely remove them 8 | 9 | authors = listOf("doGior") 10 | description = 11 | "No Streaming. This is just to open the info page of a show from the simkl library" 12 | 13 | /** 14 | * Status int as the following: 15 | * 0: Down 16 | * 1: Ok 17 | * 2: Slow 18 | * 3: Beta only 19 | * */ 20 | status = 1 // will be 3 if unspecified 21 | tvTypes = listOf( 22 | "AnimeMovie", 23 | "Anime", 24 | "OVA", 25 | "TvSeries", 26 | "Movie", 27 | "Documentary", 28 | "Cartoon" 29 | ) 30 | 31 | iconUrl = "https://eu.simkl.in/img_favicon/v2/favicon-192x192.png" 32 | } -------------------------------------------------------------------------------- /YouTube/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | YouTube plugin settings 4 | Change localization 5 | Change homepage sections 6 | Change homepage sections 7 | Change localization 8 | Language 9 | Country 10 | UK 11 | en 12 | Trending 13 | Add playlist or channel 14 | URL 15 | Use single source with mulitple tracks? 16 | -------------------------------------------------------------------------------- /TV/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 3 3 | 4 | cloudstream { 5 | // All of these properties are optional, you can safely remove them 6 | 7 | description = "Live streams from the Free TV github repository. Forked from the Free-TV plugin in the ItalianProvider repo" 8 | authors = listOf("Gian-Fr","Adippe","doGior") 9 | 10 | /** 11 | * Status int as the following: 12 | * 0: Down 13 | * 1: Ok 14 | * 2: Slow 15 | * 3: Beta only 16 | * */ 17 | status = 1 18 | 19 | tvTypes = listOf("Live") 20 | 21 | requiresResources = true 22 | 23 | iconUrl = "https://raw.githubusercontent.com/doGior/doGiorsHadEnough/refs/heads/master/TV/television.png" 24 | } 25 | 26 | android { 27 | buildFeatures { 28 | buildConfig = true 29 | viewBinding = true 30 | } 31 | } 32 | 33 | dependencies { 34 | implementation("com.google.android.material:material:1.12.0") 35 | } 36 | -------------------------------------------------------------------------------- /Arte/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 2 3 | 4 | 5 | cloudstream { 6 | // All of these properties are optional, you can safely remove them 7 | 8 | description = "Magazine shows, concerts, documentaries, and more: the European culture channel's programmes available to stream free of charge on arte.tv" 9 | authors = listOf("doGior") 10 | 11 | /** 12 | * Status int as the following: 13 | * 0: Down 14 | * 1: Ok 15 | * 2: Slow 16 | * 3: Beta only 17 | * */ 18 | status = 1 19 | 20 | tvTypes = listOf("Documentary") 21 | 22 | requiresResources = true 23 | language = "en" 24 | 25 | iconUrl = "https://static-cdn.arte.tv/replay/favicons/favicon-194x194.png" 26 | } 27 | 28 | android { 29 | buildFeatures { 30 | buildConfig = true 31 | viewBinding = true 32 | } 33 | } 34 | 35 | dependencies { 36 | implementation("com.google.android.material:material:1.13.0") 37 | } -------------------------------------------------------------------------------- /AnimeWorld/build.gradle.kts: -------------------------------------------------------------------------------- 1 | // use an integer for version numbers 2 | version = 16 3 | 4 | 5 | cloudstream { 6 | language = "it" 7 | // All of these properties are optional, you can safely remove them 8 | 9 | authors = listOf("Gian-Fr", "doGior") 10 | requiresResources = true 11 | description = 12 | "Anime from AnimeWorld. This plugin is a fork of the AnimeWorld plugin in the ItalianProvider repo" 13 | 14 | /** 15 | * Status int as the following: 16 | * 0: Down 17 | * 1: Ok 18 | * 2: Slow 19 | * 3: Beta only 20 | * */ 21 | status = 1 // will be 3 if unspecified 22 | tvTypes = listOf( 23 | "AnimeMovie", 24 | "Anime", 25 | "OVA", 26 | ) 27 | 28 | iconUrl = "https://static.animeworld.ac/assets/images/favicon/android-icon-192x192.png?s" 29 | } 30 | 31 | android { 32 | buildFeatures { 33 | buildConfig = true 34 | viewBinding = true 35 | } 36 | } 37 | 38 | dependencies { 39 | implementation("com.google.android.material:material:1.12.0") 40 | implementation("org.mozilla:rhino:1.7.15") 41 | } -------------------------------------------------------------------------------- /IPTV/build.gradle.kts: -------------------------------------------------------------------------------- 1 | dependencies { 2 | implementation("com.google.android.material:material:1.4.0") 3 | implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1") 4 | } 5 | 6 | // use an integer for version numbers 7 | version = 1 8 | 9 | 10 | android { 11 | buildFeatures { 12 | buildConfig = true 13 | viewBinding = true 14 | } 15 | } 16 | 17 | 18 | cloudstream { 19 | // All of these properties are optional, you can safely remove them 20 | 21 | // description = "Lorem Ipsum" 22 | authors = listOf("anhdaden", "dogior") 23 | 24 | /** 25 | * Status int as the following: 26 | * 0: Down 27 | * 1: Ok 28 | * 2: Slow 29 | * 3: Beta only 30 | * */ 31 | status = 1 // will be 3 if unspecified 32 | tvTypes = listOf( 33 | "Live", 34 | ) 35 | 36 | iconUrl = "https://www.shutterstock.com/image-vector/iptv-vector-line-icon-ip-260nw-1841427610.jpg" 37 | description = "General IPTV player. Add a list in the settings and you'll see it in the plugins list in the home" 38 | requiresResources = true 39 | } 40 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | -------------------------------------------------------------------------------- /Torrentio/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.jetbrains.kotlin.konan.properties.Properties 2 | 3 | // use an integer for version numbers 4 | version = 4 5 | 6 | 7 | cloudstream { 8 | // All of these properties are optional, you can safely remove them 9 | description = 10 | "Torrents from Torrentio" 11 | authors = listOf("doGior") 12 | 13 | /** 14 | * Status int as the following: 15 | * 0: Down 16 | * 1: Ok 17 | * 2: Slow 18 | * 3: Beta only 19 | * */ 20 | status = 1 21 | 22 | tvTypes = listOf("Movie", "TvSeries", "Torrent", "Documentary") 23 | 24 | requiresResources = true 25 | language = "it" 26 | 27 | iconUrl = "https://torrentio.strem.fun/images/logo_v1.png" 28 | } 29 | 30 | android { 31 | buildFeatures { 32 | buildConfig = true 33 | viewBinding = true 34 | } 35 | defaultConfig { 36 | val properties = Properties() 37 | properties.load(project.rootProject.file("secrets.properties").inputStream()) 38 | android.buildFeatures.buildConfig = true 39 | buildConfigField("String", "TMDB_API", "\"${properties.getProperty("TMDB_API")}\"") 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /IPTV/src/main/kotlin/it/dogior/hadEnough/Util.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.* 4 | 5 | suspend fun checkLinkType(url: String, headers: Map = emptyMap()): String { 6 | return try { 7 | when { 8 | url.contains(".m3u8", ignoreCase = true) -> "m3u8" 9 | url.contains(".mpegts", ignoreCase = true) -> "mpegts" 10 | url.contains(".mp4", ignoreCase = true) -> "mp4" 11 | url.contains(".flv", ignoreCase = true) -> "flv" 12 | else -> { 13 | val response = app.head(url, referer = headers["referrer"] ?: "") 14 | val contentType = response.headers["Content-Type"] ?: "" 15 | when { 16 | contentType.contains("application/vnd.apple.mpegurl", ignoreCase = true) || 17 | contentType.contains("application/x-mpegurl", ignoreCase = true) || 18 | contentType.contains("application/json", ignoreCase = true) || 19 | contentType.startsWith("text/") -> "m3u8" 20 | else -> "unknown" 21 | } 22 | } 23 | } 24 | } catch (e: Exception) { 25 | "unknown" 26 | } 27 | } -------------------------------------------------------------------------------- /CorsaroNero/build.gradle.kts: -------------------------------------------------------------------------------- 1 | import org.jetbrains.kotlin.konan.properties.Properties 2 | 3 | // use an integer for version numbers 4 | version = 4 5 | 6 | 7 | cloudstream { 8 | // All of these properties are optional, you can safely remove them 9 | description = 10 | "Torrents from Il Corsaro Nero. If something doesn't work the torrent has probably not enough seeds" 11 | authors = listOf("doGior") 12 | 13 | /** 14 | * Status int as the following: 15 | * 0: Down 16 | * 1: Ok 17 | * 2: Slow 18 | * 3: Beta only 19 | * */ 20 | status = 1 21 | 22 | tvTypes = listOf("Movie", "Torrent") 23 | 24 | requiresResources = true 25 | language = "it" 26 | 27 | iconUrl = "https://ilcorsaronero.link/assets/images/icon-dca0f2c8f780ee155024c67b63f5ebc5.svg" 28 | } 29 | 30 | android { 31 | buildFeatures { 32 | buildConfig = true 33 | viewBinding = true 34 | } 35 | defaultConfig { 36 | val properties = Properties() 37 | properties.load(project.rootProject.file("secrets.properties").inputStream()) 38 | android.buildFeatures.buildConfig = true 39 | buildConfigField("String", "TMDB_API", "\"${properties.getProperty("TMDB_API")}\"") 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /YouTube/build.gradle.kts: -------------------------------------------------------------------------------- 1 | @file:Suppress("UnstableApiUsage") 2 | 3 | // use an integer for version numbers 4 | version = 12 5 | 6 | cloudstream { 7 | description = "Videos, playlists and channels from YouTube" 8 | authors = listOf("doGior") 9 | 10 | /** 11 | * Status int as the following: 12 | * 0: Down 13 | * 1: Ok 14 | * 2: Slow 15 | * 3: Beta only 16 | * */ 17 | status = 1 18 | 19 | tvTypes = listOf("Others") 20 | 21 | requiresResources = true 22 | 23 | iconUrl = "https://www.youtube.com/s/desktop/711fd789/img/logos/favicon_144x144.png" 24 | } 25 | 26 | android { 27 | buildFeatures { 28 | buildConfig = true 29 | viewBinding = true 30 | } 31 | 32 | compileOptions { 33 | isCoreLibraryDesugaringEnabled = true 34 | sourceCompatibility = JavaVersion.VERSION_1_8 35 | targetCompatibility = JavaVersion.VERSION_1_8 36 | } 37 | kotlinOptions { 38 | jvmTarget = "1.8" 39 | } 40 | } 41 | 42 | dependencies { 43 | implementation("com.google.android.material:material:1.12.0") 44 | implementation("com.github.teamnewpipe:NewPipeExtractor:v0.24.5") 45 | //noinspection GradleDependency 46 | coreLibraryDesugaring("com.android.tools:desugar_jdk_libs_nio:2.0.4") 47 | } 48 | -------------------------------------------------------------------------------- /IPTV/src/main/res/drawable/delete_icon.xml: -------------------------------------------------------------------------------- 1 | 7 | 10 | -------------------------------------------------------------------------------- /Arte/src/main/kotlin/it/dogior/hadEnough/ArtePlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | import androidx.appcompat.app.AppCompatActivity 7 | 8 | @CloudstreamPlugin 9 | class ArtePlugin: Plugin() { 10 | override fun load(context: Context) { 11 | val sharedPref = context.getSharedPreferences("Arte", Context.MODE_PRIVATE) 12 | 13 | val language = sharedPref.getString("language", "Italian \uD83C\uDDEE\uD83C\uDDF9") ?: "Italian \uD83C\uDDEE\uD83C\uDDF9" 14 | val languageToCode = mapOf( 15 | "\uD83C\uDDEE\uD83C\uDDF9 Italian" to "it", 16 | "\uD83C\uDDEB\uD83C\uDDF7 Français" to "fr", 17 | "\uD83C\uDDE9\uD83C\uDDEA Deutsch" to "de", 18 | "\uD83C\uDDEC\uD83C\uDDE7 English" to "en", 19 | "\uD83C\uDDEA\uD83C\uDDF8 Español" to "es", 20 | "\uD83C\uDDF5\uD83C\uDDF1 Polski" to "pl", 21 | "\uD83C\uDDF7\uD83C\uDDF4 Română" to "ro", 22 | ) 23 | // All providers should be added in this manner 24 | registerMainAPI(Arte(languageToCode[language] ?: "it")) 25 | 26 | // Enable settings 27 | openSettings = {ctx -> 28 | val activity = ctx as AppCompatActivity 29 | val frag = Settings(this, sharedPref) 30 | frag.show(activity.supportFragmentManager, "Frag") 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /AnimeWorld/src/main/kotlin/it/dogior/hadEnough/AnimeWorldPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | import androidx.appcompat.app.AppCompatActivity 7 | import com.lagradost.cloudstream3.CommonActivity.activity 8 | 9 | @CloudstreamPlugin 10 | class AnimeWorldPlugin : Plugin() { 11 | val sharedPref = activity?.getSharedPreferences("AnimeWorldIT", Context.MODE_PRIVATE) 12 | 13 | override fun load(context: Context) { 14 | val isSplit = sharedPref?.getBoolean("isSplit", false) ?: false 15 | val dubEnabled = sharedPref?.getBoolean("dubEnabled", false) ?: false 16 | val subEnabled = sharedPref?.getBoolean("subEnabled", false) ?: false 17 | // All providers should be added in this manner. Please don't edit the providers list directly. 18 | if (isSplit) { 19 | if (dubEnabled) { 20 | registerMainAPI(AnimeWorldDub(isSplit)) 21 | } 22 | if (subEnabled) { 23 | registerMainAPI(AnimeWorldSub(isSplit)) 24 | } 25 | } else { 26 | registerMainAPI(AnimeWorldCore(isSplit)) 27 | } 28 | 29 | openSettings = { ctx -> 30 | val activity = ctx as AppCompatActivity 31 | val frag = Settings(this) 32 | frag.show(activity.supportFragmentManager, "Frag") 33 | } 34 | } 35 | } -------------------------------------------------------------------------------- /IPTV/src/main/kotlin/it/dogior/hadEnough/IPTVPlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import android.content.Context 4 | import androidx.appcompat.app.AppCompatActivity 5 | import com.lagradost.cloudstream3.* 6 | import com.lagradost.cloudstream3.plugins.* 7 | import com.lagradost.cloudstream3.AcraApplication.Companion.getKey 8 | 9 | @CloudstreamPlugin 10 | class IPTVPlugin : Plugin() { 11 | override fun load(context: Context) { 12 | reload() 13 | } 14 | 15 | init { 16 | this.openSettings = { ctx -> 17 | val activity = ctx as AppCompatActivity 18 | try { 19 | val frag = IPTVSettingsFragment(this) 20 | frag.show(activity.supportFragmentManager, "IPTV") 21 | } catch (e: Exception) { 22 | } 23 | } 24 | } 25 | 26 | fun reload() { 27 | try { 28 | val savedLinks = getKey>("iptv_links") ?: emptyArray() 29 | savedLinks.forEach { link -> 30 | val pluginData = PluginManager.getPluginsOnline().find { it.internalName.contains(link.name) } 31 | if (pluginData != null) { 32 | PluginManager.unloadPlugin(pluginData.filePath) 33 | } else { 34 | registerMainAPI(IPTVProvider(link.link, link.name)) 35 | } 36 | } 37 | MainActivity.afterPluginsLoadedEvent.invoke(true) 38 | } catch (e: Exception) { 39 | } 40 | } 41 | } -------------------------------------------------------------------------------- /YouTube/src/main/kotlin/it/dogior/hadEnough/YouTubePlaylistsProvider.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.LoadResponse 4 | import com.lagradost.cloudstream3.TvType 5 | import com.lagradost.cloudstream3.MainAPI 6 | import com.lagradost.cloudstream3.SearchResponse 7 | import com.lagradost.cloudstream3.SubtitleFile 8 | import com.lagradost.cloudstream3.utils.ExtractorLink 9 | 10 | class YouTubePlaylistsProvider(language: String) : MainAPI() { 11 | override var mainUrl = MAIN_URL 12 | override var name = "YouTube Playlists" 13 | override val supportedTypes = setOf(TvType.Others) 14 | override val hasMainPage = false 15 | override var lang = language 16 | 17 | private val ytParser = YouTubeParser(this.name) 18 | 19 | companion object{ 20 | const val MAIN_URL = "https://www.youtube.com" 21 | } 22 | 23 | override suspend fun search(query: String): List { 24 | val videoUrls = ytParser.search(query, "playlists") 25 | return videoUrls 26 | } 27 | 28 | override suspend fun load(url: String): LoadResponse { 29 | val video = ytParser.playlistToLoadResponse(url) 30 | return video 31 | } 32 | 33 | override suspend fun loadLinks( 34 | data: String, 35 | isCasting: Boolean, 36 | subtitleCallback: (SubtitleFile) -> Unit, 37 | callback: (ExtractorLink) -> Unit, 38 | ): Boolean { 39 | 40 | YouTubeExtractor().getUrl(data, "", subtitleCallback, callback) 41 | return true 42 | } 43 | } -------------------------------------------------------------------------------- /YouTube/src/main/kotlin/it/dogior/hadEnough/YouTubeChannelProvider.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.LoadResponse 4 | import com.lagradost.cloudstream3.TvType 5 | import com.lagradost.cloudstream3.MainAPI 6 | import com.lagradost.cloudstream3.SearchResponse 7 | import com.lagradost.cloudstream3.SubtitleFile 8 | import com.lagradost.cloudstream3.utils.ExtractorLink 9 | 10 | class YouTubeChannelProvider(language: String) : MainAPI() { 11 | override var mainUrl = MAIN_URL 12 | override var name = "YouTube Channels" 13 | override val supportedTypes = setOf(TvType.Others) 14 | override val hasMainPage = false 15 | override var lang = language 16 | 17 | private val ytParser = YouTubeParser(this.name) 18 | 19 | companion object{ 20 | const val MAIN_URL = "https://www.youtube.com" 21 | } 22 | 23 | override suspend fun search(query: String): List { 24 | val videoUrls = ytParser.search(query, contentFilter = "channels") 25 | return videoUrls 26 | } 27 | 28 | override suspend fun load(url: String): LoadResponse { 29 | val video = ytParser.channelToLoadResponse(url) 30 | return video 31 | } 32 | 33 | override suspend fun loadLinks( 34 | data: String, 35 | isCasting: Boolean, 36 | subtitleCallback: (SubtitleFile) -> Unit, 37 | callback: (ExtractorLink) -> Unit, 38 | ): Boolean { 39 | 40 | YouTubeExtractor().getUrl(data, "", subtitleCallback, callback) 41 | return true 42 | } 43 | } -------------------------------------------------------------------------------- /AltaDefinizione/src/main/kotlin/it/dogior/hadEnough/AltaDefinizioneDTO.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty 4 | 5 | class MovieDetail( 6 | @JsonProperty("actor") 7 | val actor: List, 8 | @JsonProperty("aggregateRating") 9 | val aggregateRating: AggregateRating, 10 | @JsonProperty("@context") 11 | val context: String, 12 | @JsonProperty("datePublished") 13 | val datePublished: String, 14 | @JsonProperty("description") 15 | val description: String, 16 | @JsonProperty("director") 17 | val director: List, 18 | @JsonProperty("genre") 19 | val genre: List, 20 | @JsonProperty("image") 21 | val image: String, 22 | @JsonProperty("name") 23 | val name: String, 24 | @JsonProperty("@type") 25 | val type: String, 26 | @JsonProperty("url") 27 | val url: String 28 | ) 29 | 30 | data class Actor( 31 | @JsonProperty("name") 32 | val name: String, 33 | @JsonProperty("@type") 34 | val type: String 35 | ) 36 | 37 | data class AggregateRating( 38 | @JsonProperty("bestRating") 39 | val bestRating: String, 40 | @JsonProperty("ratingValue") 41 | val ratingValue: String, 42 | @JsonProperty("reviewCount") 43 | val reviewCount: String, 44 | @JsonProperty("@type") 45 | val type: String, 46 | @JsonProperty("worstRating") 47 | val worstRating: String 48 | ) 49 | 50 | data class Director( 51 | @JsonProperty("name") 52 | val name: String, 53 | @JsonProperty("@type") 54 | val type: String 55 | ) 56 | 57 | 58 | -------------------------------------------------------------------------------- /IPTV/src/main/res/layout/add_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 20 | 21 | 28 | 29 | 34 | 35 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /YouTube/src/main/kotlin/it/dogior/hadEnough/YouTubePlugin.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import com.lagradost.cloudstream3.plugins.CloudstreamPlugin 4 | import com.lagradost.cloudstream3.plugins.Plugin 5 | import android.content.Context 6 | import androidx.appcompat.app.AppCompatActivity 7 | import com.lagradost.cloudstream3.CommonActivity.activity 8 | import it.dogior.hadEnough.settings.SettingsFragment 9 | import org.schabi.newpipe.extractor.NewPipe 10 | import org.schabi.newpipe.extractor.localization.ContentCountry 11 | import org.schabi.newpipe.extractor.localization.Localization 12 | 13 | @CloudstreamPlugin 14 | class YouTubePlugin : Plugin() { 15 | private val sharedPref = activity?.getSharedPreferences("Youtube", Context.MODE_PRIVATE) 16 | 17 | override fun load(context: Context) { 18 | var language = sharedPref?.getString("language", "it") 19 | var country = sharedPref?.getString("country", "IT") 20 | 21 | if (language.isNullOrEmpty()) {language = "it"} 22 | if (country.isNullOrEmpty()) {country = "IT"} 23 | 24 | NewPipe.init(NewPipeDownloader.getInstance()) 25 | NewPipe.setupLocalization(Localization(language), ContentCountry(country)) 26 | 27 | // All providers should be added in this manner 28 | registerMainAPI(YouTubeProvider(language, sharedPref)) 29 | registerMainAPI(YouTubePlaylistsProvider(language)) 30 | registerMainAPI(YouTubeChannelProvider(language)) 31 | registerExtractorAPI(YouTubeExtractor()) 32 | 33 | openSettings = {ctx -> 34 | val activity = ctx as AppCompatActivity 35 | val frag = SettingsFragment(this, sharedPref) 36 | frag.show(activity.supportFragmentManager, "Frag") 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /OnlineSerieTV/src/main/kotlin/it/dogior/hadEnough/extractors/StreamTapeExtractor.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough.extractors 2 | 3 | import com.lagradost.cloudstream3.SubtitleFile 4 | import com.lagradost.cloudstream3.app 5 | import com.lagradost.cloudstream3.utils.ExtractorApi 6 | import com.lagradost.cloudstream3.utils.ExtractorLink 7 | import com.lagradost.cloudstream3.utils.ExtractorLinkType 8 | import com.lagradost.cloudstream3.utils.newExtractorLink 9 | import com.lagradost.cloudstream3.utils.Qualities 10 | 11 | class StreamTapeExtractor: ExtractorApi() { 12 | override val mainUrl = "https://streamtape.com/e/" 13 | override val name = "StreamTape" 14 | override val requiresReferer = false 15 | 16 | override suspend fun getUrl( 17 | url: String, 18 | referer: String?, 19 | subtitleCallback: (SubtitleFile) -> Unit, 20 | callback: (ExtractorLink) -> Unit 21 | ){ 22 | val newUrl = if (!url.startsWith(mainUrl)) { 23 | val id = url.split("/").getOrNull(4) ?: return 24 | mainUrl + id 25 | } else { url } 26 | 27 | val document = app.get(newUrl).document 28 | val targetLine = "document.getElementById('robotlink')" 29 | val script = document.selectFirst("script:containsData($targetLine)") 30 | ?.data() 31 | ?.substringAfter("$targetLine.innerHTML = '") 32 | ?: return 33 | val videoUrl = "https:" + script.substringBefore("'") + 34 | script.substringAfter("+ ('xcd").substringBefore("'") 35 | 36 | callback.invoke( 37 | newExtractorLink( 38 | name, 39 | name, 40 | videoUrl 41 | ) { 42 | this.referer = referer ?: "" 43 | this.quality = Qualities.Unknown.value 44 | } 45 | ) 46 | 47 | } 48 | } -------------------------------------------------------------------------------- /IPTV/src/main/res/layout/list_link.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 14 | 15 | 20 | 21 | 27 | 28 | 33 | 34 | 35 | 41 | 42 | 43 | 48 | 49 | -------------------------------------------------------------------------------- /ExampleProvider/src/main/kotlin/it/dogior/hadEnough/ExampleProvider.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough 2 | 3 | import android.util.Log 4 | import com.lagradost.cloudstream3.Episode 5 | import com.lagradost.cloudstream3.HomePageResponse 6 | import com.lagradost.cloudstream3.LoadResponse 7 | import com.lagradost.cloudstream3.TvType 8 | import com.lagradost.cloudstream3.MainAPI 9 | import com.lagradost.cloudstream3.MainPageRequest 10 | import com.lagradost.cloudstream3.SearchResponse 11 | import com.lagradost.cloudstream3.SubtitleFile 12 | import com.lagradost.cloudstream3.mainPageOf 13 | import com.lagradost.cloudstream3.utils.ExtractorLink 14 | import com.lagradost.cloudstream3.app 15 | import org.jsoup.nodes.Document 16 | 17 | 18 | class ExampleProvider : MainAPI() { 19 | override var mainUrl = "" 20 | override var name = "Example" 21 | override val supportedTypes = setOf(TvType.Movie) 22 | override var lang = "it" 23 | override val hasMainPage = true 24 | 25 | override val mainPage = mainPageOf( 26 | mainUrl to "Home", 27 | ) 28 | 29 | override suspend fun getMainPage(page: Int, request: MainPageRequest): HomePageResponse { 30 | TODO("Not yet implemented") 31 | } 32 | 33 | // this function gets called when you search for something 34 | override suspend fun search(query: String): List { 35 | TODO("Not yet implemented") 36 | } 37 | 38 | override suspend fun load(url: String): LoadResponse { 39 | TODO("Not yet implemented") 40 | } 41 | 42 | private fun getEpisodes(page: Document): List { 43 | TODO("Not yet implemented") 44 | } 45 | 46 | override suspend fun loadLinks( 47 | data: String, 48 | isCasting: Boolean, 49 | subtitleCallback: (SubtitleFile) -> Unit, 50 | callback: (ExtractorLink) -> Unit, 51 | ): Boolean { 52 | TODO("Not yet implemented") 53 | } 54 | } -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | # https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions#concurrency 4 | concurrency: 5 | group: "build" 6 | cancel-in-progress: true 7 | 8 | on: 9 | workflow_dispatch: # Allows manual triggering 10 | push: 11 | branches: 12 | # choose your default branch 13 | - master 14 | - main 15 | paths-ignore: 16 | - '*.md' 17 | - '*.png' 18 | - '*.yml' 19 | 20 | jobs: 21 | build: 22 | runs-on: ubuntu-latest 23 | steps: 24 | - name: Checkout 25 | uses: actions/checkout@master 26 | with: 27 | path: "src" 28 | 29 | - name: Checkout builds 30 | uses: actions/checkout@master 31 | with: 32 | ref: "builds" 33 | path: "builds" 34 | 35 | - name: Clean old builds 36 | run: rm $GITHUB_WORKSPACE/builds/*.cs3 37 | 38 | - name: Setup Java 17 39 | uses: actions/setup-java@v4.6.0 40 | with: 41 | distribution: adopt 42 | java-version: 17 43 | 44 | - name: Setup Android SDK 45 | uses: android-actions/setup-android@v3.2.2 46 | 47 | - name: Access Secrets 48 | env: 49 | TMDB_API: ${{ secrets.TMDB_API }} 50 | run: | 51 | cd $GITHUB_WORKSPACE/src 52 | echo TMDB_API=$TMDB_API >> secrets.properties 53 | 54 | - name: Build Plugins 55 | run: | 56 | cd $GITHUB_WORKSPACE/src 57 | chmod +x gradlew 58 | ./gradlew make makePluginsJson 59 | cp **/build/*.cs3 $GITHUB_WORKSPACE/builds 60 | cp build/plugins.json $GITHUB_WORKSPACE/builds 61 | 62 | - name: Push builds 63 | run: | 64 | cd $GITHUB_WORKSPACE/builds 65 | git config --local user.email "actions@github.com" 66 | git config --local user.name "GitHub Actions" 67 | git add . 68 | git commit --amend -m "Build $GITHUB_SHA" || exit 0 # do not error if nothing to commit 69 | git push --force 70 | -------------------------------------------------------------------------------- /OnlineSerieTV/src/main/kotlin/it/dogior/hadEnough/extractors/MaxStreamExtractor.kt: -------------------------------------------------------------------------------- 1 | package it.dogior.hadEnough.extractors 2 | 3 | import com.lagradost.api.Log 4 | import com.lagradost.cloudstream3.SubtitleFile 5 | import com.lagradost.cloudstream3.app 6 | import com.lagradost.cloudstream3.utils.ExtractorApi 7 | import com.lagradost.cloudstream3.utils.ExtractorLink 8 | import com.lagradost.cloudstream3.utils.ExtractorLinkType 9 | import com.lagradost.cloudstream3.utils.newExtractorLink 10 | import com.lagradost.cloudstream3.utils.Qualities 11 | import com.lagradost.cloudstream3.utils.getAndUnpack 12 | 13 | class MaxStreamExtractor : ExtractorApi() { 14 | override var name = "MaxStream" 15 | override var mainUrl = "https://maxstream.video/" 16 | override val requiresReferer = false 17 | 18 | override suspend fun getUrl( 19 | url: String, 20 | referer: String?, 21 | subtitleCallback: (SubtitleFile) -> Unit, 22 | callback: (ExtractorLink) -> Unit, 23 | ) { 24 | val headers = mapOf( 25 | "Accept" to "*/*", 26 | "Connection" to "keep-alive", 27 | "User-Agent" to "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36", 28 | "Accept-Language" to "en-US;q=0.5,en;q=0.3", 29 | "Cache-Control" to "max-age=0", 30 | "Upgrade-Insecure-Requests" to "1" 31 | ) 32 | val response = app.get(url, headers = headers, timeout = 10_000) 33 | val responseBody = response.body.string() 34 | 35 | val script = 36 | "eval(function(p,a,c,k,e,d)" + responseBody.substringAfter("