ofscraper 3.13.dev5__tar.gz → 3.13.dev7__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.dev5 → ofscraper-3.13.dev7}/PKG-INFO +5 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/README.md +3 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/sessionmanager/download.py +7 -16
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/sessionmanager/sessionmanager.py +147 -8
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/metadata/metadata.py +1 -4
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/download.py +1 -5
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/managers/alt_download.py +58 -23
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/managers/downloadmanager.py +3 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/managers/main_download.py +60 -26
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/run.py +0 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/utils/chunk.py +4 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/like/like.py +2 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/globals.py +1 -37
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/scraper.py +4 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/utils/schedule.py +2 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/utils/command.py +6 -6
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/action/download.py +1 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/req/req.py +4 -3
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/system.py +1 -1
- ofscraper-3.13.dev7/ofscraper/data/api/common/after.py +25 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/models/utils/retriver.py +3 -3
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/posts/scrape_paid.py +1 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/media/filters.py +0 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/media/main.py +6 -4
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/close/final/final_log.py +0 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/open/load.py +0 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/config.py +4 -3
- ofscraper-3.13.dev7/ofscraper/utils/args/accessors/actions.py +0 -0
- ofscraper-3.13.dev7/ofscraper/utils/args/callbacks/arguments/post.py +6 -0
- ofscraper-3.13.dev7/ofscraper/utils/args/callbacks/arguments/username.py +9 -0
- {ofscraper-3.13.dev5/ofscraper/utils/args/callbacks → ofscraper-3.13.dev7/ofscraper/utils/args/callbacks/parse}/file.py +1 -1
- {ofscraper-3.13.dev5/ofscraper/utils/args/callbacks → ofscraper-3.13.dev7/ofscraper/utils/args/callbacks/parse}/string.py +1 -1
- {ofscraper-3.13.dev5/ofscraper/utils/args/callbacks → ofscraper-3.13.dev7/ofscraper/utils/args/callbacks/parse}/username.py +2 -3
- ofscraper-3.13.dev7/ofscraper/utils/args/parse/arguments/advanced_processing.py +33 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/advanced_program.py +1 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/automatic.py +1 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/check.py +2 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/logging.py +2 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/media_content.py +3 -3
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/metadata_filters.py +4 -16
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/post_content.py +15 -16
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/user_select.py +1 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/db.py +4 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/main.py +0 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/check.py +3 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/db.py +3 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/main.py +2 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/advanced_processing.py +3 -6
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/post_filter.py +0 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/data.py +1 -7
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/updater.py +11 -15
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/classes/classes.py +0 -14
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/classes/handlers/discord.py +6 -120
- ofscraper-3.13.dev7/ofscraper/utils/logs/classes/handlers/file.py +47 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/close.py +0 -22
- ofscraper-3.13.dev7/ofscraper/utils/logs/logger.py +49 -0
- ofscraper-3.13.dev7/ofscraper/utils/logs/other.py +49 -0
- ofscraper-3.13.dev7/ofscraper/utils/logs/stdout.py +53 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/utils/level.py +0 -4
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/paths/manage.py +1 -1
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/settings.py +9 -5
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/system/subprocess.py +2 -2
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/text.py +1 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/pyproject.toml +4 -3
- ofscraper-3.13.dev5/ofscraper/commands/scraper/actions/utils/buffer.py +0 -21
- ofscraper-3.13.dev5/ofscraper/data/api/common/after.py +0 -34
- ofscraper-3.13.dev5/ofscraper/utils/args/parse/arguments/advanced_processing.py +0 -29
- ofscraper-3.13.dev5/ofscraper/utils/args/parse/arguments/db.py +0 -15
- ofscraper-3.13.dev5/ofscraper/utils/logs/classes/handlers/file.py +0 -18
- ofscraper-3.13.dev5/ofscraper/utils/logs/classes/handlers/pipe.py +0 -72
- ofscraper-3.13.dev5/ofscraper/utils/logs/classes/handlers/rich.py +0 -136
- ofscraper-3.13.dev5/ofscraper/utils/logs/classes/handlers/zmq.py +0 -72
- ofscraper-3.13.dev5/ofscraper/utils/logs/logger.py +0 -42
- ofscraper-3.13.dev5/ofscraper/utils/logs/other.py +0 -241
- ofscraper-3.13.dev5/ofscraper/utils/logs/stdout.py +0 -277
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/LICENSE +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/__main__.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/__version__.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/__version__.pye +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/labels.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/of/base.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/of/media.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/of/posts.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/placeholder.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/sessionmanager/ofsession.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/app.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/compose.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/const.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/css.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/boolfield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/datefield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/downloadfield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/mediafield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/numfield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/pricefield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/responsefield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/selectfield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/sizefield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/textsearch.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/fields/timefield.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/inputs/filterinput.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/inputs/intergerinput.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/inputs/strinput.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/sections/sidebar.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/sections/table.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/sections/table_console.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/utils/lock.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/table/utils/names.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/db.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/manual.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/metadata/consumer.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/metadata/desc.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/metadata/manager.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/utils/desc.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/utils/keyhelpers.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/utils/leaky.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/utils/retries.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/utils/text.py +0 -0
- /ofscraper-3.13.dev5/ofscraper/commands/scraper/utils/daemon.py → /ofscraper-3.13.dev7/ofscraper/commands/scraper/actions/utils/buffer.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/general.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/log.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/params.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/paths/media.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/paths/paths.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/progress/convert.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/progress/update.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/retries.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/send/chunk.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/send/message.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/threads.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/utils/workers.py +0 -0
- /ofscraper-3.13.dev5/ofscraper/const/values/req/like.py → /ofscraper-3.13.dev7/ofscraper/commands/scraper/utils/daemon.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/utils/jobqueue.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/utils/prepare.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/utils/print.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/utils/scrape_context.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/utils/strings.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/constants.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/action/like.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/action/metadata.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/binary.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/config.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/date.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/download.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/dynamic.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/general.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/list.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/live.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/logger.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/path/bytes.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/path/files.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/path/general.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/path/path.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/prompts.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/req/anon.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/req/api.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/req/cdm.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/req/discord.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/req/git.py +0 -0
- /ofscraper-3.13.dev5/ofscraper/utils/args/accessors/actions.py → /ofscraper-3.13.dev7/ofscraper/const/values/req/like.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/req/mpd.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/rich.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/table.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/test/test_constants.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/time.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/url/other_url.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/const/values/url/url.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/archive.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/common/cache/read.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/common/cache/write.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/common/check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/common/logs/logs.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/common/logs/strings.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/common/timeline.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/highlights.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/init.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/labels.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/me.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/messages.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/paid.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/pinned.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/profile.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/streams.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/subscriptions/common.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/subscriptions/individual.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/subscriptions/lists.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/subscriptions/subscriptions.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/api/timeline.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/models/manager.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/models/models.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/data/posts/post.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/__init__.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/backup.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/difference.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/merge.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/empty.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/labels.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/media.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/messages.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/others.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/posts.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/profile.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/stories.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/operations_/wrapper.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/transition.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/db/utils/convert.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/models/date.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/models/flags.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/models/other.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/models/price.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/models/sort.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/models/subtype.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/filters/models/utils/logs.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/close/exit.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/close/final/final.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/close/final/final_script.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/close/final/final_user.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/manager.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/main/open/run.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/keybindings.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/promptConvert.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/actions.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/area.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/auth.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/binary.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/menu.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/merge.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/model.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_groups/profile.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_strings.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompt_validators.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/prompts.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/utils/model_helpers.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/prompts/utils/prompt_helpers.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/__init__.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/actions.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/ads.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/accessors/areas.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/accessors/output.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/accessors/quality.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/accessors/read.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/accessors/time.py +0 -0
- {ofscraper-3.13.dev5/ofscraper/utils/args/callbacks → ofscraper-3.13.dev7/ofscraper/utils/args/callbacks/parse}/choice.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/globals.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/helpers/hide_args.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/main.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/mutators/before.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/mutators/change.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/mutators/user.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/mutators/write.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/advanced_user_filter.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/download.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/file.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/program.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/shared.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/user_list.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/user_sort.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/utils/date.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/arguments/utils/retry.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/manual.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/message.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/metadata.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/paid.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/post.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/commands/story.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/advanced_common.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/common.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/manual.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/message_check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/metadata.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/paid_check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/post_check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/story_check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/group_bundles/utils/check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/advanced_program.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/advanced_user_filter.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/automatic.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/check_content.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/download.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/file.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/logging.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/media_filter.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/program.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/user_list.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/user_select.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/parse/groups/user_sort.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/types/arrow.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/args/types/choice.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/data.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/file.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/make.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/request.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/schema.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/utils/context.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/utils/dict.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/utils/prompt.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/utils/warning/check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/utils/warning/print.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/auth/utils/warning/warning.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/binaries.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/cache.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/checkers.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/config.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/custom.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/file.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/menu.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/schema.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/utils/context.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/config/utils/wrapper.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/console.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/constants.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/context/exit.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/context/run_async.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/context/stdout.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/dates.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/encoding.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/hash.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/classes/progress.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/classes/task.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/classes/transfercol.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/clear.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/empty.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/groups.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/live.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/panel.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/progress.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/screens.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/live/tasks.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/classes/handlers/text.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/globals.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/handle.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/logs.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/logs/utils/trace.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/manager.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/me.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/menu.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/merge.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/paths/check.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/paths/common.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/paths/db.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/paths/paths.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/profiles/data.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/profiles/manage.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/profiles/tools.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/sems.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/separate.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/string.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/system/free.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/system/network.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/system/priority.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/system/speed.py +0 -0
- {ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/utils/system/system.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: ofscraper
|
|
3
|
-
Version: 3.13.
|
|
3
|
+
Version: 3.13.dev7
|
|
4
4
|
Summary: automatically scrape onlyfans
|
|
5
5
|
Author: datawhores
|
|
6
6
|
Author-email: datawhores@riseup.net
|
|
@@ -27,6 +27,7 @@ Requires-Dist: faust-cchardet (>=2.1.19,<3.0.0)
|
|
|
27
27
|
Requires-Dist: filelock (>=3.13.1,<4.0.0)
|
|
28
28
|
Requires-Dist: httpx-aiohttp (>=0.1.2,<0.2.0)
|
|
29
29
|
Requires-Dist: httpx-curl-cffi (>=0.1.3,<0.2.0)
|
|
30
|
+
Requires-Dist: httpx[http2] (>=0.28.1,<0.29.0)
|
|
30
31
|
Requires-Dist: humanfriendly (>=10.0,<11.0)
|
|
31
32
|
Requires-Dist: idna (==3.7)
|
|
32
33
|
Requires-Dist: inquirerpy (>=0.3.4,<0.4.0)
|
|
@@ -70,6 +71,9 @@ As the API has changed older version are no longer viable
|
|
|
70
71
|
|
|
71
72
|
https://github.com/datawhores/OF-Scraper/issues/442
|
|
72
73
|
|
|
74
|
+
# For Issues related to Downloading/ No Models Retrieved error
|
|
75
|
+
https://github.com/datawhores/OF-Scraper/issues/542
|
|
76
|
+
|
|
73
77
|
# ReadMe
|
|
74
78
|
|
|
75
79
|
## Releases
|
|
@@ -11,6 +11,9 @@ As the API has changed older version are no longer viable
|
|
|
11
11
|
|
|
12
12
|
https://github.com/datawhores/OF-Scraper/issues/442
|
|
13
13
|
|
|
14
|
+
# For Issues related to Downloading/ No Models Retrieved error
|
|
15
|
+
https://github.com/datawhores/OF-Scraper/issues/542
|
|
16
|
+
|
|
14
17
|
# ReadMe
|
|
15
18
|
|
|
16
19
|
## Releases
|
|
@@ -14,24 +14,30 @@ from ofscraper.classes.sessionmanager.sessionmanager import (
|
|
|
14
14
|
)
|
|
15
15
|
from ofscraper.commands.scraper.actions.download.utils.leaky import LeakyBucket
|
|
16
16
|
import ofscraper.utils.settings as settings
|
|
17
|
+
from ofscraper.commands.scraper.actions.download.utils.chunk import get_chunk_timeout
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
class download_session(sessionManager.sessionManager):
|
|
20
21
|
def __init__(
|
|
21
22
|
self, sem_count=None, retries=None, wait_min=None, wait_max=None, log=None
|
|
22
23
|
) -> None:
|
|
23
|
-
sem_count = sem_count or common_globals.sem
|
|
24
24
|
retries = retries or get_download_req_retries()
|
|
25
25
|
wait_min = wait_min or constants.getattr("OF_MIN_WAIT_API")
|
|
26
26
|
wait_max = wait_max or constants.getattr("OF_MAX_WAIT_API")
|
|
27
|
+
read_timeout=get_chunk_timeout()
|
|
27
28
|
log = log or common_globals.log
|
|
28
29
|
self.leaky_bucket = LeakyBucket(settings.get_settings().download_limit, 1)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
29
34
|
super().__init__(
|
|
30
35
|
sem_count=sem_count,
|
|
31
36
|
retries=retries,
|
|
32
37
|
wait_min=wait_min,
|
|
33
38
|
wait_max=wait_max,
|
|
34
39
|
log=log,
|
|
40
|
+
read_timeout=read_timeout
|
|
35
41
|
)
|
|
36
42
|
|
|
37
43
|
@contextlib.asynccontextmanager
|
|
@@ -56,19 +62,6 @@ class download_session(sessionManager.sessionManager):
|
|
|
56
62
|
t.request = t.request
|
|
57
63
|
return t
|
|
58
64
|
|
|
59
|
-
async def _aio_funct(self, method, *args, **kwargs):
|
|
60
|
-
# public function forces context manager use
|
|
61
|
-
r = await self._session._request(method, *args, **kwargs)
|
|
62
|
-
r.text_ = r.text
|
|
63
|
-
r.json_ = r.json
|
|
64
|
-
r.iter_chunked = self.chunk_with_limit(r.content.iter_chunked)
|
|
65
|
-
r.iter_chunks = self.chunk_with_limit(r.content.iter_chunks)
|
|
66
|
-
r.request = r.request_info
|
|
67
|
-
r.status_code = r.status
|
|
68
|
-
r.read_ = r.content.read
|
|
69
|
-
r.eof = r.content.at_eof
|
|
70
|
-
return r
|
|
71
|
-
|
|
72
65
|
async def factoryasync(self, input):
|
|
73
66
|
if callable(input):
|
|
74
67
|
return input()
|
|
@@ -88,11 +81,9 @@ class download_session(sessionManager.sessionManager):
|
|
|
88
81
|
|
|
89
82
|
class cdm_session(sessionManager.sessionManager):
|
|
90
83
|
def __init__(self, sem_count=None) -> None:
|
|
91
|
-
sem_count = sem_count or common_globals.sem
|
|
92
84
|
super().__init__(sem_count=sem_count)
|
|
93
85
|
|
|
94
86
|
|
|
95
87
|
class cdm_session_manual(ofsessionmanager.OFSessionManager):
|
|
96
88
|
def __init__(self, sem_count=None) -> None:
|
|
97
|
-
sem_count = sem_count or common_globals.sem
|
|
98
89
|
super().__init__(sem_count=sem_count)
|
{ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/classes/sessionmanager/sessionmanager.py
RENAMED
|
@@ -50,8 +50,15 @@ def check_400(exception):
|
|
|
50
50
|
time.sleep(8)
|
|
51
51
|
|
|
52
52
|
|
|
53
|
+
|
|
53
54
|
def is_provided_exception_number(exception, *numbers):
|
|
54
55
|
return (
|
|
56
|
+
isinstance(exception, aiohttp.ClientResponseError)
|
|
57
|
+
and (
|
|
58
|
+
getattr(exception, "status_code", None)
|
|
59
|
+
or getattr(exception, "status", None) in numbers
|
|
60
|
+
)
|
|
61
|
+
) or (
|
|
55
62
|
isinstance(exception, httpx.HTTPStatusError)
|
|
56
63
|
and (
|
|
57
64
|
(
|
|
@@ -62,7 +69,6 @@ def is_provided_exception_number(exception, *numbers):
|
|
|
62
69
|
)
|
|
63
70
|
)
|
|
64
71
|
|
|
65
|
-
|
|
66
72
|
class SessionSleep:
|
|
67
73
|
def __init__(self, sleep=None, difmin=None):
|
|
68
74
|
self._sleep = None
|
|
@@ -179,7 +185,6 @@ class sessionManager:
|
|
|
179
185
|
):
|
|
180
186
|
connect_timeout = connect_timeout or constants.getattr("CONNECT_TIMEOUT")
|
|
181
187
|
total_timeout = total_timeout or constants.getattr("TOTAL_TIMEOUT")
|
|
182
|
-
read_timeout = read_timeout or constants.getattr("CHUNK_READ_TIMEOUT")
|
|
183
188
|
pool_timeout = pool_timeout or constants.getattr("POOL_CONNECT_TIMEOUT")
|
|
184
189
|
limit = limit or constants.getattr("MAX_CONNECTIONS")
|
|
185
190
|
keep_alive = keep_alive or constants.getattr("KEEP_ALIVE")
|
|
@@ -188,7 +193,7 @@ class sessionManager:
|
|
|
188
193
|
proxy_auth = proxy_auth or constants.getattr("PROXY_AUTH")
|
|
189
194
|
self._connect_timeout = connect_timeout
|
|
190
195
|
self._total_timeout = total_timeout
|
|
191
|
-
self._read_timeout
|
|
196
|
+
self._read_timeout=read_timeout
|
|
192
197
|
self._pool_connect_timeout = pool_timeout
|
|
193
198
|
self._connect_limit = limit
|
|
194
199
|
self._keep_alive = keep_alive
|
|
@@ -217,7 +222,7 @@ class sessionManager:
|
|
|
217
222
|
return
|
|
218
223
|
if async_:
|
|
219
224
|
self._session = httpx.AsyncClient(
|
|
220
|
-
|
|
225
|
+
http2=True,
|
|
221
226
|
proxy=self._proxy,
|
|
222
227
|
limits=httpx.Limits(
|
|
223
228
|
max_keepalive_connections=self._keep_alive,
|
|
@@ -232,7 +237,7 @@ class sessionManager:
|
|
|
232
237
|
)
|
|
233
238
|
else:
|
|
234
239
|
self._session = httpx.Client(
|
|
235
|
-
|
|
240
|
+
http2=True,
|
|
236
241
|
proxy=self._proxy,
|
|
237
242
|
limits=httpx.Limits(
|
|
238
243
|
max_keepalive_connections=self._keep_alive,
|
|
@@ -347,7 +352,7 @@ class sessionManager:
|
|
|
347
352
|
total_timeout or self._total_timeout,
|
|
348
353
|
connect=connect_timeout or self._connect_timeout,
|
|
349
354
|
pool=pool_connect_timeout or self._pool_connect_timeout,
|
|
350
|
-
read=read_timeout or self._read_timeout
|
|
355
|
+
read=read_timeout or self._read_timeout
|
|
351
356
|
),
|
|
352
357
|
url=url,
|
|
353
358
|
follow_redirects=redirects,
|
|
@@ -429,9 +434,9 @@ class sessionManager:
|
|
|
429
434
|
),
|
|
430
435
|
reraise=True,
|
|
431
436
|
):
|
|
437
|
+
await sem.acquire()
|
|
432
438
|
with _:
|
|
433
439
|
r = None
|
|
434
|
-
await sem.acquire()
|
|
435
440
|
try:
|
|
436
441
|
await sleeper.async_do_sleep()
|
|
437
442
|
if (
|
|
@@ -456,7 +461,8 @@ class sessionManager:
|
|
|
456
461
|
total_timeout or self._total_timeout,
|
|
457
462
|
connect=connect_timeout or self._connect_timeout,
|
|
458
463
|
pool=pool_connect_timeout or self._pool_connect_timeout,
|
|
459
|
-
read=read_timeout or self._read_timeout
|
|
464
|
+
read=read_timeout or self._read_timeout
|
|
465
|
+
|
|
460
466
|
),
|
|
461
467
|
follow_redirects=redirects,
|
|
462
468
|
url=url,
|
|
@@ -487,6 +493,118 @@ class sessionManager:
|
|
|
487
493
|
yield r
|
|
488
494
|
sem.release()
|
|
489
495
|
|
|
496
|
+
@contextlib.asynccontextmanager
|
|
497
|
+
async def requests_async_stream(
|
|
498
|
+
self,
|
|
499
|
+
url=None,
|
|
500
|
+
wait_min=None,
|
|
501
|
+
wait_max=None,
|
|
502
|
+
wait_min_exponential=None,
|
|
503
|
+
wait_max_exponential=None,
|
|
504
|
+
retries=None,
|
|
505
|
+
method="get",
|
|
506
|
+
headers=None,
|
|
507
|
+
cookies=None,
|
|
508
|
+
json=None,
|
|
509
|
+
params=None,
|
|
510
|
+
redirects=True,
|
|
511
|
+
data=None,
|
|
512
|
+
log=None,
|
|
513
|
+
sem=None,
|
|
514
|
+
total_timeout=None,
|
|
515
|
+
connect_timeout=None,
|
|
516
|
+
pool_connect_timeout=None,
|
|
517
|
+
read_timeout=None,
|
|
518
|
+
sleeper=None,
|
|
519
|
+
exceptions=[],
|
|
520
|
+
actions=[],
|
|
521
|
+
*args,
|
|
522
|
+
**kwargs,
|
|
523
|
+
):
|
|
524
|
+
wait_min = wait_min or self._wait_min
|
|
525
|
+
wait_max = wait_max or self._wait_max
|
|
526
|
+
wait_min_exponential = wait_min_exponential or self._wait_min_exponential
|
|
527
|
+
wait_max_exponential = wait_max_exponential or self._wait_max_exponential
|
|
528
|
+
log = log or self._log
|
|
529
|
+
retries = retries or self._retries
|
|
530
|
+
sem = sem or self._sem
|
|
531
|
+
sleeper = sleeper or self._sleeper
|
|
532
|
+
exceptions = exceptions or []
|
|
533
|
+
actions = actions or []
|
|
534
|
+
async for _ in CustomTenacity(
|
|
535
|
+
wait_exponential=tenacity.wait.wait_exponential(
|
|
536
|
+
multiplier=2, min=wait_min_exponential, max=wait_max_exponential
|
|
537
|
+
),
|
|
538
|
+
retry=retry_if_not_exception_type((KeyboardInterrupt)),
|
|
539
|
+
wait_random=tenacity.wait_random(min=wait_min, max=wait_max),
|
|
540
|
+
stop=tenacity.stop.stop_after_attempt(retries),
|
|
541
|
+
before=lambda x: (
|
|
542
|
+
log.debug(f"[bold]attempt: {x.attempt_number}[bold] for {url}")
|
|
543
|
+
if x.attempt_number > 1
|
|
544
|
+
else None
|
|
545
|
+
),
|
|
546
|
+
reraise=True,
|
|
547
|
+
):
|
|
548
|
+
with _:
|
|
549
|
+
r = None
|
|
550
|
+
try:
|
|
551
|
+
await sem.acquire()
|
|
552
|
+
await sleeper.async_do_sleep()
|
|
553
|
+
if (
|
|
554
|
+
SIGN in actions
|
|
555
|
+
or FORCED_NEW in actions
|
|
556
|
+
or HEADERS in actions
|
|
557
|
+
):
|
|
558
|
+
headers = (
|
|
559
|
+
self._create_headers(
|
|
560
|
+
headers, url, SIGN in actions, FORCED_NEW in actions
|
|
561
|
+
)
|
|
562
|
+
|
|
563
|
+
)
|
|
564
|
+
|
|
565
|
+
|
|
566
|
+
cookies = self._create_cookies() if COOKIES in actions else None
|
|
567
|
+
json = json
|
|
568
|
+
params = params
|
|
569
|
+
r = await self._httpx_funct_async_stream(
|
|
570
|
+
method,
|
|
571
|
+
timeout=httpx.Timeout(
|
|
572
|
+
total_timeout or self._total_timeout,
|
|
573
|
+
connect=connect_timeout or self._connect_timeout,
|
|
574
|
+
pool=pool_connect_timeout or self._pool_connect_timeout,
|
|
575
|
+
read=read_timeout or self._read_timeout
|
|
576
|
+
),
|
|
577
|
+
follow_redirects=redirects,
|
|
578
|
+
url=url,
|
|
579
|
+
cookies=cookies,
|
|
580
|
+
headers=headers,
|
|
581
|
+
json=json,
|
|
582
|
+
params=params,
|
|
583
|
+
data=data,
|
|
584
|
+
)
|
|
585
|
+
if r.status_code == 404:
|
|
586
|
+
pass
|
|
587
|
+
elif not r.ok:
|
|
588
|
+
log.debug(f"[bold]failed: [bold] {r.url}")
|
|
589
|
+
log.debug(f"[bold]status: [bold] {r.status}")
|
|
590
|
+
log.debug(f"response headers {dict(r.headers)}")
|
|
591
|
+
log.debug(f"requests headers mode{dict(r.request.headers)}")
|
|
592
|
+
r.raise_for_status()
|
|
593
|
+
yield r
|
|
594
|
+
except Exception as E:
|
|
595
|
+
# only call from sync req like "me"
|
|
596
|
+
# check_400(E)
|
|
597
|
+
log.traceback_(E)
|
|
598
|
+
log.traceback_(traceback.format_exc())
|
|
599
|
+
if TOO_MANY in exceptions:
|
|
600
|
+
await async_is_rate_limited(E, sleeper)
|
|
601
|
+
raise E
|
|
602
|
+
finally:
|
|
603
|
+
sem.release()
|
|
604
|
+
await r.aclose()
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
|
|
490
608
|
@property
|
|
491
609
|
def sleep(self):
|
|
492
610
|
return self._sleeper._sleep
|
|
@@ -506,6 +624,27 @@ class sessionManager:
|
|
|
506
624
|
t.read_ = t.aread
|
|
507
625
|
t.request = t.request
|
|
508
626
|
return t
|
|
627
|
+
|
|
628
|
+
async def _httpx_funct_async_stream(self, *args, **kwargs):
|
|
629
|
+
auth=kwargs.pop("auth",None)
|
|
630
|
+
follow_redirects=kwargs.pop("follow_redirects",None)
|
|
631
|
+
req=self._session.build_request(*args, **kwargs)
|
|
632
|
+
t = await self._session.send(
|
|
633
|
+
request=req,
|
|
634
|
+
follow_redirects=follow_redirects,
|
|
635
|
+
stream=True,
|
|
636
|
+
auth=auth,
|
|
637
|
+
)
|
|
638
|
+
t.ok = not t.is_error
|
|
639
|
+
t.json_ = lambda: self.factoryasync(t.json)
|
|
640
|
+
t.text_ = lambda: self.factoryasync(t.text)
|
|
641
|
+
t.status = t.status_code
|
|
642
|
+
t.iter_chunked = t.aiter_bytes
|
|
643
|
+
t.iter_chunks = t.aiter_bytes
|
|
644
|
+
t.read_ = t.aread
|
|
645
|
+
t.request = t.request
|
|
646
|
+
return t
|
|
647
|
+
|
|
509
648
|
|
|
510
649
|
def _httpx_funct(self, method, **kwargs):
|
|
511
650
|
t = self._session.request(method.upper(), **kwargs)
|
|
@@ -48,7 +48,6 @@ import ofscraper.utils.context.exit as exit
|
|
|
48
48
|
from ofscraper.classes.sessionmanager.download import download_session
|
|
49
49
|
from ofscraper.commands.scraper.actions.utils.log import final_log, final_log_text
|
|
50
50
|
from ofscraper.commands.scraper.actions.utils.paths.paths import setDirectoriesDate
|
|
51
|
-
from ofscraper.commands.scraper.actions.utils.buffer import download_log_clear_helper
|
|
52
51
|
|
|
53
52
|
from ofscraper.commands.scraper.actions.utils.workers import get_max_workers
|
|
54
53
|
from ofscraper.utils.context.run_async import run
|
|
@@ -192,7 +191,7 @@ class metadataCommandManager(commmandManager):
|
|
|
192
191
|
and avatar
|
|
193
192
|
and settings.get_settings().userfirst
|
|
194
193
|
):
|
|
195
|
-
logging.getLogger("
|
|
194
|
+
logging.getLogger("shared").warning(
|
|
196
195
|
avatar_str.format(avatar=avatar)
|
|
197
196
|
)
|
|
198
197
|
data.extend(
|
|
@@ -294,7 +293,6 @@ def metadata():
|
|
|
294
293
|
|
|
295
294
|
@run
|
|
296
295
|
async def process_dicts(username, model_id, medialist):
|
|
297
|
-
download_log_clear_helper()
|
|
298
296
|
task1 = None
|
|
299
297
|
with progress_utils.setup_metadata_progress_live():
|
|
300
298
|
common_globals.mainProcessVariableInit()
|
|
@@ -337,7 +335,6 @@ async def process_dicts(username, model_id, medialist):
|
|
|
337
335
|
common_globals.thread.shutdown()
|
|
338
336
|
|
|
339
337
|
setDirectoriesDate()
|
|
340
|
-
download_log_clear_helper()
|
|
341
338
|
progress_updater.remove_metadata_task(task1)
|
|
342
339
|
final_log(username)
|
|
343
340
|
return final_log_text(username)
|
{ofscraper-3.13.dev5 → ofscraper-3.13.dev7}/ofscraper/commands/scraper/actions/download/download.py
RENAMED
|
@@ -22,7 +22,6 @@ from ofscraper.classes.sessionmanager.download import download_session
|
|
|
22
22
|
from ofscraper.commands.scraper.actions.utils.log import final_log, final_log_text
|
|
23
23
|
|
|
24
24
|
from ofscraper.commands.scraper.actions.utils.paths.paths import setDirectoriesDate
|
|
25
|
-
from ofscraper.commands.scraper.actions.utils.buffer import download_log_clear_helper
|
|
26
25
|
|
|
27
26
|
from ofscraper.commands.scraper.actions.utils.workers import get_max_workers
|
|
28
27
|
from ofscraper.utils.context.run_async import run
|
|
@@ -45,7 +44,7 @@ async def downloader(username=None, model_id=None, posts=None, media=None, **kwa
|
|
|
45
44
|
)
|
|
46
45
|
|
|
47
46
|
progress_updater.update_activity_task(description=download_str + path_str)
|
|
48
|
-
logging.getLogger("
|
|
47
|
+
logging.getLogger("shared").warning(
|
|
49
48
|
download_activity_str.format(username=username)
|
|
50
49
|
)
|
|
51
50
|
progress_updater.update_activity_task(description="")
|
|
@@ -71,7 +70,6 @@ async def download_model_deleted_process(
|
|
|
71
70
|
@run
|
|
72
71
|
async def process_dicts(username, model_id, medialist, posts):
|
|
73
72
|
log_text_array = []
|
|
74
|
-
download_log_clear_helper()
|
|
75
73
|
log_text_array.append(await textDownloader(posts, username=username))
|
|
76
74
|
logging.getLogger("shared").info("Downloading in single thread mode")
|
|
77
75
|
common_globals.mainProcessVariableInit()
|
|
@@ -103,7 +101,6 @@ async def process_dicts(username, model_id, medialist, posts):
|
|
|
103
101
|
try:
|
|
104
102
|
|
|
105
103
|
aws = []
|
|
106
|
-
|
|
107
104
|
async with download_session() as c:
|
|
108
105
|
for ele in medialist:
|
|
109
106
|
aws.append((c, ele, model_id, username))
|
|
@@ -139,7 +136,6 @@ async def process_dicts(username, model_id, medialist, posts):
|
|
|
139
136
|
common_globals.thread.shutdown()
|
|
140
137
|
|
|
141
138
|
setDirectoriesDate()
|
|
142
|
-
download_log_clear_helper()
|
|
143
139
|
final_log(username, log=logging.getLogger("shared"))
|
|
144
140
|
progress_updater.remove_download_task(task1)
|
|
145
141
|
log_text_array.append(final_log_text(username))
|
|
@@ -36,7 +36,7 @@ from ofscraper.commands.scraper.actions.utils.log import (
|
|
|
36
36
|
temp_file_logger,
|
|
37
37
|
)
|
|
38
38
|
from ofscraper.commands.scraper.actions.download.utils.chunk import (
|
|
39
|
-
get_chunk_size
|
|
39
|
+
get_chunk_size
|
|
40
40
|
)
|
|
41
41
|
from ofscraper.commands.scraper.actions.utils.retries import get_download_retries
|
|
42
42
|
from ofscraper.commands.scraper.actions.utils.send.chunk import send_chunk_msg
|
|
@@ -65,6 +65,7 @@ from ofscraper.commands.scraper.actions.utils.send.message import send_msg
|
|
|
65
65
|
class AltDownloadManager(DownloadManager):
|
|
66
66
|
|
|
67
67
|
async def alt_download(self, c, ele, username, model_id):
|
|
68
|
+
await common_globals.sem.acquire()
|
|
68
69
|
common_globals.log.debug(
|
|
69
70
|
f"{get_medialog(ele)} Downloading with protected media downloader"
|
|
70
71
|
)
|
|
@@ -184,8 +185,9 @@ class AltDownloadManager(DownloadManager):
|
|
|
184
185
|
common_globals.log.debug(
|
|
185
186
|
f"{get_medialog(ele)} [attempt {self._alt_attempt_get(item).get()}/{get_download_retries()}] Downloading media with url {ele.mpd}"
|
|
186
187
|
)
|
|
187
|
-
async with c.
|
|
188
|
+
async with c.requests_async_stream(
|
|
188
189
|
url=url,
|
|
190
|
+
stream=True,
|
|
189
191
|
headers=headers,
|
|
190
192
|
params=params,
|
|
191
193
|
# action=[FORCED_NEW,SIGN] if constants.getattr("ALT_FORCE_KEY") else None
|
|
@@ -222,17 +224,20 @@ class AltDownloadManager(DownloadManager):
|
|
|
222
224
|
except Exception as E:
|
|
223
225
|
await self._total_change_helper(0)
|
|
224
226
|
raise E
|
|
227
|
+
finally:
|
|
228
|
+
common_globals.sem.release()
|
|
225
229
|
|
|
226
230
|
async def _download_fileobject_writer(self, total, l, ele, placeholderObj, item):
|
|
227
231
|
common_globals.log.debug(
|
|
228
232
|
f"{get_medialog(ele)} [attempt {self._alt_attempt_get(item).get()}/{get_download_retries()}] writing media to disk"
|
|
229
233
|
)
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
234
|
+
await self._download_fileobject_writer_streamer(
|
|
235
|
+
ele, total, l, placeholderObj
|
|
236
|
+
)
|
|
237
|
+
# if total > constants.getattr("MAX_READ_SIZE"):
|
|
238
|
+
|
|
239
|
+
# else:
|
|
240
|
+
# await self._download_fileobject_writer_reader(ele, total, l, placeholderObj)
|
|
236
241
|
common_globals.log.debug(
|
|
237
242
|
f"{get_medialog(ele)} [attempt {self._alt_attempt_get(item).get()}/{get_download_retries()}] finished writing media to disk"
|
|
238
243
|
)
|
|
@@ -258,30 +263,60 @@ class AltDownloadManager(DownloadManager):
|
|
|
258
263
|
except Exception as E:
|
|
259
264
|
raise E
|
|
260
265
|
|
|
261
|
-
async def _download_fileobject_writer_streamer(
|
|
262
|
-
|
|
263
|
-
|
|
266
|
+
async def _download_fileobject_writer_streamer(self, ele, total, res, placeholderObj):
|
|
267
|
+
common_globals.log.info(f"Starting download for {ele}. Tracking memory usage...")
|
|
268
|
+
initial_memory = self.process.memory_info().rss / (1024 * 1024) # RSS in MB
|
|
269
|
+
common_globals.log.info(f"Initial memory usage for {ele}: {initial_memory:.2f} MB")
|
|
264
270
|
|
|
265
271
|
task1 = await self._add_download_job_task(ele, total, placeholderObj)
|
|
266
|
-
fileobject =
|
|
267
|
-
chunk_size = get_chunk_size()
|
|
272
|
+
fileobject = None # Initialize to None for finally block
|
|
268
273
|
try:
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
274
|
+
# Use asyncio.timeout as a context manager for the entire download process
|
|
275
|
+
async with asyncio.timeout(None):
|
|
276
|
+
fileobject = await aiofiles.open(
|
|
277
|
+
placeholderObj.tempfilepath, "ab"
|
|
278
|
+
).__aenter__()
|
|
279
|
+
chunk_count = 0
|
|
280
|
+
chunk_iter = res.iter_chunked(get_chunk_size())
|
|
281
|
+
|
|
282
|
+
while True:
|
|
283
|
+
try:
|
|
284
|
+
chunk = await chunk_iter.__anext__()
|
|
285
|
+
await fileobject.write(chunk)
|
|
286
|
+
send_chunk_msg(ele, total, placeholderObj)
|
|
287
|
+
chunk_count += 1
|
|
288
|
+
# Log memory usage periodically, e.g., every 10 chunks
|
|
289
|
+
if chunk_count % 10 == 0:
|
|
290
|
+
current_memory = self.process.memory_info().rss / (1024 * 1024)
|
|
291
|
+
common_globals.log.debug(f"Memory usage for {ele} after {chunk_count} chunks: {current_memory:.2f} MB")
|
|
292
|
+
except StopAsyncIteration:
|
|
293
|
+
break # Exit loop when no more chunks
|
|
294
|
+
except asyncio.TimeoutError:
|
|
295
|
+
# This catches the timeout for the entire async with block
|
|
296
|
+
common_globals.log.warning(f"{common_logs.get_medialog(ele)}⚠️ No chunk received in {get_chunk_timeout()} seconds or download timed out!")
|
|
297
|
+
return # Exit the function on timeout
|
|
272
298
|
except Exception as E:
|
|
273
|
-
|
|
299
|
+
# Catch other potential exceptions during file operations or chunk iteration
|
|
300
|
+
common_globals.log.error(f"An error occurred during download for {ele}: {E}")
|
|
301
|
+
raise E # Re-raise the exception after logging
|
|
274
302
|
finally:
|
|
275
|
-
#
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
raise E
|
|
303
|
+
# Log final memory usage
|
|
304
|
+
final_memory = self.process.memory_info().rss / (1024 * 1024)
|
|
305
|
+
common_globals.log.info(f"Final memory usage for {ele}: {final_memory:.2f} MB")
|
|
306
|
+
common_globals.log.info(f"Memory change for {ele}: {(final_memory - initial_memory):.2f} MB")
|
|
280
307
|
|
|
308
|
+
# Close file if needed
|
|
309
|
+
if fileobject: # Ensure fileobject was successfully opened
|
|
310
|
+
try:
|
|
311
|
+
await fileobject.close()
|
|
312
|
+
except Exception as E:
|
|
313
|
+
common_globals.log.error(f"Error closing file for {ele}: {E}")
|
|
314
|
+
raise E # Re-raise if closing fails
|
|
281
315
|
try:
|
|
282
316
|
await self._remove_download_job_task(task1, ele)
|
|
283
317
|
except Exception as E:
|
|
284
|
-
|
|
318
|
+
common_globals.log.error(f"Error removing download job task for {ele}: {E}")
|
|
319
|
+
raise E # Re-raise if task removal fails
|
|
285
320
|
|
|
286
321
|
async def _handle_result_alt(
|
|
287
322
|
self, sharedPlaceholderObj, ele, audio, video, username, model_id
|
|
@@ -11,9 +11,10 @@ r"""
|
|
|
11
11
|
|
|
12
12
|
"""
|
|
13
13
|
|
|
14
|
-
from functools import partial
|
|
15
14
|
import pathlib
|
|
15
|
+
import os
|
|
16
16
|
from humanfriendly import format_size
|
|
17
|
+
import psutil
|
|
17
18
|
|
|
18
19
|
import ofscraper.utils.constants as constants
|
|
19
20
|
import ofscraper.utils.live.updater as progress_updater
|
|
@@ -30,6 +31,7 @@ from ofscraper.db.operations_.media import download_media_update
|
|
|
30
31
|
class DownloadManager:
|
|
31
32
|
def __init__(self):
|
|
32
33
|
self.total = None
|
|
34
|
+
self.process= psutil.Process(os.getpid())
|
|
33
35
|
|
|
34
36
|
async def _add_download_job_task(
|
|
35
37
|
self, ele, total=None, placeholderObj=None, tempholderObj=None
|