NAZQZRYQTXWVE2VFY65ONSD6O3EUMNRHARCDVH2D2HKM3YH4RGUAC 5IIWZLQR5ZKOW4OUJCQMJDPWXZKDLGRTK4DQIELXHX7VUBTXUJ4AC 7NS27QXZMVTZBK4VPMYL5IKGSTTAWR6NDG5SOVITNX44VNIRZPMAC IFVRAERTCCDICNTYTG3TX2WASB6RXQQEJWWXQMQZJSQDQ3HLE5OQC OGLLBQQYE5KICDMI6EX7ZI4TZT5RB7UFHH7O2DUOZ44QQXVL5YAAC 4VO5HC4R37PDGNAN6SX24X2M5G2V4RXIX2WCTFXDOH2TPRZA7DZQC VZGXBNYYO3E7EPFQ4GOLNVMRXXTQDDQZUU2BZ6JHNBDY4B2QLDAAC DORZF5HSV672ZP5HUDYB3J6TBH5O2LMXJE4HPSE7H5SOGZQBDCXQC L4STQEXDGCPZXDHTEUBCOQKBMTFDRVXRLNFQHPDHOVXDCJO33LQQC OCRETPZZPDCUSOPYRH5MVRATJ37TRFGVSIMOI4IV755HFXXOVHEAC KS7LFF6M5Y6UGBBA7G63BJRR5XS4P4R3PSZPG752NSGZ3Z6GY72QC name: "All files paired",wavFiles: []string{"file1-10-20.wav", "file2-30-40.wav"},pngFiles: []string{"file1-10-20.png", "file2-30-40.png"},expectedPaired: []string{"file1-10-20", "file2-30-40"},
name: "All files paired",wavFiles: []string{"file1-10-20.wav", "file2-30-40.wav"},pngFiles: []string{"file1-10-20.png", "file2-30-40.png"},expectedPaired: []string{"file1-10-20", "file2-30-40"},
name: "Missing PNG for one WAV",wavFiles: []string{"file1-10-20.wav", "file2-30-40.wav", "file3-50-60.wav"},pngFiles: []string{"file1-10-20.png", "file2-30-40.png"},expectedPaired: []string{"file1-10-20", "file2-30-40"},
name: "Missing PNG for one WAV",wavFiles: []string{"file1-10-20.wav", "file2-30-40.wav", "file3-50-60.wav"},pngFiles: []string{"file1-10-20.png", "file2-30-40.png"},expectedPaired: []string{"file1-10-20", "file2-30-40"},
name: "Missing all PNGs",wavFiles: []string{"file1-10-20.wav", "file2-30-40.wav"},pngFiles: []string{},expectedPaired: []string{},
name: "Missing all PNGs",wavFiles: []string{"file1-10-20.wav", "file2-30-40.wav"},pngFiles: []string{},expectedPaired: []string{},
name: "Extra PNG files (no WAV)",wavFiles: []string{"file1-10-20.wav"},pngFiles: []string{"file1-10-20.png", "file2-30-40.png", "file3-50-60.png"},expectedPaired: []string{"file1-10-20"},
name: "Extra PNG files (no WAV)",wavFiles: []string{"file1-10-20.wav"},pngFiles: []string{"file1-10-20.png", "file2-30-40.png", "file3-50-60.png"},expectedPaired: []string{"file1-10-20"},
Format8Digit DateFormat = iota // YYYYMMDD_HHMMSS (e.g., 20230609_103000.wav)Format6YYMMDD // YYMMDD_HHMMSS (e.g., 201012_123456.wav) - year firstFormat6DDMMYY // DDMMYY_HHMMSS (e.g., 121020_123456.wav) - year last
Format8Digit DateFormat = iota // YYYYMMDD_HHMMSS (e.g., 20230609_103000.wav)Format6YYMMDD // YYMMDD_HHMMSS (e.g., 201012_123456.wav) - year firstFormat6DDMMYY // DDMMYY_HHMMSS (e.g., 121020_123456.wav) - year last
timeStr := matches[1] // HH:MM:SSdateStr := matches[2] // DD/MM/YYYYtimezoneStr := matches[3] // ±HHrecorderID := matches[4] // Hex IDgainStr := matches[5] // gain levelbatteryStr := matches[6] // battery voltagetempStr := matches[7] // temperature
timeStr := matches[1] // HH:MM:SSdateStr := matches[2] // DD/MM/YYYYtimezoneStr := matches[3] // ±HHrecorderID := matches[4] // Hex IDgainStr := matches[5] // gain levelbatteryStr := matches[6] // battery voltagetempStr := matches[7] // temperature
Query: "SELECT c.name, c.cyclic_recording_pattern_id, p.record_s, p.sleep_s FROM cluster c LEFT JOIN cyclic_recording_pattern p ON c.cyclic_recording_pattern_id = p.id WHERE c.id = ?",
Query: "SELECT c.name, c.cyclic_recording_pattern_id, p.record_s, p.sleep_s FROM cluster c LEFT JOIN cyclic_recording_pattern p ON c.cyclic_recording_pattern_id = p.id WHERE c.id = ?",
Summary ImportSummary `json:"summary" jsonschema:"Import summary with counts and statistics"`FileIDs []string `json:"file_ids" jsonschema:"List of successfully imported file IDs"`
Summary ImportSummary `json:"summary" jsonschema:"Import summary with counts and statistics"`FileIDs []string `json:"file_ids" jsonschema:"List of successfully imported file IDs"`
ID string `json:"id"`DatasetID string `json:"dataset_id"`Name string `json:"name"`Latitude float64 `json:"latitude"`Longitude float64 `json:"longitude"`Description *string `json:"description"`CreatedAt string `json:"created_at"`LastModified string `json:"last_modified"`Active bool `json:"active"`TimezoneID string `json:"timezone_id"`
ID string `json:"id"`DatasetID string `json:"dataset_id"`Name string `json:"name"`Latitude float64 `json:"latitude"`Longitude float64 `json:"longitude"`Description *string `json:"description"`CreatedAt string `json:"created_at"`LastModified string `json:"last_modified"`Active bool `json:"active"`TimezoneID string `json:"timezone_id"`
ID string `json:"id"`FileName string `json:"file_name"`Path *string `json:"path"` // nullableXXH64Hash string `json:"xxh64_hash"`LocationID string `json:"location_id"`TimestampLocal time.Time `json:"timestamp_local"`ClusterID *string `json:"cluster_id"` // nullableDuration float64 `json:"duration"`SampleRate int `json:"sample_rate"`Description *string `json:"description"` // nullableMaybeSolarNight *bool `json:"maybe_solar_night"` // nullableMaybeCivilNight *bool `json:"maybe_civil_night"` // nullableMoonPhase *float64 `json:"moon_phase"` // nullableCreatedAt time.Time `json:"created_at"`LastModified time.Time `json:"last_modified"`Active bool `json:"active"`
ID string `json:"id"`FileName string `json:"file_name"`Path *string `json:"path"` // nullableXXH64Hash string `json:"xxh64_hash"`LocationID string `json:"location_id"`TimestampLocal time.Time `json:"timestamp_local"`ClusterID *string `json:"cluster_id"` // nullableDuration float64 `json:"duration"`SampleRate int `json:"sample_rate"`Description *string `json:"description"` // nullableMaybeSolarNight *bool `json:"maybe_solar_night"` // nullableMaybeCivilNight *bool `json:"maybe_civil_night"` // nullableMoonPhase *float64 `json:"moon_phase"` // nullableCreatedAt time.Time `json:"created_at"`LastModified time.Time `json:"last_modified"`Active bool `json:"active"`
RecorderID *string `json:"recorder_id"` // nullableGain *GainLevel `json:"gain"` // nullableBatteryV *float64 `json:"battery_v"` // nullableTempC *float64 `json:"temp_c"` // nullable
RecorderID *string `json:"recorder_id"` // nullableGain *GainLevel `json:"gain"` // nullableBatteryV *float64 `json:"battery_v"` // nullableTempC *float64 `json:"temp_c"` // nullable