ofscraper 3.13.dev7__tar.gz → 3.13.dev9__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 (409) hide show
  1. ofscraper-3.13.dev9/.gitattributes +1 -0
  2. ofscraper-3.13.dev9/.github/ISSUE_TEMPLATE/bug_report.md +66 -0
  3. ofscraper-3.13.dev9/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
  4. ofscraper-3.13.dev9/.github/dependabot.yml +11 -0
  5. ofscraper-3.13.dev9/.github/workflows/codecov.yml +32 -0
  6. ofscraper-3.13.dev9/.github/workflows/commit_bundler.yml +207 -0
  7. ofscraper-3.13.dev9/.github/workflows/docker-daily.yml +117 -0
  8. ofscraper-3.13.dev9/.github/workflows/docker-purge.yml +35 -0
  9. ofscraper-3.13.dev9/.github/workflows/package-builder-release.yml +163 -0
  10. ofscraper-3.13.dev9/.github/workflows/package-delete.yml +23 -0
  11. ofscraper-3.13.dev9/.github/workflows/publish-release-binaries.yml +194 -0
  12. ofscraper-3.13.dev9/.github/workflows/publish-release-dockers.yml +329 -0
  13. ofscraper-3.13.dev9/.gitignore +156 -0
  14. ofscraper-3.13.dev9/.gitmodules +6 -0
  15. ofscraper-3.13.dev9/CHANGES.md +36 -0
  16. ofscraper-3.13.dev9/Dockerfile +65 -0
  17. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/PKG-INFO +61 -56
  18. ofscraper-3.13.dev9/cosign.pub +4 -0
  19. ofscraper-3.13.dev9/docker-compose.yml +40 -0
  20. ofscraper-3.13.dev9/donate/btc +1 -0
  21. ofscraper-3.13.dev9/donate/eth +1 -0
  22. ofscraper-3.13.dev9/media/browser_tools_open.png +0 -0
  23. ofscraper-3.13.dev9/media/dp.png +0 -0
  24. ofscraper-3.13.dev9/media/example.png +0 -0
  25. ofscraper-3.13.dev9/media/headers.png +0 -0
  26. ofscraper-3.13.dev9/media/icon.png +0 -0
  27. ofscraper-3.13.dev9/media/init.png +0 -0
  28. ofscraper-3.13.dev9/media/list_or_username.png +0 -0
  29. ofscraper-3.13.dev9/media/main_menu.png +0 -0
  30. ofscraper-3.13.dev9/media/network_tab.png +0 -0
  31. ofscraper-3.13.dev9/media/request_headers.png +0 -0
  32. ofscraper-3.13.dev9/media/xhr_tab.png +0 -0
  33. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/__main__.py +1 -0
  34. ofscraper-3.13.dev9/ofscraper/__version__.py +12 -0
  35. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/managers/alt_download.py +2 -2
  36. ofscraper-3.13.dev9/ofscraper/commands/scraper/actions/download/utils/ffmpeg.py +102 -0
  37. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/utils/keyhelpers.py +2 -2
  38. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/constants.py +0 -1
  39. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/dynamic.py +1 -1
  40. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/open/load.py +0 -1
  41. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/config.py +0 -5
  42. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_validators.py +0 -30
  43. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompts.py +0 -1
  44. ofscraper-3.13.dev9/ofscraper/utils/args/accessors/actions.py +0 -0
  45. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/callbacks/arguments/username.py +3 -3
  46. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/checkers.py +1 -9
  47. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/config.py +0 -12
  48. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/data.py +2 -0
  49. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/settings.py +0 -1
  50. ofscraper-3.13.dev9/pyproject.toml +128 -0
  51. ofscraper-3.13.dev9/scripts/commit_version.sh +151 -0
  52. ofscraper-3.13.dev9/scripts/determine_docker_stable_dev_tags.py +172 -0
  53. ofscraper-3.13.dev9/scripts/entrypoint.sh +19 -0
  54. ofscraper-3.13.dev9/scripts/release_version.sh +135 -0
  55. ofscraper-3.13.dev9/test/calls/example.py +7 -0
  56. ofscraper-3.13.dev9/test/calls/utils_test.py +56 -0
  57. ofscraper-3.13.dev9/test/db/archive_test.py +78 -0
  58. ofscraper-3.13.dev9/test/db/highlights_test.py +74 -0
  59. ofscraper-3.13.dev9/test/db/media_test.py +82 -0
  60. ofscraper-3.13.dev9/test/db/message_test.py +73 -0
  61. ofscraper-3.13.dev9/test/db/pinned_test.py +78 -0
  62. ofscraper-3.13.dev9/test/db/post_test.py +77 -0
  63. ofscraper-3.13.dev9/test/db/profile_test.py +73 -0
  64. ofscraper-3.13.dev9/test/db/stories_test.py +64 -0
  65. ofscraper-3.13.dev9/test/general/auth_test.py +0 -0
  66. ofscraper-3.13.dev9/test/general/config_test.py +337 -0
  67. ofscraper-3.13.dev9/test/general/filter_test.py +112 -0
  68. ofscraper-3.13.dev9/test/general/like_test.py +64 -0
  69. ofscraper-3.13.dev9/test/general/misc_test.py +43 -0
  70. ofscraper-3.13.dev9/test/general/path_test.py +640 -0
  71. ofscraper-3.13.dev9/test/general/profile_folder_test.py +184 -0
  72. ofscraper-3.13.dev9/test/general/profile_scrape_test.py +57 -0
  73. ofscraper-3.13.dev9/test/general/validator_test.py +254 -0
  74. ofscraper-3.13.dev9/test/post/archived_post_test.py +598 -0
  75. ofscraper-3.13.dev9/test/post/highlight_post_test.py +595 -0
  76. ofscraper-3.13.dev9/test/post/messages_post_test.py +597 -0
  77. ofscraper-3.13.dev9/test/post/paid_post_test.py +596 -0
  78. ofscraper-3.13.dev9/test/post/pinned_post_test.py +598 -0
  79. ofscraper-3.13.dev9/test/post/stories_post_test.py +610 -0
  80. ofscraper-3.13.dev9/test/post/timeline_post_test.py +598 -0
  81. ofscraper-3.13.dev9/uv.lock +2180 -0
  82. ofscraper-3.13.dev7/ofscraper/__version__.py +0 -34
  83. ofscraper-3.13.dev7/ofscraper/const/values/binary.py +0 -1
  84. ofscraper-3.13.dev7/ofscraper/prompts/prompt_groups/binary.py +0 -73
  85. ofscraper-3.13.dev7/ofscraper/utils/binaries.py +0 -125
  86. ofscraper-3.13.dev7/ofscraper/utils/paths/check.py +0 -39
  87. ofscraper-3.13.dev7/pyproject.toml +0 -104
  88. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/LICENSE +0 -0
  89. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/README.md +0 -0
  90. /ofscraper-3.13.dev7/ofscraper/commands/scraper/actions/utils/buffer.py → /ofscraper-3.13.dev9/crypto +0 -0
  91. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/__version__.pye +0 -0
  92. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/labels.py +0 -0
  93. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/of/base.py +0 -0
  94. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/of/media.py +0 -0
  95. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/of/posts.py +0 -0
  96. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/placeholder.py +0 -0
  97. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/sessionmanager/download.py +0 -0
  98. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/sessionmanager/ofsession.py +0 -0
  99. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/sessionmanager/sessionmanager.py +0 -0
  100. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/app.py +0 -0
  101. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/compose.py +0 -0
  102. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/const.py +0 -0
  103. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/css.py +0 -0
  104. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/boolfield.py +0 -0
  105. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/datefield.py +0 -0
  106. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/downloadfield.py +0 -0
  107. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/mediafield.py +0 -0
  108. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/numfield.py +0 -0
  109. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/pricefield.py +0 -0
  110. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/responsefield.py +0 -0
  111. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/selectfield.py +0 -0
  112. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/sizefield.py +0 -0
  113. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/textsearch.py +0 -0
  114. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/fields/timefield.py +0 -0
  115. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/inputs/filterinput.py +0 -0
  116. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/inputs/intergerinput.py +0 -0
  117. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/inputs/strinput.py +0 -0
  118. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/sections/sidebar.py +0 -0
  119. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/sections/table.py +0 -0
  120. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/sections/table_console.py +0 -0
  121. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/utils/lock.py +0 -0
  122. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/classes/table/utils/names.py +0 -0
  123. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/check.py +0 -0
  124. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/db.py +0 -0
  125. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/manual.py +0 -0
  126. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/metadata/consumer.py +0 -0
  127. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/metadata/desc.py +0 -0
  128. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/metadata/manager.py +0 -0
  129. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/metadata/metadata.py +0 -0
  130. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/download.py +0 -0
  131. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/managers/downloadmanager.py +0 -0
  132. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/managers/main_download.py +0 -0
  133. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/run.py +0 -0
  134. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/utils/chunk.py +0 -0
  135. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/utils/desc.py +0 -0
  136. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/utils/leaky.py +0 -0
  137. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/utils/retries.py +0 -0
  138. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/download/utils/text.py +0 -0
  139. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/like/like.py +0 -0
  140. /ofscraper-3.13.dev7/ofscraper/commands/scraper/utils/daemon.py → /ofscraper-3.13.dev9/ofscraper/commands/scraper/actions/utils/buffer.py +0 -0
  141. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/general.py +0 -0
  142. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/globals.py +0 -0
  143. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/log.py +0 -0
  144. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/params.py +0 -0
  145. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/paths/media.py +0 -0
  146. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/paths/paths.py +0 -0
  147. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/progress/convert.py +0 -0
  148. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/progress/update.py +0 -0
  149. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/retries.py +0 -0
  150. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/send/chunk.py +0 -0
  151. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/send/message.py +0 -0
  152. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/threads.py +0 -0
  153. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/actions/utils/workers.py +0 -0
  154. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/scraper.py +0 -0
  155. /ofscraper-3.13.dev7/ofscraper/const/values/req/like.py → /ofscraper-3.13.dev9/ofscraper/commands/scraper/utils/daemon.py +0 -0
  156. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/utils/jobqueue.py +0 -0
  157. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/utils/prepare.py +0 -0
  158. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/utils/print.py +0 -0
  159. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/scraper/utils/schedule.py +0 -0
  160. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/utils/command.py +0 -0
  161. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/utils/scrape_context.py +0 -0
  162. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/commands/utils/strings.py +0 -0
  163. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/action/download.py +0 -0
  164. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/action/like.py +0 -0
  165. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/action/metadata.py +0 -0
  166. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/config.py +0 -0
  167. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/date.py +0 -0
  168. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/download.py +0 -0
  169. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/general.py +0 -0
  170. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/list.py +0 -0
  171. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/live.py +0 -0
  172. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/logger.py +0 -0
  173. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/path/bytes.py +0 -0
  174. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/path/files.py +0 -0
  175. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/path/general.py +0 -0
  176. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/path/path.py +0 -0
  177. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/prompts.py +0 -0
  178. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/req/anon.py +0 -0
  179. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/req/api.py +0 -0
  180. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/req/cdm.py +0 -0
  181. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/req/discord.py +0 -0
  182. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/req/git.py +0 -0
  183. /ofscraper-3.13.dev7/ofscraper/utils/args/accessors/actions.py → /ofscraper-3.13.dev9/ofscraper/const/values/req/like.py +0 -0
  184. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/req/mpd.py +0 -0
  185. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/req/req.py +0 -0
  186. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/rich.py +0 -0
  187. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/system.py +0 -0
  188. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/table.py +0 -0
  189. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/test/test_constants.py +0 -0
  190. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/time.py +0 -0
  191. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/url/other_url.py +0 -0
  192. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/const/values/url/url.py +0 -0
  193. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/archive.py +0 -0
  194. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/common/after.py +0 -0
  195. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/common/cache/read.py +0 -0
  196. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/common/cache/write.py +0 -0
  197. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/common/check.py +0 -0
  198. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/common/logs/logs.py +0 -0
  199. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/common/logs/strings.py +0 -0
  200. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/common/timeline.py +0 -0
  201. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/highlights.py +0 -0
  202. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/init.py +0 -0
  203. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/labels.py +0 -0
  204. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/me.py +0 -0
  205. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/messages.py +0 -0
  206. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/paid.py +0 -0
  207. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/pinned.py +0 -0
  208. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/profile.py +0 -0
  209. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/streams.py +0 -0
  210. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/subscriptions/common.py +0 -0
  211. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/subscriptions/individual.py +0 -0
  212. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/subscriptions/lists.py +0 -0
  213. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/subscriptions/subscriptions.py +0 -0
  214. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/api/timeline.py +0 -0
  215. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/models/manager.py +0 -0
  216. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/models/models.py +0 -0
  217. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/models/utils/retriver.py +0 -0
  218. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/posts/post.py +0 -0
  219. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/data/posts/scrape_paid.py +0 -0
  220. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/__init__.py +0 -0
  221. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/backup.py +0 -0
  222. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/difference.py +0 -0
  223. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/merge.py +0 -0
  224. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations.py +0 -0
  225. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/empty.py +0 -0
  226. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/labels.py +0 -0
  227. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/media.py +0 -0
  228. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/messages.py +0 -0
  229. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/others.py +0 -0
  230. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/posts.py +0 -0
  231. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/profile.py +0 -0
  232. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/stories.py +0 -0
  233. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/operations_/wrapper.py +0 -0
  234. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/transition.py +0 -0
  235. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/db/utils/convert.py +0 -0
  236. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/media/filters.py +0 -0
  237. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/media/main.py +0 -0
  238. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/models/date.py +0 -0
  239. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/models/flags.py +0 -0
  240. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/models/other.py +0 -0
  241. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/models/price.py +0 -0
  242. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/models/sort.py +0 -0
  243. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/models/subtype.py +0 -0
  244. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/filters/models/utils/logs.py +0 -0
  245. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/close/exit.py +0 -0
  246. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/close/final/final.py +0 -0
  247. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/close/final/final_log.py +0 -0
  248. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/close/final/final_script.py +0 -0
  249. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/close/final/final_user.py +0 -0
  250. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/manager.py +0 -0
  251. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/main/open/run.py +0 -0
  252. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/keybindings.py +0 -0
  253. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/promptConvert.py +0 -0
  254. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/actions.py +0 -0
  255. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/area.py +0 -0
  256. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/auth.py +0 -0
  257. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/menu.py +0 -0
  258. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/merge.py +0 -0
  259. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/model.py +0 -0
  260. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_groups/profile.py +0 -0
  261. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/prompt_strings.py +0 -0
  262. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/utils/model_helpers.py +0 -0
  263. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/prompts/utils/prompt_helpers.py +0 -0
  264. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/__init__.py +0 -0
  265. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/actions.py +0 -0
  266. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/ads.py +0 -0
  267. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/accessors/areas.py +0 -0
  268. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/accessors/output.py +0 -0
  269. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/accessors/quality.py +0 -0
  270. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/accessors/read.py +0 -0
  271. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/accessors/time.py +0 -0
  272. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/callbacks/arguments/post.py +0 -0
  273. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/callbacks/parse/choice.py +0 -0
  274. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/callbacks/parse/file.py +0 -0
  275. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/callbacks/parse/string.py +0 -0
  276. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/callbacks/parse/username.py +0 -0
  277. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/globals.py +0 -0
  278. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/helpers/hide_args.py +0 -0
  279. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/main.py +0 -0
  280. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/mutators/before.py +0 -0
  281. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/mutators/change.py +0 -0
  282. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/mutators/user.py +0 -0
  283. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/mutators/write.py +0 -0
  284. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/advanced_processing.py +0 -0
  285. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/advanced_program.py +0 -0
  286. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/advanced_user_filter.py +0 -0
  287. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/automatic.py +0 -0
  288. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/check.py +0 -0
  289. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/download.py +0 -0
  290. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/file.py +0 -0
  291. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/logging.py +0 -0
  292. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/media_content.py +0 -0
  293. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/metadata_filters.py +0 -0
  294. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/post_content.py +0 -0
  295. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/program.py +0 -0
  296. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/shared.py +0 -0
  297. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/user_list.py +0 -0
  298. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/user_select.py +0 -0
  299. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/user_sort.py +0 -0
  300. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/utils/date.py +0 -0
  301. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/arguments/utils/retry.py +0 -0
  302. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/db.py +0 -0
  303. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/main.py +0 -0
  304. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/manual.py +0 -0
  305. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/message.py +0 -0
  306. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/metadata.py +0 -0
  307. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/paid.py +0 -0
  308. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/post.py +0 -0
  309. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/commands/story.py +0 -0
  310. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/advanced_common.py +0 -0
  311. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/check.py +0 -0
  312. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/common.py +0 -0
  313. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/db.py +0 -0
  314. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/main.py +0 -0
  315. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/manual.py +0 -0
  316. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/message_check.py +0 -0
  317. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/metadata.py +0 -0
  318. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/paid_check.py +0 -0
  319. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/post_check.py +0 -0
  320. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/story_check.py +0 -0
  321. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/group_bundles/utils/check.py +0 -0
  322. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/advanced_processing.py +0 -0
  323. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/advanced_program.py +0 -0
  324. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/advanced_user_filter.py +0 -0
  325. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/automatic.py +0 -0
  326. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/check_content.py +0 -0
  327. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/download.py +0 -0
  328. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/file.py +0 -0
  329. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/logging.py +0 -0
  330. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/media_filter.py +0 -0
  331. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/post_filter.py +0 -0
  332. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/program.py +0 -0
  333. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/user_list.py +0 -0
  334. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/user_select.py +0 -0
  335. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/parse/groups/user_sort.py +0 -0
  336. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/types/arrow.py +0 -0
  337. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/args/types/choice.py +0 -0
  338. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/data.py +0 -0
  339. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/file.py +0 -0
  340. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/make.py +0 -0
  341. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/request.py +0 -0
  342. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/schema.py +0 -0
  343. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/utils/context.py +0 -0
  344. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/utils/dict.py +0 -0
  345. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/utils/prompt.py +0 -0
  346. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/utils/warning/check.py +0 -0
  347. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/utils/warning/print.py +0 -0
  348. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/auth/utils/warning/warning.py +0 -0
  349. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/cache.py +0 -0
  350. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/custom.py +0 -0
  351. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/file.py +0 -0
  352. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/menu.py +0 -0
  353. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/schema.py +0 -0
  354. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/utils/context.py +0 -0
  355. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/config/utils/wrapper.py +0 -0
  356. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/console.py +0 -0
  357. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/constants.py +0 -0
  358. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/context/exit.py +0 -0
  359. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/context/run_async.py +0 -0
  360. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/context/stdout.py +0 -0
  361. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/dates.py +0 -0
  362. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/encoding.py +0 -0
  363. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/hash.py +0 -0
  364. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/classes/progress.py +0 -0
  365. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/classes/task.py +0 -0
  366. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/classes/transfercol.py +0 -0
  367. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/clear.py +0 -0
  368. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/empty.py +0 -0
  369. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/groups.py +0 -0
  370. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/live.py +0 -0
  371. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/panel.py +0 -0
  372. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/progress.py +0 -0
  373. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/screens.py +0 -0
  374. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/tasks.py +0 -0
  375. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/live/updater.py +0 -0
  376. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/classes/classes.py +0 -0
  377. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/classes/handlers/discord.py +0 -0
  378. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/classes/handlers/file.py +0 -0
  379. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/classes/handlers/text.py +0 -0
  380. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/close.py +0 -0
  381. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/globals.py +0 -0
  382. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/handle.py +0 -0
  383. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/logger.py +0 -0
  384. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/logs.py +0 -0
  385. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/other.py +0 -0
  386. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/stdout.py +0 -0
  387. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/utils/level.py +0 -0
  388. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/logs/utils/trace.py +0 -0
  389. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/manager.py +0 -0
  390. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/me.py +0 -0
  391. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/menu.py +0 -0
  392. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/merge.py +0 -0
  393. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/paths/common.py +0 -0
  394. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/paths/db.py +0 -0
  395. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/paths/manage.py +0 -0
  396. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/paths/paths.py +0 -0
  397. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/profiles/data.py +0 -0
  398. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/profiles/manage.py +0 -0
  399. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/profiles/tools.py +0 -0
  400. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/sems.py +0 -0
  401. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/separate.py +0 -0
  402. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/string.py +0 -0
  403. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/system/free.py +0 -0
  404. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/system/network.py +0 -0
  405. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/system/priority.py +0 -0
  406. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/system/speed.py +0 -0
  407. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/system/subprocess.py +0 -0
  408. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/system/system.py +0 -0
  409. {ofscraper-3.13.dev7 → ofscraper-3.13.dev9}/ofscraper/utils/text.py +0 -0
@@ -0,0 +1 @@
1
+ .git_archival.json export-subst
@@ -0,0 +1,66 @@
1
+ ---
2
+ name: Bug report
3
+ about: Report an issue with running the script
4
+ title: "# Clear Description of issue"
5
+ labels: ""
6
+ assignees: ""
7
+ ---
8
+
9
+ <!---
10
+ Issues pertaining to the script not working
11
+ Must have a log file and config, otherwhise they will be closed
12
+
13
+ You may submit tickets privately on discord
14
+ In other cases a log and config may be helpful
15
+ -->
16
+
17
+ ## Describe the bug
18
+
19
+ A clear and concise description of what the bug is.
20
+
21
+ ## To Reproduce
22
+
23
+ Steps to reproduce the behavior:
24
+ Hint: enter the command and args would be a good idea
25
+
26
+ Example
27
+
28
+ 1. Go to '...'
29
+ 2. Click on '....'
30
+ 3. Scroll down to '....'
31
+ 4. See error
32
+
33
+ ## Expected behavior
34
+
35
+ A clear and concise description of what you expected to happen.
36
+
37
+ ## Screenshots/Logs
38
+
39
+ Logs are required for any reports of any issue, unless the issue is related to setup of script
40
+ Logs must be at least debug level
41
+
42
+ Hint: Please make sure that the log formatting is readable, use a paste site
43
+ like
44
+ [Private Bin](https://privatebin.io/)
45
+
46
+ ## Config
47
+
48
+ Please provide details about your correct config
49
+ This is required for all reports
50
+
51
+ Feel free to anonymize information
52
+
53
+ - for example home directory
54
+ - keydb api key
55
+
56
+ ## System Info
57
+
58
+ - OS: [e.g. iOS]
59
+ - Browser [e.g. chrome, safari]
60
+ - Version [e.g. 22]
61
+ - binary or python
62
+ - python version if installed via pip or pypi
63
+
64
+ ## Additional context
65
+
66
+ Add any other context about the problem here.
@@ -0,0 +1,19 @@
1
+ ---
2
+ name: Feature request
3
+ about: Suggest an idea for this project
4
+ title: ""
5
+ labels: ""
6
+ assignees: ""
7
+ ---
8
+
9
+ **Is your feature request related to a problem? Please describe.**
10
+ A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
11
+
12
+ **Describe the solution you'd like**
13
+ A clear and concise description of what you want to happen.
14
+
15
+ **Describe alternatives you've considered**
16
+ A clear and concise description of any alternative solutions or features you've considered.
17
+
18
+ **Additional context**
19
+ Add any other context or screenshots about the feature request here.
@@ -0,0 +1,11 @@
1
+ # To get started with Dependabot version updates, you'll need to specify which
2
+ # package ecosystems to update and where the package manifests are located.
3
+ # Please see the documentation for all configuration options:
4
+ # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
5
+
6
+ version: 2
7
+ updates:
8
+ - package-ecosystem: "" # See documentation for possible values
9
+ directory: / # Location of package manifests
10
+ schedule:
11
+ interval: weekly
@@ -0,0 +1,32 @@
1
+ name: codecov
2
+ permissions: read-all
3
+ on:
4
+ push:
5
+ branches: main
6
+ # Publish semver tags as releases.
7
+ tags: [v*.*.*]
8
+ pull_request:
9
+ branches: main
10
+
11
+ jobs:
12
+ run:
13
+ runs-on: ubuntu-latest
14
+ steps:
15
+ - name: Checkout
16
+ uses: actions/checkout@v4
17
+ - name: Set up Python 3.11.5
18
+ uses: actions/setup-python@v4
19
+ with:
20
+ python-version: 3.11.5
21
+ - name: install poetry
22
+ uses: abatilo/actions-poetry@v2
23
+ with:
24
+ poetry-version: 1.4.1
25
+ - name: Install dependencies
26
+ run: poetry install --with test
27
+ - name: create required folder
28
+ run: mkdir -p /home/runner/.config/ofscraper/main_profile
29
+ - name: Run tests and collect coverage
30
+ run: poetry run pytest --cov-report term --cov-report xml:coverage.xml --cov=src
31
+ - name: Upload coverage to Codecov
32
+ uses: codecov/codecov-action@v3
@@ -0,0 +1,207 @@
1
+ name: Build and Package
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '**'
7
+ tags-ignore:
8
+ - '**'
9
+
10
+ permissions:
11
+ contents: read # Required for git checkout and gh CLI to read workflow runs
12
+
13
+ jobs:
14
+ generate_version:
15
+ name: Generate Version Info
16
+ runs-on: ubuntu-latest
17
+ env:
18
+ GH_TOKEN: ${{ github.token }}
19
+ GITHUB_REPOSITORY: ${{ github.repository }}
20
+ GITHUB_REF: ${{ github.ref }}
21
+ GITHUB_EVENT_BEFORE: ${{ github.event.before }}
22
+ outputs:
23
+ version: ${{ steps.version.outputs.VERSION }}
24
+ sanitized_version: ${{ steps.version.outputs.SANITIZED_VERSION }}
25
+ short_hash: ${{ steps.version.outputs.SHORT_HASH }}
26
+ long_hash: ${{ steps.version.outputs.LONG_HASH }}
27
+ commit_timestamp: ${{ steps.version.outputs.COMMIT_TIMESTAMP }}
28
+ base_version: ${{ steps.version.outputs.BASE_VERSION }}
29
+ push_type: ${{ steps.version.outputs.PUSH_TYPE }}
30
+ is_newer_than_last_successful_run: ${{ steps.version.outputs.IS_NEWER_THAN_LAST_SUCCESSFUL_RUN }}
31
+ steps:
32
+ - name: Checkout Code
33
+ uses: actions/checkout@v4
34
+ with:
35
+ fetch-depth: 0 # Essential for git merge-base to compare full history
36
+ fetch-tags: true
37
+
38
+ - name: Make script executable
39
+ run: chmod +x ./scripts/commit_version.sh
40
+ - name: Generate Version and Git Info
41
+ id: version # This step runs your commit_version.sh script
42
+ # Pass GitHub Actions context variables as environment variables to the script
43
+ run: ./scripts/commit_version.sh
44
+
45
+ build_binaries:
46
+ name: Build on ${{ matrix.os }}
47
+ needs: [generate_version]
48
+ runs-on: ${{ matrix.os }}
49
+
50
+ strategy:
51
+ fail-fast: false # <-- ADDED: Allows all OS builds to complete even if one fails
52
+ matrix:
53
+ os: [ubuntu-latest, windows-latest, macos-latest]
54
+ include:
55
+ - os: ubuntu-latest
56
+ artifact_suffix: linux
57
+ shell: bash
58
+ - os: windows-latest
59
+ artifact_suffix: windows
60
+ shell: pwsh
61
+ - os: macos-latest
62
+ artifact_suffix: macos
63
+ shell: bash
64
+
65
+ steps:
66
+ - name: Checkout Code
67
+ uses: actions/checkout@v4
68
+ with:
69
+ fetch-depth: 0
70
+ fetch-tags: true
71
+ - name: Set up Python
72
+ uses: actions/setup-python@v5
73
+ with:
74
+ python-version: 3.12.0
75
+ - name: Install uv
76
+ uses: astral-sh/setup-uv@v1
77
+
78
+ - name: Set Version Environment Variables
79
+ shell: bash
80
+ run: |
81
+ echo "SETUPTOOLS_SCM_PRETEND_VERSION=${{ needs.generate_version.outputs.version }}" >> $GITHUB_ENV
82
+ echo "HATCH_VCS_PRETEND_VERSION=${{ needs.generate_version.outputs.version }}" >> $GITHUB_ENV
83
+
84
+ - name: Install Dependencies and Build Tools
85
+ shell: bash
86
+ run: |
87
+ uv venv
88
+ if [ "${{ runner.os }}" == "Windows" ]; then
89
+ . .venv/Scripts/activate
90
+ else
91
+ source .venv/bin/activate
92
+ fi
93
+ uv sync --verbose --extra ffmpeg --extra dev
94
+
95
+ - name: Set UTF-8 environment (Windows)
96
+ if: runner.os == 'Windows'
97
+ run: |
98
+ echo "PYTHONUTF8=1" >> $env:GITHUB_ENV
99
+ echo "PYTHONLEGACYWINDOWSSTDIO=utf8" >> $env:GITHUB_ENV
100
+ shell: pwsh
101
+
102
+ - name: Build Executable using Spec Files (One-File)
103
+ id: build_onefile
104
+ shell: bash
105
+ continue-on-error: true # <-- ADDED: Allows this step to fail without stopping this OS matrix axis
106
+ run: |
107
+ SANITIZED_VERSION="${{ needs.generate_version.outputs.sanitized_version }}"
108
+ EXE_NAME="ofscraper_${{ matrix.artifact_suffix }}_${SANITIZED_VERSION}"
109
+
110
+ if [ "${{ runner.os }}" == "Windows" ]; then
111
+ source .venv/Scripts/activate
112
+ EXE_EXT=".exe"
113
+ else
114
+ source .venv/bin/activate
115
+ EXE_EXT=""
116
+ fi
117
+
118
+ echo "Building one-file executable from specs/onefile.spec..."
119
+ pyinstaller specs/onefile.spec
120
+ mv dist/ofscraper_file${EXE_EXT} dist/${EXE_NAME}${EXE_EXT}
121
+ echo "one_file_path=dist/${EXE_NAME}${EXE_EXT}" >> $GITHUB_OUTPUT
122
+ echo "one_file_name=${EXE_NAME}${EXE_EXT}" >> $GITHUB_OUTPUT
123
+
124
+ - name: Upload One-File Artifact
125
+ uses: actions/upload-artifact@v4
126
+ with:
127
+ name: ${{ steps.build_onefile.outputs.one_file_name }}
128
+ path: ${{ steps.build_onefile.outputs.one_file_path }}
129
+ if-no-files-found: ignore # Ensures upload step doesn't fail if previous build step failed
130
+
131
+ - name: Build and Zip One-Dir Bundle
132
+ id: build_onedir_zip
133
+ shell: bash
134
+ continue-on-error: true # Already present: Allows this step to fail without stopping this OS matrix axis
135
+ run: |
136
+ SANITIZED_VERSION="${{ needs.generate_version.outputs.sanitized_version }}"
137
+ DIR_NAME="ofscraper_${{ matrix.artifact_suffix }}_dir"
138
+ ZIP_NAME="ofscraper_${{ matrix.artifact_suffix }}_${SANITIZED_VERSION}.zip"
139
+
140
+ if [ "${{ runner.os }}" == "Windows" ]; then
141
+ source .venv/Scripts/activate
142
+ else
143
+ source .venv/bin/activate
144
+ fi
145
+
146
+ echo "Building one-dir bundle from specs/onedir.spec..."
147
+ pyinstaller specs/onedir.spec
148
+ mv dist/ofscraper_dir dist/${DIR_NAME}
149
+
150
+ echo "Zipping one-dir build..."
151
+ if [ "${{ runner.os }}" == "Windows" ]; then
152
+ powershell -Command "Compress-Archive -Path dist/${DIR_NAME} -DestinationPath dist/${ZIP_NAME} -Force"
153
+ else
154
+ zip -r "dist/${ZIP_NAME}" "dist/${DIR_NAME}"
155
+ fi
156
+ echo "zip_path=dist/${ZIP_NAME}" >> $GITHUB_OUTPUT
157
+ echo "zip_name=${ZIP_NAME}" >> $GITHUB_OUTPUT
158
+ echo "dir_path=dist/${DIR_NAME}" >> $GITHUB_OUTPUT
159
+ echo "dir_name=dist/${DIR_NAME}" >> $GITHUB_OUTPUT
160
+
161
+ - name: Upload Zipped One-Dir Artifact
162
+ if: success() && steps.build_onedir_zip.outcome == 'success'
163
+ uses: actions/upload-artifact@v4
164
+ with:
165
+ name: ${{ steps.build_onedir_zip.outputs.zip_name }}
166
+ path: ${{ steps.build_onedir_zip.outputs.zip_path }}
167
+ if-no-files-found: ignore # Ensures upload step doesn't fail if previous build step failed
168
+
169
+ - name: Upload One-Dir Folder (if zip failed)
170
+ if: failure() && steps.build_onedir_zip.outcome == 'failure'
171
+ uses: actions/upload-artifact@v4
172
+ with:
173
+ name: ${{ steps.build_onedir_zip.outputs.dir_name }}
174
+ path: ${{ steps.build_onedir_zip.outputs.dir_path }}
175
+ if-no-files-found: ignore # Ensures upload step doesn't fail if previous build step failed
176
+
177
+ publish_release:
178
+ name: Publish GitHub Release
179
+ if: github.event_name == 'push' && !contains(github.ref, 'refs/tags/')
180
+ needs: [build_binaries, generate_version] # Waits for version info AND all binary builds to complete (even partially)
181
+ runs-on: ubuntu-latest
182
+ permissions:
183
+ contents: write # Required to create/update GitHub Releases
184
+ steps:
185
+ - name: Download all build artifacts
186
+ uses: actions/download-artifact@v4
187
+ with:
188
+ path: artifacts/
189
+ # No specific `if-no-files-found` here on download-artifact, it will download what's available
190
+ # and log warnings for missing ones by default.
191
+
192
+ - name: List downloaded files for debugging
193
+ run: ls -R artifacts
194
+
195
+ - name: Create or Update Release
196
+ uses: ncipollo/release-action@v1
197
+ with:
198
+ artifacts: artifacts/*/* # Attach any downloaded artifacts (will include only those that were built successfully)
199
+ # Combined tag for uniqueness and chronological sorting
200
+ tag: "${{ needs.generate_version.outputs.base_version }}-${{ needs.generate_version.outputs.short_hash }}-${{ needs.generate_version.outputs.commit_timestamp }}"
201
+ # Human-readable name with all key details
202
+ name: "Dev Build ${{ needs.generate_version.outputs.base_version }} (Commit ${{ needs.generate_version.outputs.short_hash }}) - ${{ needs.generate_version.outputs.commit_timestamp }}"
203
+
204
+ body: "This is an auto-generated development release created from commit hash `${{ needs.generate_version.outputs.long_hash }}`. Version: `${{ needs.generate_version.outputs.version }}`"
205
+ commit: "${{ needs.generate_version.outputs.long_hash }}"
206
+ allowUpdates: true
207
+ prerelease: true
@@ -0,0 +1,117 @@
1
+ name: Docker Daily Build
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - '**'
7
+ tags-ignore:
8
+ - '**'
9
+
10
+ permissions:
11
+ contents: read
12
+ packages: write
13
+ id-token: write
14
+
15
+ jobs:
16
+ generate_version:
17
+ name: Generate Version Info
18
+ runs-on: ubuntu-latest
19
+ outputs:
20
+ version: ${{ steps.version.outputs.VERSION }}
21
+ short_hash: ${{ steps.version.outputs.SHORT_HASH }}
22
+ commit_timestamp: ${{ steps.version.outputs.COMMIT_TIMESTAMP }}
23
+ base_version: ${{ steps.version.outputs.BASE_VERSION }}
24
+ is_newer_than_last_successful_run: ${{ steps.version.outputs.IS_NEWER_THAN_LAST_SUCCESSFUL_RUN }}
25
+ steps:
26
+ - name: Checkout Code
27
+ uses: actions/checkout@v4
28
+ with:
29
+ fetch-depth: 0
30
+ fetch-tags: true
31
+
32
+ - name: Make script executable
33
+ run: chmod +x ./scripts/commit_version.sh
34
+ - name: Generate Version and Git Info
35
+ id: version
36
+ env:
37
+ GH_TOKEN: ${{ github.token }}
38
+ GITHUB_REPOSITORY: ${{ github.repository }}
39
+ GITHUB_WORKFLOW_REF: ${{ github.workflow_ref }} # Still pass for general info, but not for WORKFLOW_ID now
40
+ GITHUB_REF: ${{ github.ref }}
41
+ GITHUB_EVENT_BEFORE: ${{ github.event.before }}
42
+ run: ./scripts/commit_version.sh
43
+
44
+ build_and_publish_docker:
45
+ name: Build and Publish Docker to ${{ matrix.registry.name }}
46
+ needs: [generate_version]
47
+ runs-on: ubuntu-latest
48
+
49
+ strategy:
50
+ fail-fast: false
51
+ matrix:
52
+ registry:
53
+ - id: ghcr
54
+ name: GitHub Packages
55
+ sign: false
56
+ - id: dockerhub
57
+ name: Docker Hub
58
+ sign: true
59
+
60
+ steps:
61
+ - name: Checkout repository
62
+ uses: actions/checkout@v4
63
+
64
+ - name: Set up QEMU
65
+ uses: docker/setup-qemu-action@v3
66
+ - name: Set up Docker Buildx
67
+ uses: docker/setup-buildx-action@v3
68
+
69
+ - name: Log in to ${{ matrix.registry.name }}
70
+ uses: docker/login-action@v3
71
+ with:
72
+ registry: ${{ matrix.registry.id == 'ghcr' && 'ghcr.io' || 'docker.io' }}
73
+ username: ${{ matrix.registry.id == 'ghcr' && github.actor || secrets.DOCKERHUB_USERNAME }}
74
+ password: ${{ matrix.registry.id == 'ghcr' && secrets.GITHUB_TOKEN || secrets.DOCKERHUB_TOKEN }}
75
+
76
+ - name: Extract Docker metadata
77
+ id: meta
78
+ uses: docker/metadata-action@v5
79
+ with:
80
+ images: ${{ matrix.registry.id == 'ghcr' && format('ghcr.io/{0}', github.repository) || 'datawhores/of-scraper' }}
81
+ tags: |
82
+ type=ref,event=branch
83
+ type=raw,value=${{ needs.generate_version.outputs.base_version }}-${{ needs.generate_version.outputs.short_hash }}-${{ needs.generate_version.outputs.commit_timestamp }}
84
+ type=raw,value=${{ needs.generate_version.outputs.base_version }}-${{ needs.generate_version.outputs.short_hash }}
85
+ type=raw,value=latest,enable=${{ needs.generate_version.outputs.is_newer_than_last_successful_run }}
86
+
87
+
88
+ - name: Build and push Docker image
89
+ id: build-and-push
90
+ uses: docker/build-push-action@v5
91
+ with:
92
+ context: .
93
+ push: true
94
+ tags: ${{ steps.meta.outputs.tags }}
95
+ labels: ${{ steps.meta.outputs.labels }}
96
+ cache-from: type=gha
97
+ cache-to: type=gha,mode=max
98
+ platforms: linux/amd64,linux/arm64
99
+ build-args: |
100
+ BUILD_VERSION=${{ needs.generate_version.outputs.version }}
101
+ INSTALL_FFMPEG=true
102
+
103
+ - name: Install Cosign
104
+ if: matrix.registry.sign == true
105
+ uses: sigstore/cosign-installer@v3.5.0
106
+
107
+ - name: Write signing key to disk
108
+ if: matrix.registry.sign == true
109
+ run: echo "${{ secrets.COSIGN_PRIVATE_KEY }}" > cosign.key
110
+ shell: bash
111
+
112
+ - name: Sign the published Docker image
113
+ if: matrix.registry.sign == true
114
+ env:
115
+ COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
116
+ COSIGN_EXPERIMENTAL: "true"
117
+ run: echo "${{ steps.meta.outputs.tags }}" | xargs -I {} cosign sign --yes --key cosign.key {}@${{ steps.build-and-push.outputs.digest }}
@@ -0,0 +1,35 @@
1
+ name: Docker Purge
2
+ on:
3
+ workflow_dispatch:
4
+ schedule:
5
+ - cron: "0 0 * * *" # every day at midnight
6
+ permissions: read-all
7
+
8
+ jobs:
9
+ cleanup:
10
+ runs-on: ubuntu-latest
11
+ permissions:
12
+ contents: read
13
+ packages: write
14
+ # This is used to complete the identity challenge
15
+ # with sigstore/fulcio when running outside of PRs.
16
+ id-token: write
17
+
18
+ steps:
19
+ - name: Main purger
20
+ uses: snok/container-retention-policy@v2
21
+ with:
22
+ image-names: of-scraper
23
+ timestamp-to-use: created_at
24
+ account-type: personal
25
+ token: ${{ secrets.DOCKER_DELETE}}
26
+ filter-tags: sha*
27
+ cut-off: 1 second ago UTC
28
+ - name: Delete untagged
29
+ uses: snok/container-retention-policy@v2
30
+ with:
31
+ image-names: of-scraper
32
+ cut-off: 1 second ago UTC
33
+ account-type: personal
34
+ token: ${{ secrets.DOCKER_DELETE}}
35
+ untagged-only: true
@@ -0,0 +1,163 @@
1
+ # .github/workflows/package-builder-release.yml
2
+ # checkov:skip=CKV_GHA_7: "The workflow_dispatch inputs are intentionally used for a controlled manual release process. 'version' specifically targets a Git tag/ref, and boolean flags control trusted build/publish steps. This setup does not introduce arbitrary code execution risks."
3
+ name: Package Builder Release
4
+
5
+ on:
6
+ workflow_dispatch:
7
+ inputs:
8
+ version:
9
+ description: 'The exact git tag to build (e.g., v8.4.1 or v8.4.1-alpha.1). Leave empty to auto-derive from latest Git tag.'
10
+ required: true
11
+ type: string
12
+ files:
13
+ description: 'Build binary files? (t/f)'
14
+ required: true
15
+ type: boolean
16
+ pip:
17
+ description: 'Publish to PyPI? (t/f)'
18
+ required: true
19
+ type: boolean
20
+ docker:
21
+ description: 'Publish to Docker Hub & GHCR (t/f)'
22
+ required: true
23
+ type: boolean
24
+
25
+ permissions:
26
+ contents: write # Needed for checkout, creating releases
27
+ packages: write # Needed for pushing to GHCR/Docker Hub
28
+ id-token: write # For OIDC, used by cosign, and CRUCIAL for GHCR authentication
29
+ actions: write # Needed for gh CLI to upload/download workflow artifacts (for retries)
30
+
31
+ jobs:
32
+ determine_tags_and_versions:
33
+ name: Determine Release Info and Tagging Logic
34
+ runs-on: ubuntu-latest
35
+ permissions:
36
+ actions: read # Needed to list workflow runs and jobs
37
+ contents: read # For checkout
38
+ outputs:
39
+ long_hash: ${{ steps.release_info.outputs.long_hash }}
40
+ short_hash: ${{ steps.release_info.outputs.short_hash }}
41
+ package_version: ${{ steps.release_info.outputs.package_version }}
42
+ is_stable_release: ${{ steps.release_info.outputs.is_stable_release }}
43
+ is_dev_release: ${{ steps.release_info.outputs.is_dev_release }}
44
+ commit_timestamp: ${{ steps.release_info.outputs.commit_timestamp }}
45
+ steps:
46
+ - name: Checkout Code (Optional Version or Current Branch)
47
+ uses: actions/checkout@v4
48
+ with:
49
+ ref: ${{ inputs.version || github.ref }} # Checkout the specified tag/ref or default branch
50
+ fetch-depth: 0 # Needed for git log and tag comparisons
51
+ fetch-tags: true
52
+
53
+ - name: Make release_version.sh executable
54
+ run: chmod +x ./scripts/release_version.sh
55
+
56
+ - name: Get Release Info from Script
57
+ id: release_info
58
+ env:
59
+ INPUT_VERSION: ${{ inputs.version }}
60
+ run: ./scripts/release_version.sh
61
+
62
+ determine_docker_latest_logic:
63
+ name: Determine Docker Latest Tag Logic
64
+ needs: [determine_tags_and_versions]
65
+ if: ${{ inputs.docker }}
66
+ runs-on: ubuntu-latest
67
+ permissions:
68
+ actions: read
69
+ contents: read
70
+ outputs:
71
+ should_apply_stable_latest: ${{ steps.run_python_logic.outputs.should_apply_stable_latest }}
72
+ should_apply_dev_latest: ${{ steps.run_python_logic.outputs.should_apply_dev_latest }}
73
+ steps:
74
+ - name: Checkout repository for script
75
+ uses: actions/checkout@v4
76
+ with:
77
+ ref: ${{ github.sha }}
78
+
79
+ - name: Set up Python
80
+ uses: actions/setup-python@v5
81
+ with:
82
+ python-version: '3.12'
83
+
84
+ - name: Install Python dependencies
85
+ run: pip install requests
86
+
87
+ - name: Execute Latest Tag Logic Script
88
+ id: run_python_logic
89
+ run: python scripts/determine_docker_stable_dev_tags.py \
90
+ "${{ needs.outputs.commit_timestamp }}" \
91
+ "${{ needs.determine_tags_and_versions.outputs.is_stable_release }}" \
92
+ "${{ needs.determine_tags_and_versions.outputs.is_dev_release }}"
93
+ env:
94
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
95
+ GITHUB_REPOSITORY: ${{ github.repository }}
96
+ GITHUB_WORKFLOW_REF: ${{ github.workflow_ref }}
97
+
98
+ pypi:
99
+ needs: [determine_tags_and_versions]
100
+ if: ${{ inputs.pip }}
101
+ runs-on: ubuntu-latest
102
+ name: Create PyPI Package
103
+ permissions:
104
+ id-token: write
105
+ steps:
106
+ - name: Checkout
107
+ uses: actions/checkout@v4
108
+ with:
109
+ fetch-depth: 0
110
+ fetch-tags: true
111
+ ref: ${{ inputs.version || github.ref }}
112
+ - run: git checkout ${{ needs.determine_tags_and_versions.outputs.long_hash }}
113
+ - name: Set up Python
114
+ uses: actions/setup-python@v4
115
+ with:
116
+ python-version: 3.11.5
117
+ - name: Install uv
118
+ uses: astral-sh/setup-uv@v4
119
+
120
+ - name: Install Build and Publish Tools
121
+ run: uv pip install hatch twine
122
+ - name: Build Package with Hatch
123
+ run: |
124
+ PACKAGE_VERSION="${{ needs.determine_tags_and_versions.outputs.package_version }}"
125
+ echo "Setting package version to $PACKAGE_VERSION" >> "$GITHUB_ENV" # Corrected output to GITHUB_ENV for env vars
126
+ echo "HATCH_VCS_PRETEND_VERSION=$PACKAGE_VERSION" >> "$GITHUB_ENV" # Corrected output to GITHUB_ENV for env vars
127
+ hatch build
128
+ shell: bash
129
+
130
+ - name: Publish to PyPI with Twine
131
+ env:
132
+ TWINE_USERNAME: __token__
133
+ TWINE_PASSWORD: ${{ secrets.pypi }}
134
+ run: twine upload "dist/*"
135
+ shell: bash
136
+
137
+ call_binaries_build_and_release:
138
+ name: Build & Release Binaries
139
+ needs: [determine_tags_and_versions]
140
+ if: ${{ inputs.files }}
141
+ uses: ./.github/workflows/publish-release-binaries.yml
142
+ with:
143
+ input_version: ${{ inputs.version }}
144
+ package_version: ${{ needs.determine_tags_and_versions.outputs.package_version }}
145
+ long_hash: ${{ needs.determine_tags_and_versions.outputs.long_hash }}
146
+
147
+ call_docker_publish:
148
+ name: Publish Docker Images
149
+ needs: [determine_tags_and_versions, determine_docker_latest_logic]
150
+ if: ${{ inputs.docker }}
151
+ uses: ./.github/workflows/publish-release-dockers.yml
152
+ secrets:
153
+ DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
154
+ DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
155
+ COSIGN_PASSWORD: ${{ secrets.COSIGN_PASSWORD }}
156
+ COSIGN_PRIVATE_KEY: ${{ secrets.COSIGN_PRIVATE_KEY }}
157
+ with:
158
+ input_version: ${{ inputs.version }}
159
+ package_version: ${{ needs.determine_tags_and_versions.outputs.package_version }}
160
+ long_hash: ${{ needs.determine_tags_and_versions.outputs.long_hash }}
161
+ is_stable_release: true
162
+ should_apply_stable_latest: true
163
+ should_apply_dev_latest: ${{ needs.determine_docker_latest_logic.outputs.should_apply_dev_latest }}
@@ -0,0 +1,23 @@
1
+ name: Delete Package
2
+ permissions: read-all
3
+ on:
4
+ workflow_dispatch:
5
+ jobs:
6
+ cleanup:
7
+ runs-on: ubuntu-latest
8
+ permissions:
9
+ contents: read
10
+ packages: write
11
+ # This is used to complete the identity challenge
12
+ # with sigstore/fulcio when running outside of PRs.
13
+ id-token: write
14
+ steps:
15
+ - uses: snok/container-retention-policy@v2
16
+ with:
17
+ image-names: ofscraper
18
+ cut-off: two hours ago UTC+2
19
+ timestamp-to-use: updated_at
20
+ account-type: personal
21
+ keep-at-least: 10
22
+ skip-tags: latest,1.*
23
+ token: ${{ secrets.DOCKER_DELETE}}