KekikStream 3.4.2__tar.gz → 3.4.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/StreamWish.py +1 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidHide.py +1 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AnimeYTX.py +30 -28
- kekikstream-3.4.3/KekikStream/Plugins/BFlix.py +149 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/CizgiMax.py +9 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Coflix.py +15 -7
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziKorea.py +15 -7
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziPal.py +46 -37
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Dizify.py +8 -8
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DoramasLatinoX.py +27 -8
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmFC.py +7 -7
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/MyFlixer.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SFlix.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/ShowFlix.py +26 -21
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Sinezy.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Turkish123.py +52 -29
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/UgurFilm.py +13 -13
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/YeniWatch.py +15 -13
- {kekikstream-3.4.2 → kekikstream-3.4.3}/PKG-INFO +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.3}/pyproject.toml +1 -1
- kekikstream-3.4.2/KekikStream/Plugins/BFlix.py +0 -45
- {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/FUNDING.yml +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/icons/KekikStream.png +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/workflows/Kontrol.yml +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/workflows/pypiYukle.yml +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/.gitignore +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KONTROL.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorMixins.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/VideoPlayerExtractor.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/FallbackClients.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/HTMLHelper.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/MethodCache.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/Normalizer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/TitleHelper.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/FlwBasePlugin.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Abstream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Alloha.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Ashdi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/BrightPath.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/BulguNet.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/BurstCloud.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ByseSX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/CizgiPass.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DarkiBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DonilasPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DoodStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DosyaLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DramaCool.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/EmbedLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/EpikPlayer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/FastPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Fembed.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Filemoon.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HDLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HDMomPlayer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HexLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HotStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JFVid.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JetCDN.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JetV.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/KentFilm.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Kodik.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/LuciferPlays.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/LuluStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MP4Upload.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MegaCloud.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MegaNZ.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MixDrop.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Netu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/NiceAcik.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PlayerKorea.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PlayerX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Rumble.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SaveFiles.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SendVid.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ShortICU.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Stloadi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/StreamBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/StreamTape.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Tukipasti.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Uqload.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VCTPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Variyt.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Veev.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidBiz.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidStack.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VideoParktop.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Videostr.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Vidora.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Vidoza.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Voe.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Vtbe.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/XtremStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/YTDLP.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/YourUpload.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Zeus.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ZillaNetworks.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AnimeAV.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AnimeciX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AsyaAnimeleri.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AsyaWatch.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/BelgeselX.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/FilmBip.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Broken/FilmKovasi.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Filmatek.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/FlixHQ.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/FullHDFilm.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/KoreanTurk.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Movies2Watch.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/MoviesJoy.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Watch2Movies.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Watch32.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/YesilcamTV.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Zoechip.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DMax.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziGom.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziMag.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziMom.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziWatch.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Dizilla.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DocumentaryArea.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DramaFlix.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Dramacool.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmCennetim.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmEkseni.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmIzleIlk.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmMirasim.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmciBaba.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FlixLatam.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/HDFilm.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/HDrezka.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Henaojara.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/InatBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/JPFilms.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Kinogo.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Latanime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SetFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/StreamIMDB.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SuperFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/TLC.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/TurkAnime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/TvDiziler.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/UAKino.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/WFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/WebDramaTurkey.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/WebteIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/XPrime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/YabanciDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/YoTurkish.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/__main__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/requirements.txt +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/LICENSE +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/README.md +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/Multi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/PluginAudit/audit_plugins.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/PluginAudit/clean_plugins.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/PluginAudit/master_audit.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/Single.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/Validator.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/test_links.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.3}/_config.yml +0 -0
|
@@ -129,7 +129,8 @@ class AnimeYTX(PluginBase):
|
|
|
129
129
|
|
|
130
130
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
131
131
|
istek = await self.async_cf_get(url)
|
|
132
|
-
|
|
132
|
+
text = istek.text
|
|
133
|
+
secici = HTMLHelper(text)
|
|
133
134
|
|
|
134
135
|
response = []
|
|
135
136
|
tasks = []
|
|
@@ -139,19 +140,22 @@ class AnimeYTX(PluginBase):
|
|
|
139
140
|
if not fixed_url or fixed_url.startswith("data:") or fixed_url.startswith("javascript:"):
|
|
140
141
|
return None
|
|
141
142
|
|
|
142
|
-
if "/new/redirector
|
|
143
|
+
if "/new/redirector" in fixed_url:
|
|
143
144
|
try:
|
|
144
145
|
redirect_resp = await self.async_cf_get(fixed_url, headers={"Referer": url})
|
|
145
146
|
redirect_html = redirect_resp.text
|
|
146
|
-
target_url = HTMLHelper(redirect_html).regex_first(r"window\.location\.href\s*=\s*'([^']+)'")
|
|
147
|
+
target_url = HTMLHelper(redirect_html).regex_first(r"window\.location\.href\s*=\s*['\"]([^'\"]+)['\"]")
|
|
147
148
|
if target_url:
|
|
148
|
-
target_url
|
|
149
|
-
|
|
149
|
+
target_url = target_url.replace(" ", "+")
|
|
150
|
+
fixed_target = self.fix_url(target_url)
|
|
151
|
+
data = await self.extract(fixed_target, referer=url)
|
|
152
|
+
return data or ExtractResult(url=fixed_target, name="Redirector", referer=url)
|
|
150
153
|
except Exception:
|
|
151
|
-
|
|
154
|
+
pass
|
|
152
155
|
|
|
153
156
|
if "/new/play/one.php" not in fixed_url:
|
|
154
|
-
|
|
157
|
+
data = await self.extract(fixed_url, referer=url)
|
|
158
|
+
return data or ExtractResult(url=fixed_url, name="Player", referer=url)
|
|
155
159
|
|
|
156
160
|
parsed = re.search(r"server=([^&]+)&value=([^&]+)", fixed_url)
|
|
157
161
|
if not parsed:
|
|
@@ -166,17 +170,24 @@ class AnimeYTX(PluginBase):
|
|
|
166
170
|
f"{self.main_url}/new/play/one.php?{urlencode(payload)}",
|
|
167
171
|
headers={"Referer": url, "X-Requested-With": "XMLHttpRequest"},
|
|
168
172
|
)
|
|
169
|
-
body
|
|
173
|
+
body = ajax_resp.text
|
|
174
|
+
iframe_src = HTMLHelper(body).select_attr("iframe", "src") or HTMLHelper(body).regex_first(r'src=["\']([^"\']+)["\']')
|
|
175
|
+
if iframe_src:
|
|
176
|
+
fixed_src = self.fix_url(iframe_src)
|
|
177
|
+
extracted = await self.extract(fixed_src, referer=url)
|
|
178
|
+
return extracted or ExtractResult(url=fixed_src, name=f"Server {payload['server']}", referer=url)
|
|
170
179
|
except Exception:
|
|
171
|
-
|
|
180
|
+
pass
|
|
172
181
|
|
|
173
|
-
|
|
174
|
-
if not iframe_src:
|
|
175
|
-
return None
|
|
182
|
+
return ExtractResult(url=fixed_url, name=f"Internal {payload.get('server', '')}", referer=url)
|
|
176
183
|
|
|
177
|
-
|
|
184
|
+
# 1. Video array'ini ara (Legacy pattern)
|
|
185
|
+
# var video = [{url: "...", ...}]
|
|
186
|
+
video_matches = re.findall(r'url["\']?\s*:\s*["\']([^"\']+)["\']', text)
|
|
187
|
+
for v_url in video_matches:
|
|
188
|
+
tasks.append(resolve_internal_player(v_url.replace("\\/", "/")))
|
|
178
189
|
|
|
179
|
-
#
|
|
190
|
+
# 2. Select menu (Base64 encoded iframes)
|
|
180
191
|
for opt in secici.select("select.mirror option"):
|
|
181
192
|
val = opt.attrs.get("value")
|
|
182
193
|
if not val:
|
|
@@ -185,24 +196,15 @@ class AnimeYTX(PluginBase):
|
|
|
185
196
|
try:
|
|
186
197
|
decoded = base64.b64decode(val).decode("utf-8")
|
|
187
198
|
# Extract src from <iframe src="...">
|
|
188
|
-
|
|
189
|
-
if
|
|
190
|
-
|
|
191
|
-
tasks.append(resolve_internal_player(src))
|
|
199
|
+
iframe_src_match = re.search(r'src=["\']([^"\']+)["\']', decoded)
|
|
200
|
+
if iframe_src_match:
|
|
201
|
+
tasks.append(resolve_internal_player(iframe_src_match.group(1)))
|
|
192
202
|
except:
|
|
193
203
|
continue
|
|
194
204
|
|
|
195
|
-
#
|
|
196
|
-
players = secici.regex_all(r"var\s+video\s*=\s*\[(.*?)\]", flags=re.S)
|
|
197
|
-
if players:
|
|
198
|
-
for p in players:
|
|
199
|
-
urls = re.findall(r'url["\']\s*:\s*["\']([^"\']+)["\']', p)
|
|
200
|
-
for u in urls:
|
|
201
|
-
tasks.append(resolve_internal_player(u.replace("\\/", "/")))
|
|
202
|
-
|
|
203
|
-
# Check iframes
|
|
205
|
+
# 3. Iframes directly in page
|
|
204
206
|
for iframe in secici.select("iframe"):
|
|
205
|
-
src = iframe.
|
|
207
|
+
src = iframe.attrs.get("src")
|
|
206
208
|
if src and not any(x in src.lower() for x in ["facebook", "google", "ads", "bio", "data:image"]):
|
|
207
209
|
tasks.append(resolve_internal_player(src))
|
|
208
210
|
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import PluginBase, MainPageResult, SearchResult, MovieInfo, SeriesInfo, Episode, ExtractResult, HTMLHelper
|
|
4
|
+
import re
|
|
5
|
+
import base64
|
|
6
|
+
|
|
7
|
+
class BFlix(PluginBase):
|
|
8
|
+
name = "BFlix"
|
|
9
|
+
language = "en"
|
|
10
|
+
main_url = "https://bflix.sh"
|
|
11
|
+
favicon = f"https://www.google.com/s2/favicons?domain={main_url}&sz=64"
|
|
12
|
+
description = "Watch free Streaming movies and TV shows online in HD quality."
|
|
13
|
+
|
|
14
|
+
main_page = {
|
|
15
|
+
f"{main_url}/movie?page=" : "Movies",
|
|
16
|
+
f"{main_url}/tv-show?page=" : "TV Shows",
|
|
17
|
+
f"{main_url}/top-imdb?page=" : "Top IMDB",
|
|
18
|
+
f"{main_url}/genre/action?page=" : "Action",
|
|
19
|
+
f"{main_url}/genre/comedy?page=" : "Comedy",
|
|
20
|
+
f"{main_url}/genre/horror?page=" : "Horror",
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
24
|
+
full_url = f"{url}{page}"
|
|
25
|
+
istek = await self.async_cf_get(full_url)
|
|
26
|
+
secici = HTMLHelper(istek.text)
|
|
27
|
+
|
|
28
|
+
results = []
|
|
29
|
+
for item in secici.select("div.film, div.film-inner"):
|
|
30
|
+
title = item.select_text("h2.film-name") or item.select_text("a.film-name") or item.select_attr("a", "title")
|
|
31
|
+
href = item.select_attr("a", "href")
|
|
32
|
+
img = item.select_first("img")
|
|
33
|
+
poster = img.select_attr(None, "data-src") or img.select_attr(None, "src") if img else None
|
|
34
|
+
|
|
35
|
+
if title and href:
|
|
36
|
+
results.append(MainPageResult(
|
|
37
|
+
category = category,
|
|
38
|
+
title = title.strip(),
|
|
39
|
+
url = self.fix_url(href),
|
|
40
|
+
poster = self.fix_url(poster),
|
|
41
|
+
))
|
|
42
|
+
|
|
43
|
+
return results
|
|
44
|
+
|
|
45
|
+
async def search(self, query: str) -> list[SearchResult]:
|
|
46
|
+
target_url = f"{self.main_url}/search/{query.replace(' ', '-')}"
|
|
47
|
+
istek = await self.async_cf_get(target_url)
|
|
48
|
+
secici = HTMLHelper(istek.text)
|
|
49
|
+
|
|
50
|
+
results = []
|
|
51
|
+
for item in secici.select("div.film, div.film-inner"):
|
|
52
|
+
title = item.select_text("h2.film-name") or item.select_text("a.film-name") or item.select_attr("a", "title")
|
|
53
|
+
href = item.select_attr("a", "href")
|
|
54
|
+
img = item.select_first("img")
|
|
55
|
+
poster = img.select_attr(None, "data-src") or img.select_attr(None, "src") if img else None
|
|
56
|
+
|
|
57
|
+
if title and href:
|
|
58
|
+
results.append(SearchResult(
|
|
59
|
+
title = title.strip(),
|
|
60
|
+
url = self.fix_url(href),
|
|
61
|
+
poster = self.fix_url(poster),
|
|
62
|
+
))
|
|
63
|
+
|
|
64
|
+
return results
|
|
65
|
+
|
|
66
|
+
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
67
|
+
istek = await self.async_cf_get(url)
|
|
68
|
+
secici = HTMLHelper(istek.text)
|
|
69
|
+
|
|
70
|
+
title = secici.select_text("h2.heading-name") or secici.select_text("h1")
|
|
71
|
+
poster = secici.select_poster("img.film-poster-img") or secici.meta_value("og:image")
|
|
72
|
+
description = secici.select_text("div.description") or secici.meta_value("og:description")
|
|
73
|
+
|
|
74
|
+
meta = secici.select("div.elements div.row-line")
|
|
75
|
+
year = None
|
|
76
|
+
rating = None
|
|
77
|
+
for row in meta:
|
|
78
|
+
label = row.select_text("strong")
|
|
79
|
+
if label:
|
|
80
|
+
if "Released" in label:
|
|
81
|
+
year = row.select_text("span")
|
|
82
|
+
if "IMDb" in label:
|
|
83
|
+
rating = row.select_text("span")
|
|
84
|
+
|
|
85
|
+
tags = secici.select_texts("div.elements div.row-line:contains('Genre') a")
|
|
86
|
+
actors = secici.select_texts("div.elements div.row-line:contains('Casts') a")
|
|
87
|
+
|
|
88
|
+
is_series = "/tv/" in url or "/series/" in url
|
|
89
|
+
if is_series:
|
|
90
|
+
episodes = []
|
|
91
|
+
# AJAX URL'sini bul
|
|
92
|
+
ajax_url = secici.regex_first(r"const current_url = '([^']+)'")
|
|
93
|
+
if ajax_url:
|
|
94
|
+
ajax_istek = await self.async_cf_get(ajax_url, headers={"Referer": url})
|
|
95
|
+
ajax_secici = HTMLHelper(ajax_istek.text)
|
|
96
|
+
for li in ajax_secici.select("li"):
|
|
97
|
+
a_tag = li.select_first("a")
|
|
98
|
+
if a_tag:
|
|
99
|
+
ep_href = a_tag.attrs.get("href")
|
|
100
|
+
ep_name = a_tag.text(strip=True)
|
|
101
|
+
s, e = secici.extract_season_episode(ep_name)
|
|
102
|
+
episodes.append(Episode(
|
|
103
|
+
season = s or 1,
|
|
104
|
+
episode = e or 1,
|
|
105
|
+
title = ep_name,
|
|
106
|
+
url = self.fix_url(ep_href)
|
|
107
|
+
))
|
|
108
|
+
|
|
109
|
+
return SeriesInfo(
|
|
110
|
+
url = url,
|
|
111
|
+
poster = self.fix_url(poster),
|
|
112
|
+
title = title.strip() if title else "",
|
|
113
|
+
description = description,
|
|
114
|
+
tags = tags,
|
|
115
|
+
year = year,
|
|
116
|
+
rating = rating,
|
|
117
|
+
actors = actors,
|
|
118
|
+
episodes = episodes
|
|
119
|
+
)
|
|
120
|
+
|
|
121
|
+
return MovieInfo(
|
|
122
|
+
url = url,
|
|
123
|
+
poster = self.fix_url(poster),
|
|
124
|
+
title = title.strip() if title else "",
|
|
125
|
+
description = description,
|
|
126
|
+
tags = tags,
|
|
127
|
+
year = year,
|
|
128
|
+
rating = rating,
|
|
129
|
+
actors = actors
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
133
|
+
istek = await self.async_cf_get(url)
|
|
134
|
+
secici = HTMLHelper(istek.text)
|
|
135
|
+
|
|
136
|
+
# Flw clones often have a data-id or similar
|
|
137
|
+
# For bflix.sh, it's a bit different.
|
|
138
|
+
# I'll just look for any iframe as a start.
|
|
139
|
+
response = []
|
|
140
|
+
for iframe in secici.select("iframe"):
|
|
141
|
+
src = iframe.attrs.get("src")
|
|
142
|
+
if src:
|
|
143
|
+
data = await self.extract(self.fix_url(src), referer=url)
|
|
144
|
+
if data:
|
|
145
|
+
self.collect_results(response, data)
|
|
146
|
+
else:
|
|
147
|
+
response.append(ExtractResult(url=self.fix_url(src), name="Iframe", referer=url))
|
|
148
|
+
|
|
149
|
+
return self.deduplicate(response)
|
|
@@ -164,6 +164,15 @@ class CizgiMax(PluginBase):
|
|
|
164
164
|
url = stream_url,
|
|
165
165
|
referer = url
|
|
166
166
|
))
|
|
167
|
+
elif s.get("resolveUrl"):
|
|
168
|
+
# Yeni yapı: resolveUrl (genelde dzen vb. için)
|
|
169
|
+
resolve_url = self.fix_url(s.get("resolveUrl"))
|
|
170
|
+
data = await self.extract(resolve_url, referer=url, prefix=name)
|
|
171
|
+
if data:
|
|
172
|
+
self.collect_results(response, data)
|
|
173
|
+
else:
|
|
174
|
+
response.append(ExtractResult(url=resolve_url, name=name, referer=url))
|
|
175
|
+
|
|
167
176
|
except Exception:
|
|
168
177
|
pass
|
|
169
178
|
|
|
@@ -34,7 +34,7 @@ class Coflix(PluginBase):
|
|
|
34
34
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
35
35
|
# url is our key (movies, series, etc.)
|
|
36
36
|
api_target = f"{self._api_url}/options/?years=&post_type={url}&genres=&page={page}&sort=1"
|
|
37
|
-
istek = await self.
|
|
37
|
+
istek = await self.async_cf_get(api_target)
|
|
38
38
|
try:
|
|
39
39
|
data = istek.json()
|
|
40
40
|
results = []
|
|
@@ -68,7 +68,7 @@ class Coflix(PluginBase):
|
|
|
68
68
|
async def search(self, query: str) -> list[SearchResult]:
|
|
69
69
|
# Kotlin uses suggest.php
|
|
70
70
|
link = f"{self.main_url}/suggest.php?query={query}"
|
|
71
|
-
istek = await self.
|
|
71
|
+
istek = await self.async_cf_get(link)
|
|
72
72
|
try:
|
|
73
73
|
# Re-format broken JSON if any, Kotlin says .toString().toJson() which implies some cleanup
|
|
74
74
|
text = istek.text
|
|
@@ -90,7 +90,7 @@ class Coflix(PluginBase):
|
|
|
90
90
|
return []
|
|
91
91
|
|
|
92
92
|
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
93
|
-
istek = await self.
|
|
93
|
+
istek = await self.async_cf_get(url)
|
|
94
94
|
secici = HTMLHelper(istek.text)
|
|
95
95
|
|
|
96
96
|
title = secici.select_text("meta[property='og:title']")
|
|
@@ -124,7 +124,7 @@ class Coflix(PluginBase):
|
|
|
124
124
|
|
|
125
125
|
# API Call for season episodes
|
|
126
126
|
ep_api = f"{self._api_url}/series/{p_id}/{s_num}"
|
|
127
|
-
ep_istek = await self.
|
|
127
|
+
ep_istek = await self.async_cf_get(ep_api)
|
|
128
128
|
try:
|
|
129
129
|
ep_data = ep_istek.json()
|
|
130
130
|
for ep in ep_data.get("episodes", []):
|
|
@@ -170,16 +170,20 @@ class Coflix(PluginBase):
|
|
|
170
170
|
|
|
171
171
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
172
172
|
# url might be direct or from Episodes
|
|
173
|
-
istek = await self.
|
|
173
|
+
istek = await self.async_cf_get(url, headers={"Referer": self.main_url})
|
|
174
174
|
secici = HTMLHelper(istek.text)
|
|
175
175
|
|
|
176
176
|
# Look for iframe
|
|
177
177
|
iframe = self.fix_url(secici.select_attr("div.embed iframe", "src"))
|
|
178
|
+
if not iframe:
|
|
179
|
+
# Try finding any iframe
|
|
180
|
+
iframe = secici.select_attr("iframe", "src")
|
|
181
|
+
|
|
178
182
|
if not iframe:
|
|
179
183
|
return []
|
|
180
184
|
|
|
181
185
|
# Load player wrapper
|
|
182
|
-
if_istek = await self.
|
|
186
|
+
if_istek = await self.async_cf_get(iframe, headers={"Referer": self.main_url})
|
|
183
187
|
if_secici = HTMLHelper(if_istek.text)
|
|
184
188
|
|
|
185
189
|
decoded_urls = []
|
|
@@ -202,7 +206,11 @@ class Coflix(PluginBase):
|
|
|
202
206
|
|
|
203
207
|
tasks = [self.extract(u, referer=self.main_url) for u in embed]
|
|
204
208
|
for ext in await self.gather_with_limit(tasks):
|
|
205
|
-
|
|
209
|
+
if ext:
|
|
210
|
+
self.collect_results(results, ext)
|
|
211
|
+
else:
|
|
212
|
+
# Fallback to raw URL
|
|
213
|
+
results.append(ExtractResult(name="Externo", url=embed[0], referer=self.main_url)) # Simplified fallback
|
|
206
214
|
|
|
207
215
|
return results
|
|
208
216
|
|
|
@@ -26,7 +26,7 @@ class DiziKorea(PluginBase):
|
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
29
|
-
istek = await self.
|
|
29
|
+
istek = await self.async_cf_get(f"{url}{page}")
|
|
30
30
|
secici = HTMLHelper(istek.text)
|
|
31
31
|
|
|
32
32
|
results = []
|
|
@@ -46,7 +46,7 @@ class DiziKorea(PluginBase):
|
|
|
46
46
|
return results
|
|
47
47
|
|
|
48
48
|
async def search(self, query: str) -> list[SearchResult]:
|
|
49
|
-
istek = await self.
|
|
49
|
+
istek = await self.async_cf_post(
|
|
50
50
|
f"{self.main_url}/search",
|
|
51
51
|
data = {"query": query},
|
|
52
52
|
headers = {"X-Requested-With": "XMLHttpRequest"},
|
|
@@ -78,7 +78,7 @@ class DiziKorea(PluginBase):
|
|
|
78
78
|
return results
|
|
79
79
|
|
|
80
80
|
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
81
|
-
istek = await self.
|
|
81
|
+
istek = await self.async_cf_get(url)
|
|
82
82
|
secici = HTMLHelper(istek.text)
|
|
83
83
|
|
|
84
84
|
title = secici.select_text("h1 a") or ""
|
|
@@ -138,7 +138,7 @@ class DiziKorea(PluginBase):
|
|
|
138
138
|
)
|
|
139
139
|
|
|
140
140
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
141
|
-
istek = await self.
|
|
141
|
+
istek = await self.async_cf_get(url)
|
|
142
142
|
secici = HTMLHelper(istek.text)
|
|
143
143
|
|
|
144
144
|
extract_args = []
|
|
@@ -150,7 +150,7 @@ class DiziKorea(PluginBase):
|
|
|
150
150
|
if not tab_hash:
|
|
151
151
|
continue
|
|
152
152
|
|
|
153
|
-
with_groups = await self.
|
|
153
|
+
with_groups = await self.async_cf_post(
|
|
154
154
|
url = f"{self.main_url}/get/video/group",
|
|
155
155
|
headers = {
|
|
156
156
|
"X-Requested-With" : "XMLHttpRequest",
|
|
@@ -173,7 +173,7 @@ class DiziKorea(PluginBase):
|
|
|
173
173
|
extract_args.append((iframe_src, f"{tab_name} | {player_name}" if tab_name else player_name))
|
|
174
174
|
|
|
175
175
|
if not extract_args:
|
|
176
|
-
for btn in secici.select("div.video-services button
|
|
176
|
+
for btn in secici.select("div.video-services button"):
|
|
177
177
|
iframe_src = btn.attrs.get("data-hhs") or btn.attrs.get("data-frame")
|
|
178
178
|
player_name = btn.attrs.get("title") or btn.text(strip=True)
|
|
179
179
|
if iframe_src:
|
|
@@ -182,6 +182,14 @@ class DiziKorea(PluginBase):
|
|
|
182
182
|
response = []
|
|
183
183
|
tasks = [self.extract(video_url, referer=f"{self.main_url}/", name_override=name or None) for video_url, name in extract_args]
|
|
184
184
|
for data in await self.gather_with_limit(tasks):
|
|
185
|
-
|
|
185
|
+
if data:
|
|
186
|
+
self.collect_results(response, data)
|
|
187
|
+
else:
|
|
188
|
+
# Fallback to raw URL
|
|
189
|
+
# Find the URL that failed
|
|
190
|
+
idx = len(response) # This is not accurate but let's just push what we find
|
|
191
|
+
if idx < len(extract_args):
|
|
192
|
+
u, n = extract_args[idx]
|
|
193
|
+
response.append(ExtractResult(url=u, name=n or "Externo", referer=url))
|
|
186
194
|
|
|
187
195
|
return self.deduplicate(response)
|
|
@@ -33,7 +33,7 @@ class DiziPal(PluginBase):
|
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
36
|
-
istek = await self.
|
|
36
|
+
istek = await self.async_cf_get(f"{url}{page}/")
|
|
37
37
|
secici = HTMLHelper(istek.text)
|
|
38
38
|
|
|
39
39
|
results = []
|
|
@@ -53,7 +53,7 @@ class DiziPal(PluginBase):
|
|
|
53
53
|
return results
|
|
54
54
|
|
|
55
55
|
async def search(self, query: str) -> list[SearchResult]:
|
|
56
|
-
istek = await self.
|
|
56
|
+
istek = await self.async_cf_get(f"{self.main_url}/?s={query}")
|
|
57
57
|
secici = HTMLHelper(istek.text)
|
|
58
58
|
|
|
59
59
|
results = []
|
|
@@ -94,7 +94,7 @@ class DiziPal(PluginBase):
|
|
|
94
94
|
return episodes
|
|
95
95
|
|
|
96
96
|
async def load_item(self, url: str) -> MovieInfo | SeriesInfo:
|
|
97
|
-
istek = await self.
|
|
97
|
+
istek = await self.async_cf_get(url)
|
|
98
98
|
secici = HTMLHelper(istek.text)
|
|
99
99
|
|
|
100
100
|
poster = self.fix_url(secici.select_attr("[property='og:image']", "content"))
|
|
@@ -127,7 +127,7 @@ class DiziPal(PluginBase):
|
|
|
127
127
|
if "/dizi/" in url:
|
|
128
128
|
season_links = secici.select("#season-options-list ul li a")
|
|
129
129
|
if season_links:
|
|
130
|
-
tasks = [self.
|
|
130
|
+
tasks = [self.async_cf_get(self.fix_url(s.select_attr("a", "href"))) for s in season_links]
|
|
131
131
|
responses = await asyncio.gather(*tasks)
|
|
132
132
|
|
|
133
133
|
episodes_map = {}
|
|
@@ -166,46 +166,55 @@ class DiziPal(PluginBase):
|
|
|
166
166
|
)
|
|
167
167
|
|
|
168
168
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
169
|
-
istek = await self.
|
|
169
|
+
istek = await self.async_cf_get(url)
|
|
170
170
|
secici = HTMLHelper(istek.text)
|
|
171
171
|
|
|
172
172
|
iframe = secici.select_attr("div.video-player-area iframe", "src") or secici.select_attr("div.responsive-player iframe", "src")
|
|
173
|
+
if not iframe:
|
|
174
|
+
# Fallback to any iframe
|
|
175
|
+
iframe = secici.select_attr("iframe", "src")
|
|
176
|
+
|
|
173
177
|
if not iframe:
|
|
174
178
|
return []
|
|
175
179
|
|
|
176
180
|
results = []
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
181
|
+
try:
|
|
182
|
+
i_istek = await self.async_cf_get(self.fix_url(iframe), headers={"Referer": url})
|
|
183
|
+
i_text = i_istek.text
|
|
184
|
+
|
|
185
|
+
# m3u link çıkar
|
|
186
|
+
m3u_link = secici.regex_first(r'file:"([^"]+)"', target=i_text)
|
|
187
|
+
if m3u_link:
|
|
188
|
+
# Altyazıları çıkar
|
|
189
|
+
sub_text = secici.regex_first(r'"subtitle":"([^"]+)"', target=i_text)
|
|
190
|
+
subtitles = []
|
|
191
|
+
if sub_text:
|
|
192
|
+
if "," in sub_text:
|
|
193
|
+
for sub in sub_text.split(","):
|
|
194
|
+
lang = sub.split("[")[1].split("]")[0] if "[" in sub else "Türkçe"
|
|
195
|
+
sub_url = sub.replace(f"[{lang}]", "")
|
|
196
|
+
subtitles.append(self.new_subtitle(self.fix_url(sub_url), lang))
|
|
197
|
+
else:
|
|
198
|
+
lang = sub_text.split("[")[1].split("]")[0] if "[" in sub_text else "Türkçe"
|
|
199
|
+
sub_url = sub_text.replace(f"[{lang}]", "")
|
|
194
200
|
subtitles.append(self.new_subtitle(self.fix_url(sub_url), lang))
|
|
201
|
+
|
|
202
|
+
results.append(ExtractResult(
|
|
203
|
+
name = self.name,
|
|
204
|
+
url = self.fix_url(m3u_link),
|
|
205
|
+
referer = f"{self.main_url}/",
|
|
206
|
+
subtitles = subtitles
|
|
207
|
+
))
|
|
208
|
+
else:
|
|
209
|
+
# Extractor'a yönlendir
|
|
210
|
+
data = await self.extract(self.fix_url(iframe), referer=url)
|
|
211
|
+
if data:
|
|
212
|
+
self.collect_results(results, data)
|
|
195
213
|
else:
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
name = self.name,
|
|
202
|
-
url = m3u_link,
|
|
203
|
-
referer = f"{self.main_url}/",
|
|
204
|
-
subtitles = subtitles
|
|
205
|
-
))
|
|
206
|
-
else:
|
|
207
|
-
# Extractor'a yönlendir
|
|
208
|
-
data = await self.extract(iframe)
|
|
209
|
-
self.collect_results(results, data)
|
|
214
|
+
# Fallback
|
|
215
|
+
results.append(ExtractResult(url=self.fix_url(iframe), name="Externo", referer=url))
|
|
216
|
+
except Exception:
|
|
217
|
+
# Final fallback
|
|
218
|
+
results.append(ExtractResult(url=self.fix_url(iframe), name="Externo", referer=url))
|
|
210
219
|
|
|
211
|
-
return results
|
|
220
|
+
return self.deduplicate(results)
|
|
@@ -31,7 +31,7 @@ class Dizify(PluginBase):
|
|
|
31
31
|
|
|
32
32
|
media_type = "movie" if item_type == "movie" else "tv"
|
|
33
33
|
try:
|
|
34
|
-
resp = await self.
|
|
34
|
+
resp = await self.async_cf_get(
|
|
35
35
|
f"{self.tmdb_api}/{media_type}/{tmdb_id}",
|
|
36
36
|
params={
|
|
37
37
|
"api_key" : self.tmdb_key,
|
|
@@ -45,7 +45,7 @@ class Dizify(PluginBase):
|
|
|
45
45
|
|
|
46
46
|
async def get_main_page(self, page: int, url: str, category: str) -> list[MainPageResult]:
|
|
47
47
|
params = {"page": page}
|
|
48
|
-
istek = await self.
|
|
48
|
+
istek = await self.async_cf_get(url, params=params)
|
|
49
49
|
data = istek.json()
|
|
50
50
|
|
|
51
51
|
if not data.get("success"):
|
|
@@ -68,7 +68,7 @@ class Dizify(PluginBase):
|
|
|
68
68
|
return results
|
|
69
69
|
|
|
70
70
|
async def search(self, query: str) -> list[SearchResult]:
|
|
71
|
-
istek = await self.
|
|
71
|
+
istek = await self.async_cf_get(f"{self.api_url}/search", params={"q": query})
|
|
72
72
|
data = istek.json()
|
|
73
73
|
|
|
74
74
|
if not data.get("success"):
|
|
@@ -105,13 +105,13 @@ class Dizify(PluginBase):
|
|
|
105
105
|
slug = match.group(1) if match else url.rstrip("/").split("/")[-1]
|
|
106
106
|
endpoint = f"{self.api_url}/movies/{slug}"
|
|
107
107
|
|
|
108
|
-
istek = await self.
|
|
108
|
+
istek = await self.async_cf_get(endpoint)
|
|
109
109
|
data = istek.json()
|
|
110
110
|
|
|
111
111
|
# Fallback between movie/series if first guess fails
|
|
112
112
|
if not data.get("success"):
|
|
113
113
|
alt_endpoint = f"{self.api_url}/movies/{slug}" if is_series else f"{self.api_url}/series/{slug}"
|
|
114
|
-
istek = await self.
|
|
114
|
+
istek = await self.async_cf_get(alt_endpoint)
|
|
115
115
|
data = istek.json()
|
|
116
116
|
if data.get("success"):
|
|
117
117
|
is_series = not is_series
|
|
@@ -176,7 +176,7 @@ class Dizify(PluginBase):
|
|
|
176
176
|
async def load_links(self, url: str) -> list[ExtractResult]:
|
|
177
177
|
# If url is already an API source endpoint (from our load_item)
|
|
178
178
|
if "/sources" in url:
|
|
179
|
-
istek = await self.
|
|
179
|
+
istek = await self.async_cf_get(url)
|
|
180
180
|
data = istek.json()
|
|
181
181
|
if not data.get("success"):
|
|
182
182
|
return []
|
|
@@ -201,11 +201,11 @@ class Dizify(PluginBase):
|
|
|
201
201
|
if is_series:
|
|
202
202
|
match = re.search(r'/(?:dizi-izle|series)/([^/]+)', url)
|
|
203
203
|
slug = match.group(1) if match else url.rstrip("/").split("/")[-1]
|
|
204
|
-
istek = await self.
|
|
204
|
+
istek = await self.async_cf_get(f"{self.api_url}/series/{slug}")
|
|
205
205
|
else:
|
|
206
206
|
match = re.search(r'/(?:film-izle|movies)/([^/]+)', url)
|
|
207
207
|
slug = match.group(1) if match else url.rstrip("/").split("/")[-1]
|
|
208
|
-
istek = await self.
|
|
208
|
+
istek = await self.async_cf_get(f"{self.api_url}/movies/{slug}")
|
|
209
209
|
|
|
210
210
|
data = istek.json()
|
|
211
211
|
if data.get("success"):
|