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.
Files changed (223) hide show
  1. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/StreamWish.py +1 -0
  2. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidHide.py +1 -0
  3. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AnimeYTX.py +30 -28
  4. kekikstream-3.4.3/KekikStream/Plugins/BFlix.py +149 -0
  5. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/CizgiMax.py +9 -0
  6. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Coflix.py +15 -7
  7. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziKorea.py +15 -7
  8. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziPal.py +46 -37
  9. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Dizify.py +8 -8
  10. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DoramasLatinoX.py +27 -8
  11. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmFC.py +7 -7
  12. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/MyFlixer.py +1 -1
  13. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SFlix.py +1 -1
  14. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/ShowFlix.py +26 -21
  15. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Sinezy.py +1 -1
  16. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Turkish123.py +52 -29
  17. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/UgurFilm.py +13 -13
  18. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/YeniWatch.py +15 -13
  19. {kekikstream-3.4.2 → kekikstream-3.4.3}/PKG-INFO +1 -1
  20. {kekikstream-3.4.2 → kekikstream-3.4.3}/pyproject.toml +1 -1
  21. kekikstream-3.4.2/KekikStream/Plugins/BFlix.py +0 -45
  22. {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/FUNDING.yml +0 -0
  23. {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/icons/KekikStream.png +0 -0
  24. {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/workflows/Kontrol.yml +0 -0
  25. {kekikstream-3.4.2 → kekikstream-3.4.3}/.github/workflows/pypiYukle.yml +0 -0
  26. {kekikstream-3.4.2 → kekikstream-3.4.3}/.gitignore +0 -0
  27. {kekikstream-3.4.2 → kekikstream-3.4.3}/KONTROL.py +0 -0
  28. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/CLI/__init__.py +0 -0
  29. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/CLI/pypi_kontrol.py +0 -0
  30. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorBase.py +0 -0
  31. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorLoader.py +0 -0
  32. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorManager.py +0 -0
  33. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorMixins.py +0 -0
  34. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/ExtractorModels.py +0 -0
  35. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/VideoPlayerExtractor.py +0 -0
  36. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Extractor/YTDLPCache.py +0 -0
  37. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/FallbackClients.py +0 -0
  38. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/HTMLHelper.py +0 -0
  39. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/MethodCache.py +0 -0
  40. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/Normalizer.py +0 -0
  41. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/TitleHelper.py +0 -0
  42. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Helpers/__init__.py +0 -0
  43. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Media/MediaHandler.py +0 -0
  44. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Media/MediaManager.py +0 -0
  45. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/FlwBasePlugin.py +0 -0
  46. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginBase.py +0 -0
  47. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginLoader.py +0 -0
  48. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginManager.py +0 -0
  49. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/Plugin/PluginModels.py +0 -0
  50. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/UI/UIManager.py +0 -0
  51. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Core/__init__.py +0 -0
  52. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Abstream.py +0 -0
  53. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Alloha.py +0 -0
  54. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Ashdi.py +0 -0
  55. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/BrightPath.py +0 -0
  56. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/BulguNet.py +0 -0
  57. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/BurstCloud.py +0 -0
  58. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ByseSX.py +0 -0
  59. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/CizgiPass.py +0 -0
  60. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/CloseLoad.py +0 -0
  61. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ContentX.py +0 -0
  62. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DarkiBox.py +0 -0
  63. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DonilasPlay.py +0 -0
  64. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DoodStream.py +0 -0
  65. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DosyaLoad.py +0 -0
  66. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DramaCool.py +0 -0
  67. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/DzenRu.py +0 -0
  68. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/EmbedLoad.py +0 -0
  69. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/EpikPlayer.py +0 -0
  70. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ExPlay.py +0 -0
  71. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/FastPlay.py +0 -0
  72. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Fembed.py +0 -0
  73. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Filemoon.py +0 -0
  74. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HDLoad.py +0 -0
  75. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HDMomPlayer.py +0 -0
  76. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HDPlayerSystem.py +0 -0
  77. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HexLoad.py +0 -0
  78. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/HotStream.py +0 -0
  79. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JFVid.py +0 -0
  80. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JetCDN.py +0 -0
  81. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JetTv.py +0 -0
  82. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/JetV.py +0 -0
  83. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/KentFilm.py +0 -0
  84. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Kodik.py +0 -0
  85. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/LuciferPlays.py +0 -0
  86. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/LuluStream.py +0 -0
  87. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MP4Upload.py +0 -0
  88. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MailRu.py +0 -0
  89. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MegaCloud.py +0 -0
  90. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MegaNZ.py +0 -0
  91. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MixDrop.py +0 -0
  92. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MixPlayHD.py +0 -0
  93. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MixTiger.py +0 -0
  94. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/MolyStream.py +0 -0
  95. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Netu.py +0 -0
  96. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/NiceAcik.py +0 -0
  97. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Odnoklassniki.py +0 -0
  98. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PeaceMakerst.py +0 -0
  99. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PixelDrain.py +0 -0
  100. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PlayerFilmIzle.py +0 -0
  101. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PlayerKorea.py +0 -0
  102. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/PlayerX.py +0 -0
  103. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/RapidVid.py +0 -0
  104. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Rumble.py +0 -0
  105. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SaveFiles.py +0 -0
  106. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SendVid.py +0 -0
  107. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SetPlay.py +0 -0
  108. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SetPrime.py +0 -0
  109. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ShortICU.py +0 -0
  110. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/SibNet.py +0 -0
  111. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Sobreatsesuyp.py +0 -0
  112. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Stloadi.py +0 -0
  113. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/StreamBox.py +0 -0
  114. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/StreamTape.py +0 -0
  115. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TRsTX.py +0 -0
  116. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TauVideo.py +0 -0
  117. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Tukipasti.py +0 -0
  118. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TurboImgz.py +0 -0
  119. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/TurkeyPlayer.py +0 -0
  120. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Uqload.py +0 -0
  121. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VCTPlay.py +0 -0
  122. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Variyt.py +0 -0
  123. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Veev.py +0 -0
  124. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidBiz.py +0 -0
  125. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidLoad.py +0 -0
  126. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidMoly.py +0 -0
  127. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidMoxy.py +0 -0
  128. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidPapi.py +0 -0
  129. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VidStack.py +0 -0
  130. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VideoParktop.py +0 -0
  131. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/VideoSeyred.py +0 -0
  132. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Videostr.py +0 -0
  133. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Vidora.py +0 -0
  134. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Vidoza.py +0 -0
  135. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Voe.py +0 -0
  136. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Vtbe.py +0 -0
  137. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/XtremStream.py +0 -0
  138. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/YTDLP.py +0 -0
  139. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/YildizKisaFilm.py +0 -0
  140. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/YourUpload.py +0 -0
  141. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/Zeus.py +0 -0
  142. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Extractors/ZillaNetworks.py +0 -0
  143. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AnimeAV.py +0 -0
  144. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AnimeciX.py +0 -0
  145. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AsyaAnimeleri.py +0 -0
  146. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/AsyaWatch.py +0 -0
  147. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/BelgeselX.py +0 -0
  148. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/FilmBip.py +0 -0
  149. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Broken/FilmKovasi.py +0 -0
  150. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Filmatek.py +0 -0
  151. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/FlixHQ.py +0 -0
  152. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/FullHDFilm.py +0 -0
  153. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/KoreanTurk.py +0 -0
  154. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Movies2Watch.py +0 -0
  155. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/MoviesJoy.py +0 -0
  156. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Watch2Movies.py +0 -0
  157. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Watch32.py +0 -0
  158. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/YesilcamTV.py +0 -0
  159. {kekikstream-3.4.2/KekikStream/Plugins → kekikstream-3.4.3/KekikStream/Plugins/Broken}/Zoechip.py +0 -0
  160. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DDizi.py +0 -0
  161. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DMax.py +0 -0
  162. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziBox.py +0 -0
  163. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziGom.py +0 -0
  164. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziMag.py +0 -0
  165. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziMom.py +0 -0
  166. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziWatch.py +0 -0
  167. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DiziYou.py +0 -0
  168. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Dizilla.py +0 -0
  169. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DocumentaryArea.py +0 -0
  170. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/DramaFlix.py +0 -0
  171. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Dramacool.py +0 -0
  172. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmCennetim.py +0 -0
  173. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmEkseni.py +0 -0
  174. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmIzleIlk.py +0 -0
  175. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmMakinesi.py +0 -0
  176. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmMirasim.py +0 -0
  177. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmModu.py +0 -0
  178. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FilmciBaba.py +0 -0
  179. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FlixLatam.py +0 -0
  180. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/FullHDFilmizlesene.py +0 -0
  181. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/HDFilm.py +0 -0
  182. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/HDFilmCehennemi.py +0 -0
  183. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/HDrezka.py +0 -0
  184. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Henaojara.py +0 -0
  185. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/InatBox.py +0 -0
  186. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/JPFilms.py +0 -0
  187. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/JetFilmizle.py +0 -0
  188. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Kinogo.py +0 -0
  189. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/KultFilmler.py +0 -0
  190. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Latanime.py +0 -0
  191. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/RecTV.py +0 -0
  192. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/RoketDizi.py +0 -0
  193. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SelcukFlix.py +0 -0
  194. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SetFilmIzle.py +0 -0
  195. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SezonlukDizi.py +0 -0
  196. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SineWix.py +0 -0
  197. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/Sinefy.py +0 -0
  198. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SinemaCX.py +0 -0
  199. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/StreamIMDB.py +0 -0
  200. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/SuperFilmIzle.py +0 -0
  201. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/TLC.py +0 -0
  202. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/TurkAnime.py +0 -0
  203. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/TvDiziler.py +0 -0
  204. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/UAKino.py +0 -0
  205. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/WFilmIzle.py +0 -0
  206. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/WebDramaTurkey.py +0 -0
  207. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/WebteIzle.py +0 -0
  208. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/XPrime.py +0 -0
  209. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/YabanciDizi.py +0 -0
  210. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/Plugins/YoTurkish.py +0 -0
  211. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/__init__.py +0 -0
  212. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/__main__.py +0 -0
  213. {kekikstream-3.4.2 → kekikstream-3.4.3}/KekikStream/requirements.txt +0 -0
  214. {kekikstream-3.4.2 → kekikstream-3.4.3}/LICENSE +0 -0
  215. {kekikstream-3.4.2 → kekikstream-3.4.3}/README.md +0 -0
  216. {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/Multi.py +0 -0
  217. {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/PluginAudit/audit_plugins.py +0 -0
  218. {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/PluginAudit/clean_plugins.py +0 -0
  219. {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/PluginAudit/master_audit.py +0 -0
  220. {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/Single.py +0 -0
  221. {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/Validator.py +0 -0
  222. {kekikstream-3.4.2 → kekikstream-3.4.3}/Tests/test_links.py +0 -0
  223. {kekikstream-3.4.2 → kekikstream-3.4.3}/_config.yml +0 -0
@@ -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 = {
@@ -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:
@@ -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
- secici = HTMLHelper(istek.text)
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.php" in fixed_url or "/new/redirector2.php" in fixed_url:
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 = target_url.replace(" ", "+")
149
- return await self.extract(self.fix_url(target_url), referer=url)
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
- return None
154
+ pass
152
155
 
153
156
  if "/new/play/one.php" not in fixed_url:
154
- return await self.extract(fixed_url, referer=url)
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 = ajax_resp.text
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
- return None
180
+ pass
172
181
 
173
- iframe_src = HTMLHelper(body).select_attr("iframe", "src") or HTMLHelper(body).regex_first(r'src=["\']([^"\']+)["\']')
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
- return await self.extract(self.fix_url(iframe_src), referer=url)
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
- # Find players in select menu (Base64 encoded iframes)
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
- iframe_src = re.search(r'src=["\']([^"\']+)["\']', decoded)
189
- if iframe_src:
190
- src = iframe_src.group(1)
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
- # Legacy/Other patterns
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.select_attr(None, "src")
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.httpx.get(api_target)
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.httpx.get(link)
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.httpx.get(url)
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.httpx.get(ep_api)
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.httpx.get(url, headers={"Referer": self.main_url})
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.httpx.get(iframe, headers={"Referer": self.main_url})
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
- self.collect_results(results, ext)
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.httpx.get(f"{url}{page}")
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.httpx.post(
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.httpx.get(url)
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.httpx.get(url)
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.httpx.post(
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[data-hhs], div.video-services button[data-frame]"):
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
- self.collect_results(response, data)
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.httpx.get(f"{url}{page}/")
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.httpx.get(f"{self.main_url}/?s={query}")
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.httpx.get(url)
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.httpx.get(self.fix_url(s.select_attr("a", "href"))) for s in season_links]
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.httpx.get(url)
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
- self.httpx.headers.update({"Referer": f"{self.main_url}/"})
179
- i_istek = await self.httpx.get(iframe)
180
- i_text = i_istek.text
181
-
182
- # m3u link çıkar
183
- m3u_link = secici.regex_first(r'file:"([^"]+)"', target=i_text)
184
- if m3u_link:
185
-
186
- # Altyazıları çıkar
187
- sub_text = secici.regex_first(r'"subtitle":"([^"]+)"', target=i_text)
188
- subtitles = []
189
- if sub_text:
190
- if "," in sub_text:
191
- for sub in sub_text.split(","):
192
- lang = sub.split("[")[1].split("]")[0] if "[" in sub else "Türkçe"
193
- sub_url = sub.replace(f"[{lang}]", "")
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
- lang = sub_text.split("[")[1].split("]")[0] if "[" in sub_text else "Türkçe"
197
- sub_url = sub_text.replace(f"[{lang}]", "")
198
- subtitles.append(self.new_subtitle(self.fix_url(sub_url), lang))
199
-
200
- results.append(ExtractResult(
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.httpx.get(
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.httpx.get(url, params=params)
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.httpx.get(f"{self.api_url}/search", params={"q": query})
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.httpx.get(endpoint)
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.httpx.get(alt_endpoint)
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.httpx.get(url)
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.httpx.get(f"{self.api_url}/series/{slug}")
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.httpx.get(f"{self.api_url}/movies/{slug}")
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"):