amazon-photos


Nameamazon-photos JSON
Version 0.0.97 PyPI version JSON
download
home_pagehttps://github.com/trevorhobenshield/amazon_photos
SummaryAmazon Photos API
upload_time2024-01-13 20:33:13
maintainer
docs_urlNone
authorTrevor Hobenshield
requires_python>=3.10.10
licenseMIT
keywords amazon photos api async search automation
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 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"
}
        
Elapsed time: 3.23070s