Skip to content

Releases: simulot/immich-go

Release 0.23.0-alpha5 🏗️ Work in progress 🏗️ Archiving immich

11 Nov 09:51
Compare
Choose a tag to compare

Release 0.23.0-alpha5 🏗️ Work in progress 🏗️

🚨 New binaries for Windows!

New features

The command archive --from-immich archives the user content from an Immich into a folder structure
Archive photos from Immich

Usage:
  immich-go archive from-immich [from-flags] [flags]

Flags:
      --from-album strings             Get assets only from those albums, can be used multiple times
      --from-api-key string            API Key
      --from-api-trace                 Enable trace of api calls
      --from-client-timeout duration   Set server calls timeout (default 5m0s)
      --from-date-range date-range     Get assets only within this date range (fromat: YYYY[-MM[-DD[,YYYY-MM-DD]]]) (default unset)
      --from-server string             Immich server address (example http://your-ip:2283 or https://your-domain)
      --from-skip-verify-ssl           Skip SSL verification
  -h, --help                           help for from-immich

Global Flags:
  -l, --log-file string          Write log messages into the file
      --log-level string         Log level (DEBUG|INFO|WARN|ERROR), default INFO (default "INFO")
      --log-type string          Log formatted  as text of JSON file (default "text")
  -w, --write-to-folder string   Path where to write the archive

Comming soon:
--minimal-rating
--from-favorite
--from-trashed
--from-archived

The command upload --from-immich upload the user content from another Immich

This command accepts the same flags as the archive --from-immich command.
It preserves albums and tags from the source Immich.

Release v0.23.0-alpha4 🏗️ Work in progress 🏗️

06 Nov 21:01
Compare
Choose a tag to compare

New features

New command archive

This command aims is to store photos and videos into a plain folder structure. The folder structure is YYYY/YYYY-MM/files, as following:

tree .
.
├── 2011
│   └── 2011-04
│       ├── 20110430.CR2
│       ├── 20110430.CR2.xmp
│       ├── 20110430.jpg
│       ├── 20110430.jpg.xmp
│       ├── IMG_2477.CR2
│       ├── IMG_2477.CR2.xmp
│       ├── IMG_2478.CR2
│       ├── IMG_2478.CR2.xmp
│       ├── IMG_2479.CR2
│       └── IMG_2479.CR2.xmp
└── 2023
    ├── 2023-06
    │   ├── PXL_20230607_063000139.jpg
    │   └── PXL_20230607_063000139.jpg.xmp
    └── 2023-10
        ├── PXL_20231006_063029647.jpg
        ├── PXL_20231006_063029647.jpg.xmp
        ├── PXL_20231006_063851485.jpg
        └── PXL_20231006_063851485.jpg.xmp

XMP files present in the source folder are copied in the destination folder.
Google Photos takeout JSON files are translated into customized XMP files and copied in the destination folder.
Those XMP files use a custom schema to store the Google Photos metadata:

<?xpacket begin='?' id='W5M0MpCehiHzreSzNTczkc9d'?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:exif="http://ns.adobe.com/exif/1.0/" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:tiff="http://ns.adobe.com/tiff/1.0/" xmlns:digikam="http://www.digikam.org/ns/1.0/" xmlns:immichgo="http://ns.immich-go.com/immich-go/1.0/" x:xmptk="immich-go version:dev, commit:none, date:unknown">
  <rdf:RDF>
    <rdf:Description>
      <immichgo:ImmichGoProperties>
        <immichgo:title>This is a title</immichgo:title>
        <immichgo:DateTimeOriginal>2023-10-10T01:11:00.000-04:00</immichgo:DateTimeOriginal>
        <immichgo:trashed>False</immichgo:trashed>
        <immichgo:archived>False</immichgo:archived>
        <immichgo:fromPartner>False</immichgo:fromPartner>
        <immichgo:favorite>True</immichgo:favorite>
        <immichgo:rating>3</immichgo:rating>
        <immichgo:albums>
          <rdf:Bag>
            <rdf:Li>
              <immichgo:album>
                <immichgo:title>Vacation 2024</immichgo:title>
                <immichgo:description>Vacation 2024 hawaii and more</immichgo:description>
                <immichgo:latitude>19,49.23661N</immichgo:latitude>
                <immichgo:longitude>155,28.39525W</immichgo:longitude>
              </immichgo:album>
            </rdf:Li>
          </rdf:Bag>
        </immichgo:albums>
      </immichgo:ImmichGoProperties>
    </rdf:Description>
  </rdf:RDF>
</x:xmpmeta>
<?xpacket end='w'?>

The general syntax is:

.\immich-go archive from-xxx [from-xxx flags...] --write-to-folder <destination> <source> 
The command archive --from-google-photos archives a Google Photos takeout into a folder structure

This command create a folder structure in /path/to/destination with the result of the takeout analysis.
The resulting folder structure can be re-imported into immich-go with the command upload from-google-photo path/to/archived-folder.

The command archive --from- archives a Google Photos takeout into a folder structure

Example:

.\immich-go archive from-google-photos  --include-partner  --write-to-folder /path/to/destination /path/to/takeout*.zip

Coming soon:

  • archiving an immich server into a folder.

Handling of scanned photos by Epson FastFoto

  • --manage-epson-fastfoto Manage Epson FastFoto file (default: false)

    Group scanned photos in stacks
    • Scan_0001.jpg Original photo
    • Scan_0001_a.jpg Enhanced photo, the cover of the stack
    • Scan_0001_b.jpg Back of the photo

Release 0.23.0-alpha3 🏗️ Work in progress 🏗️ stacks are back

01 Nov 13:36
Compare
Choose a tag to compare

The code refactoring continue. Better code, less bugs, few features...

New features

  • --manage-burst=BurstFlag Manage burst photos. Possible values are:

    • StackKeepRaw Discard JPEG files, and stack the RAW files (default)
    • StackKeepJPEG Discard RAW files, and stack the JPEG files
    • Stack Stack all photos, RAW and JPEG photos are imported in the same stack
  • --manage-heic-jpeg=HeicJpgFlag Manage coupled HEIC and JPEG files. Possible values:

    • KeepHeic Keep only the HEIC files (default)
    • KeepJPG Keep only the JPEG files
    • StackCoverHeic Stack both, the HEIC file is the cover
    • StackCoverJPG Stack both, the JPEG file is the cover
  • --manage-raw-jpeg=RawJPGFlag Manage coupled RAW and JPEG files. Possible values:

    • KeepRaw Keep only the RAW files (default)
    • KeepJPG Keep only the JPEG files
    • StackCoverRaw Stack both, the RAW file is the cover
    • StackCoverJPG Stack both, the JPEG file is the cover

Full Changelog: 0.21.2...0.23.0-alpha3

0.22.1

15 Oct 19:52
Compare
Choose a tag to compare

Changelog

  • 7ee54ba "Update releases.md to include Release 0.22.0 with new features, changes, and contributors" (#459)
  • be10802 Add new AutoArchive option (#450)
  • 6cd230f Fix "reason" field not being populated by correct album title when use-full-path-album-name was used (#457)
  • ce79f99 Fix incorrect argument description (#456)
  • 726a523 Incompatible with Immich v1.118 Fixes #509
  • 785f61a Incompatible with Immich v1.118 Fixes #509
  • 3598281 Merge branch 'simulot/issue509' of github.com:simulot/immich-go into simulot/issue509
  • 7f517ba Update README.md, google-takeout.md, and motivation.md (#454)

v0.23.0-alpha2 better logs

13 Oct 08:30
Compare
Choose a tag to compare
Pre-release

🏗️ Work in progress 🏗️

This an early version of immich-go version v0.23.0-alpha2
Yes, v0.23.0-alpha2, and not v1.0.0-alpha2. Let's stick to the semantic versioning.

  • better logging
    • log level are effectives
    • adoption of the structured log package
    • the level DEBUG give file details and metadata
  • colored log on screen
  • clear separation between folder import and google import
  • adoption of the linux convention of double dashes flags
  • priority of EXIF data over file name for date capture
  • code restructuration to enable further possibilities
    • Upload from Picasa
    • Exporting of google photos archive as a folder

Upload from folder options

Upload photos from a folder

Usage:
  immich-go upload from-folder [flags] <path>...

Flags:
      --album-path-joiner string           Specify a string to use when joining multiple folder names to create an album name (e.g. ' ',' - ') (default " / ")
      --ban-file FileList                  Exclude a file based on a pattern (case-insensitive). Can be specified multiple times. (default '@eaDir/', '@__thumb/', 'SYNOFILE_THUMB_*.*', 'Lightroom Catalog/', 'thumbnails/', '.DS_Store/')
      --capture-date-method DateMethod     Specify the method to determine the capture date when not provided in a sidecar file. Options: NONE (do not attempt to determine), FILENAME (extract from filename), EXIF (extract from EXIF metadata), FILENAME-EXIF (try filename first, then EXIF), EXIF-FILENAME (try EXIF first, then filename) (default EXIF-FILENAME)
      --date-range date-range              Only import photos taken within the specified date range (default unset)
      --exclude-extensions ExtensionList   Comma-separated list of extension to exclude. (e.g. .gif,.PM) (default: none)
      --exiftool-enabled                   Enable the use of the external 'exiftool' program (if installed and available in the system path) to extract EXIF metadata
      --exiftool-path string               Path to the ExifTool executable (default: search in system's PATH)
      --exiftool-timezone timezone         Timezone to use when parsing exif timestamps without timezone Options: LOCAL (use the system's local timezone), UTC (use UTC timezone), or a valid timezone name (e.g. America/New_York) (default Local)
      --filename-timezone timezone         Specify the timezone to use when detecting the date from the filename. Options: Local (use the system's local timezone), UTC (use UTC timezone), or a valid timezone name (e.g. America/New_York) (default Local)
      --folder-as-album folderMode         Import all files in albums defined by the folder structure. Can be set to 'FOLDER' to use the folder name as the album name, or 'PATH' to use the full path as the album name (default NONE)
  -h, --help                               help for from-folder
      --ignore-sidecar-files               Don't upload sidecar with the photo.
      --include-extensions ExtensionList   Comma-separated list of extension to include. (e.g. .jpg,.heic) (default: all)
      --into-album string                  Specify an album to import all files into
      --recursive                          Explore the folder and all its sub-folders (default true)

Global Flags:
      --api string                Immich api endpoint (example http://container_ip:3301)
  -k, --api-key string            API Key
      --api-trace                 Enable trace of api calls
      --client-timeout duration   Set server calls timeout (default 5m0s)
      --device-uuid string        Set a device UUID (default "gl65")
      --dry-run                   Simulate all actions
  -l, --log-file string           Write log messages into the file
      --log-level string          Log level (DEBUG|INFO|WARN|ERROR), default INFO (default "INFO")
      --log-type string           Log formatted  as text of JSON file (default "text")
      --no-ui                     Disable the user interface
  -s, --server string             Immich server address (example http://your-ip:2283 or https://your-domain)
      --skip-verify-ssl           Skip SSL verification
      --time-zone string          Override the system time zone

Upload from a google-photos

Upload photos either from a zipped Google Photos takeout or decompressed archive

Usage:
  immich-go upload from-google-photos [flags] <takeout-*.zip> | <takeout-folder>

Flags:
      --ban-file FileList                  Exclude a file based on a pattern (case-insensitive). Can be specified multiple times.
      --date-range date-range              Only import photos taken within the specified date range (default unset)
      --exclude-extensions ExtensionList   Comma-separated list of extension to exclude. (e.g. .gif,.PM) (default: none)
      --from-album-name string             Only import photos from the specified Google Photos album
  -h, --help                               help for from-google-photos
  -a, --include-archived                   Import archived Google Photos (default true)
      --include-extensions ExtensionList   Comma-separated list of extension to include. (e.g. .jpg,.heic) (default: all)
  -p, --include-partner                    Import photos from your partner's Google Photos account (default true)
  -t, --include-trashed                    Import photos that are marked as trashed in Google Photos
  -u, --include-unmatched                  Import photos that do not have a matching JSON file in the takeout
      --include-untitled-albums            Include photos from albums without a title in the import process
      --partner-shared-album string        Add partner's photo to the specified album name
      --sync-albums                        Automatically create albums in Immich that match the albums in your Google Photos takeout (default true)

Global Flags:
      --api string                Immich api endpoint (example http://container_ip:3301)
  -k, --api-key string            API Key
      --api-trace                 Enable trace of api calls
      --client-timeout duration   Set server calls timeout (default 5m0s)
      --device-uuid string        Set a device UUID (default "gl65")
      --dry-run                   Simulate all actions
  -l, --log-file string           Write log messages into the file
      --log-level string          Log level (DEBUG|INFO|WARN|ERROR), default INFO (default "INFO")
      --log-type string           Log formatted  as text of JSON file (default "text")
      --no-ui                     Disable the user interface
  -s, --server string             Immich server address (example http://your-ip:2283 or https://your-domain)
      --skip-verify-ssl           Skip SSL verification
      --time-zone string          Override the system time zone

0.22.0

24 Aug 08:39
Compare
Choose a tag to compare

Many thanks to @maybeanerd for their meticulous proofreading of the documentation files.

New feature: Use the full image path as album name

Thanks to @giejay for their contribution
When the -use-full-path-album-name option is enabled, photos are added to a new album named after their full file path.
The path separator can be replaced using the -album-name-path-separator=CHAR

New feature: google photos archived photos are imported as immich archive by default

Thanks to @Alex1607 for their contribution
Use the option -auto-archive=FALSE to disable this feature.

What's Changed

  • fix Takeout zip is unsupported file type #357 by @simulot in #415
  • docs: fix typos in readme by @maybeanerd in #421
  • Program errors out due to no ping API response despite API responding by @simulot in #431
  • remove "GetJobs" call from API traces by @simulot in #442
  • Add support for -use-full-path-album-name to be able to use the full path to the file as album name/title by @giejay in #444
  • Documentation-update by @simulot in #446
  • Add new AutoArchive option by @Alex1607 in #450
  • Update README.md, google-takeout.md, and motivation.md by @aaronjrodrigues in #454

New Contributors

Full Changelog: 0.21.0...0.22.0

0.21.3

19 Aug 20:55
d58d266
Compare
Choose a tag to compare

Changelog

  • d58d266 "Added return nil statement when encountering a directory in passOneFsWalk function" (#447)
  • 8adfd32 Add support for -use-full-path-album-name to be able to use the full path to the file as album name/title (#444)
  • ab7ee9f Documentation-update (#446)

0.21.2

17 Aug 19:38
c9bfd97
Compare
Choose a tag to compare

Changelog

  • 3396f6f Program errors out due to no ping API response despite API responding (#431)
  • 1a4de53 chore(deps): bump golang.org/x/sync from 0.7.0 to 0.8.0 (#425)
  • fad0f57 google photo: file is uploaded with the title VID_20180811_184034.mp4.MP4 (#441)
  • c9bfd97 remove "GetJobs" call from API traces (#442)

0.21.1

01 Aug 15:35
c637717
Compare
Choose a tag to compare

Changelog

0.21.0

30 Jul 14:56
356bf1b
Compare
Choose a tag to compare

Refactoring the Google Photos import another time

Lot of users have reported inconsistencies in upload counters. Each user case a different, and the takeout structure varies a bit.
In order to debug those cases, I have developed a way to simulate the takeout import using only the the file list. Read how to send debug data without sharing photos.

Option to force the upload of images despite the lack of JSON

Each image in a takeout is supposed to come with A JSON file giving the date of capture and the GPS coordinate. There a few reason for this:

  1. The original file is copied, modified... and sometime there ins't a JSON for all versions
  2. JSON aren't in the same ZIP file than the image, and only one part of the takeout is processed
  3. The takeout misses a bunch of JSON

When asking another takeout isn't an option, it's possible to force the upload of photos with no JSON. Use the option -upload-when-missing-JSON

The stack function is disabled

The stack function need to be improved #399, #345, #235
Meanwhile, it is disabled by default. You can enable it using the option -create-stacks=TRUE.

fixes:

  • #376 errors when uploading are disturbing the the % of the progression
  • files with same path and name, but in different part of the takeout file set was forgotten in duplicate counters
  • iPhone's Live photos recognition when the name is duplicated: ex IMG_2710(1).MP4 and IMG_2710(1).HEIC
  • Missing a file when a directory contain several files with the same name, but of a different type. Ex: IMG_0170.HEIC, IMG_0170.JPG
  • Live videos attached to duplicated photos are now counted as duplicate as well, making the final report more relevant
  • #402 Wrong album assignment for images with the same name
  • #390 Question: report shows way less images uploaded than scanned
  • #376 errors when uploading are disturbing the the % of the progression
  • #401 Add an option to import images/movies even if there is no JSON file in the takeout