Announcement

#16 2023-03-01 08:42:50

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation


Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#17 2023-03-01 19:17:09

erAck
Only trying to help
2015-09-06
1703

Re: [resolved] Write metadata plugin date_creation

Gnagh.. sorry, I was totally off the other direction, reading/writing metadata to database..


Running Piwigo at https://erack.net/gallery/

Offline

 

#18 2023-03-02 14:01:14

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

erAck wrote:

Gnagh.. sorry, I was totally off the other direction, reading/writing metadata to database..

No worries :-) Thank you!


Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#19 2023-03-02 17:42:44

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

1. Write info from database to original jpg file (IPTC) with the write metadata  plugin (including date_available and date_creation).  ✔
2. Copy jpg ALL IPTC data to new version of file with Exiftool. ✔
3. Sync the new version jpg file with database.  ✔
4. Write html code from database in plain text to the IPTC description field with Write metadata plugin.                  FAILED!
5. Check logfile for errors when trying to write html (Exiftool doesn't write logfiles according to author) FAILED
6. What to do next??

Last edited by BigIsland270972 (2023-03-02 17:44:10)


Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#20 2023-03-27 03:51:25

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

UPDATE!!

/plugins/write_metadata/main.inc.php

Added support for writing GPS location from database. You can then import GPS location from image file when syncronizing.


Code:

<?php
/*
Plugin Name: Write Metadata
Description: Write Piwigo photo properties (title, description, author, tags) into IPTC fields
Author: plg
Plugin URI: http://piwigo.org/ext/extension_view.php?eid=769
Version: 12.a
*/

// +-----------------------------------------------------------------------+
// | Define plugin constants                                               |
// +-----------------------------------------------------------------------+

defined('WRITE_METADATA_ID') or define('WRITE_METADATA_ID', basename(dirname(__FILE__)));
define('WRITE_METADATA_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');

// +-----------------------------------------------------------------------+
// | Edit Photo                                                            |
// +-----------------------------------------------------------------------+

add_event_handler('loc_begin_admin_page', 'wm_add_link', 60);
function wm_add_link()
{
  global $template, $page;

  $template->set_prefilter('picture_modify', 'wm_add_link_prefilter');

  if (isset($page['page']) and 'photo' == $page['page'])
  {
    $template->assign(
      'U_WRITEMETADATA',
      get_root_url().'admin.php?page=photo-'.$_GET['image_id'].'-properties&amp;write_metadata=1'
      );
  }
}

function wm_add_link_prefilter($content)
{
  $search = '{if !url_is_remote($PATH)}';
  
  $replacement = '{if !url_is_remote($PATH)}
  <a class="icon-docs" href="{$U_WRITEMETADATA}" title="{\'Write metadata\'|translate}"></a>';

  return str_replace($search, $replacement, $content);
}

add_event_handler('loc_begin_admin_page', 'wm_picture_write_metadata');
function wm_picture_write_metadata()
{
  global $page, $conf;

  load_language('plugin.lang', dirname(__FILE__).'/');
  
  if (isset($page['page']) and 'photo' == $page['page'] and isset($_GET['write_metadata']))
  {
    check_input_parameter('image_id', $_GET, false, PATTERN_ID);
    list($rc, $output) = wm_write_metadata($_GET['image_id']);

    if (count($output) == 0)
    {
      $_SESSION['page_infos'][] = l10n('Metadata written into file');
      redirect(get_root_url().'admin.php?page=photo-'.$_GET['image_id'].'-properties');
    }
    else
    {
      $page['errors'] = array_merge($page['errors'], $output);
    }
  }
}

// +-----------------------------------------------------------------------+
// | Batch Manager                                                         |
// +-----------------------------------------------------------------------+

add_event_handler('loc_begin_element_set_global', 'wm_element_set_global_add_action');
function wm_element_set_global_add_action()
{
  global $template, $page;
  
  $template->set_filename('writeMetadata', realpath(WRITE_METADATA_PATH.'element_set_global_action.tpl'));

  if (isset($_POST['submit']) and $_POST['selectAction'] == 'writeMetadata')
  {
    $page['infos'][] = l10n('Metadata written into file');
  }

  $template->assign(
    array(
      'WM_PWG_TOKEN' => get_pwg_token(),
      )
    );

  $template->append(
    'element_set_global_plugins_actions',
    array(
      'ID' => 'writeMetadata',
      'NAME' => l10n('Write metadata'),
      'CONTENT' => $template->parse('writeMetadata', true),
      )
    );
}

add_event_handler('ws_add_methods', 'wm_add_methods');
function wm_add_methods($arr)
{
  include_once(WRITE_METADATA_PATH.'ws_functions.inc.php');
}

// +-----------------------------------------------------------------------+
// | Common functions                                                      |
// +-----------------------------------------------------------------------+

/**
 * inspired by convert_row_to_file_exiftool method in ExportImageMetadata
 * class from plugin Tags2File. In plugin write_medata we just skip the
 * batch command file, and execute directly on server (much more user
 * friendly...).
 */
function wm_write_metadata($image_id)
{
  global $conf, $logger;
  
  $query = '
SELECT
    img.name,
    img.comment,
    img.author,
    img.date_creation,
    img.date_available,
    img.latitude, 
    img.longitude,
    GROUP_CONCAT(tags.name) AS tags,
    img.path,
    img.representative_ext
  FROM '.IMAGES_TABLE.' AS img
    LEFT OUTER JOIN '.IMAGE_TAG_TABLE.' AS img_tag ON img_tag.image_id = img.id
    LEFT OUTER JOIN '.TAGS_TABLE.' AS tags ON tags.id = img_tag.tag_id
  WHERE img.id = '.$image_id.'
  GROUP BY img.id, img.name, img.comment, img.author, img.path, img.representative_ext
;';
  $result = pwg_query($query);
  $row = pwg_db_fetch_assoc($result);

  $name = wm_prepare_string($row['name'], 500);
  $description = wm_prepare_string($row['comment'], 10000);
  $author = wm_prepare_string($row['author'], 500);
  $date_creation = wm_prepare_string($row['date_creation'], 50);
  $date_available = wm_prepare_string($row['date_available'], 50);
  $latitude = wm_prepare_string($row['latitude'], 50);
  $longitude = wm_prepare_string($row['longitude'], 50);

  $command = isset($conf['exiftool_path']) ? $conf['exiftool_path'] : 'exiftool -m -codedcharacterset=utf8 -overwrite_original';
  $command.= ' -q';

  if (strlen($name) > 0)
  {
    # 2#105 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:Headline="'.$name.'"';

    # 2#005 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:ObjectName="'.wm_cutString($name, 64).'"';
  }

  if (strlen($description) > 0)
  {
    # 2#120 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:Caption-Abstract="'.$description.'"';
  }

  if (strlen($date_creation) > 0)
  {
    # 2#055 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:DateCreated="'.$date_creation.'"';
  }

  if (strlen($date_available) > 0)
  {
    # 2#030 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:ReleaseDate="'.$date_available.'"';
  }
  if (strlen($latitude) > 0)
  {
    $command.= ' -GPSLatitudeRef=North -GPSLatitude="'.$latitude.'"';
  }
  if (strlen($longitude) > 0)
  {
    $command.= ' -GPSLongitudeRef=East -GPSLongitude="'.$longitude.'"';
  }

  if (strlen($author) > 0)
  {
    # 2#080 in iptcparse($imginfo['APP13'])
    $iptc_field = 'By-line';

    if (
      $conf['use_iptc']
      and isset($conf['use_iptc_mapping']['author'])
      and '2#122' == $conf['use_iptc_mapping']['author']
      )
    {
      # 2#122 in iptcparse($imginfo['APP13'])
      $iptc_field = 'Writer-Editor';
    }

    $command.= ' -m -codedcharacterset=utf8 -IPTC:'.$iptc_field.'="'.$author.'"';
  }
  
  if (strlen($row['tags']) > 0)
  {
    $tags = explode(',', $row['tags']);
    foreach ($tags as $tag)
    {
      $tag = wm_prepare_string($tag, 64);

      # 2#025 in iptcparse($imginfo['APP13'])
      $command.= ' -IPTC:Keywords="'.$tag.'"';
    }
  }

  $command.= ' "'.$row['path'].'"';
  $command.= ' 2>&1';
  // echo $command;
  $logger->info(__FUNCTION__.' command = '.$command);

  $exec_return = exec($command, $output, $rc);
  // echo '$exec_return = '.$exec_return.'<br>';
  // echo '<pre>'; print_r($output); echo '</pre>';

  // as derivatives may contain metadata, they must be reset
  delete_element_derivatives($row);

  return array($rc, $output);
}

function wm_prepare_string($string, $maxLen)
{
  return wm_cutString(
    wm_explode_description(
      wm_decode_html_string_to_unicode($string)
      ),
    $maxLen
    );
}

function wm_cutString($description, $maxLen)
{
  if (strlen($description) > $maxLen)
  {
    $description = substr($description, 0, $maxLen);
  }
  return $description;
}

function wm_explode_description($description)
{
  return str_replace(
    array('<br>', '<br />', "\n", "\r"),
    array('', '', '', ''),
    $description
    );
}

function wm_decode_html_string_to_unicode($string)
{
  if (isset($string) and strlen($string) > 0)
  {
    $string = html_entity_decode(trim($string), ENT_QUOTES, 'UTF8');
    $string = stripslashes($string);
  }
  else
  {
    $string = '';
  }
  
  return($string);
}
?>

Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#21 2023-03-27 18:25:27

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

BigIsland270972 wrote:

1. Write info from database to original jpg file (IPTC) with the write metadata  plugin (including date_available and date_creation).  ✔
2. Copy jpg ALL IPTC data to new version of file with Exiftool. ✔
3. Sync the new version jpg file with database.  ✔
4. Write html code from database in plain text to the IPTC description field with Write metadata plugin.                  FAILED!
5. Check logfile for errors when trying to write html (Exiftool doesn't write logfiles according to author) FAILED
6. What to do next??

I've come a little closer to finding a solution to write html code problem.
See error:
sh: line 1: $'p\303\245': command not found
https://www.fotoarkiv.no/priv/write.png

Last edited by BigIsland270972 (2023-03-27 18:29:28)


Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#22 2023-03-27 20:41:58

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

WELL theres ONE more problem.

Code:

 }
  if (strlen($latitude) > 0)
  {
    $command.= ' -GPSLatitudeRef=North -GPSLatitude="'.$latitude.'"';
  }
  if (strlen($longitude) > 0)
  {
    $command.= ' -GPSLongitudeRef=East -GPSLongitude="'.$longitude.'"';
  }

Latitude (-90=S to 90=N)
    Longitude (-180=W to 180=E)

This code work for  +pluss North and East but not for  - minus South and West.

How to solve this??

Last edited by BigIsland270972 (2023-03-27 21:19:54)


Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#23 2023-03-27 22:46:27

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

@plg???


Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#24 2023-03-28 01:53:36

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

YES! Figured it out:

Code:

if ($latitude > 0)
  {
    $command.= ' -GPSLatitudeRef=North -GPSLatitude="'.$latitude.'"';
  }
  if ($longitude > 0)
  {
    $command.= ' -GPSLongitudeRef=East -GPSLongitude="'.$longitude.'"';
  }
  if ($latitude < 0)
  {
    $command.= ' -GPSLatitudeRef=South -GPSLatitude="'.$latitude.'"';
  }
  if ($longitude < 0)
  {
    $command.= ' -GPSLongitudeRef=West -GPSLongitude="'.$longitude.'"';
  }

Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#25 2023-03-28 12:09:07

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

The latest working version here:

Code:

<?php
/*
Plugin Name: Write Metadata
Description: Write Piwigo photo properties (title, description, author, tags) into IPTC fields
Author: plg
Plugin URI: http://piwigo.org/ext/extension_view.php?eid=769
Version: 12.a
*/

// +-----------------------------------------------------------------------+
// | Define plugin constants                                               |
// +-----------------------------------------------------------------------+

defined('WRITE_METADATA_ID') or define('WRITE_METADATA_ID', basename(dirname(__FILE__)));
define('WRITE_METADATA_PATH' , PHPWG_PLUGINS_PATH.basename(dirname(__FILE__)).'/');

// +-----------------------------------------------------------------------+
// | Edit Photo                                                            |
// +-----------------------------------------------------------------------+

add_event_handler('loc_begin_admin_page', 'wm_add_link', 60);
function wm_add_link()
{
  global $template, $page;

  $template->set_prefilter('picture_modify', 'wm_add_link_prefilter');

  if (isset($page['page']) and 'photo' == $page['page'])
  {
    $template->assign(
      'U_WRITEMETADATA',
      get_root_url().'admin.php?page=photo-'.$_GET['image_id'].'-properties&amp;write_metadata=1'
      );
  }
}

function wm_add_link_prefilter($content)
{
  $search = '{if !url_is_remote($PATH)}';
  
  $replacement = '{if !url_is_remote($PATH)}
  <a class="icon-docs" href="{$U_WRITEMETADATA}" title="{\'Write metadata\'|translate}"></a>';

  return str_replace($search, $replacement, $content);
}

add_event_handler('loc_begin_admin_page', 'wm_picture_write_metadata');
function wm_picture_write_metadata()
{
  global $page, $conf;

  load_language('plugin.lang', dirname(__FILE__).'/');
  
  if (isset($page['page']) and 'photo' == $page['page'] and isset($_GET['write_metadata']))
  {
    check_input_parameter('image_id', $_GET, false, PATTERN_ID);
    list($rc, $output) = wm_write_metadata($_GET['image_id']);

    if (count($output) == 0)
    {
      $_SESSION['page_infos'][] = l10n('Metadata written into file');
      redirect(get_root_url().'admin.php?page=photo-'.$_GET['image_id'].'-properties');
    }
    else
    {
      $page['errors'] = array_merge($page['errors'], $output);
    }
  }
}

// +-----------------------------------------------------------------------+
// | Batch Manager                                                         |
// +-----------------------------------------------------------------------+

add_event_handler('loc_begin_element_set_global', 'wm_element_set_global_add_action');
function wm_element_set_global_add_action()
{
  global $template, $page;
  
  $template->set_filename('writeMetadata', realpath(WRITE_METADATA_PATH.'element_set_global_action.tpl'));

  if (isset($_POST['submit']) and $_POST['selectAction'] == 'writeMetadata')
  {
    $page['infos'][] = l10n('Metadata written into file');
  }

  $template->assign(
    array(
      'WM_PWG_TOKEN' => get_pwg_token(),
      )
    );

  $template->append(
    'element_set_global_plugins_actions',
    array(
      'ID' => 'writeMetadata',
      'NAME' => l10n('Write metadata'),
      'CONTENT' => $template->parse('writeMetadata', true),
      )
    );
}

add_event_handler('ws_add_methods', 'wm_add_methods');
function wm_add_methods($arr)
{
  include_once(WRITE_METADATA_PATH.'ws_functions.inc.php');
}

// +-----------------------------------------------------------------------+
// | Common functions                                                      |
// +-----------------------------------------------------------------------+

/**
 * inspired by convert_row_to_file_exiftool method in ExportImageMetadata
 * class from plugin Tags2File. In plugin write_medata we just skip the
 * batch command file, and execute directly on server (much more user
 * friendly...).
 */
function wm_write_metadata($image_id)
{
  global $conf, $logger;
  
  $query = '
SELECT
    img.name,
    img.comment,
    img.author,
    img.date_creation,
    img.date_available,
    img.latitude, 
    img.longitude,
    GROUP_CONCAT(tags.name) AS tags,
    img.path,
    img.representative_ext
  FROM '.IMAGES_TABLE.' AS img
    LEFT OUTER JOIN '.IMAGE_TAG_TABLE.' AS img_tag ON img_tag.image_id = img.id
    LEFT OUTER JOIN '.TAGS_TABLE.' AS tags ON tags.id = img_tag.tag_id
  WHERE img.id = '.$image_id.'
  GROUP BY img.id, img.name, img.comment, img.author, img.path, img.representative_ext
;';
  $result = pwg_query($query);
  $row = pwg_db_fetch_assoc($result);

  $name = wm_prepare_string($row['name'], 500);
  $description = wm_prepare_string($row['comment'], 10000);
  $author = wm_prepare_string($row['author'], 500);
  $date_creation = wm_prepare_string($row['date_creation'], 50);
  $date_available = wm_prepare_string($row['date_available'], 50);
  $latitude = wm_prepare_string($row['latitude'], 50);
  $longitude = wm_prepare_string($row['longitude'], 50);

  $command = isset($conf['exiftool_path']) ? $conf['exiftool_path'] : 'exiftool -m -codedcharacterset=utf8 -overwrite_original';
  $command.= ' -q';

  if (strlen($name) > 0)
  {
    # 2#105 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:Headline="'.$name.'"';

    # 2#005 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:ObjectName="'.wm_cutString($name, 64).'"';
  }

  if (strlen($description) > 0)
  {
    # 2#120 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:Caption-Abstract="'.$description.'"';
  }

  if (strlen($date_creation) > 0)
  {
    # 2#055 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:DateCreated="'.$date_creation.'"';
  }

  if (strlen($date_available) > 0)
  {
    # 2#030 in iptcparse($imginfo['APP13'])
    $command.= ' -IPTC:ReleaseDate="'.$date_available.'"';
  }
  if ($latitude > 0)
  {
    $command.= ' -GPSLatitudeRef=North -GPSLatitude="'.$latitude.'"';
  }
  if ($longitude > 0)
  {
    $command.= ' -GPSLongitudeRef=East -GPSLongitude="'.$longitude.'"';
  }
  if ($latitude < 0)
  {
    $command.= ' -GPSLatitudeRef=South -GPSLatitude="'.$latitude.'"';
  }
  if ($longitude < 0)
  {
    $command.= ' -GPSLongitudeRef=West -GPSLongitude="'.$longitude.'"';
  }

  if (strlen($author) > 0)
  {
    # 2#080 in iptcparse($imginfo['APP13'])
    $iptc_field = 'By-line';

    if (
      $conf['use_iptc']
      and isset($conf['use_iptc_mapping']['author'])
      and '2#122' == $conf['use_iptc_mapping']['author']
      )
    {
      # 2#122 in iptcparse($imginfo['APP13'])
      $iptc_field = 'Writer-Editor';
    }

    $command.= ' -m -codedcharacterset=utf8 -IPTC:'.$iptc_field.'="'.$author.'"';
  }
  
  if (strlen($row['tags']) > 0)
  {
    $tags = explode(',', $row['tags']);
    foreach ($tags as $tag)
    {
      $tag = wm_prepare_string($tag, 64);

      # 2#025 in iptcparse($imginfo['APP13'])
      $command.= ' -IPTC:Keywords="'.$tag.'"';
    }
  }

  $command.= ' "'.$row['path'].'"';
  $command.= ' 2>&1';
  // echo $command;
  $logger->info(__FUNCTION__.' command = '.$command);

  $exec_return = exec($command, $output, $rc);
  // echo '$exec_return = '.$exec_return.'<br>';
  // echo '<pre>'; print_r($output); echo '</pre>';

  // as derivatives may contain metadata, they must be reset
  delete_element_derivatives($row);

  return array($rc, $output);
}

function wm_prepare_string($string, $maxLen)
{
  return wm_cutString(
    wm_explode_description(
      wm_decode_html_string_to_unicode($string)
      ),
    $maxLen
    );
}

function wm_cutString($description, $maxLen)
{
  if (strlen($description) > $maxLen)
  {
    $description = substr($description, 0, $maxLen);
  }
  return $description;
}

function wm_explode_description($description)
{
  return str_replace(
    array('<br>', '<br />', "\n", "\r"),
    array('', '', '', ''),
    $description
    );
}

function wm_decode_html_string_to_unicode($string)
{
  if (isset($string) and strlen($string) > 0)
  {
    $string = html_entity_decode(trim($string), ENT_QUOTES, 'UTF8');
    $string = stripslashes($string);
  }
  else
  {
    $string = '';
  }
  
  return($string);
}
?>

Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

#26 2023-03-28 12:12:47

BigIsland270972
Member
Norway
2022-03-15
359

Re: [resolved] Write metadata plugin date_creation

BigIsland270972 wrote:

BigIsland270972 wrote:

1. Write info from database to original jpg file (IPTC) with the write metadata  plugin (including date_available and date_creation).  ✔
2. Copy jpg ALL IPTC data to new version of file with Exiftool. ✔
3. Sync the new version jpg file with database.  ✔
4. Write html code from database in plain text to the IPTC description field with Write metadata plugin.                  FAILED!
5. Check logfile for errors when trying to write html (Exiftool doesn't write logfiles according to author) FAILED
6. What to do next??

I've come a little closer to finding a solution to write html code problem.
See error:
sh: line 1: $'p\303\245': command not found

The problem is RESOLVED. It was the use of double quotes " in the html code. Changed to single quote ' and all is working just FINE. :-)))


Piwigo 13.6.0 | https://fotoarkiv.no | https://foto.arki.vet | http://Bergen.gallery  | http://Ålesund.gallery | http://geiranger.gallery | http://fjord.photos | http://foto.oslo.no
Apache | PHP 7.4 | MariaDB

Offline

 

Board footer

Powered by FluxBB

github twitter newsletter Donate Piwigo.org © 2002-2023 · Contact