' . gettext('Clean folder img...') . ''; $originals = array_map('basename', glob("$img_path/*.{jpg,jpeg,JPG,JPEG,heic,HEIC,webp,WEBP}", GLOB_BRACE)); $thumbs = array_map('basename', glob("$thumb_path/*.{jpg,jpeg,JPG,JPEG,heic,HEIC,webp,WEBP}", GLOB_BRACE)); // On recherche les vignettes manquantes $missing_thumbs = array_diff($originals, $thumbs); $a = count($missing_thumbs); echo '

' . gettext('Missing thumbs: ') . $a . '

'; // On crée les vignettes manquantes if ($a > 0) { echo '

' . gettext('Create missing thumbs...') . '

'; foreach($missing_thumbs as $img){ $file = $img_path . $img; create_thumb($th_w, $th_h, $file); echo '
' . gettext('Thumb for ') . $img . gettext(' was successfully created!') . '
'; } } // On recherche les vignettes en trop $extra_thumbs = array_diff($thumbs, $originals); $b = count($extra_thumbs); echo '

' . gettext('Extra thumbs: ') . $b . '

'; // On efface les vignettes en trop if ($b > 0) { echo '

' . gettext('Delete extra thumbs...') . '

'; foreach($extra_thumbs as $thumb){ $file = $thumb_path . $thumb; if (unlink($file)) { echo '
' . $thumb . gettext(' was deleted successfully!') . '
'; } else { echo '
' . gettext('There was a error deleting the file ') . $thumb . '
'; } } } // On compare le dossier 'img' et la base echo '

' . gettext('Compare folder img and database...') . '

'; try { $conn = new PDO("sqlite:$base"); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $query = "SELECT filename FROM photos"; $stmt = $conn->prepare($query); $stmt->execute();// (1,3...) 1=1ere valeur 3=valeur $result = $stmt->fetchAll(PDO::FETCH_CLASS); $rowcount = count($result); } catch(PDOException $e) { echo $e->getMessage(); } //_pr($result); $bdd = array(); foreach($result as $file) { $bdd[] = $file->filename; } $base = array_map('basename', $bdd); echo '

' . count($base) . gettext(" entries in database"). "

"; echo '

' . count($originals) . gettext(" files on disk") . "

"; $extra_in_bdd= array_diff($base, $originals); $c = count($extra_in_bdd); echo '

' . gettext('Extra images in database: ') . $c . '

'; // On supprime les images en trop dans la base if ($c > 0) { echo '

' . gettext('Delete extra images in database...') . '

'; foreach($extra_in_bdd as $img){ $file = $img_path . $img; $query4 = "DELETE FROM photos WHERE filename=:filename"; $stmt = $conn->prepare($query4); $stmt->bindParam(':filename', $file); $result = $stmt->execute(); if ($result) { echo '
' . $img . gettext(' has been deleted from database !') . "
"; } } } $missing_in_bdd = array_diff($originals, $base); $d = count($missing_in_bdd); echo '

' . gettext('Missing images in database: ') . $d . '

'; // On ajoute les images manquantes dans la base if ($d > 0) { echo '

' . gettext('Adding missing images in database...') . '

'; $i = 1; $photos = array(); foreach($missing_in_bdd as $img){ $file = $img_path . $img; $query4 = "INSERT INTO photos WHERE filename=:filename"; if ($exif = @exif_read_data($file, 0, true )) { //_pr($exif); unset($fla); unset($flash); // filename //echo "File: " . $file . "
"; // filesize $fs = isset($exif['FILE']['FileSize']) ? $exif['FILE']['FileSize'] : ''; $fsize = formatBytes($fs, $precision = 0); // dateoriginal # YYYY-MM-DD HH:MM:SS.SSS - 2019:10:01 14:03:12 $da = isset($exif['EXIF']['DateTimeOriginal']) ? $exif['EXIF']['DateTimeOriginal'] : ''; if (isset($exif['EXIF']['DateTimeOriginal'])) { $d = explode(' ', $exif['EXIF']['DateTimeOriginal']); $da = str_replace(':', '-', $d[0]) . " " . $d[1] . ".000"; } else { $d = ''; } // lens if (isset($exif['EXIF']['UndefinedTag:0xA434'])) { $w = trim($exif['EXIF']['UndefinedTag:0xA434']); $arr = array("600" => "EF600mm f/4L IS III USM", "100.0 mm" => "EF100mm f/2.8 Macro USM", "100.0-400.0 mm" => "EF100-400mm f/4.5-5.6L IS USM", "140.0-560.0 mm" => "EF100-400mm f/4.5-5.6L IS USM +1.4x II", "17.0-40.0 mm" => "EF17-40mm f/4L USM", "24-70mm" => "SIGMA 24-70mm F2.8 EX DG", "70.0-200.0 mm" => "EF70-200mm f/4L USM", "10.0-22.0 mm" => "EF-S10-22mm f/3.5-4.5 USM", "500.0 mm" => "SIGMA 500mm f/4.5 EX HSM", "500mm" => "SIGMA 500mm f/4.5 EX HSM"); if (array_key_exists($w, $arr)) $obj= $arr[$w]; else $obj = $w; } else { $obj = ''; } // speed if (isset($exif['EXIF']['ExposureTime'])) { $q = explode('/', $exif['EXIF']['ExposureTime']); $sp = ($q[0] > 1) ? ($q[0] / $q[1]) . "s" : $exif['EXIF']['ExposureTime']; } else { $sp = ''; } // aperture $ap = isset($exif['COMPUTED']['ApertureFNumber']) ? $exif['COMPUTED']['ApertureFNumber'] : ''; // correctexpo //$ev = isset($exif['EXIF']['ExposureBiasValue']) ? $exif['EXIF']['ExposureBiasValue'] : ''; if (isset($exif['EXIF']['ExposureBiasValue'])) { $ev = $exif['EXIF']['ExposureBiasValue']; $div = explode( "/", $ev); $dividende = $div[0]; $diviseur = $div[1]; if (str_starts_with($ev, '0')) { $ev = '0'; } elseif ($dividende === $diviseur) { $ev = '0'; } if ((! str_starts_with($ev, '0')) && (! str_starts_with($ev, '-'))) { $ev = "+" . $ev; } } else { $ev = ''; } // iso $iso = isset($exif['EXIF']['ISOSpeedRatings']) ? $exif['EXIF']['ISOSpeedRatings'] : ''; // model $mod = isset($exif['IFD0']['Model']) ? $exif['IFD0']['Model'] : ''; // metering if (isset($exif['EXIF']['MeteringMode'])) { $mm = $exif['EXIF']['MeteringMode']; switch ($mm) { case 1: $mm = gettext("Average"); break; case 2: $mm = gettext("Center-weighted average"); // Moy. à pred. centrale break; case 3: $mm = gettext("Spot"); break; case 4: $mm = gettext("Multi-Spot"); break; case 5: $mm = gettext("Pattern"); // Mesure évaluative break; case 6: $mm = gettext("Partial"); // Mesure sélective break; default: $mm = gettext("Unknown") . ': ' . $mm; // Evaluative Mesure évaluative // Centre-weighted Average Moy. à pred. centrale // Partial Mesure sélective // Spot Spot // Pattern =Mesure évaluative (30D) // Average Mesure évaluative } } else { $mm = ''; } // flash // https://stackoverflow.com/questions/7076958/read-exif-and-determine-if-the-flash-has-fired if (isset($exif['EXIF']['Flash'])) { $fla = $exif['EXIF']['Flash']; $flash = $fla; //$flashfired = ($fla & 1) != 0; //echo "flashfired: " . $flashfired . "
"; // 12_2018.jpg No Flash 0 // 5_2013.jpg Off, Did not fire 16 // folder flash 9 switch ($fla) { case 0: $fla = gettext("No Flash"); break; case 9: $fla = gettext("On, Fired"); break; case 16: $fla = gettext("Off, Did not fire"); break; default: $fla = gettext("Unknown"); } /* Exiftool: [Flash] => On, Fired [Flash Compensation] => -1 */ /* 0x0 = No Flash 0x1 = Fired 0x5 = Fired, Return not detected 0x7 = Fired, Return detected 0x8 = On, Did not fire 0x9 = On, Fired 0xd = On, Return not detected 0xf = On, Return detected 0x10 = Off, Did not fire 0x14 = Off, Did not fire, Return not detected 0x18 = Auto, Did not fire 0x19 = Auto, Fired 0x1d = Auto, Fired, Return not detected 0x1f = Auto, Fired, Return detected 0x20 = No flash function 0x30 = Off, No flash function 0x41 = Fired, Red-eye reduction 0x45 = Fired, Red-eye reduction, Return not detected 0x47 = Fired, Red-eye reduction, Return detected 0x49 = On, Red-eye reduction 0x4d = On, Red-eye reduction, Return not detected 0x4f = On, Red-eye reduction, Return detected 0x50 = Off, Red-eye reduction 0x58 = Auto, Did not fire, Red-eye reduction 0x59 = Auto, Fired, Red-eye reduction 0x5d = Auto, Fired, Red-eye reduction, Return not detected 0x5f = Auto, Fired, Red-eye reduction, Return detected */ } else { $fla = ''; } // focal if (isset($exif['EXIF']['FocalLength'])) { $k = explode('/', $exif['EXIF']['FocalLength']); $fl = $k[0] . " mm"; } else { $fl = ''; } // program if (isset($exif['EXIF']['ExposureMode'])) { $em = $exif['EXIF']['ExposureMode']; //$em = hexdec(intel2Moto($exif['EXIF']['ExposureMode'])); //echo $em; switch ($em) { case 0: $em = gettext("OFF"); break; case 1: $em = gettext("ON"); break; default: $em = gettext("Unknown"); } /* switch ($ep) { case 1: $ep = gettext('Manual'); break; case 2: $ep = gettext('Program'); break; case 3: $ep = gettext('Aperture Priority'); break; case 4: $ep = gettext('Shutter Priority'); break; case 5: $ep = gettext('Program Creative'); break; case 6: $ep = gettext('Program Action'); break; case 7: $ep = gettext('Portrait'); break; case 8: $ep = gettext('Landscape'); break; default: $ep = gettext('Unknown') . ': ' . $ep; break; } */ } else { $em = ''; } // wb if (isset($exif['EXIF']['WhiteBalance'])) { $wb = $exif['EXIF']['WhiteBalance']; switch ($wb) { case 0: $wb = gettext("Auto"); break; case 1: $wb = gettext("Daylight"); break; case 2: $wb = gettext("Cloudy"); break; case 3: $wb = gettext("Tungsten"); break; case 4: $wb = gettext("Fluorescent"); break; case 5: $wb = gettext("Flash"); break; case 6: $wb = gettext("Custom"); break; case 7: $wb = gettext("Black & White"); break; case 8: $wb = gettext("Shade"); break; case 9: $wb = gettext("Manual Temperature (Kelvin)"); break; default: $wb = gettext("Unknown"); } } else { $wb = ''; } // mode if (isset($exif['EXIF']['ExposureProgram'])) { $ep = $exif['EXIF']['ExposureProgram']; switch ($ep) { case 1: $ep = gettext('Manual'); break; case 2: $ep = gettext('Program'); break; case 3: $ep = gettext('Aperture Priority'); break; case 4: $ep = gettext('Shutter Priority'); break; case 5: $ep = gettext('Program Creative'); break; case 6: $ep = gettext('Program Action'); break; case 7: $ep = gettext('Portrait'); break; case 8: $ep = gettext('Landscape'); break; default: $ep = gettext('Unknown') . ': ' . $data; break; } } else { $ep = ''; } // width $wi = isset($exif['COMPUTED']['Width']) ? $exif['COMPUTED']['Width'] : ''; // height $he = isset($exif['COMPUTED']['Height']) ? $exif['COMPUTED']['Height'] : ''; // html $ht = isset($exif['COMPUTED']['html']) ? $exif['COMPUTED']['html'] : ''; // software $soft = isset($exif['IFD0']['Software']) ? $exif['IFD0']['Software'] : ''; // lat, long, alt $gps = get_gps($exif); // usercomment $uc = isset($exif['COMPUTED']['UserComment']) ? $exif['COMPUTED']['UserComment'] : ''; // comment $comment = isset($exif['COMMENT']['0']) ? $exif['COMMENT']['0'] : ''; $photos[$i] = array( 'filename' => $file, 'filesize' => $fsize, 'dateoriginal' => $da, 'lens' => $obj, 'speed' => $sp, 'aperture' => $ap, 'correctexpo' => $ev, //// 'iso' => $iso, 'model' => $mod, 'metering' => $mm, 'flash' => $fla, 'focal' => $fl, 'program' => $em, 'wb' => $wb, 'mode' => $ep, 'width' => $wi, 'height' => $he, 'html' => $ht, 'software' => $soft, 'lat' => $gps['latitude'], 'long' => $gps['longitude'], 'alt' => $gps['altitude'], 'usercomment' => $uc, 'comment' => $comment, ); } /********/ /* IPTC */ /********/ if ($iptc = @getimagesize($file, $info)) { //_pr($iptc); if (isset($info["APP13"])) { $mots = ""; $iptc = iptcparse ($info["APP13"]); // keywords $mots_cles = (isset($iptc["2#025"])) ? $iptc["2#025"] : ''; if (!empty($mots_cles)) { foreach ($mots_cles as $key => $val) { $mots .= $val . ","; } $mots = substr($mots, 0, -1); } // titre $title = (isset($iptc["2#105"][0])) ? $iptc["2#105"][0] : ''; // creator $creator = (isset($iptc["2#080"][0])) ? $iptc["2#080"][0] : ''; // ville $ville = (isset($iptc["2#090"][0])) ? $iptc["2#090"][0] : ''; // departement $departement = (isset($iptc["2#095"][0])) ? $iptc["2#095"][0] : ''; // code $code = (isset($iptc["2#100"][0])) ? $iptc["2#100"][0] : ''; // pays $pays = (isset($iptc["2#101"][0])) ? $iptc["2#101"][0] : ''; // copyright $copyright = (isset($iptc["2#116"][0])) ? $iptc["2#116"][0] : ''; // legende $legende = (isset($iptc["2#120"][0])) ? $iptc["2#120"][0] : ''; $photos[$i]['keywords'] = $mots; $photos[$i]['title'] = $title; $photos[$i]['creator'] = $creator; $photos[$i]['city'] = $ville; $photos[$i]['department'] = $departement; $photos[$i]['code'] = $code; $photos[$i]['country'] = $pays; $photos[$i]['copyright'] = $copyright; $photos[$i]['legende'] = $legende; } else { $photos[$i]['keywords'] = ''; $photos[$i]['title'] = ''; $photos[$i]['creator'] = ''; $photos[$i]['city'] = ''; $photos[$i]['department'] = ''; $photos[$i]['code'] = ''; $photos[$i]['country'] = ''; $photos[$i]['copyright'] = ''; $photos[$i]['legende'] = ''; } } $i++; } //_pr($photos); $query5 = "SELECT MAX(id) FROM photos"; $stmt = $conn->prepare($query5); $stmt->execute(); $resultat = $stmt->fetch(PDO::FETCH_ASSOC); $avant = $resultat['MAX(id)']; $nb_avant = (isset($avant)) ? $avant : 0; try { $query2 = "INSERT OR IGNORE INTO photos (filename, filesize, dateoriginal, lens, speed, aperture, correctexpo, iso, model, metering, flash, focal, program, wb, mode, width, height, html, software, lat, long, alt, usercomment, comment, keywords, title, creator, city, department, code, country, copyright, legende) VALUES (:filename, :filesize, :dateoriginal, :lens, :speed, :aperture, :correctexpo, :iso, :model, :metering, :flash, :focal, :program, :wb, :mode, :width, :height, :html, :software, :lat, :long, :alt, :usercomment, :comment, :keywords, :title, :creator, :city, :department, :code, :country, :copyright, :legende)"; $stmt = $conn->prepare($query2); /* EXIF */ $stmt->bindParam(':filename', $file); $stmt->bindParam(':filesize', $fsize); $stmt->bindParam(':dateoriginal', $da); $stmt->bindParam(':lens', $obj); $stmt->bindParam(':speed', $sp); $stmt->bindParam(':aperture', $ap); $stmt->bindParam(':correctexpo', $ev); $stmt->bindParam(':iso', $iso); $stmt->bindParam(':model', $mod); $stmt->bindParam(':metering', $mm); $stmt->bindParam(':flash', $fla); $stmt->bindParam(':focal', $fl); $stmt->bindParam(':program', $em); $stmt->bindParam(':wb', $wb); $stmt->bindParam(':mode', $ep); $stmt->bindParam(':width', $wi); $stmt->bindParam(':height', $he); $stmt->bindParam(':html', $ht); $stmt->bindParam(':software', $soft); $stmt->bindParam(':lat', $gps['latitude']); $stmt->bindParam(':long', $gps['longitude']); $stmt->bindParam(':alt', $gps['altitude']); $stmt->bindParam(':usercomment', $uc); $stmt->bindParam(':comment', $com); /* IPTC */ $stmt->bindParam(':keywords', $mot); $stmt->bindParam(':title', $tit); $stmt->bindParam(':creator', $crea); $stmt->bindParam(':city', $ci); $stmt->bindParam(':department', $dep); $stmt->bindParam(':code', $cp); $stmt->bindParam(':country', $pa); $stmt->bindParam(':copyright', $cop); $stmt->bindParam(':legende', $leg); if (isset($photos)) { foreach ($photos as $item) { $file = $item['filename']; $fsize = $item['filesize']; $da = $item['dateoriginal']; $obj = $item['lens']; $sp = $item['speed']; $ap = $item['aperture']; $ev = $item['correctexpo']; $iso = $item['iso']; $mod = $item['model']; $mm = $item['metering']; $fla = $item['flash']; $fl = $item['focal']; $em = $item['program']; $wb = $item['wb']; $ep = $item['mode']; $wi = $item['width']; $he = $item['height']; $ht = $item['html']; $soft = $item['software']; $gps['latitude'] = $item['lat']; $gps['longitude'] = $item['long']; $gps['altitude'] = $item['alt']; $mot = $item['keywords']; $tit = $item['title']; $crea = $item['creator']; $ci = $item['city']; $dep = $item['department']; $cp = $item['code']; $pa = $item['country']; $cop = $item['copyright']; $leg = $item['legende']; $uc = $item['usercomment']; $com = $item['comment']; create_thumb($th_w, $th_h, $file); $stmt->execute(); } } } catch(PDOException $e) { echo $e->getMessage(); } /***********************/ /* Display new entries */ /***********************/ try { $query4 = "SELECT filename, filesize, dateoriginal, lens, speed, aperture, correctexpo, iso, model, metering, flash, focal, program, wb, mode, width, height, html, software, lat, long, alt, usercomment, comment, keywords, title, creator, city, department, code, country, copyright, legende FROM photos WHERE id > ? ORDER BY dateoriginal DESC"; $stmt = $conn->prepare($query4); $stmt->bindValue(1, $nb_avant, SQLITE3_INTEGER); // (1,3...) 1=1ere valeur 3=valeur $stmt->execute(); echo '

' . gettext('Reading added photos') . ':

'; echo '
'; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; echo ''; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { //$thumbnail = host() . str_replace("photos/img", "photos/thumb", $row['filename']); //$full = host() . $row['filename']; $lb = data_for_lightbox($row); echo ''; } echo '
' . gettext('Thumb') . '' . gettext('Filename') . '' . gettext('File size') . '' . gettext('Date') . '' . gettext('Lens') . '' . gettext('Speed') . '' . gettext('Aperture') . '' . gettext('Exposure Corr.') . '' . gettext('Iso') . '' . gettext('Model') . '' . gettext('Metering') . '' . gettext('Flash') . '' . gettext('Focal') . '' . gettext('Program') . '' . gettext('White Balance') . '' . gettext('Mode') . '' . gettext('Software') . '' . gettext('Latitude') . '' . gettext('Longitude') . '' . gettext('Alttitude') . '' . gettext('Keywords') . '' . gettext('Title') . '' . gettext('Creator') . '' . gettext('City') . '' . gettext('Department') . '' . gettext('CP') . '' . gettext('Country') . '' . gettext('Copyright') . '' . gettext('Legende') . '
' . '' . '' . $row['filename'] . '' . $row['filesize'] . '' . $row['dateoriginal'] . '' . $row['lens'] . '' . $row['speed'] . '' . $row['aperture'] . '' . $row['correctexpo'] . '' . $row['iso'] . '' . $row['model'] . '' . $row['metering'] . '' . $row['flash'] . '' . $row['focal'] . '' . $row['program'] . '' . $row['wb'] . '' . $row['mode'] . '' . $row['software'] . '' . $row['lat'] . '' . $row['long'] . '' . $row['alt'] . '' . $row['keywords'] . '' . $row['title'] . '' . $row['creator'] . '' . $row['city'] . '' . $row['department'] . '' . $row['code'] . '' . $row['country'] . '' . $row['copyright'] . '' . $row['legende'] . '
'; echo '
'; $conn = null; } catch(PDOException $e) { echo $e->getMessage(); } $conn = null; } ?> ' . gettext("Log out") . '' : ''; ?>

© 2013- sur-le-sentier.fr