{"id":13469254,"url":"https://github.com/stewartmcgown/uds","last_synced_at":"2025-05-14T20:07:01.375Z","repository":{"id":38450925,"uuid":"141484869","full_name":"stewartmcgown/uds","owner":"stewartmcgown","description":"📀 Unlimited Google Drive Storage by splitting binary files into base64","archived":false,"fork":false,"pushed_at":"2021-11-02T07:51:47.000Z","size":6353,"stargazers_count":4355,"open_issues_count":30,"forks_count":278,"subscribers_count":75,"default_branch":"master","last_synced_at":"2025-04-13T14:06:56.866Z","etag":null,"topics":["google-drive","unlimited"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stewartmcgown.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":["stewartmcgown"],"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":null}},"created_at":"2018-07-18T20:10:10.000Z","updated_at":"2025-04-10T11:45:57.000Z","dependencies_parsed_at":"2022-07-12T15:31:31.305Z","dependency_job_id":null,"html_url":"https://github.com/stewartmcgown/uds","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stewartmcgown%2Fuds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stewartmcgown%2Fuds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stewartmcgown%2Fuds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stewartmcgown%2Fuds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stewartmcgown","download_url":"https://codeload.github.com/stewartmcgown/uds/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248724639,"owners_count":21151561,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["google-drive","unlimited"],"created_at":"2024-07-31T15:01:30.865Z","updated_at":"2025-04-13T14:07:00.161Z","avatar_url":"https://github.com/stewartmcgown.png","language":"Python","funding_links":["https://github.com/sponsors/stewartmcgown"],"categories":["Python","Python (1887)","Cloud Storage"],"sub_categories":["Subtitles Automation"],"readme":"# :milky_way: UDS : Unlimited Drive Storage\n\nStore files in Google Docs without counting against your quota.\n\nsorry @ the guys from google internal forums who are looking at this\n\nDevelopment on a web-based JS version has started [here](https://github.com/stewartmcgown/uds-web).\n\n\u003e Note: After June 1st 2021, starting June 1, 2021, Google will count Docs, Sheets, Slides, Drawings, Forms and Jamboard files against the user's storage quota.\n\n## Features\n\n- Upload files to Google Drive without using storage space\n- Download any stored files to your computer\n\n## Logic\n\n- Google Docs take up 0 bytes of quota in your Google Drive\n- Split up binary files into Google Docs, with base64 encoded text\n- Size of the encoded file is always larger than the original. Base64 encodes binary data to a ratio of about 4:3.\n- A single google doc can store about a million characters. This is around 710KB of base64 encoded data.\n- Some experiments with multi-threading the uploads, but there was no significant performance increase.\n\n## Setup \u0026 Authentication\n\n1. Clone the Repository and setup the requirements `pip3 install -r requirements.txt`\n2. Head to [Google's API page](https://developers.google.com/drive/api/v3/quickstart/python) and enable the Drive API\n3. Download the configuration file as 'client_secret.json' to the UDS directory\n4. Run `python3 uds.py` or `./uds.py` for initial set up\n\n## UDS Core\n\n### Upload\n\n```sh\n\u003e ./uds.py --push Ubuntu.Desktop.16.04.iso\nUbuntu.Desktop.16.04.iso will required 543 Docs to store.\nCreated parent folder with ID 1fc6JGpX6vUWiwflL1jBxM1YpuMHFAms8\nSuccessfully Uploaded Ubuntu.Desktop.16.04.iso: [██████████████████████████████] 100%\n```\n\n```\n[Layout]\n./uds.py --push argument\n\nargument: Path_to_file+file_name\n```\n\n### List\n\n```sh\n\u003e ./uds.py --list\nName                      Size   Encoded    ID\n------------------------  -----  ---------  ---------------------------------  \nUbuntu.Desktop.16.04.iso  810 MB  1.1 GB    1fc6JGpX6vUWiwflL1jBxM1YpuMHFAms8\nUbuntu.Desktop.18.10.iso  1.1 GB  1.3 GB    1RzzVfN9goHMTkM1Hf1FUWUVS_2R3GK7D\n\nAlso supports searching with a query!\n\n\u003e ./uds.py --list \"18\"\nName                      Size   Encoded    ID\n------------------------  -----  ---------  ---------------------------------  \nUbuntu.Desktop.18.10.iso  1.1 GB  1.3 GB    1RzzVfN9goHMTkM1Hf1FUWUVS_2R3GK7D\n```\n\n```\n[Layout]\n./uds.py --list\n\narguments: query\n```\n\n### Download\n\n```sh\n\u003e ./uds.py --pull 1fc6JGpX6vUWiwflL1jBxM1YpuMHFAms8\nDownloaded Ubuntu.Desktop.16.04.iso: [██████████████████████████████] 100%\n```\n\n```\n[Layout]\n./uds.py --pull argument\n\nargument: id_of_file\n```\n\n### Delete\n\n```sh\n\u003e ./uds.py --delete 1fc6JGpX6vUWiwflL1jBxM1YpuMHFAms8\nDeleted 1fc6JGpX6vUWiwflL1jBxM1YpuMHFAms8\n```\n\n```\n[Layout]\n./uds.py --delete argument\n\nargument: id_of_file\n```\n## Alpha Extensions\n\n\n### Grab\n\n```sh\n\u003e ./uds.py --grab test.7z\nUpdate Successful!\nDownloaded test.7z: [██████████████████████████████] 100%\n```\n\n```\n[Layout]\n./uds.py --grab argument\n\nargument: name_of_file\n```\n\n### Erase\n\n```sh\n\u003e./uds.py --erase test2.7z\nUpdate Successful!\nDeleted test2.7z\n```\n\n```\n[Layout]\n./uds.py --erase argument\n\nargument: name_of_file\n```\n\n### Update\n\n```sh\n\u003e ./uds.py --update\n\nName       Encoded   Size \n---------  --------  -----\nfile_name  1.1 GB    810 MB \n\n\"User.txt\"\nName       Encoded   Size \n---------  --------  -----\nfile_name  1.1 GB    810 MB \n\n\"data.txt\"\n{\n   \"file0\": \"1fc6JGpX6vUWiwflL1jBxM1YpuMHFAms8\"\n   \"file2\": \"1fc6JGpX6vUWiwflL1jBxM1YpuMHFAms9\"\n}\n```\n\n```\n[Layout]\n./uds.py --update\n\narguments: None\n```\n\n## Bulk Extensions\n\n### Bunch\n\n```sh\n\u003e ./uds.py --bunch test\ntest.7z.1 will require 1337 Docs to store.\nCreated parent folder with ID 1fc6JGpX6vUWiwflL1jBxM1YpuMHFAm12\nSuccessfully Uploaded test.7z.1: [██████████████████████████████] 100%\ntest.7z.2 will require 1337 Docs to store.\nCreated parent folder with ID 1fc6JGpX6vUWiwflL1jBxM1YpuQQFAm12\nSuccessfully Uploaded test.7z.2: [██████████████████████████████] 100%\ntest.7z.3 will require 600 Docs to store.\nCreated parent folder with ID 1fc6JGpX6vTOiwflL1jBxM1YpuQQFAm12\nSuccessfully Uploaded test.7z.3: [██████████████████████████████] 100%\n```\n\n```\n[Layout]\n./uds.py --bunch argument[1] argument[2]\n\nargument[1]: name_in_files, or wildcard \"?\" without quotes\nargument[2]: directory, default is current directory of UDS\n```\n\n\n### Batch\n\n```sh\n\u003e ./uds.py --batch file_name\nUpdate Successful!\nDownloaded file_name.7z.1: [██████████████████████████████] 100%\nDownloaded file_name.7z.2: [██████████████████████████████] 100%\nDownloaded file_name.7z.3: [██████████████████████████████] 100%\n```\n\n```\n[Layout]\n./uds.py --batch argument\n\narguments: name_in_files, or wildcard \"?\" without quotes\n```\n\n### Wipe\n\n```sh\n\u003e ./uds.py --wipe file\nUpdate Successful!\nDeleted file.7z.1\nDeleted file.7z.2\nDeleted file.7z.3\n```\n\n```\n[Layout]\n./uds.py --wipe argument\n\narguments: name_in_files, or wildcard \"?\" without quotes\n```\n\n**Only Compatible with Python 3.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstewartmcgown%2Fuds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstewartmcgown%2Fuds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstewartmcgown%2Fuds/lists"}