Usage
=====

As a Python module
------------------

Simple usage
************

You only have to import :mod:`pyimgren` and create a
:class:`pyimgren.renamer.Renamer`::

    import pyimgren

    ren = pyimgren.Renamer("/path/to_folder")      # use default options here

and that's all...

You can then use the :meth:`~pyimgren.renamer.Renamer.rename` and
:meth:`~pyimgren.renamer.Renamer.back` methods to rename
pictures forth and back::

    ren.rename("DSC*.JPF")     # rename all files in the folder matching DSCF*.JPG
    ...
    ren.back("20160910*.jpg")  # only rename back pictures taken on 10/09/2016

You can also merge files from a different directory. It makes sense when you
want to pick pictures from another camera::

    ren.merge("IMG*.JPG", src_folder="e:\dcim")

Mid-level usage
***************

All messages from the :mod:`pyimgren` module go through the :mod:`logging`
module. If you want debug messages to be actually printed, you **must**
configure a non default handler processing that level before using
:meth:`~pyimgren.renamer.Renamer.rename`,
:meth:`~pyimgren.renamer.Renamer.back` and
:meth:`~pyimgren.renamer.Renamer.merge`, methods with a
``debug=True`` parameter::

    log = logging.getLogger('pyimgren')
    log.setLevel(logging.DEBUG)
    log.addHandler(logging.StreamHandler())
    ...
    ren.rename("IMG*.JPEG", debug=True)       # ok, debug messages will be printed

Advanced usage
**************

If you want to build a complete front end for :mod:`pyimgren`, you will
probably be interested by the others methods from
:class:`~pyimgren.renamer.Renamer` and the
function :func:`~pyimgren.renamer.exif_dat`.

This last one tries its best to extract an exif timestamp from a file and
returns ``None`` if it could not find one. You can use it to easily build a
dictionary ``{file_name: exif_timestamp}`` from a list of picture names::

    dd = { file: exif_dat(file) for file in files }

It is guaranteed to never raise any exception.

The other methods from :class:`~pyimgren.renamer.Renamer`, namely
:meth:`~pyimgren.renamer.Renamer.load_names` and
:meth:`~pyimgren.renamer.Renamer.get_new_name` respectively load
the names of pictures which have been
renamed (both new name and original one), and find what would be the new name
of a file with respect to the ``a`` to ``zz`` suffixes. Examples::

    # build a list of all files in the folder with their original name
    names = ren.load(names).items()

or::

    file_name = ...
    dat = exif_dat(file_name)
    if dat is not None:
        new_name = get_new_name(dat.strftime(ren.dst_mask) + ren.dst_ext)

.. _cmd_line:

From the command line
---------------------

The package provides a command line interface to the
:class:`~pyimgren.renamer.Renamer` class.

Syntax:

.. code-block:: none

    usage: pyimgren [-h] [-V] [--folder FOLDER] [-d DST_MASK]
                    [-e EXT_MASK] [-r REF_FILE] [-x DELTA] [-D] [-X]
                    {rename,back,merge} ...

    Rename pictures according to their exif timestamp

    positional arguments:
      {rename,back,merge}   sub-commands
        rename              rename files by using their exif timestamp
        back                rename files back to their original name
        merge               merge files from a different folder

    options:
      -h, --help            show this help message and exit
      -V, --version         show program's version number and exit
      --folder FOLDER, -f FOLDER
                            folder containing files to rename
      -d DST_MASK, --dst_mask DST_MASK
                            format for the new file name
      -e EXT_MASK, --ext EXT_MASK
                            extension for the new file name
      -r REF_FILE, --ref_file REF_FILE
                            a file to remember the old names
      -x DELTA, --delta DELTA
                            number of minutes to add to exif time
      -D, --debug           print a line per rename
      -X, --dry_run         process normally except no rename occurs

and for sub-commands:

.. code-block:: none

    usage: pyimgren {rename|back} [-h] files [files ...]

    positional arguments:
      files       files to process

    options:
      -h, --help  show this help message and exit

or:

.. code-block:: none

    usage: pyimgren merge [-h] [-s SRC_FOLDER] files [files ...]

    positional arguments:
      files                 files to process

    options:
      -h, --help            show this help message and exit
      -s SRC_FOLDER, --src_folder SRC_FOLDER
                            source folder for merging from

This internally starts a :class:`~pyimgren.renamer.Renamer`
with the options passed as
parameter. If option ``-D|--debug`` is present a :class:`StreamHandler`
is configured to process Debug level message in the :mod:`logging` module.
Then, the :class:`~pyimgren.renamer.Renamer` runs the method corresponding
to the sub-command.

Default values:
***************

All (global) options have default values::

    folder:         current directory (.)
    DST_MASK:       %Y%m%d_%H%M%S
    EXT_MASK:       .jpg
    REF_FILE:       names.log
    delta:          0.0

Options ``debug`` and ``dry_run`` are inactive by default.

.. _py_launch:

Special case
************

On Windows, the Python script directories are commonly not in the PATH,
and users use the :program:`py` launcher to start the interpreter or the
scripts. In that case, the :mod:`pyimgren` package can be started from the
command line as a module:

.. code-block:: none

        usage: py [version] -m pyimgren [-h] [-V] [--folder FOLDER] [-d DST_MASK]
                        [-e EXT_MASK] [-r REF_FILE] [-x DELTA] [-D] [-X]
                        {rename,back,merge} ...

The parameters are exactly the same they were for the script.
