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.
Files changed (227) hide show
  1. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorMixins.py +5 -6
  2. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Abstream.py +1 -1
  3. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Ashdi.py +4 -3
  4. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/BrightPath.py +28 -5
  5. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ByseSX.py +39 -16
  6. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DoodStream.py +13 -10
  7. kekikstream-3.4.4/KekikStream/Extractors/Embedgram.py +31 -0
  8. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Fembed.py +1 -1
  9. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Filemoon.py +6 -2
  10. kekikstream-3.4.4/KekikStream/Extractors/GoodStream.py +65 -0
  11. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HDPlayerSystem.py +3 -2
  12. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JFVid.py +7 -2
  13. kekikstream-3.4.4/KekikStream/Extractors/JWPlayer.py +16 -0
  14. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/KentFilm.py +3 -3
  15. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/StreamWish.py +1 -0
  16. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidHide.py +33 -3
  17. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidStack.py +33 -9
  18. kekikstream-3.4.4/KekikStream/Extractors/VideoParktop.py +82 -0
  19. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Vidoza.py +9 -3
  20. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Zeus.py +11 -5
  21. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AnimeYTX.py +36 -29
  22. kekikstream-3.4.4/KekikStream/Plugins/BFlix.py +149 -0
  23. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/CizgiMax.py +9 -0
  24. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Coflix.py +15 -7
  25. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziKorea.py +15 -7
  26. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziPal.py +46 -37
  27. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Dizify.py +9 -9
  28. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Dizilla.py +6 -4
  29. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DoramasLatinoX.py +27 -8
  30. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmFC.py +7 -7
  31. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/MyFlixer.py +1 -1
  32. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SFlix.py +1 -1
  33. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/ShowFlix.py +26 -21
  34. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Sinezy.py +1 -1
  35. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Turkish123.py +52 -29
  36. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/UgurFilm.py +13 -13
  37. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/YeniWatch.py +15 -13
  38. {kekikstream-3.4.2 → kekikstream-3.4.4}/PKG-INFO +1 -1
  39. {kekikstream-3.4.2 → kekikstream-3.4.4}/pyproject.toml +1 -1
  40. kekikstream-3.4.2/KekikStream/Extractors/VideoParktop.py +0 -47
  41. kekikstream-3.4.2/KekikStream/Plugins/BFlix.py +0 -45
  42. {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/FUNDING.yml +0 -0
  43. {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/icons/KekikStream.png +0 -0
  44. {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/workflows/Kontrol.yml +0 -0
  45. {kekikstream-3.4.2 → kekikstream-3.4.4}/.github/workflows/pypiYukle.yml +0 -0
  46. {kekikstream-3.4.2 → kekikstream-3.4.4}/.gitignore +0 -0
  47. {kekikstream-3.4.2 → kekikstream-3.4.4}/KONTROL.py +0 -0
  48. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/CLI/__init__.py +0 -0
  49. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/CLI/pypi_kontrol.py +0 -0
  50. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  51. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  52. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  53. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  54. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/VideoPlayerExtractor.py +0 -0
  55. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  56. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/FallbackClients.py +0 -0
  57. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/HTMLHelper.py +0 -0
  58. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/MethodCache.py +0 -0
  59. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/Normalizer.py +0 -0
  60. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/TitleHelper.py +0 -0
  61. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Helpers/__init__.py +0 -0
  62. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Media/MediaHandler.py +0 -0
  63. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Media/MediaManager.py +0 -0
  64. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/FlwBasePlugin.py +0 -0
  65. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  66. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  67. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  68. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  69. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/UI/UIManager.py +0 -0
  70. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Core/__init__.py +0 -0
  71. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Alloha.py +0 -0
  72. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/BulguNet.py +0 -0
  73. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/BurstCloud.py +0 -0
  74. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/CizgiPass.py +0 -0
  75. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/CloseLoad.py +0 -0
  76. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ContentX.py +0 -0
  77. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DarkiBox.py +0 -0
  78. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DonilasPlay.py +0 -0
  79. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DosyaLoad.py +0 -0
  80. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DramaCool.py +0 -0
  81. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/DzenRu.py +0 -0
  82. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/EmbedLoad.py +0 -0
  83. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/EpikPlayer.py +0 -0
  84. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ExPlay.py +0 -0
  85. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/FastPlay.py +0 -0
  86. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HDLoad.py +0 -0
  87. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HDMomPlayer.py +0 -0
  88. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HexLoad.py +0 -0
  89. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/HotStream.py +0 -0
  90. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JetCDN.py +0 -0
  91. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JetTv.py +0 -0
  92. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/JetV.py +0 -0
  93. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Kodik.py +0 -0
  94. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/LuciferPlays.py +0 -0
  95. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/LuluStream.py +0 -0
  96. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MP4Upload.py +0 -0
  97. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MailRu.py +0 -0
  98. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MegaCloud.py +0 -0
  99. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MegaNZ.py +0 -0
  100. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MixDrop.py +0 -0
  101. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MixPlayHD.py +0 -0
  102. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MixTiger.py +0 -0
  103. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/MolyStream.py +0 -0
  104. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Netu.py +0 -0
  105. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/NiceAcik.py +0 -0
  106. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  107. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  108. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PixelDrain.py +0 -0
  109. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  110. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PlayerKorea.py +0 -0
  111. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/PlayerX.py +0 -0
  112. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/RapidVid.py +0 -0
  113. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Rumble.py +0 -0
  114. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SaveFiles.py +0 -0
  115. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SendVid.py +0 -0
  116. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SetPlay.py +0 -0
  117. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SetPrime.py +0 -0
  118. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ShortICU.py +0 -0
  119. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/SibNet.py +0 -0
  120. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  121. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Stloadi.py +0 -0
  122. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/StreamBox.py +0 -0
  123. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/StreamTape.py +0 -0
  124. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TRsTX.py +0 -0
  125. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TauVideo.py +0 -0
  126. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Tukipasti.py +0 -0
  127. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TurboImgz.py +0 -0
  128. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  129. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Uqload.py +0 -0
  130. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VCTPlay.py +0 -0
  131. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Variyt.py +0 -0
  132. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Veev.py +0 -0
  133. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidBiz.py +0 -0
  134. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidLoad.py +0 -0
  135. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidMoly.py +0 -0
  136. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidMoxy.py +0 -0
  137. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VidPapi.py +0 -0
  138. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/VideoSeyred.py +0 -0
  139. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Videostr.py +0 -0
  140. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Vidora.py +0 -0
  141. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Voe.py +0 -0
  142. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/Vtbe.py +0 -0
  143. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/XtremStream.py +0 -0
  144. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/YTDLP.py +0 -0
  145. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  146. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/YourUpload.py +0 -0
  147. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Extractors/ZillaNetworks.py +0 -0
  148. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AnimeAV.py +0 -0
  149. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AnimeciX.py +0 -0
  150. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AsyaAnimeleri.py +0 -0
  151. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/AsyaWatch.py +0 -0
  152. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/BelgeselX.py +0 -0
  153. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/FilmBip.py +0 -0
  154. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Broken/FilmKovasi.py +0 -0
  155. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Filmatek.py +0 -0
  156. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/FlixHQ.py +0 -0
  157. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/FullHDFilm.py +0 -0
  158. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/KoreanTurk.py +0 -0
  159. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Movies2Watch.py +0 -0
  160. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/MoviesJoy.py +0 -0
  161. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Watch2Movies.py +0 -0
  162. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Watch32.py +0 -0
  163. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/YesilcamTV.py +0 -0
  164. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.4/KekikStream/Plugins/Broken}/Zoechip.py +0 -0
  165. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DDizi.py +0 -0
  166. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DMax.py +0 -0
  167. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziBox.py +0 -0
  168. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziGom.py +0 -0
  169. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziMag.py +0 -0
  170. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziMom.py +0 -0
  171. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziWatch.py +0 -0
  172. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DiziYou.py +0 -0
  173. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DocumentaryArea.py +0 -0
  174. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/DramaFlix.py +0 -0
  175. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Dramacool.py +0 -0
  176. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmCennetim.py +0 -0
  177. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmEkseni.py +0 -0
  178. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmIzleIlk.py +0 -0
  179. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  180. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmMirasim.py +0 -0
  181. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmModu.py +0 -0
  182. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FilmciBaba.py +0 -0
  183. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FlixLatam.py +0 -0
  184. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  185. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/HDFilm.py +0 -0
  186. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  187. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/HDrezka.py +0 -0
  188. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Henaojara.py +0 -0
  189. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/InatBox.py +0 -0
  190. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/JPFilms.py +0 -0
  191. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/JetFilmizle.py +0 -0
  192. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Kinogo.py +0 -0
  193. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/KultFilmler.py +0 -0
  194. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Latanime.py +0 -0
  195. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/RecTV.py +0 -0
  196. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/RoketDizi.py +0 -0
  197. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SelcukFlix.py +0 -0
  198. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SetFilmIzle.py +0 -0
  199. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  200. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SineWix.py +0 -0
  201. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/Sinefy.py +0 -0
  202. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SinemaCX.py +0 -0
  203. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/StreamIMDB.py +0 -0
  204. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/SuperFilmIzle.py +0 -0
  205. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/TLC.py +0 -0
  206. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/TurkAnime.py +0 -0
  207. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/TvDiziler.py +0 -0
  208. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/UAKino.py +0 -0
  209. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/WFilmIzle.py +0 -0
  210. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/WebDramaTurkey.py +0 -0
  211. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/WebteIzle.py +0 -0
  212. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/XPrime.py +0 -0
  213. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/YabanciDizi.py +0 -0
  214. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/Plugins/YoTurkish.py +0 -0
  215. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/__init__.py +0 -0
  216. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/__main__.py +0 -0
  217. {kekikstream-3.4.2 → kekikstream-3.4.4}/KekikStream/requirements.txt +0 -0
  218. {kekikstream-3.4.2 → kekikstream-3.4.4}/LICENSE +0 -0
  219. {kekikstream-3.4.2 → kekikstream-3.4.4}/README.md +0 -0
  220. {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/Multi.py +0 -0
  221. {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/PluginAudit/audit_plugins.py +0 -0
  222. {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/PluginAudit/clean_plugins.py +0 -0
  223. {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/PluginAudit/master_audit.py +0 -0
  224. {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/Single.py +0 -0
  225. {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/Validator.py +0 -0
  226. {kekikstream-3.4.2 → kekikstream-3.4.4}/Tests/test_links.py +0 -0
  227. {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.httpx.post(
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.httpx.get(m3u8_url, headers={"Referer": ref})
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
- self.httpx.headers.update({"Referer": referer or url})
225
-
226
- resp = await self.httpx.get(url)
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 = await self.httpx.get(
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 = "Ashdi"
8
- main_url = "https://ashdi.vip"
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.httpx.get(
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
- ext_sub = api_data["data"].get("externalSub") or config.get("externalSub")
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
- subtitles.append(self.new_subtitle(
81
- url = self.fix_url(ext_sub["file"]),
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 geç."""
39
- headers = {"Origin": f"https://{host}", "Referer": f"https://{host}/e/{code}"}
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
- if resp.status_code == 200:
43
- return resp.json()
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
- if resp.status_code == 404:
46
- raise ValueError(f"ByseSX: Video bulunamadı. {code}")
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
- code = parsed.path.rstrip("/").rsplit("/", 1)[-1]
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
- # Try alternative pattern
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
- # /d/ sürümünde bulamazsak /e/ sürümünü dene (tekrar döngüye girme)
58
- if "/d/" in url and "/e/" in original_url:
59
- raise ValueError(f"{self.name}: Pass key bulunamadı.")
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: pass_resp.text + some characters + token
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
- # DoodStream usually appends some random characters
81
- # The number of characters can vary, but 10 is common
82
- final_url = f"{pass_resp.text}1234567890?token={token}&expiry={expiry}"
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
- data = response.json() if "json" in (response.headers.get("content-type") or "").lower() else None
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
- data = response.json() if "json" in (response.headers.get("content-type") or "").lower() else None
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 = "HDPlayerSystem"
7
- main_url = "https://hdplayersystem.com"
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
- v_id = url.split("/play/")[-1] if "/play/" in url else url.split("/stream/")[-1]
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*(\{.*?\})\s*,')
15
+ json_str = helper.regex_first(r'(?s)FirePlayer\s*\(\s*[^,]+\s*,\s*({.*?})\s*,')
16
16
 
17
17
  if not json_str:
18
- # Fallback regex explicit
19
- json_str = helper.regex_first(r'FirePlayer\s*\(\s*[^,]+\s*,\s*(\{.*?\})\s*,\s*false\s*\);')
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}")
@@ -59,6 +59,7 @@ class StreamWish(PackedJSExtractor):
59
59
  "vtube.to",
60
60
  "vudeo.io",
61
61
  "vadshar.com",
62
+ "happy1de.space",
62
63
  ]
63
64
 
64
65
  _DIRECT_ALIAS_MAP = {
@@ -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(name=name, url=self.fix_url(m3u8), referer=f"{final_base_url}/", user_agent=self.httpx.headers.get("User-Agent", "")))
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
- raw_data = bytes.fromhex(input_hex)
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 (webdrama), ardından bilinen IV'lar
92
- keys = ["kiemtienmua911ca", "46ed6256db0ca41ec"]
93
- ivs = [b"\x00" * 16, b"1234567890oiuytr", b"0123456789abcdef"]
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: