# What is it?
A python library and commandline tool to access and sync data from a ezShare WIFI SD Card.
[](https://asciinema.org/a/R7jcHXTVy1rP97TQdyQfSFwf8)
# How to install?
```
pip install ezshare
```
# How to use the commandline?
The commandline is really dead simple. It allows to list the card contents (_-l_, _--list_) and download (_-d_, _--download_) files
off the card. _-r_, _--recursive_ makes these operations recursive.
The source can be either a file or a directory (specified with -d). The target directory is the current working directory,
unless specified otherwise with _-t_ option. The target can be either a file for single-file downloads, or a dir (ending with /)
When downloading directories recursively the behavior is as follows:
* If the file doesn't exist on the local machine - create it and download
* If the file exists but differs in size - assume a broken download and download it again
* If the file exists and the size is the same as the remote - assume it's been already downloaded and skip it
There are also two weird, but most useful options:
* _-w_, _--wait_ - Ping the card until it's detected.
* _--live_ - Live mode.
See `--help` for up-to-date options. Typical usage examples are below.
```
~# ezshare-cli [-h] [-l LIST] [-d DOWNLOAD] [-r] [-t TARGET] [-w] [--live LIVE]
Unofficial ezShare cli tool
optional arguments:
-h, --help show this help message and exit
-l LIST, --list LIST List remote directory
-d DOWNLOAD, --download DOWNLOAD
Download a remote file or directory
-r, --recursive Recurse to subdirs on list/download
-t TARGET, --target TARGET
Specify target directory for downloads
-w, --wait Wait for WiFi SD to appear on the network
--live LIVE Live mode. Don't exit after syncronisation.The argument specifies cooldown in seconds
between sync. See docs for details
```
## List card contents
In a single directory
```
$ ezshare-cli -l /
Listing remote directory: /
DCIM/
```
or recursively
```
Listing remote directory: /
DCIM/
101CANON/
IMG_0356.JPG
IMG_0357.JPG
```
## Download a single file to current directory
```
ezshare-cli -d /DCIM/101CANON/IMG_0356.JPG
Synchronizing remote /DCIM/101CANON/IMG_0356.JPG -> .
./IMG_0356.JPG: 100%|██████████████████| 4.45M/4.45M [00:02<00:00, 1.71MB/s]
```
## Download a single file to a custom destination
```
Synchronizing remote /DCIM/101CANON/IMG_0356.JPG -> /tmp/
/tmp/IMG_0356.JPG: 100%|███████████████| 4.45M/4.45M [00:02<00:00, 1.68MB/s]
```
## Recursively download a directory
```
$ ezshare-cli -r -d / -t /tmp/SD_CONTENTS/
Synchronizing remote / -> /tmp/SD_CONTENTS/
/tmp/SD_CONTENTS/DCIM/101CANON/IMG_0356.JPG: 100%|███████████████| 4.45M/4.45M [00:05<00:00, 862kB/s]
/tmp/SD_CONTENTS/DCIM/101CANON/IMG_0357.JPG: 100%|███████████████| 2.86M/2.86M [00:02<00:00, 1.04MB/s]
```
## Wait for the card connection and synchronize contents when the card is available
```
$ ezshare-cli -w -r -d / -t /tmp/SD_CONTENTS/
Waiting for ezShare card...ONLINE!
Synchronizing remote / -> /tmp/SD_CONTENTS/
/tmp/SD_CONTENTS/DCIM/101CANON/IMG_0356.JPG: 100%|███████████████| 4.45M/4.45M [00:05<00:00, 862kB/s]
/tmp/SD_CONTENTS/DCIM/101CANON/IMG_0357.JPG: 100%|███████████████| 2.86M/2.86M [00:02<00:00, 1.04MB/s]
0 ✓ necromant @ silverblade /tmp $
```
## Continuous sync mode
Now this should be the most useful. In this mode the app pings the card until it's available, syncs the directories as specified, and sleeps for a timeout of seconds that is specified after the live option. You can specify the target directory in your nextcloud/dropbox/whatever directory and all
the photos will automagically sync to the cloud as soon as you connect your card.
```
$ ezshare-cli -w -r -d / -t /tmp/SD_CONTENTS/ --live 10
Waiting for ezShare card.ONLINE!
Synchronizing remote / -> /tmp/SD_CONTENTS/
/tmp/SD_CONTENTS/DCIM/101CANON/IMG_0356.JPG: 100%|████████████████| 4.45M/4.45M [00:05<00:00, 904kB/s]
/tmp/SD_CONTENTS/DCIM/101CANON/IMG_0357.JPG: 100%|████████████████| 2.86M/2.86M [00:02<00:00, 1.08MB/s]
Live mode. Next sync in 10 seconds
Waiting for ezShare card.ONLINE!
Synchronizing remote / -> /tmp/SD_CONTENTS/
Skipping file /tmp/SD_CONTENTS/DCIM/101CANON/IMG_0356.JPG (same size)
Skipping file /tmp/SD_CONTENTS/DCIM/101CANON/IMG_0357.JPG (same size)
Live mode. Next sync in 10 seconds
...
```
# Limitations
* There's no way to actually remove or upload files to the card. This is the hardware limitation;
* There's no way to make the card work in client mode or change the IP address. But you can work this around with an OpenWRT router.
Check out my blog for a neat trick: TODO
# Extra
Check out the docker-compose.yml and Dockerfile for an automated webdav uploader that I'm running.
It's not yet up at dockerhub, but I plan to fix it soon.
The idea is simple:
* Mount webdav via fuse inside the docker container,
* Run the 'live' mode of ezshare,
* Get all the photos delivered into your cloud file storage.
* ...
* PROFIT!