Metadata-Version: 2.1
Name: ezshare
Version: 0.0.8
Summary: A simple library and commandline tool to access EzShare WiFi SD Cards
Author-email: Andrew 'Necromant' Andrianov <andrew@ncrmnt.org>
License: DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
                            Version 2, December 2004        
         Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>        
         Everyone is permitted to copy and distribute verbatim or modified
         copies of this license document, and changing it is allowed as long
         as the name is changed.        
                    DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
           TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION        
          0. You just DO WHAT THE FUCK YOU WANT TO.
Project-URL: Homepage, https://github.com/nekromant/python-ezshare
Project-URL: Bug Tracker, https://github.com/nekromant/python-ezshare/issues
Classifier: Programming Language :: Python :: 3
Classifier: License :: Public Domain
Classifier: Operating System :: OS Independent
Requires-Python: >=3.7
Description-Content-Type: text/markdown
License-File: LICENSE.TXT
Requires-Dist: requests (>=2)
Requires-Dist: lxml (>=4.6)
Requires-Dist: tqdm (>=4.6)
Requires-Dist: parse (>=1.18)

# What is it?

A python library and commandline tool to access and sync data from a ezShare WIFI SD Card.


# 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/ directory for a docker-compose.yml file and dockerfiles for an automated webdav uploader that I'm running.
The idea is simple: Mount webdav via fuse inside the docker container and run the 'live' mode in background.
