filedate

package
v0.1.12 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 9, 2026 License: GPL-3.0 Imports: 3 Imported by: 0

Documentation

Overview

Package filedate extracts dates from filenames using patterns common to Google Photos exports (Pixel, Samsung, WhatsApp, Telegram, Facebook, etc.).

Index

Constants

This section is empty.

Variables

View Source
var Patterns = []Pattern{
	{

		Name: "PXL",
		Re:   regexp.MustCompile(`(?i)^PXL_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "IMG_",
		Re:   regexp.MustCompile(`(?i)^IMG_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "IMGcompact",
		Re:   regexp.MustCompile(`(?i)^IMG(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "VID_",
		Re:   regexp.MustCompile(`(?i)^VID_(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "Screenshot_",
		Re:   regexp.MustCompile(`(?i)^Screenshot_(\d{4})(\d{2})(\d{2})-(\d{2})(\d{2})(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "Screenshot_dash",
		Re:   regexp.MustCompile(`(?i)^Screenshot_(\d{4})-(\d{2})-(\d{2})-(\d{2})-(\d{2})-(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "screen-",
		Re:   regexp.MustCompile(`(?i)^screen-(\d{4})(\d{2})(\d{2})-(\d{2})(\d{2})(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "WhatsApp",
		Re:   regexp.MustCompile(`(?i)^IMG-(\d{4})(\d{2})(\d{2})-WA`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], "12", "0", "0")
		},
	},
	{

		Name: "Telegram",
		Re:   regexp.MustCompile(`(?i)^photo_(\d{4})-(\d{2})-(\d{2})[ _](\d{2})[._](\d{2})[._](\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "YYYYMMDD_HHMMSS",
		Re:   regexp.MustCompile(`^(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "YYYY-MM-DD",
		Re:   regexp.MustCompile(`^(\d{4})-(\d{2})-(\d{2})[ _](\d{2})[._](\d{2})[._](\d{2})`),
		Extract: func(m []string) time.Time {
			return dateFromParts(m[1], m[2], m[3], m[4], m[5], m[6])
		},
	},
	{

		Name: "Facebook",
		Re:   regexp.MustCompile(`(?i)^FB_IMG_(\d{10,13})`),
		Extract: func(m []string) time.Time {
			ms, err := strconv.ParseInt(m[1], 10, 64)
			if err != nil {
				return time.Time{}
			}

			if ms > 1e12 {
				ms /= 1000
			}
			return time.Unix(ms, 0).Local()
		},
	},
}

Patterns is the ordered list of filename date patterns, most specific first.

Functions

func Extract

func Extract(filename string) (time.Time, string)

Extract attempts to parse a date from the given filename (basename only). Returns the matched time and pattern name, or zero Time if nothing matched.

Types

type Pattern

type Pattern struct {
	Name string
	Re   *regexp.Regexp
	// Extract returns a time.Time from named subgroups of a regexp match.
	// Returns zero Time if the match cannot be parsed.
	Extract func(m []string) time.Time
}

Pattern pairs a compiled regexp with an extraction function.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL