aensley/media-organizer

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# MediaOrganizer

Organize images and videos (or any files) into date-based folders.

[![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/aensley/media-organizer/blob/master/LICENSE)
[![Build Status](https://travis-ci.org/aensley/media-organizer.svg)](https://travis-ci.org/aensley/media-organizer)
[![Maintainability](https://api.codeclimate.com/v1/badges/329a1fe38b276ae65c7e/maintainability)](https://codeclimate.com/github/aensley/media-organizer/maintainability)
[![Test Coverage](https://api.codeclimate.com/v1/badges/329a1fe38b276ae65c7e/test_coverage)](https://codeclimate.com/github/aensley/media-organizer/test_coverage)
[![Latest Stable Version](https://poser.pugx.org/aensley/media-organizer/v/stable)](https://packagist.org/packages/aensley/media-organizer)
[![Packagist Downloads](https://img.shields.io/packagist/dt/aensley/media-organizer)](https://packagist.org/packages/aensley/media-organizer)

## What it does

Description for the impatient reader: This library moves files from one place to another.

Detailed description: This library helps organize files into date-based folders. The date is retrieved from each file in a number of configurable ways. The structure of the date-based folders can be designed any way you want.

This was primarily written to organize JPG images, but it will work for files of any type. Available date-retrieval methods are:

1. **EXIF** - Retrieve the date from the file's EXIF data (JPG and TIFF images only).
2. **File Name Masks** - Match date/time patterns in the name of the file.
3. **Modified Time** - Use the file's "last modified" time. This property is set by the operating system and is often not as reliable as the first two.

## Installation

Install the latest version with

```bash
composer require aensley/media-organizer
```

## Options

### Profiles

You can specify any number of profiles to process. They will be processed in order. Each profile can have its own separate options. Available options are [documented in the code](https://github.com/aensley/media-organizer/blob/master/src/Aensley/MediaOrganizer/MediaOrganizer.php#L14).

### Logger

You can specify a logger object implementing the [PRS-3 Logger Interface](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md) for custom handling of log messages. I recommend [Monolog](https://github.com/Seldaek/monolog) (and [monolog-colored-line-formatter](https://github.com/bramus/monolog-colored-line-formatter) for bonus points in bash).

Otherwise, you can specify a log level string (one of: 'none', 'error', 'warning', 'info', 'debug') to use the simple internal logger. The internal logger directly echoes messages followed by newline characters `\n`.

## Requirements

* PHP >= 7.1

## Example usage

### Simple example

```php
<?php

require '/path/to/composer/autoload.php';

$organizer = new \Aensley\MediaOrganizer\MediaOrganizer(
    array(
        'images' => array(
            'source_directory' => '/data/unorganized_pictures/',
            'target_directory' => '/data/Organized/Pictures/',
            'valid_extensions' => array('jpg'),
        ),
        'videos' => array(
            'source_directory' => '/data/unorganized_videos/',
            'target_directory' => '/data/Organized/Videos/',
            'valid_extensions' => array('mp4'),
            'scan_exif' => false,
        ),
    ),
    'debug'
);

$organizer->organize();
```

### Advanced Usage

```php
<?php

require '/path/to/composer/autoload.php';

use \Monolog\Logger;
use \Monolog\Handler\StreamHandler;
use \Bramus\Monolog\Formatter\ColoredLineFormatter;
use \Aensley\MediaOrganizer\MediaOrganizer;

$logger = new Logger('mediaOrganizer');
// Colored output in Bash
$handler = new StreamHandler('php://stdout', Logger::DEBUG);
$handler->setFormatter(new ColoredLineFormatter());
$logger->pushHandler($handler);
// Put everything in a log file, too.
$logger->pushHandler(new StreamHandler('/var/log/mediaOrganizer/mediaOrganizer.log', Logger::DEBUG));

$organizer = new MediaOrganizer(
    array(
        'images' => array(
            'source_directory' => '/data/unorganized_pictures/',
            'target_directory' => '/data/Organized/Pictures/',
            'valid_extensions' => array('jpg'),
        ),
        'videos' => array(
            'source_directory' => '/data/unorganized_videos/',
            'target_directory' => '/data/Organized/Videos/',
            'valid_extensions' => array('mp4'),
            'scan_exif' => false,
        ),
        'gifs' => array(
            'source_directory' => '/data/unorganized_gifs/',
            'target_directory' => '/data/Organized/Gifs/',
            'valid_extensions' => array('gif'),
            'scan_exif' => false,
            'file_name_masks' => false,
            'modified_time' => true,
            'search_recursive' => true,
            'target_mask' => 'Y/F/d',
            'overwrite' => true,
        ),
    ),
    $logger
);

$organizer->organize();
```