YaDisk is a Yandex.Disk REST API client library.
Documentation is available at Read the Docs (EN) and Read the Docs (RU).
yadisk
supports multiple HTTP client libraries and has both synchronous and
asynchronous API.
The following HTTP client libraries are currently supported:
requests
(used by default for synchronous API)httpx
(both synchronous and asynchronous, used by default for asynchronous API)aiohttp
(asynchronous only)pycurl
(synchronous only)
For synchronous API (installs requests
):
pip install yadisk[sync_defaults]
For asynchronous API (installs aiofiles
and httpx
):
pip install yadisk[async_defaults]
Alternatively, you can manually choose which optional libraries to install:
# For use with pycurl
pip install yadisk[pycurl]
# For use with aiohttp, will also install aiofiles
pip install yadisk[async_files,aiofiles]
import yadisk
client = yadisk.Client(token="<token>")
# or
# client = yadisk.Client("<application-id>", "<application-secret>", "<token>")
# You can either use the with statement or manually call client.close() later
with client:
# Check if the token is valid
print(client.check_token())
# Get disk information
print(client.get_disk_info())
# Print files and directories at "/some/path"
print(list(client.listdir("/some/path")))
# Upload "file_to_upload.txt" to "/destination.txt"
client.upload("file_to_upload.txt", "/destination.txt")
# Same thing
with open("file_to_upload.txt", "rb") as f:
client.upload(f, "/destination.txt")
# Download "/some-file-to-download.txt" to "downloaded.txt"
client.download("/some-file-to-download.txt", "downloaded.txt")
# Permanently remove "/file-to-remove"
client.remove("/file-to-remove", permanently=True)
# Create a new directory at "/test-dir"
print(client.mkdir("/test-dir"))
import yadisk
import aiofiles
client = yadisk.AsyncClient(token="<token>")
# or
# client = yadisk.AsyncClient("<application-id>", "<application-secret>", "<token>")
# You can either use the with statement or manually call client.close() later
async with client:
# Check if the token is valid
print(await client.check_token())
# Get disk information
print(await client.get_disk_info())
# Print files and directories at "/some/path"
print([i async for i in client.listdir("/some/path")])
# Upload "file_to_upload.txt" to "/destination.txt"
await client.upload("file_to_upload.txt", "/destination.txt")
# Same thing
async with aiofiles.open("file_to_upload.txt", "rb") as f:
await client.upload(f, "/destination.txt")
# Same thing but with regular files
with open("file_to_upload.txt", "rb") as f:
await client.upload(f, "/destination.txt")
# Download "/some-file-to-download.txt" to "downloaded.txt"
await client.download("/some-file-to-download.txt", "downloaded.txt")
# Same thing
async with aiofiles.open("downloaded.txt", "wb") as f:
await client.download("/some-file-to-download.txt", f)
# Permanently remove "/file-to-remove"
await client.remove("/file-to-remove", permanently=True)
# Create a new directory at "/test-dir"
print(await client.mkdir("/test-dir"))
- Release 3.1.0 (2024-07-12)
- New features:
- Added new exception classes:
GoneError
andResourceDownloadLimitExceededError
- Added a new method:
Client.get_all_public_resources()
andAsyncClient.get_all_public_resources()
- Added new exception classes:
- Bug fixes:
- Fixed setting
headers
and session arguments toNone
causing errors - Fixed incorrect handling of empty filename in
Client.rename()
andAsyncClient.rename()
- Fixed several typos in async convenience method implementations
(
listdir()
and related) - Fixed
PublicResourceListObject
having the wrong type for itsitems
member - Fixed API requests not working with
PycURLSession
whenstream=True
is set - No data will be written to the output file by
Client.download()
,Client.download_by_link()
,AsyncClient.download()
andAsyncClient.download_by_link()
if the server returns a bad status code
- Fixed setting
- New features:
- Release 3.0.1 (2024-07-09)
- Fixed broken
pyproject.toml
that did not include full package contents (see issue #49)
- Fixed broken
- Release 3.0.0 (2024-07-09)
- Breaking changes:
- See Migration Guide for full details
- All methods wait for asynchronous operations to complete by default
(see the new
wait=<bool>
parameter) - Iterating over the result of
AsyncClient.listdir()
no longer requires the additional await keyword. - Number of returned items of
Client.get_files()
/AsyncClient.get_files()
is now controlled by themax_items
parameter, rather thanlimit
- Methods
set_token()
,set_headers()
ofSession
andAsyncSession
were removed - Some methods no longer accept the
fields
parameter Client.get_last_uploaded()
/AsyncClient.get_last_uploaded()
now return a list instead of a generatoryadisk.api
is now a private module- All private modules were renamed to have names that start with
_
(e.g,yadisk._api
)
- New features:
- Added methods to wait until an asynchronous operation completes
(see
Client.wait_for_operation()
/AsyncClient.wait_for_operation()
) - Methods that may start an asynchronous operation now accept additional
parameters:
wait: bool = True
,poll_interval: float = 1.0
andpoll_timeout: Optional[float] = None
Client.listdir()
,Client.get_files()
and their async variants now accept a new parametermax_items: Optional[int] = None
, which can be used to limit the maximum number of returned items- Most
Client
andAsyncClient
methods now accept an optional parameterretry_on: Optional[Tuple[Type[Exception], ...]] = None
, which lets you specify a tuple of additional exceptions that can trigger an automatic retry yadisk.types
module is now public- Added basic logging of outgoing API requests and automatic retries
- The logger instance for the library can be accessed as
yadisk.settings.logger
- Added
YaDiskObject.field()
and the@
operator (YaDiskObject.__matmul__()
) which verify that the given field is notNone
- Added
Client.get_upload_link_object()
,AsyncClient.get_upload_link_object()
whose return values additionally containoperation_id
utils.auto_retry()
now accepts more parameters- Added a few missing fields for
DiskInfoObject
EXIFObject
now contains GPS coordinatesCaseInsensitiveDict
is now part ofyadisk.utils
- Added methods to wait until an asynchronous operation completes
(see
- Improvements:
- Added full type hints for
Client
,AsyncClient
through.pyi
stub files - Docstrings for
Client
/AsyncClient
now include more parameters - Errors during JSON processing (e.g.
InvalidResponseError
) also trigger automatic retries - Error message when the default session module is not available is now less confusing (see issue #43)
- Reduced
Client.listdir()
's defaultlimit
to500
from10000
to avoid timeouts on large directories (see issue #45) - Reduced
Client.get_files()
's defaultlimit
to200
from1000
to avoid timeouts Client.download()
and similar methods no longer setConnection: close
header, since it's not necessary (unlike withClient.upload()
)UnknownYaDiskError
now includes status code in the error message
- Added full type hints for
- Bug fixes:
- Fixed
httpx
- andaiohttp
-based session implementations not converting their exceptions toRequestError
in theirResponse.json()
/AsyncResponse.json()
implementations - Fixed
stream=True
not being set by default inAsyncClient.download()
,AsyncClient.download_public()
- Fixed
- Other changes:
typing_extensions
is now required for Python < 3.10
- Breaking changes:
- Release 2.1.0 (2024-01-03)
- Fixed a bug where POST request parameters were not encoded correctly
- Fixed a bug in
PycURLSession.send_request()
that made it ignore passed headers RequestsSession.close()
now closes all underlying session instances, instead of only the current thread-local one- All methods of
Client
andAsyncClient
now use existing session - Removed
session_factory
attribute andmake_session()
method ofClient
andAsyncClient
- Session class can now be specified as a string
- Added
Client.get_device_code()
/AsyncClient.get_device_code()
methods - Added
Client.get_token_from_device_code()
/AsyncClient.get_token_from_device_code()
methods - Added missing
redirect_uri
parameter forClient.get_auth_url()
/AsyncClient.get_auth_url()
andClient.get_code_url()
/AsyncClient.get_code_url()
- Added support for PKCE parameters for
Client.get_auth_url()
/AsyncClient.get_auth_url()
,Client.get_code_url()
/AsyncClient.get_code_url()
andClient.get_token()
/AsyncClient.get_token()
- Added
scope
attribute forTokenObject
- Added new exception classes:
InvalidClientError
,InvalidGrantError
,AuthorizationPendingError
,BadVerificationCodeError
andUnsupportedTokenTypeError
- Release 2.0.0 (2023-12-12)
- The library now provides both synchronous and asynchronous APIs (see Introduction and API Reference)
- Multiple HTTP libraries are supported by default (see Available Session Implementations for the full list)
- It is now possible to add support for any HTTP library (see Session Interface)
- requests is now an optional dependency (although it's still used by default for synchronous API)
- Note that now requests-specific arguments must be passed differently (see Available Session Implementations)
- Preferred HTTP client libraries must be explicitly installed now (see Introduction)
Client.upload()
andClient.upload_by_link()
can now accept a function that returns an iterator (or a generator) as a payload
- Release 1.3.4 (2023-10-15)
upload()
anddownload()
(and related) methods can now upload/download non-seekable file-like objects (e.g.stdin
orstdout
when open in binary mode), see PR #31
- Release 1.3.3 (2023-04-22)
app:/
paths now work correctly (see issue #26)
- Release 1.3.2 (2023-03-20)
- Fixed issue #29: TypeError: 'type' object is not subscriptable
- Release 1.3.1 (2023-02-28)
- Fixed issue #28: calling
download_public()
withpath
keyword argument raisesTypeError
- Fixed
AttributeError
raised when callingResourceLinkObject.public_listdir()
- Fixed issue #28: calling
- Release 1.3.0 (2023-01-30)
- Added convenience methods to
...Object
objects (e.g. seeResourceObject
in docs) - Added type hints
- Improved error checking and response validation
- Added
InvalidResponseError
,PayloadTooLargeError
,UploadTrafficLimitExceededError
- Added a few missing fields to
DiskInfoObject
andSystemFoldersObject
- Added
rename()
,upload_by_link()
anddownload_by_link()
methods - Added
default_args
field forYaDisk
object download()
andupload()
now returnResourceLinkObject
- Returned
LinkObject
instances have been replaced by more specific subclasses ConnectionError
now also triggers a retry
- Added convenience methods to
- Release 1.2.19 (2023-01-20)
- Fixed incorrect behavior of the fix from 1.2.18 for paths
disk:
andtrash:
(only these two).
- Fixed incorrect behavior of the fix from 1.2.18 for paths
- Release 1.2.18 (2023-01-20)
- Fixed issue #26: ':' character in filenames causes
BadRequestError
. This is due the behavior of Yandex.Disk's REST API itself but is avoided on the library level with this fix.
- Fixed issue #26: ':' character in filenames causes
- Release 1.2.17 (2022-12-11)
- Fixed a minor bug which could cause a
ReferenceError
(which would not cause a crash, but still show an error message). The bug involved using__del__()
method inSelfDestructingSession
to automatically close the sessions it seems to affect primarily old Python versions (such as 3.4).
- Fixed a minor bug which could cause a
- Release 1.2.16 (2022-08-17)
- Fixed a bug in
check_token()
: could throwForbiddenError
if the application lacks necessary permissions (issue #23).
- Fixed a bug in
- Release 1.2.15 (2021-12-31)
- Fixed an issue where
http://
links were not recognized as operation links (they were assumed to always behttps://
, since all the other requests are always HTTPS). Occasionally, Yandex.Disk can for some reason return anhttp://
link to an asynchronous operation instead ofhttps://
. Both links are now recognized correctly and anhttps://
version will always be used byget_operation_status()
, regardless of which one Yandex.Disk returned.
- Fixed an issue where
- Release 1.2.14 (2019-03-26)
- Fixed a
TypeError
inget_public_*
functions when passingpath
parameter (see issue #7) - Added
unlimited_autoupload_enabled
attribute forDiskInfoObject
- Fixed a
- Release 1.2.13 (2019-02-23)
- Added
md5
parameter forremove()
- Added
UserPublicInfoObject
- Added
country
attribute forUserObject
- Added
photoslice_time
attribute forResourceObject
,PublicResourceObject
andTrashResourceObject
- Added
- Release 1.2.13 (2019-02-23)
- Added
md5
parameter forremove()
- Added
UserPublicInfoObject
- Added
country
attribute forUserObject
- Added
photoslice_time
attribute forResourceObject
,PublicResourceObject
andTrashResourceObject
- Added
- Release 1.2.12 (2018-10-11)
- Fixed fields parameter not working properly in listdir() (issue #4)
- Release 1.2.11 (2018-06-30)
- Added the missing parameter
sort
forget_meta()
- Added
file
andantivirus_status
attributes forResourceObject
,PublicResourceObject
andTrashResourceObject
- Added
headers
parameter - Fixed a typo in
download()
anddownload_public()
(issue #2) - Removed
*args
parameter everywhere
- Added the missing parameter
- Release 1.2.10 (2018-06-14)
- Fixed
timeout=None
behavior.None
is supposed to mean 'no timeout' but in the older versions it was synonymous with the default timeout.
- Fixed
- Release 1.2.9 (2018-04-28)
- Changed the license to LGPLv3 (see
COPYING
andCOPYING.lesser
) - Other package info updates
- Changed the license to LGPLv3 (see
- Release 1.2.8 (2018-04-17)
- Fixed a couple of typos:
PublicResourceListObject.items
andTrashResourceListObject.items
had wrong types - Substitute field aliases in
fields
parameter when performing API requests (e.g.embedded
->_embedded
)
- Fixed a couple of typos:
- Release 1.2.7 (2018-04-15)
- Fixed a file rewinding bug when uploading/downloading files after a retry
- Release 1.2.6 (2018-04-13)
- Now caching
requests
sessions so that open connections can be reused (which can significantly speed things up sometimes) - Disable
keep-alive
when uploading/downloading files by default
- Now caching
- Release 1.2.5 (2018-03-31)
- Fixed an off-by-one bug in
utils.auto_retry()
(which could sometimes result inAttributeError
) - Retry the whole request for
upload()
,download()
anddownload_public()
- Set
stream=True
fordownload()
anddownload_public()
- Other minor fixes
- Fixed an off-by-one bug in
- Release 1.2.4 (2018-02-19)
- Fixed
TokenObject
havingexprires_in
instead ofexpires_in
(fixed a typo)
- Fixed
- Release 1.2.3 (2018-01-20)
- Fixed a
TypeError
whenWrongResourceTypeError
is raised
- Fixed a
- Release 1.2.2 (2018-01-19)
refresh_token()
no longer requires a valid or empty token.
- Release 1.2.1 (2018-01-14)
- Fixed auto retries not working. Whoops.
- Release 1.2.0 (2018-01-14)
- Fixed passing
n_retries=0
toupload()
,download()
anddownload_public()
upload()
,download()
anddownload_public()
no longer return anything (see the docs)- Added
utils
module (see the docs) - Added
RetriableYaDiskError
,WrongResourceTypeError
,BadGatewayError
andGatewayTimeoutError
listdir()
now raisesWrongResourceTypeError
instead ofNotADirectoryError
- Fixed passing
- Release 1.1.1 (2017-12-29)
- Fixed argument handling in
upload()
,download()
anddownload_public()
. Previously, passingn_retries
andretry_interval
would raise an exception (TypeError
).
- Fixed argument handling in
- Release 1.1.0 (2017-12-27)
- Better exceptions (see the docs)
- Added support for
force_async
parameter - Minor bug fixes
- Release 1.0.8 (2017-11-29)
- Fixed yet another
listdir()
bug
- Fixed yet another
- Release 1.0.7 (2017-11-04)
- Added
install_requires
argument tosetup.py
- Added
- Release 1.0.6 (2017-11-04)
- Return
OperationLinkObject
in some functions
- Return
- Release 1.0.5 (2017-10-29)
- Fixed
setup.py
to exclude tests
- Fixed
- Release 1.0.4 (2017-10-23)
- Fixed bugs in
upload
,download
andlistdir
functions - Set default
listdir
limit
to10000
- Fixed bugs in
- Release 1.0.3 (2017-10-22)
- Added settings
- Release 1.0.2 (2017-10-19)
- Fixed
get_code_url
function (added missing parameters)
- Fixed
- Release 1.0.1 (2017-10-18)
- Fixed a major bug in
GetTokenRequest
(added missing parameter)
- Fixed a major bug in
- Release 1.0.0 (2017-10-18)
- Initial release