KekikStream 3.4.2__tar.gz → 3.4.4__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.4}/KekikStream/Core/Extractor/ExtractorMixins.py +5 -6
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Abstream.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Ashdi.py +4 -3
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/BrightPath.py +28 -5
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ByseSX.py +39 -16
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DoodStream.py +13 -10
- kekikstream-3.4.4/KekikStream/Extractors/Embedgram.py +31 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Fembed.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Filemoon.py +6 -2
- kekikstream-3.4.4/KekikStream/Extractors/GoodStream.py +65 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HDPlayerSystem.py +3 -2
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JFVid.py +7 -2
- kekikstream-3.4.4/KekikStream/Extractors/JWPlayer.py +16 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/KentFilm.py +3 -3
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/StreamWish.py +1 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidHide.py +33 -3
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidStack.py +33 -9
- kekikstream-3.4.4/KekikStream/Extractors/VideoParktop.py +82 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Vidoza.py +9 -3
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Zeus.py +11 -5
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AnimeYTX.py +36 -29
- kekikstream-3.4.4/KekikStream/Plugins/BFlix.py +149 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/CizgiMax.py +9 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Coflix.py +15 -7
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziKorea.py +15 -7
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziPal.py +46 -37
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Dizify.py +9 -9
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Dizilla.py +6 -4
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DoramasLatinoX.py +27 -8
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmFC.py +7 -7
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/MyFlixer.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SFlix.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/ShowFlix.py +26 -21
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Sinezy.py +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Turkish123.py +52 -29
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/UgurFilm.py +13 -13
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/YeniWatch.py +15 -13
- {kekikstream-3.4.2 → kekikstream-3.4.4}/PKG-INFO +1 -1
- {kekikstream-3.4.2 → kekikstream-3.4.4}/pyproject.toml +1 -1
- kekikstream-3.4.2/KekikStream/Extractors/VideoParktop.py +0 -47
- kekikstream-3.4.2/KekikStream/Plugins/BFlix.py +0 -45
- {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/FUNDING.yml +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/icons/KekikStream.png +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/workflows/Kontrol.yml +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/workflows/pypiYukle.yml +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/.gitignore +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KONTROL.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/CLI/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/CLI/pypi_kontrol.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/VideoPlayerExtractor.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/FallbackClients.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/HTMLHelper.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/MethodCache.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/Normalizer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/TitleHelper.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Media/MediaHandler.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Media/MediaManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/FlwBasePlugin.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginBase.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginModels.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/UI/UIManager.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Alloha.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/BulguNet.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/BurstCloud.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/CizgiPass.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/CloseLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ContentX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DarkiBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DonilasPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DosyaLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DramaCool.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DzenRu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/EmbedLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/EpikPlayer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ExPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/FastPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HDLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HDMomPlayer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HexLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HotStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JetCDN.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JetTv.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JetV.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Kodik.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/LuciferPlays.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/LuluStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MP4Upload.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MailRu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MegaCloud.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MegaNZ.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MixDrop.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MixPlayHD.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MixTiger.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MolyStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Netu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/NiceAcik.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Odnoklassniki.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PeaceMakerst.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PixelDrain.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PlayerKorea.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PlayerX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/RapidVid.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Rumble.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SaveFiles.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SendVid.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SetPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SetPrime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ShortICU.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SibNet.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Stloadi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/StreamBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/StreamTape.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TRsTX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TauVideo.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Tukipasti.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TurboImgz.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Uqload.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VCTPlay.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Variyt.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Veev.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidBiz.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidLoad.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidMoly.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidMoxy.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidPapi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VideoSeyred.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Videostr.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Vidora.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Voe.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Vtbe.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/XtremStream.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/YTDLP.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/YourUpload.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ZillaNetworks.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AnimeAV.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AnimeciX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AsyaAnimeleri.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AsyaWatch.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/BelgeselX.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/FilmBip.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Broken/FilmKovasi.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Filmatek.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/FlixHQ.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/FullHDFilm.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/KoreanTurk.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Movies2Watch.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/MoviesJoy.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Watch2Movies.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Watch32.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/YesilcamTV.py +0 -0
- {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Zoechip.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DMax.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziGom.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziMag.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziMom.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziWatch.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziYou.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DocumentaryArea.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DramaFlix.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Dramacool.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmCennetim.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmEkseni.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmIzleIlk.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmMakinesi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmMirasim.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmModu.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmciBaba.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FlixLatam.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/HDFilm.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/HDrezka.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Henaojara.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/InatBox.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/JPFilms.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/JetFilmizle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Kinogo.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/KultFilmler.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Latanime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/RecTV.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/RoketDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SelcukFlix.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SetFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SezonlukDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SineWix.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Sinefy.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SinemaCX.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/StreamIMDB.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SuperFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/TLC.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/TurkAnime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/TvDiziler.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/UAKino.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/WFilmIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/WebDramaTurkey.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/WebteIzle.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/XPrime.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/YabanciDizi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/YoTurkish.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/__init__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/__main__.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/requirements.txt +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/LICENSE +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/README.md +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/Multi.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/PluginAudit/audit_plugins.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/PluginAudit/clean_plugins.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/PluginAudit/master_audit.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/Single.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/Validator.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/test_links.py +0 -0
- {kekikstream-3.4.2 → kekikstream-3.4.4}/_config.yml +0 -0
|
@@ -93,7 +93,7 @@ class SecuredLinkExtractor(ExtractorBase):
|
|
|
93
93
|
v_id = self._parse_video_id(url)
|
|
94
94
|
base_url = self._get_base_url(url)
|
|
95
95
|
|
|
96
|
-
resp = await self.
|
|
96
|
+
resp = await self.async_cf_post(
|
|
97
97
|
url = f"{base_url}/player/index.php?data={v_id}&do=getVideo",
|
|
98
98
|
data = {"hash": v_id, "r": ref},
|
|
99
99
|
headers = {"Referer": ref, "X-Requested-With": "XMLHttpRequest"}
|
|
@@ -116,7 +116,7 @@ class SecuredLinkExtractor(ExtractorBase):
|
|
|
116
116
|
# Bazı hostlar POST yanıtında sadece iframe döndürüyor; ikinci katmanı da çöz.
|
|
117
117
|
if "/player/" in m3u8_url or "/video/" in m3u8_url or "/embed/" in m3u8_url:
|
|
118
118
|
if m3u8_url != url:
|
|
119
|
-
inner_resp = await self.
|
|
119
|
+
inner_resp = await self.async_cf_get(m3u8_url, headers={"Referer": ref})
|
|
120
120
|
if inner_url := self._extract_link_from_text(inner_resp.text):
|
|
121
121
|
m3u8_url = self.fix_url(inner_url)
|
|
122
122
|
|
|
@@ -221,10 +221,9 @@ class BePlayerExtractor(ExtractorBase):
|
|
|
221
221
|
return m3u8_url, subtitles, raw_data
|
|
222
222
|
|
|
223
223
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
sel = HTMLHelper(resp.text)
|
|
224
|
+
headers = {"Referer": referer or url}
|
|
225
|
+
resp = await self.async_cf_get(url, headers=headers)
|
|
226
|
+
sel = HTMLHelper(resp.text)
|
|
228
227
|
|
|
229
228
|
m3u8_url, subtitles, _ = self.decrypt_beplayer(resp.text)
|
|
230
229
|
|
|
@@ -7,7 +7,7 @@ class Abstream(ExtractorBase):
|
|
|
7
7
|
main_url = "https://abstream.to"
|
|
8
8
|
|
|
9
9
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
10
|
-
istek
|
|
10
|
+
istek = await self.async_cf_get(
|
|
11
11
|
url = url,
|
|
12
12
|
headers = {
|
|
13
13
|
"Accept-Language" : "en-US,en;q=0.5",
|
|
@@ -4,8 +4,9 @@ from KekikStream.Core import PackedJSExtractor, ExtractResult, HTMLHelper
|
|
|
4
4
|
import contextlib, json
|
|
5
5
|
|
|
6
6
|
class Ashdi(PackedJSExtractor):
|
|
7
|
-
name
|
|
8
|
-
main_url
|
|
7
|
+
name = "Ashdi"
|
|
8
|
+
main_url = "https://ashdi.vip"
|
|
9
|
+
supported_domains = ["ashdi.vip", "ashdi.org"]
|
|
9
10
|
|
|
10
11
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
11
12
|
# Referer trailing slash fix
|
|
@@ -13,7 +14,7 @@ class Ashdi(PackedJSExtractor):
|
|
|
13
14
|
if ref.endswith("/") and len(ref) > 10:
|
|
14
15
|
ref = ref.rstrip("/")
|
|
15
16
|
|
|
16
|
-
resp = await self.
|
|
17
|
+
resp = await self.async_cf_get(
|
|
17
18
|
url = url,
|
|
18
19
|
headers = {
|
|
19
20
|
"Referer" : ref,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle, HTMLHelper
|
|
4
4
|
import re, json, base64, gzip
|
|
5
5
|
|
|
6
6
|
class BrightPath(ExtractorBase):
|
|
@@ -75,12 +75,35 @@ class BrightPath(ExtractorBase):
|
|
|
75
75
|
|
|
76
76
|
# Subtitles
|
|
77
77
|
subtitles = []
|
|
78
|
-
|
|
78
|
+
seen_urls = set()
|
|
79
|
+
|
|
80
|
+
def add_subtitle(url, name):
|
|
81
|
+
full_url = self.fix_url(url)
|
|
82
|
+
if full_url and full_url not in seen_urls:
|
|
83
|
+
subtitles.append(Subtitle(url=full_url, name=name))
|
|
84
|
+
seen_urls.add(full_url)
|
|
85
|
+
|
|
86
|
+
# 1. External Subtitle (from data or config)
|
|
87
|
+
ext_sub = api_data["data"].get("externalSub") or config.get("externalSub")
|
|
79
88
|
if ext_sub and ext_sub.get("file"):
|
|
80
|
-
|
|
81
|
-
url =
|
|
89
|
+
add_subtitle(
|
|
90
|
+
url = ext_sub["file"],
|
|
82
91
|
name = ext_sub.get("label") or ext_sub.get("lang") or "Subtitle"
|
|
83
|
-
)
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
# 2. Default Subtitles (from root)
|
|
95
|
+
for sub in api_data.get("default_subs", []):
|
|
96
|
+
add_subtitle(
|
|
97
|
+
url = sub["url"],
|
|
98
|
+
name = sub.get("lang") or "Subtitle"
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
# 3. Subtitles from data
|
|
102
|
+
for sub in api_data["data"].get("subtitles", []):
|
|
103
|
+
add_subtitle(
|
|
104
|
+
url = sub.get("file") or sub.get("url"),
|
|
105
|
+
name = sub.get("label") or sub.get("lang") or "Subtitle"
|
|
106
|
+
)
|
|
84
107
|
|
|
85
108
|
for idx, s_url in enumerate(stream_urls, 1):
|
|
86
109
|
# If it's a list, the first item is the name, second is the URL
|
|
@@ -26,6 +26,7 @@ class ByseSX(ExtractorBase):
|
|
|
26
26
|
"bysebuho.com",
|
|
27
27
|
"bysevepoin.com",
|
|
28
28
|
"byseqekaho.com",
|
|
29
|
+
"bysesx.com",
|
|
29
30
|
]
|
|
30
31
|
|
|
31
32
|
@staticmethod
|
|
@@ -34,36 +35,58 @@ class ByseSX(ExtractorBase):
|
|
|
34
35
|
pad = (4 - len(fixed) % 4) % 4
|
|
35
36
|
return base64.b64decode(fixed + "=" * pad)
|
|
36
37
|
|
|
37
|
-
async def _api_get(self, code: str, host: str):
|
|
38
|
-
"""details API'sini dene; 403 dönerse mirror domain'lere
|
|
39
|
-
|
|
40
|
-
resp = await self.async_cf_get(f"https://{host}/api/videos/{code}/embed/details", headers=headers, timeout=12)
|
|
38
|
+
async def _api_get(self, code: str, host: str, referer: str = None):
|
|
39
|
+
"""details API'sini dene; 403 dönerse mirror domain'lere veya referer'a göre Origin değiştir."""
|
|
40
|
+
candidates = [host] + MIRROR_DOMAINS
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
42
|
+
# Eğer referer varsa, onun domain'ini de Origin olarak denemek isteyebiliriz
|
|
43
|
+
origin_from_referer = None
|
|
44
|
+
if referer:
|
|
45
|
+
ref_parsed = urlparse(referer)
|
|
46
|
+
origin_from_referer = f"{ref_parsed.scheme}://{ref_parsed.netloc}"
|
|
44
47
|
|
|
45
|
-
|
|
46
|
-
|
|
48
|
+
for domain in candidates:
|
|
49
|
+
headers = {"Origin": f"https://{domain}", "Referer": f"https://{domain}/e/{code}"}
|
|
50
|
+
resp = await self.async_cf_get(f"https://{domain}/api/videos/{code}/embed/details", headers=headers, timeout=12)
|
|
47
51
|
|
|
48
|
-
for mirror in MIRROR_DOMAINS:
|
|
49
|
-
if mirror == host:
|
|
50
|
-
continue
|
|
51
|
-
headers = {"Origin": f"https://{mirror}", "Referer": f"https://{mirror}/e/{code}"}
|
|
52
|
-
resp = await self.async_cf_get(f"https://{mirror}/api/videos/{code}/embed/details", headers=headers, timeout=12)
|
|
53
52
|
if resp.status_code == 200:
|
|
54
53
|
return resp.json()
|
|
54
|
+
|
|
55
|
+
# 403 dönerse referer origin'ini dene
|
|
56
|
+
if resp.status_code == 403 and origin_from_referer:
|
|
57
|
+
headers["Origin"] = origin_from_referer
|
|
58
|
+
resp = await self.async_cf_get(f"https://{domain}/api/videos/{code}/embed/details", headers=headers, timeout=12)
|
|
59
|
+
if resp.status_code == 200:
|
|
60
|
+
return resp.json()
|
|
61
|
+
|
|
55
62
|
if resp.status_code == 404:
|
|
56
63
|
raise ValueError(f"ByseSX: Video bulunamadı. {code}")
|
|
57
64
|
|
|
58
|
-
raise ValueError(f"ByseSX: API erişimi başarısız. {code}")
|
|
65
|
+
raise ValueError(f"ByseSX: API erişimi başarısız (403/Mirror Fail). {code}")
|
|
59
66
|
|
|
60
67
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
61
68
|
parsed = urlparse(url)
|
|
62
69
|
host = parsed.netloc.lstrip("www.")
|
|
63
|
-
|
|
70
|
+
|
|
71
|
+
# /api/get/ pattern support
|
|
72
|
+
if "/api/get/" in url:
|
|
73
|
+
headers = {"Referer": referer or f"https://{host}/"}
|
|
74
|
+
resp = await self.async_cf_get(url, headers=headers)
|
|
75
|
+
if resp.status_code == 200:
|
|
76
|
+
data = resp.json()
|
|
77
|
+
sources = data.get("sources") or data.get("data", {}).get("sources", [])
|
|
78
|
+
if sources:
|
|
79
|
+
best = max(sources, key=lambda s: s.get("bitrate_kbps", 0))
|
|
80
|
+
return ExtractResult(
|
|
81
|
+
name = self.name,
|
|
82
|
+
url = best["url"],
|
|
83
|
+
referer = url,
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
code = parsed.path.rstrip("/").rsplit("/", 1)[-1]
|
|
64
87
|
|
|
65
88
|
# 1) details
|
|
66
|
-
details = await self._api_get(code, host)
|
|
89
|
+
details = await self._api_get(code, host, referer=referer)
|
|
67
90
|
embed_frame_url = details["embed_frame_url"]
|
|
68
91
|
|
|
69
92
|
# 2) playback
|
|
@@ -50,13 +50,14 @@ class DoodStream(ExtractorBase):
|
|
|
50
50
|
# DoodStream token/key parsing
|
|
51
51
|
pass_key = re.search(r"/(?:pass_md5|pass_key)/([^'\"]+)", html)
|
|
52
52
|
if not pass_key:
|
|
53
|
-
|
|
54
|
-
pass_key = re.search(r"\$\.get\(['\"]/([^'\"]+)['\"]", html)
|
|
53
|
+
pass_key = re.search(r"/(?:pass_md5|pass_key)/([^'\"]+)", html, re.IGNORECASE)
|
|
55
54
|
|
|
56
55
|
if not pass_key:
|
|
57
|
-
#
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
# Try finding it in script calls
|
|
57
|
+
pass_key = re.search(r"\.get\(['\"]/([^'\"]+)['\"]", html)
|
|
58
|
+
|
|
59
|
+
if not pass_key:
|
|
60
|
+
# /d/ sürümünde bulamazsak /e/ sürümünü dene
|
|
60
61
|
if "/d/" in url:
|
|
61
62
|
return await self.extract(url.replace("/d/", "/e/"), referer=referer)
|
|
62
63
|
if "/e/" in url:
|
|
@@ -72,13 +73,15 @@ class DoodStream(ExtractorBase):
|
|
|
72
73
|
if not pass_resp.text:
|
|
73
74
|
raise ValueError(f"{self.name}: Pass response empty.")
|
|
74
75
|
|
|
75
|
-
# Final URL construction
|
|
76
|
-
# DoodStream logic usually: data + "789...?" + token
|
|
76
|
+
# Final URL construction
|
|
77
77
|
token = pk_val.split("/")[-1]
|
|
78
78
|
expiry = int(time.time() * 1000)
|
|
79
79
|
|
|
80
|
-
#
|
|
81
|
-
|
|
82
|
-
|
|
80
|
+
# random characters (usually 10)
|
|
81
|
+
random_str = "".join(re.findall(r"[a-zA-Z0-9]", pk_val))[:10]
|
|
82
|
+
if len(random_str) < 10:
|
|
83
|
+
random_str = "kekikstream"
|
|
84
|
+
|
|
85
|
+
final_url = f"{pass_resp.text}{random_str}?token={token}&expiry={expiry}"
|
|
83
86
|
|
|
84
87
|
return ExtractResult(name=self.name, url=final_url, referer=url)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
|
|
4
|
+
|
|
5
|
+
class Embedgram(ExtractorBase):
|
|
6
|
+
name = "Embedgram"
|
|
7
|
+
main_url = "https://embedgram.com"
|
|
8
|
+
supported_domains = ["embedgram.com", "upload.embedgram.com"]
|
|
9
|
+
|
|
10
|
+
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
11
|
+
istek = await self.async_cf_get(url, headers={"Referer": referer or self.main_url})
|
|
12
|
+
secici = HTMLHelper(istek.text)
|
|
13
|
+
|
|
14
|
+
# 1. Look for direct file in script or config
|
|
15
|
+
media_url = secici.regex_first(r'["\'](https?://[^"\']+\.(?:m3u8|mp4)[^"\']*)["\']')
|
|
16
|
+
|
|
17
|
+
# 2. Look for iframe
|
|
18
|
+
if not media_url:
|
|
19
|
+
iframe = secici.select_attr("iframe", "src")
|
|
20
|
+
if iframe:
|
|
21
|
+
# Recursive extraction
|
|
22
|
+
return await self.extract(self.fix_url(iframe), referer=url)
|
|
23
|
+
|
|
24
|
+
if not media_url:
|
|
25
|
+
raise ValueError(f"Embedgram: Medya bulunamadı. {url}")
|
|
26
|
+
|
|
27
|
+
return ExtractResult(
|
|
28
|
+
name = self.name,
|
|
29
|
+
url = media_url,
|
|
30
|
+
referer = url
|
|
31
|
+
)
|
|
@@ -7,7 +7,7 @@ import re, json
|
|
|
7
7
|
class Fembed(ExtractorBase):
|
|
8
8
|
name = "Fembed"
|
|
9
9
|
main_url = "https://fembed.online"
|
|
10
|
-
supported_domains = ["fembed.online", "fembed.net", "fembed.com"]
|
|
10
|
+
supported_domains = ["fembed.online", "fembed.net", "fembed.com", "tr.fembed.com", "suzihaza.com", "feurl.com"]
|
|
11
11
|
|
|
12
12
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
13
13
|
headers = {"Referer": referer or self.main_url}
|
|
@@ -86,11 +86,15 @@ class Filemoon(PackedJSExtractor):
|
|
|
86
86
|
|
|
87
87
|
try:
|
|
88
88
|
response = await self.httpx.get(api_url, headers=headers)
|
|
89
|
-
|
|
89
|
+
if response.status_code == 405:
|
|
90
|
+
response = await self.httpx.post(api_url, headers=headers)
|
|
91
|
+
data = response.json() if "json" in (response.headers.get("content-type") or "").lower() else None
|
|
90
92
|
except Exception:
|
|
91
93
|
try:
|
|
92
94
|
response = await self.async_cf_get(api_url, headers=headers)
|
|
93
|
-
|
|
95
|
+
if response.status_code == 405:
|
|
96
|
+
response = await self.async_cf_post(api_url, headers=headers)
|
|
97
|
+
data = response.json() if "json" in (response.headers.get("content-type") or "").lower() else None
|
|
94
98
|
except Exception:
|
|
95
99
|
return None, root_referer, None
|
|
96
100
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult, HTMLHelper
|
|
4
|
+
import re
|
|
5
|
+
|
|
6
|
+
class GoodStream(ExtractorBase):
|
|
7
|
+
name = "GoodStream"
|
|
8
|
+
main_url = "https://goodstream.one"
|
|
9
|
+
|
|
10
|
+
supported_domains = ["goodstream.one", "goodstream.tv"]
|
|
11
|
+
|
|
12
|
+
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
13
|
+
# 1) Get the embed page
|
|
14
|
+
headers = {
|
|
15
|
+
"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36",
|
|
16
|
+
"Referer" : referer or self.main_url,
|
|
17
|
+
}
|
|
18
|
+
resp = await self.async_cf_get(url, headers=headers)
|
|
19
|
+
|
|
20
|
+
# 2) Find the file code and POST to /dl
|
|
21
|
+
# document.forms['F1'].file_code.value = code;
|
|
22
|
+
code = self._media_id_from_url(url)
|
|
23
|
+
if not code:
|
|
24
|
+
code = HTMLHelper(resp.text).regex_first(r'file_code\.value\s*=\s*["\']([^"\']+)["\']')
|
|
25
|
+
|
|
26
|
+
if not code:
|
|
27
|
+
raise ValueError(f"GoodStream: File code bulunamadı. {url}")
|
|
28
|
+
|
|
29
|
+
dl_url = f"{self.get_base_url(url)}/dl"
|
|
30
|
+
data = {
|
|
31
|
+
"op" : "embed",
|
|
32
|
+
"file_code" : code,
|
|
33
|
+
"auto" : "1",
|
|
34
|
+
"referer" : referer or "",
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
# We need the same headers for POST
|
|
38
|
+
headers["Origin"] = self.get_base_url(url)
|
|
39
|
+
headers["Referer"] = url
|
|
40
|
+
|
|
41
|
+
dl_resp = await self.async_cf_post(dl_url, headers=headers, data=data)
|
|
42
|
+
|
|
43
|
+
# 3) Parse the final m3u8 URL from the response
|
|
44
|
+
# sources: [{file:"..."}]
|
|
45
|
+
m3u8_url = HTMLHelper(dl_resp.text).regex_first(r'sources:\s*\[{file:["\']([^"\']+)["\']')
|
|
46
|
+
|
|
47
|
+
if not m3u8_url:
|
|
48
|
+
# Fallback for simple file: "..."
|
|
49
|
+
m3u8_url = HTMLHelper(dl_resp.text).regex_first(r'file\s*:\s*["\']([^"\']+)["\']')
|
|
50
|
+
|
|
51
|
+
if not m3u8_url:
|
|
52
|
+
raise ValueError(f"GoodStream: Video URL bulunamadı. {url}")
|
|
53
|
+
|
|
54
|
+
return ExtractResult(
|
|
55
|
+
name = self.name,
|
|
56
|
+
url = self.fix_url(m3u8_url),
|
|
57
|
+
referer = url
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
def _media_id_from_url(self, url: str) -> str | None:
|
|
61
|
+
# Match /e/code or /embed-code or /embed/code
|
|
62
|
+
match = re.search(r"/(?:e|embed-|embed/|embed)/?([0-9a-zA-Z]+)", url)
|
|
63
|
+
if match:
|
|
64
|
+
return match.group(1)
|
|
65
|
+
return None
|
|
@@ -3,5 +3,6 @@
|
|
|
3
3
|
from KekikStream.Core import SecuredLinkExtractor
|
|
4
4
|
|
|
5
5
|
class HDPlayerSystem(SecuredLinkExtractor):
|
|
6
|
-
name
|
|
7
|
-
main_url
|
|
6
|
+
name = "HDPlayerSystem"
|
|
7
|
+
main_url = "https://hdplayersystem.com"
|
|
8
|
+
supported_domains = ["hdplayersystem.com"]
|
|
@@ -7,10 +7,15 @@ class JFVid(ExtractorBase):
|
|
|
7
7
|
main_url = "https://jfvid.com"
|
|
8
8
|
|
|
9
9
|
# Birden fazla domain destekle
|
|
10
|
-
supported_domains = ["jfvid.com"]
|
|
10
|
+
supported_domains = ["jfvid.com", "jetvid.top"]
|
|
11
11
|
|
|
12
12
|
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
13
13
|
base_url = self.get_base_url(url)
|
|
14
|
-
|
|
14
|
+
|
|
15
|
+
# Determine ID from path or query
|
|
16
|
+
if "jetvid.top" in url and "?v=" in url:
|
|
17
|
+
v_id = url.split("?v=")[1].split("&")[0]
|
|
18
|
+
else:
|
|
19
|
+
v_id = url.split("/play/")[-1] if "/play/" in url else url.split("/stream/")[-1]
|
|
15
20
|
|
|
16
21
|
return ExtractResult(name=self.name, url=f"{base_url}/stream/{v_id}", referer=referer or base_url)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
|
+
|
|
3
|
+
from KekikStream.Core import ExtractorBase, ExtractResult
|
|
4
|
+
|
|
5
|
+
class JWPlayer(ExtractorBase):
|
|
6
|
+
name = "JWPlayer"
|
|
7
|
+
main_url = "https://jwplayer.com"
|
|
8
|
+
supported_domains = ["cdn.jwplayer.com"]
|
|
9
|
+
|
|
10
|
+
async def extract(self, url: str, referer: str = None) -> ExtractResult:
|
|
11
|
+
# JWPlayer manifests are usually direct m3u8
|
|
12
|
+
return ExtractResult(
|
|
13
|
+
name = self.name,
|
|
14
|
+
url = url,
|
|
15
|
+
referer = referer or self.main_url
|
|
16
|
+
)
|
|
@@ -12,11 +12,11 @@ class KentFilm(ExtractorBase):
|
|
|
12
12
|
helper = HTMLHelper(istek.text)
|
|
13
13
|
|
|
14
14
|
# HTMLHelper.regex_first otomatik olarak ilk grubu döndürür
|
|
15
|
-
json_str = helper.regex_first(r'FirePlayer\s*\(\s*[^,]+\s*,\s*(
|
|
15
|
+
json_str = helper.regex_first(r'(?s)FirePlayer\s*\(\s*[^,]+\s*,\s*({.*?})\s*,')
|
|
16
16
|
|
|
17
17
|
if not json_str:
|
|
18
|
-
#
|
|
19
|
-
json_str = helper.regex_first(r'
|
|
18
|
+
# Alternatif: json direkt değişkende olabilir
|
|
19
|
+
json_str = helper.regex_first(r'(?s)var\s+playerData\s*=\s*({.*?});')
|
|
20
20
|
|
|
21
21
|
if not json_str:
|
|
22
22
|
raise ValueError(f"KentFilm: Video bilgisi bulunamadı. {url}")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Bu araç @keyiflerolsun tarafından | @KekikAkademi için yazılmıştır.
|
|
2
2
|
|
|
3
|
-
from KekikStream.Core import PackedJSExtractor, ExtractResult, HTMLHelper, M3U8_FILE_REGEX
|
|
3
|
+
from KekikStream.Core import PackedJSExtractor, ExtractResult, HTMLHelper, M3U8_FILE_REGEX, Subtitle
|
|
4
4
|
from urllib.parse import urlparse, urlunparse
|
|
5
5
|
import re
|
|
6
6
|
|
|
@@ -71,6 +71,7 @@ class VidHide(PackedJSExtractor):
|
|
|
71
71
|
"dhtpre.com",
|
|
72
72
|
"peytonepre.com",
|
|
73
73
|
"minochinos.com",
|
|
74
|
+
"ag2m4.cfd",
|
|
74
75
|
]
|
|
75
76
|
|
|
76
77
|
def get_embed_url(self, url: str) -> str:
|
|
@@ -195,6 +196,17 @@ class VidHide(PackedJSExtractor):
|
|
|
195
196
|
# Packed JS'den m3u8 çıkarmayı dene (unpack_and_find helper)
|
|
196
197
|
m3u8_url = self.unpack_and_find(text)
|
|
197
198
|
|
|
199
|
+
# NEW: fetch('/dl?op=get_stream...') pattern
|
|
200
|
+
if not m3u8_url:
|
|
201
|
+
fetch_url = sel.regex_first(r"fetch\(['\"]([^'\"]*?/dl\?op=get_stream[^'\"]+)['\"]")
|
|
202
|
+
if fetch_url:
|
|
203
|
+
try:
|
|
204
|
+
f_resp = await self.async_cf_get(self.fix_url(fetch_url), headers={"Referer": final_url})
|
|
205
|
+
f_data = f_resp.json()
|
|
206
|
+
m3u8_url = f_data.get("url")
|
|
207
|
+
except Exception:
|
|
208
|
+
pass
|
|
209
|
+
|
|
198
210
|
# Çoklu m3u8 sonucu olabilir (regex ile tüm m3u8'leri bul)
|
|
199
211
|
if not m3u8_url:
|
|
200
212
|
m3u8_matches = re.findall(r'(?:file|src|url)["\']?\s*[:=]\s*["\']([^"\']+\.m3u8[^"\']*)["\']', text)
|
|
@@ -204,14 +216,32 @@ class VidHide(PackedJSExtractor):
|
|
|
204
216
|
else:
|
|
205
217
|
m3u8_matches = [m3u8_url]
|
|
206
218
|
|
|
219
|
+
# Altyazıları çıkar (Playerjs formatı)
|
|
220
|
+
subtitles = []
|
|
221
|
+
sub_text = sel.regex_first(r'["\']subtitle["\']\s*:\s*["\']([^"\']+)["\']')
|
|
222
|
+
if sub_text:
|
|
223
|
+
for part in sub_text.split(","):
|
|
224
|
+
if "[" in part and "]" in part:
|
|
225
|
+
s_name = part.split("[")[1].split("]")[0]
|
|
226
|
+
s_url = part.split("]")[1]
|
|
227
|
+
subtitles.append(Subtitle(url=self.fix_url(s_url), name=s_name))
|
|
228
|
+
else:
|
|
229
|
+
subtitles.append(Subtitle(url=self.fix_url(part), name="Bilinmeyen"))
|
|
230
|
+
|
|
207
231
|
results = []
|
|
208
232
|
for m3u8 in m3u8_matches:
|
|
209
|
-
results.append(ExtractResult(
|
|
233
|
+
results.append(ExtractResult(
|
|
234
|
+
name = name,
|
|
235
|
+
url = self.fix_url(m3u8),
|
|
236
|
+
referer = f"{final_base_url}/",
|
|
237
|
+
user_agent = self.httpx.headers.get("User-Agent", ""),
|
|
238
|
+
subtitles = subtitles
|
|
239
|
+
))
|
|
210
240
|
|
|
211
241
|
if not results:
|
|
212
242
|
# Fallback: sources pattern
|
|
213
243
|
if m3u8_url := sel.regex_first(r'sources:\s*\[\s*\{\s*file:\s*"([^"]+)"'):
|
|
214
|
-
results.append(ExtractResult(name=name, url=self.fix_url(m3u8_url), referer=f"{final_base_url}/", user_agent=self.httpx.headers.get("User-Agent", "")))
|
|
244
|
+
results.append(ExtractResult(name=name, url=self.fix_url(m3u8_url), referer=f"{final_base_url}/", user_agent=self.httpx.headers.get("User-Agent", ""), subtitles=subtitles))
|
|
215
245
|
|
|
216
246
|
if not results:
|
|
217
247
|
raise ValueError(f"{name}: Video URL bulunamadı. {url}")
|
|
@@ -4,7 +4,7 @@ from KekikStream.Core import ExtractorBase, ExtractResult, Subtitle
|
|
|
4
4
|
from Crypto.Cipher import AES
|
|
5
5
|
from Crypto.Util import Padding
|
|
6
6
|
from urllib.parse import urlparse, parse_qs
|
|
7
|
-
import re
|
|
7
|
+
import re, base64
|
|
8
8
|
|
|
9
9
|
class VidStack(ExtractorBase):
|
|
10
10
|
name = "VidStack"
|
|
@@ -12,16 +12,21 @@ class VidStack(ExtractorBase):
|
|
|
12
12
|
requires_referer = True
|
|
13
13
|
|
|
14
14
|
supported_domains = [
|
|
15
|
-
"vidstack.io", "server1.uns.bio", "upns.one", "upn.one",
|
|
16
|
-
"webdrama.upns.online", "webdrama.playerp2p.com",
|
|
17
|
-
"player4me.vip", "vidplayer.live", "rpmvid.com", "rpmshare.com",
|
|
18
|
-
"rpmplayer.com", "ytplay.rpmvid.com", "rpmvip.com"
|
|
15
|
+
"vidstack.io", "server1.uns.bio", "vids.uns.bio", "upns.one", "upn.one",
|
|
16
|
+
"webdrama.upns.online", "webdrama.playerp2p.com", "upns.online",
|
|
17
|
+
"player4me.vip", "player4me.top", "vidplayer.live", "rpmvid.com", "rpmshare.com",
|
|
18
|
+
"rpmplayer.com", "ytplay.rpmvid.com", "rpmvip.com", "uns.bio"
|
|
19
19
|
]
|
|
20
20
|
|
|
21
21
|
def decrypt_aes(self, input_hex: str, key: str, iv: bytes) -> str:
|
|
22
22
|
try:
|
|
23
23
|
cipher = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv)
|
|
24
|
-
|
|
24
|
+
try:
|
|
25
|
+
raw_data = bytes.fromhex(input_hex)
|
|
26
|
+
except ValueError:
|
|
27
|
+
# Try base64 if hex fails
|
|
28
|
+
raw_data = base64.b64decode(input_hex)
|
|
29
|
+
|
|
25
30
|
decrypted = cipher.decrypt(raw_data)
|
|
26
31
|
unpadded = Padding.unpad(decrypted, AES.block_size)
|
|
27
32
|
return unpadded.decode('utf-8')
|
|
@@ -88,9 +93,28 @@ class VidStack(ExtractorBase):
|
|
|
88
93
|
if not encoded_data:
|
|
89
94
|
raise ValueError(f"VidStack: API yanıtı alınamadı. {url}")
|
|
90
95
|
|
|
91
|
-
# AES Çözme — sıfır IV
|
|
92
|
-
keys = [
|
|
93
|
-
|
|
96
|
+
# AES Çözme — sıfır IV, bilinen IV'lar ve Payload'ın ilk 16 byte'ı
|
|
97
|
+
keys = [
|
|
98
|
+
"kiemtienmua911ca",
|
|
99
|
+
"kiemtienmua911ca123",
|
|
100
|
+
"kiemtienmua911ca_123",
|
|
101
|
+
"46ed6256db0ca41ec",
|
|
102
|
+
"46ed6256db0ca41e",
|
|
103
|
+
"vidstackio",
|
|
104
|
+
"vidstack",
|
|
105
|
+
]
|
|
106
|
+
|
|
107
|
+
try:
|
|
108
|
+
raw_data = bytes.fromhex(encoded_data)
|
|
109
|
+
except:
|
|
110
|
+
try:
|
|
111
|
+
raw_data = base64.b64decode(encoded_data)
|
|
112
|
+
except:
|
|
113
|
+
raw_data = b""
|
|
114
|
+
|
|
115
|
+
ivs = [b"\x00" * 16, b"1234567890oiuytr", b"0123456789abcdef"]
|
|
116
|
+
if len(raw_data) > 16:
|
|
117
|
+
ivs.append(raw_data[:16])
|
|
94
118
|
|
|
95
119
|
decrypted_text = None
|
|
96
120
|
for key in keys:
|