{"id":13589761,"url":"https://github.com/ruarxive/ydiskarc","last_synced_at":"2026-04-08T15:31:21.351Z","repository":{"id":48347943,"uuid":"432135830","full_name":"ruarxive/ydiskarc","owner":"ruarxive","description":"command-line tool to backup public resources from Yandex.disk (disk.yandex.ru / yadi.sk) filestorage service","archived":false,"fork":false,"pushed_at":"2025-12-15T17:56:26.000Z","size":67,"stargazers_count":5,"open_issues_count":7,"forks_count":3,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-12-18T20:05:33.375Z","etag":null,"topics":["archiving","backup","yandex","yandex-api","yandex-disk"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ruarxive.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-11-26T10:16:51.000Z","updated_at":"2025-12-16T09:09:05.000Z","dependencies_parsed_at":"2024-06-19T04:50:38.930Z","dependency_job_id":"695d8d82-96f1-477e-85ca-b31a3198b895","html_url":"https://github.com/ruarxive/ydiskarc","commit_stats":{"total_commits":9,"total_committers":3,"mean_commits":3.0,"dds":0.4444444444444444,"last_synced_commit":"40ebadf676084e2656ed3520f1720551eef6a822"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/ruarxive/ydiskarc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruarxive%2Fydiskarc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruarxive%2Fydiskarc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruarxive%2Fydiskarc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruarxive%2Fydiskarc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ruarxive","download_url":"https://codeload.github.com/ruarxive/ydiskarc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ruarxive%2Fydiskarc/sbom","scorecard":{"id":788504,"data":{"date":"2025-08-11","repo":{"name":"github.com/ruarxive/ydiskarc","commit":"40ebadf676084e2656ed3520f1720551eef6a822"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":1.7,"checks":[{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":0,"reason":"Found 0/10 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'main'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"10 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-117 / GHSA-mrwq-x4v8-fh7p","Warn: Project is vulnerable to: PYSEC-2022-43017 / GHSA-qwmp-2cf2-g9g6","Warn: Project is vulnerable to: GHSA-55x5-fj6c-h6m8","Warn: Project is vulnerable to: PYSEC-2014-9 / GHSA-57qw-cc2g-pv5p","Warn: Project is vulnerable to: PYSEC-2021-19 / GHSA-jq4v-f5q6-mjqq","Warn: Project is vulnerable to: GHSA-pgww-xf46-h92r","Warn: Project is vulnerable to: PYSEC-2022-230 / GHSA-wrxv-2j5q-m38w","Warn: Project is vulnerable to: PYSEC-2018-12 / GHSA-xp26-p53h-6h2p","Warn: Project is vulnerable to: PYSEC-2021-142 / GHSA-8q59-q68h-6hv4","Warn: Project is vulnerable to: PYSEC-2018-49 / GHSA-rprw-h62v-c2w7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-23T06:46:40.751Z","repository_id":48347943,"created_at":"2025-08-23T06:46:40.751Z","updated_at":"2025-08-23T06:46:40.751Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31562685,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["archiving","backup","yandex","yandex-api","yandex-disk"],"created_at":"2024-08-01T16:00:34.070Z","updated_at":"2026-04-08T15:31:21.343Z","avatar_url":"https://github.com/ruarxive.png","language":"Python","funding_links":[],"categories":["Other Digital Objects"],"sub_categories":["Online Storage"],"readme":"# ydiskarc\n\nydiskarc (pronounced *Ai-disk-arc*) is a command line tool used to backup Yandex.Disk public resources.\nPublic resources are only shared files and folders from Yandex.Disk service.\nYandex provides free-to-use API that allow to download the data.\n\n## Main features\n\n* **Metadata extraction** - Automatically saves metadata as `_metadata.json` files\n* **Download any public resource** - Files or entire directories\n* **Resume support** - Automatically resumes interrupted downloads\n* **Retry logic** - Handles transient network failures automatically\n* **Rate limiting handling** - Respects API rate limits\n* **Progress tracking** - Visual progress bars for downloads using tqdm\n* **Pre-download statistics** - Shows total file count and estimated size before downloading\n* **Quiet by default** - Logs only appear when verbose mode is enabled\n* **Update mode** - Only download files that don't already exist locally\n\n## Installation\n\n### Any OS\n\nA universal installation method (that works on Windows, Mac OS X, Linux, …,\nand always provides the latest version) is to use pip:\n\n```bash\n# Make sure we have an up-to-date version of pip and setuptools:\n$ pip install --upgrade pip setuptools\n\n$ pip install --upgrade ydiskarc\n```\n\n(If ``pip`` installation fails for some reason, you can try\n``easy_install ydiskarc`` as a fallback.)\n\n### Python version\n\nPython version 3.6 or greater is required.\n\n## Usage\n\nSynopsis:\n\n```bash\n$ ydiskarc [command] [URL] [flags]\n```\n\n**Examples:**\n```bash\n# Sync command - URL is a positional argument\n$ ydiskarc sync https://disk.yandex.ru/d/ABC123 -o output\n\n# Full command - URL is a positional argument  \n$ ydiskarc full https://disk.yandex.ru/i/XYZ789 -o output\n```\n\nSee also ``python -m ydiskarc`` and ``ydiskarc [command] --help`` for help for each command.\n\n## Commands\n\n### Sync command\n\nSynchronizes files and metadata from public resource of directory type to the local directory.\nMaintains directory structure and saves metadata for each directory level.\n\n**Basic usage:**\n```bash\n$ ydiskarc sync https://disk.yandex.ru/d/VVNMYpZtWtST9Q -o mos9maystyle\n```\n\n**Update mode (only download new files):**\n```bash\n$ ydiskarc sync https://disk.yandex.ru/d/VVNMYpZtWtST9Q -o mos9maystyle --update\n```\n\n**Metadata only (no file downloads):**\n```bash\n$ ydiskarc sync https://disk.yandex.ru/d/VVNMYpZtWtST9Q -o mos9maystyle --nofiles\n```\n\n**Options:**\n- `URL` - Public resource URL (required, positional argument)\n- `--output`, `-o` - Output directory (defaults to resource ID)\n- `--update` - Update mode: only download files that don't exist locally\n- `--nofiles`, `-n` - Metadata-only mode: save metadata without downloading files\n- `--verbose`, `-v` - Enable verbose logging (logs are hidden by default)\n\n**Note:** The command now displays total file count and estimated size before starting downloads.\n\n### Full command\n\nDownloads single file or directory. Single files are downloaded with their original format.\nDirectories are downloaded as ZIP files containing all files inside.\n\n**Basic usage:**\n```bash\n$ ydiskarc full https://disk.yandex.ru/i/t_pNaarK8UJ-bQ -o files\n```\n\n**With metadata:**\n```bash\n$ ydiskarc full https://disk.yandex.ru/i/t_pNaarK8UJ-bQ -o files -m\n```\n\n**Verbose output:**\n```bash\n$ ydiskarc full https://disk.yandex.ru/i/t_pNaarK8UJ-bQ -o files -v -m\n```\n\n**Options:**\n- `URL` - Public resource URL (required, positional argument)\n- `--output`, `-o` - Output directory\n- `--filename`, `-f` - Output filename (defaults to `dump.zip` if not specified)\n- `--metadata`, `-m` - Extract and save metadata as `_metadata.json`\n- `--verbose`, `-v` - Enable verbose logging (logs are hidden by default)\n\n**Note:** \n- Single files are downloaded with their original format\n- Directories are downloaded as ZIP files (default filename: `dump.zip`)\n- The command displays file count and size information before downloading\n\n### Version command\n\nCheck the installed version:\n```bash\n$ ydiskarc version\n```\n\n## Configuration\n\nydiskarc can be configured using a `.ydiskarc` YAML file in your project directory.\n\n**Example configuration:**\n```yaml\nkeys:\n  yandex_oauth: your_oauth_key_here\n```\n\nTo configure:\n```bash\n$ ydiskarc configure --key YOUR_OAUTH_KEY\n```\n\n## Troubleshooting\n\n### Common Issues\n\n**\"No download url. Probably wrong public url/key?\"**\n- Verify the URL is correct and the resource is publicly accessible\n- Check that the URL format matches: `https://disk.yandex.ru/d/...` or `https://disk.yandex.ru/i/...`\n\n**\"Failed to download file\" or network errors**\n- Check your internet connection\n- The tool automatically retries on transient failures\n- For rate limiting, the tool will wait and retry automatically\n\n**\"Failed to create directory\"**\n- Check file system permissions\n- Ensure you have write access to the output directory\n\n**Resume interrupted downloads**\n- Downloads automatically resume if interrupted\n- Partial files are detected and resumed from the last byte\n\n### Verbose Mode\n\nBy default, ydiskarc runs quietly and only shows progress bars and essential information. For detailed debugging information, use the `--verbose` or `-v` flag:\n```bash\n$ ydiskarc sync https://disk.yandex.ru/d/... -o output -v\n```\n\nWhen verbose mode is enabled, you'll see:\n- Detailed logging of all operations\n- File-by-file download progress\n- API request details\n- Error stack traces\n\n## Examples\n\n**Download a public folder:**\n```bash\n$ ydiskarc sync https://disk.yandex.ru/d/ABC123 -o my_backup\n```\n\n**Download a single file with metadata:**\n```bash\n$ ydiskarc full https://disk.yandex.ru/i/XYZ789 -o downloads -m\n```\n\n**Update existing backup (skip existing files):**\n```bash\n$ ydiskarc sync https://disk.yandex.ru/d/ABC123 -o my_backup --update\n```\n\n**Get metadata only:**\n```bash\n$ ydiskarc sync https://disk.yandex.ru/d/ABC123 -o metadata_only --nofiles\n```\n\n**Example output:**\n```\nTotal files to download: 7\nTotal size: 10.12 MB\nDownloading: 100%|████████████| 1.72M/1.72M [00:05\u003c00:00, 345KB/s]\n```\n\n## Contributing\n\nContributions are welcome! Please follow these guidelines:\n\n1. **Fork the repository** and create a feature branch\n2. **Write tests** for new functionality\n3. **Follow code style** - the project uses:\n   - Black for formatting (line length: 100)\n   - flake8 and ruff for linting\n   - isort for import sorting\n   - Type hints for better code clarity\n   - All code must pass linting checks before submission\n4. **Run tests** before submitting:\n   ```bash\n   pip install -r requirements-dev.txt\n   pytest\n   ```\n5. **Run linting** to ensure code quality:\n   ```bash\n   black ydiskarc/\n   isort ydiskarc/\n   flake8 ydiskarc/\n   ruff check ydiskarc/\n   ```\n6. **Install pre-commit hooks** (optional but recommended):\n   ```bash\n   pip install pre-commit\n   pre-commit install\n   ```\n7. **Submit a pull request** with a clear description\n\n### Development Setup\n\n```bash\n# Clone the repository\ngit clone https://github.com/ruarxive/ydiskarc.git\ncd ydiskarc\n\n# Install in development mode\npip install -e .\n\n# Install development dependencies\npip install -r requirements-dev.txt\n\n# Run tests\npytest\n\n# Run linting\nflake8 ydiskarc/\nruff check ydiskarc/\nblack --check ydiskarc/\nisort --check-only ydiskarc/\n```\n\n## Metadata Documentation\n\nFor detailed information about the Yandex.Disk API metadata structure, see:\n- [Examples Directory](examples/) - Contains example metadata file and documentation\n- [Metadata Structure Documentation](examples/METADATA_STRUCTURE.md) - Complete reference of metadata fields\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for a detailed list of changes.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## Links\n\n- **Repository**: https://github.com/ruarxive/ydiskarc/\n- **Issues**: https://github.com/ruarxive/ydiskarc/issues\n- **Yandex.Disk API**: https://yandex.com/dev/disk/api/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruarxive%2Fydiskarc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fruarxive%2Fydiskarc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fruarxive%2Fydiskarc/lists"}