ofscraper 3.13.dev7__tar.gz → 3.13.dev10__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.
- ofscraper-3.13.dev10/.gitattributes +1 -0
- ofscraper-3.13.dev10/.github/ISSUE_TEMPLATE/bug_report.md +66 -0
- ofscraper-3.13.dev10/.github/ISSUE_TEMPLATE/feature_request.md +19 -0
- ofscraper-3.13.dev10/.github/actions/retry-artifact-operation/action.yml +186 -0
- ofscraper-3.13.dev10/.github/dependabot.yml +11 -0
- ofscraper-3.13.dev10/.github/workflows/codecov.yml +32 -0
- ofscraper-3.13.dev10/.github/workflows/commit_bundler.yml +207 -0
- ofscraper-3.13.dev10/.github/workflows/docker-daily.yml +117 -0
- ofscraper-3.13.dev10/.github/workflows/docker-purge.yml +35 -0
- ofscraper-3.13.dev10/.github/workflows/package-builder-release.yml +235 -0
- ofscraper-3.13.dev10/.github/workflows/package-delete.yml +23 -0
- ofscraper-3.13.dev10/.github/workflows/publish-release-binaries.yml +210 -0
- ofscraper-3.13.dev10/.github/workflows/publish-release-dockers.yml +331 -0
- ofscraper-3.13.dev10/.gitignore +156 -0
- ofscraper-3.13.dev10/.gitmodules +6 -0
- ofscraper-3.13.dev10/CHANGES.md +36 -0
- ofscraper-3.13.dev10/Dockerfile +65 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/PKG-INFO +61 -56
- ofscraper-3.13.dev10/cosign.pub +4 -0
- ofscraper-3.13.dev10/docker-compose.yml +40 -0
- ofscraper-3.13.dev10/donate/btc +1 -0
- ofscraper-3.13.dev10/donate/eth +1 -0
- ofscraper-3.13.dev10/media/browser_tools_open.png +0 -0
- ofscraper-3.13.dev10/media/dp.png +0 -0
- ofscraper-3.13.dev10/media/example.png +0 -0
- ofscraper-3.13.dev10/media/headers.png +0 -0
- ofscraper-3.13.dev10/media/icon.png +0 -0
- ofscraper-3.13.dev10/media/init.png +0 -0
- ofscraper-3.13.dev10/media/list_or_username.png +0 -0
- ofscraper-3.13.dev10/media/main_menu.png +0 -0
- ofscraper-3.13.dev10/media/network_tab.png +0 -0
- ofscraper-3.13.dev10/media/request_headers.png +0 -0
- ofscraper-3.13.dev10/media/xhr_tab.png +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/__main__.py +1 -0
- ofscraper-3.13.dev10/ofscraper/__version__.py +12 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/managers/alt_download.py +2 -2
- ofscraper-3.13.dev10/ofscraper/commands/scraper/actions/download/utils/ffmpeg.py +102 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/utils/keyhelpers.py +2 -2
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/constants.py +0 -1
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/dynamic.py +1 -1
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/open/load.py +0 -1
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/config.py +0 -5
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_validators.py +0 -30
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompts.py +0 -1
- ofscraper-3.13.dev10/ofscraper/utils/args/accessors/actions.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/callbacks/arguments/username.py +3 -3
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/checkers.py +1 -9
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/config.py +0 -12
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/data.py +2 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/settings.py +0 -1
- ofscraper-3.13.dev10/pyproject.toml +128 -0
- ofscraper-3.13.dev10/scripts/commit_version.sh +151 -0
- ofscraper-3.13.dev10/scripts/determine_docker_stable_dev_tags.py +205 -0
- ofscraper-3.13.dev10/scripts/entrypoint.sh +17 -0
- ofscraper-3.13.dev10/scripts/release_version.sh +135 -0
- ofscraper-3.13.dev10/scripts/retry_action.sh +31 -0
- ofscraper-3.13.dev10/test/calls/example.py +7 -0
- ofscraper-3.13.dev10/test/calls/utils_test.py +56 -0
- ofscraper-3.13.dev10/test/db/archive_test.py +78 -0
- ofscraper-3.13.dev10/test/db/highlights_test.py +74 -0
- ofscraper-3.13.dev10/test/db/media_test.py +82 -0
- ofscraper-3.13.dev10/test/db/message_test.py +73 -0
- ofscraper-3.13.dev10/test/db/pinned_test.py +78 -0
- ofscraper-3.13.dev10/test/db/post_test.py +77 -0
- ofscraper-3.13.dev10/test/db/profile_test.py +73 -0
- ofscraper-3.13.dev10/test/db/stories_test.py +64 -0
- ofscraper-3.13.dev10/test/general/auth_test.py +0 -0
- ofscraper-3.13.dev10/test/general/config_test.py +337 -0
- ofscraper-3.13.dev10/test/general/filter_test.py +112 -0
- ofscraper-3.13.dev10/test/general/like_test.py +64 -0
- ofscraper-3.13.dev10/test/general/misc_test.py +43 -0
- ofscraper-3.13.dev10/test/general/path_test.py +640 -0
- ofscraper-3.13.dev10/test/general/profile_folder_test.py +184 -0
- ofscraper-3.13.dev10/test/general/profile_scrape_test.py +57 -0
- ofscraper-3.13.dev10/test/general/validator_test.py +254 -0
- ofscraper-3.13.dev10/test/post/archived_post_test.py +598 -0
- ofscraper-3.13.dev10/test/post/highlight_post_test.py +595 -0
- ofscraper-3.13.dev10/test/post/messages_post_test.py +597 -0
- ofscraper-3.13.dev10/test/post/paid_post_test.py +596 -0
- ofscraper-3.13.dev10/test/post/pinned_post_test.py +598 -0
- ofscraper-3.13.dev10/test/post/stories_post_test.py +610 -0
- ofscraper-3.13.dev10/test/post/timeline_post_test.py +598 -0
- ofscraper-3.13.dev10/uv.lock +2180 -0
- ofscraper-3.13.dev7/ofscraper/__version__.py +0 -34
- ofscraper-3.13.dev7/ofscraper/const/values/binary.py +0 -1
- ofscraper-3.13.dev7/ofscraper/prompts/prompt_groups/binary.py +0 -73
- ofscraper-3.13.dev7/ofscraper/utils/binaries.py +0 -125
- ofscraper-3.13.dev7/ofscraper/utils/paths/check.py +0 -39
- ofscraper-3.13.dev7/pyproject.toml +0 -104
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/LICENSE +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/README.md +0 -0
- /ofscraper-3.13.dev7/ofscraper/commands/scraper/actions/utils/buffer.py → /ofscraper-3.13.dev10/crypto +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/__version__.pye +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/labels.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/of/base.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/of/media.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/of/posts.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/placeholder.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/sessionmanager/download.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/sessionmanager/ofsession.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/sessionmanager/sessionmanager.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/app.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/compose.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/const.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/css.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/boolfield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/datefield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/downloadfield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/mediafield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/numfield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/pricefield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/responsefield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/selectfield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/sizefield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/textsearch.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/fields/timefield.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/inputs/filterinput.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/inputs/intergerinput.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/inputs/strinput.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/sections/sidebar.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/sections/table.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/sections/table_console.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/utils/lock.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/classes/table/utils/names.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/db.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/manual.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/metadata/consumer.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/metadata/desc.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/metadata/manager.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/metadata/metadata.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/download.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/managers/downloadmanager.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/managers/main_download.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/run.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/utils/chunk.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/utils/desc.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/utils/leaky.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/utils/retries.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/download/utils/text.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/like/like.py +0 -0
- /ofscraper-3.13.dev7/ofscraper/commands/scraper/utils/daemon.py → /ofscraper-3.13.dev10/ofscraper/commands/scraper/actions/utils/buffer.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/general.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/globals.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/log.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/params.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/paths/media.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/paths/paths.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/progress/convert.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/progress/update.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/retries.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/send/chunk.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/send/message.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/threads.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/actions/utils/workers.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/scraper.py +0 -0
- /ofscraper-3.13.dev7/ofscraper/const/values/req/like.py → /ofscraper-3.13.dev10/ofscraper/commands/scraper/utils/daemon.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/utils/jobqueue.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/utils/prepare.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/utils/print.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/scraper/utils/schedule.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/utils/command.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/utils/scrape_context.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/commands/utils/strings.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/action/download.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/action/like.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/action/metadata.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/config.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/date.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/download.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/general.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/list.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/live.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/logger.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/path/bytes.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/path/files.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/path/general.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/path/path.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/prompts.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/req/anon.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/req/api.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/req/cdm.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/req/discord.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/req/git.py +0 -0
- /ofscraper-3.13.dev7/ofscraper/utils/args/accessors/actions.py → /ofscraper-3.13.dev10/ofscraper/const/values/req/like.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/req/mpd.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/req/req.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/rich.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/system.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/table.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/test/test_constants.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/time.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/url/other_url.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/const/values/url/url.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/archive.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/common/after.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/common/cache/read.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/common/cache/write.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/common/check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/common/logs/logs.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/common/logs/strings.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/common/timeline.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/highlights.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/init.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/labels.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/me.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/messages.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/paid.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/pinned.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/profile.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/streams.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/subscriptions/common.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/subscriptions/individual.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/subscriptions/lists.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/subscriptions/subscriptions.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/api/timeline.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/models/manager.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/models/models.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/models/utils/retriver.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/posts/post.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/data/posts/scrape_paid.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/__init__.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/backup.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/difference.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/merge.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/empty.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/labels.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/media.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/messages.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/others.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/posts.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/profile.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/stories.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/operations_/wrapper.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/transition.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/db/utils/convert.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/media/filters.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/media/main.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/models/date.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/models/flags.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/models/other.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/models/price.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/models/sort.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/models/subtype.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/filters/models/utils/logs.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/close/exit.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/close/final/final.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/close/final/final_log.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/close/final/final_script.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/close/final/final_user.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/manager.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/main/open/run.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/keybindings.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/promptConvert.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/actions.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/area.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/auth.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/menu.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/merge.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/model.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_groups/profile.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/prompt_strings.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/utils/model_helpers.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/prompts/utils/prompt_helpers.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/__init__.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/actions.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/ads.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/accessors/areas.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/accessors/output.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/accessors/quality.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/accessors/read.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/accessors/time.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/callbacks/arguments/post.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/callbacks/parse/choice.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/callbacks/parse/file.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/callbacks/parse/string.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/callbacks/parse/username.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/globals.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/helpers/hide_args.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/main.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/mutators/before.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/mutators/change.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/mutators/user.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/mutators/write.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/advanced_processing.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/advanced_program.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/advanced_user_filter.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/automatic.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/download.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/file.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/logging.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/media_content.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/metadata_filters.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/post_content.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/program.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/shared.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/user_list.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/user_select.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/user_sort.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/utils/date.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/arguments/utils/retry.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/db.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/main.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/manual.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/message.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/metadata.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/paid.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/post.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/commands/story.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/advanced_common.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/common.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/db.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/main.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/manual.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/message_check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/metadata.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/paid_check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/post_check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/story_check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/group_bundles/utils/check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/advanced_processing.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/advanced_program.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/advanced_user_filter.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/automatic.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/check_content.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/download.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/file.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/logging.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/media_filter.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/post_filter.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/program.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/user_list.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/user_select.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/parse/groups/user_sort.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/types/arrow.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/args/types/choice.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/data.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/file.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/make.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/request.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/schema.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/utils/context.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/utils/dict.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/utils/prompt.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/utils/warning/check.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/utils/warning/print.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/auth/utils/warning/warning.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/cache.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/custom.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/file.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/menu.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/schema.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/utils/context.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/config/utils/wrapper.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/console.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/constants.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/context/exit.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/context/run_async.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/context/stdout.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/dates.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/encoding.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/hash.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/classes/progress.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/classes/task.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/classes/transfercol.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/clear.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/empty.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/groups.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/live.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/panel.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/progress.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/screens.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/tasks.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/live/updater.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/classes/classes.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/classes/handlers/discord.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/classes/handlers/file.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/classes/handlers/text.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/close.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/globals.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/handle.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/logger.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/logs.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/other.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/stdout.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/utils/level.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/logs/utils/trace.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/manager.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/me.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/menu.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/merge.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/paths/common.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/paths/db.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/paths/manage.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/paths/paths.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/profiles/data.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/profiles/manage.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/profiles/tools.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/sems.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/separate.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/string.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/system/free.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/system/network.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/system/priority.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/system/speed.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/system/subprocess.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/ofscraper/utils/system/system.py +0 -0
- {ofscraper-3.13.dev7 → ofscraper-3.13.dev10}/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,186 @@
|
|
|
1
|
+
# .github/actions/retry-artifact-operation/action.yml
|
|
2
|
+
name: 'Retryable Artifact Operation (Fixed Attempts)'
|
|
3
|
+
description: 'Uploads or downloads artifacts with a fixed number of retries.'
|
|
4
|
+
|
|
5
|
+
inputs:
|
|
6
|
+
operation_type:
|
|
7
|
+
description: 'Specify "upload", "download-specific", or "download-all".' # Updated description for clarity
|
|
8
|
+
required: true
|
|
9
|
+
type: string
|
|
10
|
+
name:
|
|
11
|
+
description: 'Artifact name for upload or specific download. Omit/leave empty for "download-all".'
|
|
12
|
+
required: false # <--- CRITICAL: Set to false to allow omitting for "download-all"
|
|
13
|
+
type: string
|
|
14
|
+
path:
|
|
15
|
+
description: 'Paths for operation.'
|
|
16
|
+
required: true
|
|
17
|
+
type: string
|
|
18
|
+
if_no_files_found:
|
|
19
|
+
description: 'For upload: warn, error, ignore.'
|
|
20
|
+
required: false
|
|
21
|
+
default: 'warn'
|
|
22
|
+
type: string
|
|
23
|
+
overwrite:
|
|
24
|
+
description: 'For upload: true/false.'
|
|
25
|
+
required: false
|
|
26
|
+
default: 'true'
|
|
27
|
+
type: boolean
|
|
28
|
+
|
|
29
|
+
runs:
|
|
30
|
+
using: "composite"
|
|
31
|
+
steps:
|
|
32
|
+
# --- ATTEMPT 1 ---
|
|
33
|
+
# Path 1: Upload Logic for Attempt 1
|
|
34
|
+
- name: Attempt 1 - Upload Artifact
|
|
35
|
+
id: upload_attempt_1
|
|
36
|
+
if: ${{ inputs.operation_type == 'upload' }}
|
|
37
|
+
uses: actions/upload-artifact@v4
|
|
38
|
+
with:
|
|
39
|
+
name: ${{ inputs.name }}
|
|
40
|
+
path: ${{ inputs.path }}
|
|
41
|
+
if-no-files-found: ${{ inputs.if_no_files_found }}
|
|
42
|
+
overwrite: ${{ inputs.overwrite }}
|
|
43
|
+
continue-on-error: true
|
|
44
|
+
|
|
45
|
+
# Path 2: Download Specific Artifact Logic for Attempt 1
|
|
46
|
+
- name: Attempt 1 - Download Specific Artifact
|
|
47
|
+
id: download_specific_attempt_1 # Unique ID for specific download
|
|
48
|
+
if: ${{ inputs.operation_type == 'download' && inputs.name != '' }} # Run if download AND name is provided
|
|
49
|
+
uses: actions/download-artifact@v4
|
|
50
|
+
with:
|
|
51
|
+
name: ${{ inputs.name }}
|
|
52
|
+
path: ${{ inputs.path }}
|
|
53
|
+
continue-on-error: true
|
|
54
|
+
|
|
55
|
+
# Path 3: Download All Artifacts Logic for Attempt 1
|
|
56
|
+
- name: Attempt 1 - Download All Artifacts
|
|
57
|
+
id: download_all_attempt_1 # Unique ID for download all
|
|
58
|
+
if: ${{ inputs.operation_type == 'download' && inputs.name == '' }} # Run if download AND name is empty (implying download all)
|
|
59
|
+
uses: actions/download-artifact@v4
|
|
60
|
+
with:
|
|
61
|
+
# NO 'name' input here to explicitly trigger download all behavior
|
|
62
|
+
path: ${{ inputs.path }}
|
|
63
|
+
continue-on-error: true
|
|
64
|
+
|
|
65
|
+
# --- ATTEMPT 2 ---
|
|
66
|
+
# Delay for Attempt 2 (checking outcomes of previous attempt for all 3 paths)
|
|
67
|
+
- name: Delay for Attempt 2
|
|
68
|
+
if: | # Multi-line if condition for readability
|
|
69
|
+
${{ (inputs.operation_type == 'upload' && steps.upload_attempt_1.outcome == 'failure') ||
|
|
70
|
+
(inputs.operation_type == 'download' && inputs.name != '' && steps.download_specific_attempt_1.outcome == 'failure') ||
|
|
71
|
+
(inputs.operation_type == 'download' && inputs.name == '' && steps.download_all_attempt_1.outcome == 'failure') }}
|
|
72
|
+
run: |
|
|
73
|
+
echo "Previous attempt failed. Retrying in 10 seconds..." >&2
|
|
74
|
+
sleep 10
|
|
75
|
+
shell: bash
|
|
76
|
+
|
|
77
|
+
# Path 1: Upload Logic for Attempt 2
|
|
78
|
+
- name: Attempt 2 - Upload Artifact
|
|
79
|
+
id: upload_attempt_2
|
|
80
|
+
if: ${{ inputs.operation_type == 'upload' && steps.upload_attempt_1.outcome == 'failure' }}
|
|
81
|
+
uses: actions/upload-artifact@v4
|
|
82
|
+
with:
|
|
83
|
+
name: ${{ inputs.name }}
|
|
84
|
+
path: ${{ inputs.path }}
|
|
85
|
+
if-no-files-found: ${{ inputs.if_no_files_found }}
|
|
86
|
+
overwrite: ${{ inputs.overwrite }}
|
|
87
|
+
continue-on-error: true
|
|
88
|
+
|
|
89
|
+
# Path 2: Download Specific Artifact Logic for Attempt 2
|
|
90
|
+
- name: Attempt 2 - Download Specific Artifact
|
|
91
|
+
id: download_specific_attempt_2
|
|
92
|
+
if: ${{ inputs.operation_type == 'download' && inputs.name != '' && steps.download_specific_attempt_1.outcome == 'failure' }}
|
|
93
|
+
uses: actions/download-artifact@v4
|
|
94
|
+
with:
|
|
95
|
+
name: ${{ inputs.name }}
|
|
96
|
+
path: ${{ inputs.path }}
|
|
97
|
+
continue-on-error: true
|
|
98
|
+
|
|
99
|
+
# Path 3: Download All Artifacts Logic for Attempt 2
|
|
100
|
+
- name: Attempt 2 - Download All Artifacts
|
|
101
|
+
id: download_all_attempt_2
|
|
102
|
+
if: ${{ inputs.operation_type == 'download' && inputs.name == '' && steps.download_all_attempt_1.outcome == 'failure' }}
|
|
103
|
+
uses: actions/download-artifact@v4
|
|
104
|
+
with:
|
|
105
|
+
path: ${{ inputs.path }}
|
|
106
|
+
continue-on-error: true
|
|
107
|
+
|
|
108
|
+
# --- ATTEMPT 3 ---
|
|
109
|
+
# Delay for Attempt 3
|
|
110
|
+
- name: Delay for Attempt 3
|
|
111
|
+
if: |
|
|
112
|
+
${{ (inputs.operation_type == 'upload' && steps.upload_attempt_2.outcome == 'failure') ||
|
|
113
|
+
(inputs.operation_type == 'download' && inputs.name != '' && steps.download_specific_attempt_2.outcome == 'failure') ||
|
|
114
|
+
(inputs.operation_type == 'download' && inputs.name == '' && steps.download_all_attempt_2.outcome == 'failure') }}
|
|
115
|
+
run: |
|
|
116
|
+
echo "Previous attempt failed. Retrying in 10 seconds..." >&2
|
|
117
|
+
sleep 10
|
|
118
|
+
shell: bash
|
|
119
|
+
|
|
120
|
+
# Path 1: Upload Logic for Attempt 3
|
|
121
|
+
- name: Attempt 3 - Upload Artifact
|
|
122
|
+
id: upload_attempt_3
|
|
123
|
+
if: ${{ inputs.operation_type == 'upload' && steps.upload_attempt_2.outcome == 'failure' }}
|
|
124
|
+
uses: actions/upload-artifact@v4
|
|
125
|
+
with:
|
|
126
|
+
name: ${{ inputs.name }}
|
|
127
|
+
path: ${{ inputs.path }}
|
|
128
|
+
if-no-files-found: ${{ inputs.if_no_files_found }}
|
|
129
|
+
overwrite: ${{ inputs.overwrite }}
|
|
130
|
+
continue-on-error: true
|
|
131
|
+
|
|
132
|
+
# Path 2: Download Specific Artifact Logic for Attempt 3
|
|
133
|
+
- name: Attempt 3 - Download Specific Artifact
|
|
134
|
+
id: download_specific_attempt_3
|
|
135
|
+
if: ${{ inputs.operation_type == 'download' && inputs.name != '' && steps.download_specific_attempt_2.outcome == 'failure' }}
|
|
136
|
+
uses: actions/download-artifact@v4
|
|
137
|
+
with:
|
|
138
|
+
name: ${{ inputs.name }}
|
|
139
|
+
path: ${{ inputs.path }}
|
|
140
|
+
continue-on-error: true
|
|
141
|
+
|
|
142
|
+
# Path 3: Download All Artifacts Logic for Attempt 3
|
|
143
|
+
- name: Attempt 3 - Download All Artifacts
|
|
144
|
+
id: download_all_attempt_3
|
|
145
|
+
if: ${{ inputs.operation_type == 'download' && inputs.name == '' && steps.download_all_attempt_2.outcome == 'failure' }}
|
|
146
|
+
uses: actions/download-artifact@v4
|
|
147
|
+
with:
|
|
148
|
+
path: ${{ inputs.path }}
|
|
149
|
+
continue-on-error: true
|
|
150
|
+
|
|
151
|
+
# --- FINAL STATUS CHECK ---
|
|
152
|
+
# This step will fail the composite action if all attempts for the chosen operation failed
|
|
153
|
+
- name: Final Check on Operation Status
|
|
154
|
+
run: |
|
|
155
|
+
if [ "${{ inputs.operation_type }}" == "upload" ]; then
|
|
156
|
+
if [ "${{ steps.upload_attempt_1.outcome }}" == "failure" ] && \
|
|
157
|
+
[ "${{ steps.upload_attempt_2.outcome }}" == "failure" ] && \
|
|
158
|
+
[ "${{ steps.upload_attempt_3.outcome }}" == "failure" ]; then
|
|
159
|
+
echo "::error::Artifact upload failed after all 3 attempts." >&2
|
|
160
|
+
exit 1
|
|
161
|
+
fi
|
|
162
|
+
elif [ "${{ inputs.operation_type }}" == "download" ]; then
|
|
163
|
+
DOWNLOAD_FAILED="false"
|
|
164
|
+
if [ "${{ inputs.name }}" != "" ]; then # Check specific download path if name was provided
|
|
165
|
+
if [ "${{ steps.download_specific_attempt_1.outcome }}" == "failure" ] && \
|
|
166
|
+
[ "${{ steps.download_specific_attempt_2.outcome }}" == "failure" ] && \
|
|
167
|
+
[ "${{ steps.download_specific_attempt_3.outcome }}" == "failure" ]; then
|
|
168
|
+
DOWNLOAD_FAILED="true"
|
|
169
|
+
fi
|
|
170
|
+
else # Check download all path if name was NOT provided
|
|
171
|
+
if [ "${{ steps.download_all_attempt_1.outcome }}" == "failure" ] && \
|
|
172
|
+
[ "${{ steps.download_all_attempt_2.outcome }}" == "failure" ] && \
|
|
173
|
+
[ "${{ steps.download_all_attempt_3.outcome }}" == "failure" ]; then
|
|
174
|
+
DOWNLOAD_FAILED="true"
|
|
175
|
+
fi
|
|
176
|
+
fi
|
|
177
|
+
|
|
178
|
+
if [ "$DOWNLOAD_FAILED" == "true" ]; then
|
|
179
|
+
echo "::error::Artifact download failed after all 3 attempts." >&2
|
|
180
|
+
exit 1
|
|
181
|
+
fi
|
|
182
|
+
else
|
|
183
|
+
echo "::error::Invalid operation_type specified. Must be 'upload' or 'download'." >&2
|
|
184
|
+
exit 1
|
|
185
|
+
fi
|
|
186
|
+
shell: bash
|
|
@@ -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
|