Organizador de fotos e vídeos em pastas por tipo e data (Linux/macOS).
Project description
galerymanager
Organizador de fotos e vídeos por tipo e data, escrito em Python. Lê pastas e subpastas recursivamente, identifica cada arquivo de mídia, descobre a data em que foi capturado e reorganiza tudo em uma estrutura limpa:
<destino>/
├── Imagens/
│ └── 2021/
│ └── 2021-07/
│ └── praia.jpg
└── Videos/
└── 2022/
└── 2022-12/
└── clip.mp4
Funciona em Linux e macOS usando apenas a biblioteca padrão do Python — não precisa instalar Pillow, ffmpeg nem nada além do Python 3.9+.
Como a data é descoberta
Para cada arquivo, a data é escolhida na seguinte ordem de prioridade:
- EXIF
DateTimeOriginal(fotos JPEG/TIFF e muitos formatos RAW); - Metadados do vídeo — a box
mvhdde contêineres MP4/MOV/M4V/3GP; - Data de modificação do arquivo (fallback sempre disponível).
A coluna [origem] na saída indica qual fonte foi usada em cada arquivo.
Instalação
Via PyPI (recomendado)
Com pipx (isola o CLI em seu próprio ambiente):
pipx install galerymanager
Ou com pip:
pip install galerymanager
Direto de um release do GitHub
pip install "git+https://github.com/mpgxc/galerymanager.git@v0.1.0"
Você também pode baixar o arquivo .whl da página de
Releases e instalar com
pip install galerymanager-<versão>-py3-none-any.whl.
A partir do código-fonte
Não é obrigatório instalar — dá para rodar direto do diretório do projeto:
python3 -m galerymanager --help
Para instalar localmente o comando galerymanager:
pip install .
Uso
Sempre comece com --dry-run para revisar o plano sem alterar nada:
python3 -m galerymanager ~/Fotos -o ~/Galeria --dry-run
Aplicando de verdade (o padrão é copiar, preservando as origens):
python3 -m galerymanager ~/Fotos ~/Downloads -o ~/Galeria
Movendo os arquivos em vez de copiar:
python3 -m galerymanager ~/Camera -o ~/Galeria --move
Opções
| Opção | Descrição |
|---|---|
sources... |
Uma ou mais pastas (ou arquivos) de origem. |
-o, --output |
Pasta de destino da galeria organizada (obrigatório). |
--dry-run |
Apenas simula e mostra o plano, sem tocar em arquivos. |
--move |
Move os arquivos em vez de copiar. |
--pattern |
Padrão strftime das subpastas de data (padrão: %Y/%Y-%m). |
--no-recursive |
Não descer em subpastas das origens. |
--include-other |
Também organizar arquivos que não são mídia (pasta Outros). |
--on-duplicate |
rename (padrão), skip ou overwrite. |
-q, --quiet |
Mostrar só o resumo. |
Estruturas de data personalizadas
O --pattern aceita qualquer diretiva strftime, e / cria níveis de pasta:
# Imagens/2021/2021-07/20/praia.jpg
python3 -m galerymanager ~/Fotos -o ~/Galeria --pattern '%Y/%Y-%m/%d'
# Imagens/2021/Julho/praia.jpg
python3 -m galerymanager ~/Fotos -o ~/Galeria --pattern '%Y/%B'
Tratamento de duplicatas
- Se o destino já existe com conteúdo idêntico (mesmo tamanho e hash SHA-256), o arquivo é pulado — nunca há cópia redundante.
- Se existe um arquivo diferente com o mesmo nome, a política padrão
renamegeraarquivo_1.jpg,arquivo_2.jpg, etc. Use--on-duplicate skipou--on-duplicate overwritepara outro comportamento. - Rodar duas vezes é seguro (idempotente): a segunda execução não duplica nada.
Formatos reconhecidos
- Imagens: jpg, jpeg, png, gif, bmp, tif/tiff, webp, heic/heif, avif, svg, ico e RAW (arw, cr2, cr3, nef, orf, rw2, dng, raf, sr2, pef).
- Vídeos: mp4, m4v, mov, avi, mkv, wmv, flv, webm, mpg/mpeg, 3gp, mts, m2ts, ts, vob, ogv, mxf.
Usando como biblioteca
from pathlib import Path
from galerymanager import Organizer
org = Organizer(Path("~/Galeria"), move=False)
report = org.run([Path("~/Fotos")], dry_run=False)
print(f"Imagens: {report.by_kind()}")
for move in report.moves:
print(move.source, "->", move.dest)
Testes
python3 -m unittest discover -s tests -v
Os testes rodam automaticamente em cada push/PR (Linux e macOS) via GitHub
Actions — veja .github/workflows/ci.yml.
Publicando uma nova versão (mantenedor)
O projeto publica no PyPI e cria um GitHub Release automaticamente ao
receber uma tag v* (workflow .github/workflows/release.yml).
Configuração única — trusted publishing no PyPI (sem tokens/senhas):
- Crie uma conta em https://pypi.org e faça login.
- Acesse https://pypi.org/manage/account/publishing/ e adicione um
pending publisher com:
- PyPI Project Name:
galerymanager - Owner:
mpgxc - Repository name:
galerymanager - Workflow name:
release.yml - Environment name:
pypi
- PyPI Project Name:
A cada versão:
# 1. Atualize a versão em pyproject.toml (ex.: 0.1.0 -> 0.2.0)
# 2. Faça o commit e crie a tag correspondente
git commit -am "chore: versão 0.2.0"
git tag v0.2.0
git push origin main --tags
O workflow builda o pacote, roda os testes, publica no PyPI e cria o Release
com os arquivos .whl e .tar.gz anexados.
Licença
MIT.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file galerymanager-0.1.0.tar.gz.
File metadata
- Download URL: galerymanager-0.1.0.tar.gz
- Upload date:
- Size: 16.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c65b88636cdb6aea4b0bb8b61b2c6bfb5480cb78c928705e00f4cff6c497220f
|
|
| MD5 |
9dbd954c1fc14e68370357470f343f54
|
|
| BLAKE2b-256 |
156121ec501864f3e1440b78f67b29f791b05a93e8610e251bcdb4b61db4d7a8
|
Provenance
The following attestation bundles were made for galerymanager-0.1.0.tar.gz:
Publisher:
release.yml on mpgxc/galerymanager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
galerymanager-0.1.0.tar.gz -
Subject digest:
c65b88636cdb6aea4b0bb8b61b2c6bfb5480cb78c928705e00f4cff6c497220f - Sigstore transparency entry: 2078674669
- Sigstore integration time:
-
Permalink:
mpgxc/galerymanager@8529218f72d9a76efc008dbb31f0397cb2208ebc -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mpgxc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8529218f72d9a76efc008dbb31f0397cb2208ebc -
Trigger Event:
push
-
Statement type:
File details
Details for the file galerymanager-0.1.0-py3-none-any.whl.
File metadata
- Download URL: galerymanager-0.1.0-py3-none-any.whl
- Upload date:
- Size: 14.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ff1e03053cbbb1ec3fedef2b06c03a4e8424619d772646f55b2996a350c8f69f
|
|
| MD5 |
f05cd59e4985d8f99867efe0d97b7c79
|
|
| BLAKE2b-256 |
2938a7ffb091a8e27a1843cd6668f666cb08c1a1d38e7e7a5bacace3aeebf80a
|
Provenance
The following attestation bundles were made for galerymanager-0.1.0-py3-none-any.whl:
Publisher:
release.yml on mpgxc/galerymanager
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
galerymanager-0.1.0-py3-none-any.whl -
Subject digest:
ff1e03053cbbb1ec3fedef2b06c03a4e8424619d772646f55b2996a350c8f69f - Sigstore transparency entry: 2078674750
- Sigstore integration time:
-
Permalink:
mpgxc/galerymanager@8529218f72d9a76efc008dbb31f0397cb2208ebc -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/mpgxc
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@8529218f72d9a76efc008dbb31f0397cb2208ebc -
Trigger Event:
push
-
Statement type: