├── 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("