# Amazon Photos API
## Table of Contents
<!-- TOC -->
* [Installation](#installation)
* [Setup](#setup)
* [Examples](#examples)
* [Search](#search)
* [Nodes](#nodes)
* [Restrictions](#restrictions)
* [Range Queries](#range-queries)
* [Notes](#notes)
* [Known File Types](#known-file-types)
* [Custom Image Labeling (Optional)](#custom-image-labeling-optional)
<!-- TOC -->
> It is recommended to use this API in a [Jupyter Notebook](https://jupyter.org/install), as the results from most
> endpoints
> are a [DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html#pandas.DataFrame)
> which can be neatly displayed and efficiently manipulated with vectorized ops. This becomes
> increasingly important if you have "large" amounts of data (e.g. >1 million photos/videos).
## Installation
```bash
pip install amazon-photos -U
```
### Output Examples
`ap.db`
| | dateTimeDigitized | id | name | ... | model | apertureValue | focalLength | width | height | size |
|--:|:-------------------------|:-----------------------|:------------------|:----|:------------------|:--------------|:------------|------:|-------:|-------:|
| 0 | 2019-07-06T18:22:00.000Z | HeMReF-vvJiTTkdPIeWuoP | 1694252973839.png | ... | iPhone XS | 54823/32325 | 17/4 | 3024 | 4032 | 432777 |
| 1 | 2023-01-18T09:36:22.000Z | z_HiIvASAKqWmdrkjWiqMZ | 1692626817154.jpg | ... | iPhone XS | 54823/32325 | 17/4 | 3024 | 4032 | 234257 |
| 2 | 2022-08-14T14:13:21.000Z | LKXEZbqoVrhrOYBezisGEQ | 1798219686789.jpg | ... | iPhone 11 Pro Max | 54823/32325 | 17/4 | 3024 | 4032 | 423987 |
| 3 | 2020-06-28T19:32:30.000Z | EPUeciHtfKkGiYkfUyEuMa | 1593482220567.jpg | ... | iPhone XS | 54823/32325 | 17/4 | 3024 | 4032 | 898957 |
| 4 | 2021-07-07T17:12:55.000Z | fdfKzRJbEyoVeGcfCoJgE- | 1592299282720.png | ... | iPhone XR | 54823/32325 | 17/4 | 3024 | 4032 | 432556 |
| 5 | 2021-08-18T18:32:41.000Z | crskJSmKPFRhxbpfkivyLm | 1592902159105.png | ... | iPhone XR | 54823/32325 | 17/4 | 3024 | 4032 | 123123 |
| 6 | 2023-08-23T19:12:21.000Z | qkBFUlyIdkUwVVSaVWWKEF | 1598138358650.png | ... | iPhone 11 | 54823/32325 | 17/4 | 3024 | 4032 | 437887 |
| 7 | 2021-06-19T17:14:13.000Z | TXKMKC-mHvSUrtRfwmtyDe | 1622199863606.jpg | ... | iPhone 12 Pro | 14447/10653 | 21/5 | 1536 | 2048 | 758432 |
| 8 | 2023-02-15T22:45:40.000Z | FRDvvjcZdpFWiwrIZfTNHO | 1581874518054.jpg | ... | iPhone 8 Plus | 54823/32325 | 399/100 | 1348 | 2049 | 862883 |
`ap.print_tree()`
```text
~
├── Documents
├── Pictures
│ ├── iPhone
│ └── Web
│ ├── foo
│ └── bar
├── Videos
└── Backup
├── LAPTOP-XYZ
│ └── Desktop
└── DESKTOP-IJK
└── Desktop
```
## Setup
> [Update] Jan 04 2024: To avoid confusion, setting env vars is no longer supported. One must pass cookies directly as
> shown below.
Log in to Amazon Photos and copy the following cookies:
- `session-id`
- `ubid`*
- `at`*
### Canada/Europe
where `xx` is the TLD (top-level domain)
- `ubid-acbxx`
- `at-acbxx`
### United States
- `ubid_main`
- `at_main`
E.g.
```python
from amazon_photos import AmazonPhotos
ap = AmazonPhotos(
## US
# cookies={
# 'ubid_main': ...,
# 'at_main': ...,
# 'session-id': ...,
# },
## Canada
# cookies={
# 'ubid-acbca': ...,
# 'at-acbca': ...,
# 'session-id': ...,
# }
## Italy
# cookies={
# 'ubid-acbit': ...,
# 'at-acbit': ...,
# 'session-id': ...,
# }
)
```
## Examples
> A database named `ap.parquet` will be created during the initial setup. This is mainly used to reduce upload conflicts
> by checking your local file(s) md5 against the database before sending the request.
```python
from amazon_photos import AmazonPhotos
ap = AmazonPhotos(
# see cookie examples above
cookies={...},
# optionally cache all intermediate JSON responses
tmp='tmp',
# pandas options
dtype_backend='pyarrow',
engine='pyarrow',
)
# get current usage stats
ap.usage()
# get entire Amazon Photos library
nodes = ap.query("type:(PHOTOS OR VIDEOS)")
# query Amazon Photos library with more filters applied
nodes = ap.query("type:(PHOTOS OR VIDEOS) AND things:(plant AND beach OR moon) AND timeYear:(2023) AND timeMonth:(8) AND timeDay:(14) AND location:(CAN#BC#Vancouver)")
# sample first 10 nodes
node_ids = nodes.id[:10]
# move a batch of images/videos to the trash bin
ap.trash(node_ids)
# get trash bin contents
ap.trashed()
# permanently delete a batch of images/videos
ap.delete(node_ids)
# restore a batch of images/videos from the trash bin
ap.restore(node_ids)
# upload media (preserves local directory structure and copies to Amazon Photos root directory)
ap.upload('path/to/files')
# download a batch of images/videos
ap.download(node_ids)
# convenience method to get photos only
ap.photos()
# convenience method to get videos only
ap.videos()
# get all identifiers calculated by Amazon.
ap.aggregations(category="all")
# get specific identifiers calculated by Amazon.
ap.aggregations(category="location")
```
## Search
*Undocumented API, current endpoints valid Dec 2023.*
For valid **location** and **people** IDs, see the results from the `aggregations()` method.
| name | type | description |
|:----------------|:-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| ContentType | str | `"JSON"` |
| _ | int | `1690059771064` |
| asset | str | `"ALL"`<br/>`"MOBILE"`<br/>`"NONE`<br/>`"DESKTOP"`<br/><br/>default: `"ALL"` |
| filters | str | `"type:(PHOTOS OR VIDEOS) AND things:(plant AND beach OR moon) AND timeYear:(2019) AND timeMonth:(7) AND location:(CAN#BC#Vancouver) AND people:(CyChdySYdfj7DHsjdSHdy)"`<br/><br/>default: `"type:(PHOTOS OR VIDEOS)"` |
| groupByForTime | str | `"day"`<br/>`"month"`<br/>`"year"` |
| limit | int | `200` |
| lowResThumbnail | str | `"true"`<br/>`"false"`<br/><br/>default: `"true"` |
| resourceVersion | str | `"V2"` |
| searchContext | str | `"customer"`<br/>`"all"`<br/>`"unknown"`<br/>`"family"`<br/>`"groups"`<br/><br/>default: `"customer"` |
| sort | str | `"['contentProperties.contentDate DESC']"`<br/>`"['contentProperties.contentDate ASC']"`<br/>`"['createdDate DESC']"`<br/>`"['createdDate ASC']"`<br/>`"['name DESC']"`<br/>`"['name ASC']"`<br/><br/>default: `"['contentProperties.contentDate DESC']"` |
| tempLink | str | `"false"`<br/>`"true"`<br/><br/>default: `"false"` | |
## Nodes
*Docs last updated in 2015*
| FieldName | FieldType | Sort Allowed | Notes |
|-------------------------------|--------------------------|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| isRoot | Boolean | | Only lower case `"true"` is supported. |
| name | String | Yes | This field does an exact match on the name and prefix query. Consider `node1{ "name" : "sample" }` `node2 { "name" : "sample1" }` Query filter<br>`name:sample` will return node1<br>`name:sample*` will return node1 and node2 |
| kind | String | Yes | To search for all the nodes which contains kind as FILE `kind:FILE` |
| modifiedDate | Date (in ISO8601 Format) | Yes | To Search for all the nodes which has modified from time `modifiedDate:{"2014-12-31T23:59:59.000Z" TO *]` |
| createdDate | Date (in ISO8601 Format) | Yes | To Search for all the nodes created on `createdDate:2014-12-31T23:59:59.000Z` |
| labels | String Array | | Only Equality can be tested with arrays.<br>if labels contains `["name", "test", "sample"]`.<br>Label can be searched for name or combination of values.<br>To get all the labels which contain name and test<br>`labels: (name AND test)` |
| description | String | | To Search all the nodes for description with value 'test'<br>`description:test` |
| parents | String Array | | Only Equality can be tested with arrays.<br>if parents contains `["id1", "id2", "id3"]`.<br>Parent can be searched for name or combination of values.<br>To get all the parents which contains id1 and id2<br>`parents:id1 AND parents:id2` |
| status | String | Yes | For searching nodes with AVAILABLE status.<br>`status:AVAILABLE` |
| contentProperties.size | Long | Yes | |
| contentProperties.contentType | String | Yes | If prefix query, only the major content-type (e.g. `image*`, `video*`, etc.) is supported as a prefix. |
| contentProperties.md5 | String | | |
| contentProperties.contentDate | Date (in ISO8601 Format) | Yes | RangeQueries and equals queries can be used with this field |
| contentProperties.extension | String | Yes | |
### Restrictions
> Max # of Filter Parameters Allowed is 8
| Filter Type | Filters |
|:------------|:--------------------------------------------------------------------------------------|
| Equality | createdDate, description, isRoot, kind, labels, modifiedDate, name, parentIds, status |
| Range | contentProperties.contentDate, createdDate, modifiedDate |
| Prefix | contentProperties.contentType, name |
### Range Queries
| Operation | Syntax |
|----------------------|------------------------------------------------------------------|
| GreaterThan | `{"valueToBeTested" TO *}` |
| GreaterThan or Equal | `["ValueToBeTested" TO *]` |
| LessThan | `{* TO "ValueToBeTested"}` |
| LessThan or Equal | `{* TO "ValueToBeTested"]` |
| Between | `["ValueToBeTested_LowerBound" TO "ValueToBeTested_UpperBound"]` |
## Notes
#### `https://www.amazon.ca/drive/v1/batchLink`
- This endpoint is called when downloading a batch of photos/videos in the web interface. It then returns a URL to
download a zip file, then makes a request to that url to download the content.
When making a request to download data for 1200 nodes (max batch size), it turns out to be much slower (~2.5 minutes)
than asynchronously downloading 1200 photos/videos individually (~1 minute).
### Known File Types
| Extension | Category |
|-----------|----------|
| \.pdf | pdf |
| \.doc | doc |
| \.docx | doc |
| \.docm | doc |
| \.dot | doc |
| \.dotx | doc |
| \.dotm | doc |
| \.asd | doc |
| \.cnv | doc |
| \.mp3 | mp3 |
| \.m4a | mp3 |
| \.m4b | mp3 |
| \.m4p | mp3 |
| \.wav | mp3 |
| \.aac | mp3 |
| \.aif | mp3 |
| \.mpa | mp3 |
| \.wma | mp3 |
| \.flac | mp3 |
| \.mid | mp3 |
| \.ogg | mp3 |
| \.xls | xls |
| \.xlm | xls |
| \.xll | xls |
| \.xlc | xls |
| \.xar | xls |
| \.xla | xls |
| \.xlb | xls |
| \.xlsb | xls |
| \.xlsm | xls |
| \.xlsx | xls |
| \.xlt | xls |
| \.xltm | xls |
| \.xltx | xls |
| \.xlw | xls |
| \.ppt | ppt |
| \.pptx | ppt |
| \.ppa | ppt |
| \.ppam | ppt |
| \.pptm | ppt |
| \.pps | ppt |
| \.ppsm | ppt |
| \.ppsx | ppt |
| \.pot | ppt |
| \.potm | ppt |
| \.potx | ppt |
| \.sldm | ppt |
| \.sldx | ppt |
| \.txt | txt |
| \.text | txt |
| \.rtf | txt |
| \.xml | markup |
| \.htm | markup |
| \.html | markup |
| \.zip | zip |
| \.rar | zip |
| \.7z | zip |
| \.jpg | img |
| \.jpeg | img |
| \.png | img |
| \.bmp | img |
| \.gif | img |
| \.tif | img |
| \.svg | img |
| \.mp4 | vid |
| \.m4v | vid |
| \.qt | vid |
| \.mov | vid |
| \.mpg | vid |
| \.mpeg | vid |
| \.3g2 | vid |
| \.3gp | vid |
| \.flv | vid |
| \.f4v | vid |
| \.asf | vid |
| \.avi | vid |
| \.wmv | vid |
| \.swf | exe |
| \.exe | exe |
| \.dll | exe |
| \.ax | exe |
| \.ocx | exe |
| \.rpm | exe |
## Custom Image Labeling (Optional)
Categorize your images into folders using computer vision models.
```bash
pip install amazon-photos[extras] -U
```
See the [Model List](https://www.hobenshield.com/stats/bench/index.html) for a list of all available models.
### Sample Models
**Very Large**
```
eva02_base_patch14_448.mim_in22k_ft_in22k_in1k
```
**Large**
```
eva02_large_patch14_448.mim_m38m_ft_in22k_in1k
```
**Medium**
```
eva02_small_patch14_336.mim_in22k_ft_in1k
vit_base_patch16_clip_384.laion2b_ft_in12k_in1k
vit_base_patch16_clip_384.openai_ft_in12k_in1k
caformer_m36.sail_in22k_ft_in1k_384
```
**Small**
```
eva02_tiny_patch14_336.mim_in22k_ft_in1k
tiny_vit_5m_224.dist_in22k_ft_in1k
edgenext_small.usi_in1k
xcit_tiny_12_p8_384.fb_dist_in1k
```
```python
run(
'eva02_base_patch14_448.mim_in22k_ft_in22k_in1k',
path_in='images',
path_out='labeled',
thresh=0.0, # threshold for predictions, 0.9 means you want very confident predictions only
topk=5,
# window of predictions to check if using exclude or restrict, if set to 1, only the top prediction will be checked
exclude=lambda x: re.search('boat|ocean', x, flags=re.I),
# function to exclude classification of these predicted labels
restrict=lambda x: re.search('sand|beach|sunset', x, flags=re.I),
# function to restrict classification to only these predicted labels
dataloader_options={
'batch_size': 4, # *** adjust ***
'shuffle': False,
'num_workers': psutil.cpu_count(logical=False), # *** adjust ***
'pin_memory': True,
},
accumulate=False,
# accumulate results in path_out, if False, everything in path_out will be deleted before running again
device='cuda',
naming_style='name', # use human-readable label names, optionally use the label index or synset
debug=0,
)
```
Raw data
{
"_id": null,
"home_page": "https://github.com/trevorhobenshield/amazon_photos",
"name": "amazon-photos",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.10.10",
"maintainer_email": "",
"keywords": "amazon photos api async search automation",
"author": "Trevor Hobenshield",
"author_email": "trevorhobenshield@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/33/7e/3a0aa08826cbf928dd8b15f57119430aeecea9fedc824fd3a24dc7dc487b/amazon-photos-0.0.97.tar.gz",
"platform": null,
"description": "# Amazon Photos API\n\n## Table of Contents\n\n<!-- TOC -->\n\n* [Installation](#installation)\n* [Setup](#setup)\n* [Examples](#examples)\n* [Search](#search)\n* [Nodes](#nodes)\n * [Restrictions](#restrictions)\n * [Range Queries](#range-queries)\n* [Notes](#notes)\n * [Known File Types](#known-file-types)\n* [Custom Image Labeling (Optional)](#custom-image-labeling-optional)\n\n<!-- TOC -->\n\n> It is recommended to use this API in a [Jupyter Notebook](https://jupyter.org/install), as the results from most\n> endpoints\n> are a [DataFrame](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html#pandas.DataFrame)\n> which can be neatly displayed and efficiently manipulated with vectorized ops. This becomes\n> increasingly important if you have \"large\" amounts of data (e.g. >1 million photos/videos).\n\n## Installation\n\n```bash\npip install amazon-photos -U\n```\n\n### Output Examples\n\n`ap.db`\n\n| | dateTimeDigitized | id | name | ... | model | apertureValue | focalLength | width | height | size |\n|--:|:-------------------------|:-----------------------|:------------------|:----|:------------------|:--------------|:------------|------:|-------:|-------:|\n| 0 | 2019-07-06T18:22:00.000Z | HeMReF-vvJiTTkdPIeWuoP | 1694252973839.png | ... | iPhone XS | 54823/32325 | 17/4 | 3024 | 4032 | 432777 |\n| 1 | 2023-01-18T09:36:22.000Z | z_HiIvASAKqWmdrkjWiqMZ | 1692626817154.jpg | ... | iPhone XS | 54823/32325 | 17/4 | 3024 | 4032 | 234257 |\n| 2 | 2022-08-14T14:13:21.000Z | LKXEZbqoVrhrOYBezisGEQ | 1798219686789.jpg | ... | iPhone 11 Pro Max | 54823/32325 | 17/4 | 3024 | 4032 | 423987 |\n| 3 | 2020-06-28T19:32:30.000Z | EPUeciHtfKkGiYkfUyEuMa | 1593482220567.jpg | ... | iPhone XS | 54823/32325 | 17/4 | 3024 | 4032 | 898957 |\n| 4 | 2021-07-07T17:12:55.000Z | fdfKzRJbEyoVeGcfCoJgE- | 1592299282720.png | ... | iPhone XR | 54823/32325 | 17/4 | 3024 | 4032 | 432556 |\n| 5 | 2021-08-18T18:32:41.000Z | crskJSmKPFRhxbpfkivyLm | 1592902159105.png | ... | iPhone XR | 54823/32325 | 17/4 | 3024 | 4032 | 123123 |\n| 6 | 2023-08-23T19:12:21.000Z | qkBFUlyIdkUwVVSaVWWKEF | 1598138358650.png | ... | iPhone 11 | 54823/32325 | 17/4 | 3024 | 4032 | 437887 |\n| 7 | 2021-06-19T17:14:13.000Z | TXKMKC-mHvSUrtRfwmtyDe | 1622199863606.jpg | ... | iPhone 12 Pro | 14447/10653 | 21/5 | 1536 | 2048 | 758432 |\n| 8 | 2023-02-15T22:45:40.000Z | FRDvvjcZdpFWiwrIZfTNHO | 1581874518054.jpg | ... | iPhone 8 Plus | 54823/32325 | 399/100 | 1348 | 2049 | 862883 |\n\n`ap.print_tree()`\n\n```text\n~ \n\u251c\u2500\u2500 Documents \n\u251c\u2500\u2500 Pictures \n\u2502 \u251c\u2500\u2500 iPhone \n\u2502 \u2514\u2500\u2500 Web \n\u2502 \u251c\u2500\u2500 foo \n\u2502 \u2514\u2500\u2500 bar\n\u251c\u2500\u2500 Videos \n\u2514\u2500\u2500 Backup \n \u251c\u2500\u2500 LAPTOP-XYZ \n \u2502 \u2514\u2500\u2500 Desktop \n \u2514\u2500\u2500 DESKTOP-IJK \n \u2514\u2500\u2500 Desktop\n```\n\n## Setup\n\n> [Update] Jan 04 2024: To avoid confusion, setting env vars is no longer supported. One must pass cookies directly as\n> shown below.\n\nLog in to Amazon Photos and copy the following cookies:\n\n- `session-id`\n- `ubid`*\n- `at`*\n\n### Canada/Europe\n\nwhere `xx` is the TLD (top-level domain)\n\n- `ubid-acbxx`\n- `at-acbxx`\n\n### United States\n\n- `ubid_main`\n- `at_main`\n\nE.g.\n\n```python\nfrom amazon_photos import AmazonPhotos\n\nap = AmazonPhotos(\n ## US\n # cookies={\n # 'ubid_main': ...,\n # 'at_main': ...,\n # 'session-id': ...,\n # },\n\n ## Canada\n # cookies={\n # 'ubid-acbca': ...,\n # 'at-acbca': ...,\n # 'session-id': ...,\n # }\n\n ## Italy\n # cookies={\n # 'ubid-acbit': ...,\n # 'at-acbit': ...,\n # 'session-id': ...,\n # }\n)\n```\n\n## Examples\n\n> A database named `ap.parquet` will be created during the initial setup. This is mainly used to reduce upload conflicts\n> by checking your local file(s) md5 against the database before sending the request.\n\n```python\nfrom amazon_photos import AmazonPhotos\n\nap = AmazonPhotos(\n # see cookie examples above\n cookies={...},\n # optionally cache all intermediate JSON responses\n tmp='tmp',\n # pandas options\n dtype_backend='pyarrow',\n engine='pyarrow',\n)\n\n# get current usage stats\nap.usage()\n\n# get entire Amazon Photos library\nnodes = ap.query(\"type:(PHOTOS OR VIDEOS)\")\n\n# query Amazon Photos library with more filters applied\nnodes = ap.query(\"type:(PHOTOS OR VIDEOS) AND things:(plant AND beach OR moon) AND timeYear:(2023) AND timeMonth:(8) AND timeDay:(14) AND location:(CAN#BC#Vancouver)\")\n\n# sample first 10 nodes\nnode_ids = nodes.id[:10]\n\n# move a batch of images/videos to the trash bin\nap.trash(node_ids)\n\n# get trash bin contents\nap.trashed()\n\n# permanently delete a batch of images/videos\nap.delete(node_ids)\n\n# restore a batch of images/videos from the trash bin\nap.restore(node_ids)\n\n# upload media (preserves local directory structure and copies to Amazon Photos root directory)\nap.upload('path/to/files')\n\n# download a batch of images/videos\nap.download(node_ids)\n\n# convenience method to get photos only\nap.photos()\n\n# convenience method to get videos only\nap.videos()\n\n# get all identifiers calculated by Amazon.\nap.aggregations(category=\"all\")\n\n# get specific identifiers calculated by Amazon.\nap.aggregations(category=\"location\")\n```\n\n## Search\n\n*Undocumented API, current endpoints valid Dec 2023.*\n\nFor valid **location** and **people** IDs, see the results from the `aggregations()` method.\n\n| name | type | description |\n|:----------------|:-----|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| ContentType | str | `\"JSON\"` |\n| _ | int | `1690059771064` |\n| asset | str | `\"ALL\"`<br/>`\"MOBILE\"`<br/>`\"NONE`<br/>`\"DESKTOP\"`<br/><br/>default: `\"ALL\"` |\n| filters | str | `\"type:(PHOTOS OR VIDEOS) AND things:(plant AND beach OR moon) AND timeYear:(2019) AND timeMonth:(7) AND location:(CAN#BC#Vancouver) AND people:(CyChdySYdfj7DHsjdSHdy)\"`<br/><br/>default: `\"type:(PHOTOS OR VIDEOS)\"` |\n| groupByForTime | str | `\"day\"`<br/>`\"month\"`<br/>`\"year\"` |\n| limit | int | `200` |\n| lowResThumbnail | str | `\"true\"`<br/>`\"false\"`<br/><br/>default: `\"true\"` |\n| resourceVersion | str | `\"V2\"` |\n| searchContext | str | `\"customer\"`<br/>`\"all\"`<br/>`\"unknown\"`<br/>`\"family\"`<br/>`\"groups\"`<br/><br/>default: `\"customer\"` |\n| sort | str | `\"['contentProperties.contentDate DESC']\"`<br/>`\"['contentProperties.contentDate ASC']\"`<br/>`\"['createdDate DESC']\"`<br/>`\"['createdDate ASC']\"`<br/>`\"['name DESC']\"`<br/>`\"['name ASC']\"`<br/><br/>default: `\"['contentProperties.contentDate DESC']\"` |\n| tempLink | str | `\"false\"`<br/>`\"true\"`<br/><br/>default: `\"false\"` | |\n\n## Nodes\n\n*Docs last updated in 2015*\n\n| FieldName | FieldType | Sort Allowed | Notes |\n|-------------------------------|--------------------------|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| isRoot | Boolean | | Only lower case `\"true\"` is supported. |\n| name | String | Yes | This field does an exact match on the name and prefix query. Consider `node1{ \"name\" : \"sample\" }` `node2 { \"name\" : \"sample1\" }` Query filter<br>`name:sample` will return node1<br>`name:sample*` will return node1 and node2 |\n| kind | String | Yes | To search for all the nodes which contains kind as FILE `kind:FILE` |\n| modifiedDate | Date (in ISO8601 Format) | Yes | To Search for all the nodes which has modified from time `modifiedDate:{\"2014-12-31T23:59:59.000Z\" TO *]` |\n| createdDate | Date (in ISO8601 Format) | Yes | To Search for all the nodes created on `createdDate:2014-12-31T23:59:59.000Z` |\n| labels | String Array | | Only Equality can be tested with arrays.<br>if labels contains `[\"name\", \"test\", \"sample\"]`.<br>Label can be searched for name or combination of values.<br>To get all the labels which contain name and test<br>`labels: (name AND test)` |\n| description | String | | To Search all the nodes for description with value 'test'<br>`description:test` |\n| parents | String Array | | Only Equality can be tested with arrays.<br>if parents contains `[\"id1\", \"id2\", \"id3\"]`.<br>Parent can be searched for name or combination of values.<br>To get all the parents which contains id1 and id2<br>`parents:id1 AND parents:id2` |\n| status | String | Yes | For searching nodes with AVAILABLE status.<br>`status:AVAILABLE` |\n| contentProperties.size | Long | Yes | |\n| contentProperties.contentType | String | Yes | If prefix query, only the major content-type (e.g. `image*`, `video*`, etc.) is supported as a prefix. |\n| contentProperties.md5 | String | | |\n| contentProperties.contentDate | Date (in ISO8601 Format) | Yes | RangeQueries and equals queries can be used with this field |\n| contentProperties.extension | String | Yes | |\n\n### Restrictions\n\n> Max # of Filter Parameters Allowed is 8\n\n| Filter Type | Filters |\n|:------------|:--------------------------------------------------------------------------------------|\n| Equality | createdDate, description, isRoot, kind, labels, modifiedDate, name, parentIds, status |\n| Range | contentProperties.contentDate, createdDate, modifiedDate |\n| Prefix | contentProperties.contentType, name |\n\n### Range Queries\n\n| Operation | Syntax |\n|----------------------|------------------------------------------------------------------|\n| GreaterThan | `{\"valueToBeTested\" TO *}` |\n| GreaterThan or Equal | `[\"ValueToBeTested\" TO *]` |\n| LessThan | `{* TO \"ValueToBeTested\"}` |\n| LessThan or Equal | `{* TO \"ValueToBeTested\"]` |\n| Between | `[\"ValueToBeTested_LowerBound\" TO \"ValueToBeTested_UpperBound\"]` |\n\n## Notes\n\n#### `https://www.amazon.ca/drive/v1/batchLink`\n\n- This endpoint is called when downloading a batch of photos/videos in the web interface. It then returns a URL to\n download a zip file, then makes a request to that url to download the content.\n When making a request to download data for 1200 nodes (max batch size), it turns out to be much slower (~2.5 minutes)\n than asynchronously downloading 1200 photos/videos individually (~1 minute).\n\n### Known File Types\n\n| Extension | Category |\n|-----------|----------|\n| \\.pdf | pdf |\n| \\.doc | doc |\n| \\.docx | doc |\n| \\.docm | doc |\n| \\.dot | doc |\n| \\.dotx | doc |\n| \\.dotm | doc |\n| \\.asd | doc |\n| \\.cnv | doc |\n| \\.mp3 | mp3 |\n| \\.m4a | mp3 |\n| \\.m4b | mp3 |\n| \\.m4p | mp3 |\n| \\.wav | mp3 |\n| \\.aac | mp3 |\n| \\.aif | mp3 |\n| \\.mpa | mp3 |\n| \\.wma | mp3 |\n| \\.flac | mp3 |\n| \\.mid | mp3 |\n| \\.ogg | mp3 |\n| \\.xls | xls |\n| \\.xlm | xls |\n| \\.xll | xls |\n| \\.xlc | xls |\n| \\.xar | xls |\n| \\.xla | xls |\n| \\.xlb | xls |\n| \\.xlsb | xls |\n| \\.xlsm | xls |\n| \\.xlsx | xls |\n| \\.xlt | xls |\n| \\.xltm | xls |\n| \\.xltx | xls |\n| \\.xlw | xls |\n| \\.ppt | ppt |\n| \\.pptx | ppt |\n| \\.ppa | ppt |\n| \\.ppam | ppt |\n| \\.pptm | ppt |\n| \\.pps | ppt |\n| \\.ppsm | ppt |\n| \\.ppsx | ppt |\n| \\.pot | ppt |\n| \\.potm | ppt |\n| \\.potx | ppt |\n| \\.sldm | ppt |\n| \\.sldx | ppt |\n| \\.txt | txt |\n| \\.text | txt |\n| \\.rtf | txt |\n| \\.xml | markup |\n| \\.htm | markup |\n| \\.html | markup |\n| \\.zip | zip |\n| \\.rar | zip |\n| \\.7z | zip |\n| \\.jpg | img |\n| \\.jpeg | img |\n| \\.png | img |\n| \\.bmp | img |\n| \\.gif | img |\n| \\.tif | img |\n| \\.svg | img |\n| \\.mp4 | vid |\n| \\.m4v | vid |\n| \\.qt | vid |\n| \\.mov | vid |\n| \\.mpg | vid |\n| \\.mpeg | vid |\n| \\.3g2 | vid |\n| \\.3gp | vid |\n| \\.flv | vid |\n| \\.f4v | vid |\n| \\.asf | vid |\n| \\.avi | vid |\n| \\.wmv | vid |\n| \\.swf | exe |\n| \\.exe | exe |\n| \\.dll | exe |\n| \\.ax | exe |\n| \\.ocx | exe |\n| \\.rpm | exe |\n\n## Custom Image Labeling (Optional)\n\nCategorize your images into folders using computer vision models.\n\n```bash\npip install amazon-photos[extras] -U\n```\n\nSee the [Model List](https://www.hobenshield.com/stats/bench/index.html) for a list of all available models.\n\n### Sample Models\n\n**Very Large**\n\n```\neva02_base_patch14_448.mim_in22k_ft_in22k_in1k\n```\n\n**Large**\n\n```\neva02_large_patch14_448.mim_m38m_ft_in22k_in1k\n```\n\n**Medium**\n\n```\neva02_small_patch14_336.mim_in22k_ft_in1k\nvit_base_patch16_clip_384.laion2b_ft_in12k_in1k\nvit_base_patch16_clip_384.openai_ft_in12k_in1k\ncaformer_m36.sail_in22k_ft_in1k_384\n```\n\n**Small**\n\n```\neva02_tiny_patch14_336.mim_in22k_ft_in1k\ntiny_vit_5m_224.dist_in22k_ft_in1k\nedgenext_small.usi_in1k\nxcit_tiny_12_p8_384.fb_dist_in1k\n```\n\n```python\nrun(\n 'eva02_base_patch14_448.mim_in22k_ft_in22k_in1k',\n path_in='images',\n path_out='labeled',\n thresh=0.0, # threshold for predictions, 0.9 means you want very confident predictions only\n topk=5,\n # window of predictions to check if using exclude or restrict, if set to 1, only the top prediction will be checked\n exclude=lambda x: re.search('boat|ocean', x, flags=re.I),\n # function to exclude classification of these predicted labels\n restrict=lambda x: re.search('sand|beach|sunset', x, flags=re.I),\n # function to restrict classification to only these predicted labels\n dataloader_options={\n 'batch_size': 4, # *** adjust ***\n 'shuffle': False,\n 'num_workers': psutil.cpu_count(logical=False), # *** adjust ***\n 'pin_memory': True,\n },\n accumulate=False,\n # accumulate results in path_out, if False, everything in path_out will be deleted before running again\n device='cuda',\n naming_style='name', # use human-readable label names, optionally use the label index or synset\n debug=0,\n)\n```\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Amazon Photos API",
"version": "0.0.97",
"project_urls": {
"Homepage": "https://github.com/trevorhobenshield/amazon_photos"
},
"split_keywords": [
"amazon",
"photos",
"api",
"async",
"search",
"automation"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "d4f827e0939b5505e4fbeb1938ede117d19556b0aa82dd60484bef51266ff063",
"md5": "7af12df075d6340664c28008c0815d45",
"sha256": "d4028fa714c1b7039b544db06c482766b1b57ffb9326c8a3affeb21891112540"
},
"downloads": -1,
"filename": "amazon_photos-0.0.97-py3-none-any.whl",
"has_sig": false,
"md5_digest": "7af12df075d6340664c28008c0815d45",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.10.10",
"size": 21247,
"upload_time": "2024-01-13T20:33:10",
"upload_time_iso_8601": "2024-01-13T20:33:10.962792Z",
"url": "https://files.pythonhosted.org/packages/d4/f8/27e0939b5505e4fbeb1938ede117d19556b0aa82dd60484bef51266ff063/amazon_photos-0.0.97-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "337e3a0aa08826cbf928dd8b15f57119430aeecea9fedc824fd3a24dc7dc487b",
"md5": "53635398803ab50d0769e06be699db56",
"sha256": "785d59b8756821d30ede67a25e376fd4fadd08b25a3af329d933cb16ac387381"
},
"downloads": -1,
"filename": "amazon-photos-0.0.97.tar.gz",
"has_sig": false,
"md5_digest": "53635398803ab50d0769e06be699db56",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10.10",
"size": 26155,
"upload_time": "2024-01-13T20:33:13",
"upload_time_iso_8601": "2024-01-13T20:33:13.335496Z",
"url": "https://files.pythonhosted.org/packages/33/7e/3a0aa08826cbf928dd8b15f57119430aeecea9fedc824fd3a24dc7dc487b/amazon-photos-0.0.97.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-01-13 20:33:13",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "trevorhobenshield",
"github_project": "amazon_photos",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "amazon-photos"
}