diff --git a/deploy_mediaconch/add_dnx_mappings/README.txt b/deploy_mediaconch/add_dnx_mappings/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..96ba4732036741130fba5b1474bf8675cf33611f --- /dev/null +++ b/deploy_mediaconch/add_dnx_mappings/README.txt @@ -0,0 +1,32 @@ +How to automatically add Mappings between extracted Technical Metadata and DNX Significant Properties in Rosetta +================================================================================================================ + +:lang: en +:encoding: utf-8 +:author: Jörg Sachse + +== Prerequisites + +* Desktop environment +* Perl programming language +* Selenium Perl module (download at https://metacpan.org/pod/Selenium::Remote::Driver) +* Chrome browser (download at https://www.google.com/intl/de_de/chrome/) +* Chrome driver compatible with the installed Chrome browser (download at https://sites.google.com/chromium.org/driver/) + +== How to install on Debian 11 (Buster) +* sudo apt install perl chromium cpanminus unzip +* cpanm Selenium::Remote::Driver +* check Chromium version (i.e. "91.x.xxxx.xxx") --> download coresponding 'chromedriver_linux64.zip' from https://sites.google.com/chromium.org/driver/ (Downloads) +* unzip chromedriver_linux64.zip + +== How to build + +* You don't have to do anything, just run the script. + +== How to run + +* general invocation +** $# perl -I path/to/perl/modules .add_dnx_mappings.pl "Rosetta-Host.Domain.tld" "Rosetta-User" "Rosetta-Password" "Institution-Name" "Portnumber" + +* example invocation: +** $# perl -I ~/perl5/lib/perl5 ./add_dnx_mappings.pl "sdvrosetta-test.slub-dresden.de" "su-user" "Sw0rdF!$h" "SLUB" "8443" diff --git a/deploy_mediaconch/add_dnx_mappings/add_dnx_mappings.pl b/deploy_mediaconch/add_dnx_mappings/add_dnx_mappings.pl new file mode 100644 index 0000000000000000000000000000000000000000..a8a24dc83d111785c4f86c4748e8b7bd2cc5e24c --- /dev/null +++ b/deploy_mediaconch/add_dnx_mappings/add_dnx_mappings.pl @@ -0,0 +1,238 @@ +#!/usr/bin/env perl +# adds all dnx properties +# by Andreas Romeyke (andreas.romeyke@slub-dresden.de) and Serhiy Bolkun (serhiy.bolkun@slub-dresden.de) +# +# usage: perl add_dnx_mappings.pl rosetta-host rosetta-user rosetta-user-password rosetta-institution rosetta-login-port +# example: perl add_dnx_mappings.pl rosetta.my-archive.domain user1 12345 MYINSTITUTE 8443 +# +# needs a geckodriver and the Selenium::Remote::Driver module +# see http://www.seleniumhq.org/ +# +# tested against Rosetta 7.0 using chromedriver and chromium 90.0.4430.93 +# under Windows 10 and Debian 10 +# +# ensure, that the plugin is assigned to a classification, for example to +# "Image (Mix)" + +use strict; +use warnings; +use utf8; +use Selenium::Remote::Driver; +use Selenium::Chrome; +use Term::ANSIColor; # colored print +use Data::Printer; +use v5.10; + +BEGIN { + if ($^O eq 'MSWin32') { + require Win32::Console::ANSI; + Win32::Console::ANSI->import(); + } +} + + +my $host = shift; +my $user = shift; +my $passwd = shift; +my $institution = shift; +my $ui_port = shift; +my $protocol = 'https'; +my %exiftool2dnx = ( + "ICC-header:ColorSpaceData" => "icc.colorspacedata", + "ICC-header:DeviceModel" => "icc.devicemodel", + "ICC-header:PrimaryPlatform" => "icc.primaryplatform", + "ICC-header:ProfileCMMType" => "icc.profilecmmtype", + "ICC-header:ProfileCreator" => "icc.profilecreator", + "ICC-header:ProfileDateTime" => "icc.profiledatetime", + "ICC-header:ProfileVersion" => "icc.profileversion", + "ICC_Profile:CalibrationDateTime" => "icc.profilecalibrationdatetime", + "ICC_Profile:MakeAndModel" => "icc.makeandmodel", + "ICC_Profile:ProfileCopyright" => "icc.profilecopyright", + "ICC_Profile:ProfileDescription" => "icc.profiledescription", + "IFD0:BitsPerSample" => "tiff.bitspersample", # TIFF-Tag 258 BitsPerSample () + "IFD0:Compression" => "tiff.compression", + "IFD0:Copyright" => "tiff.copyright", # TIFF-Tag 33432 Copyright () + "IFD0:DocumentName" => "tiff.documentname", # TIFF-Tag 269 DocumentName () + "ExifIFD:GrayResponseCurve" => "tiff.grayresponsecurve", # TIFF-Tag 291 GrayResponseCurve () + "IFD0:GrayResponseUnit" => "tiff.grayresponseunit", # TIFF-Tag 290 GrayResponseUnit () + "IFD0:ImageDescription" => "tiff.imagedescription", # TIFF-Tag 270 ImageDescription () + "IFD0:ImageHeight" => "image.height", # TIFF-Tag 257 ImageLength () + "IFD0:ImageWidth" => "image.width", # TIFF-Tag 256 ImageWidth ( ) + "IFD0:Make" => "tiff.make", # TIFF-Tag 271 Make () + "IFD0:MaxSampleValue" => "tiff.maxsamplevalue", # TIFF-Tag 281 MaxSampleValue ( ) + "IFD0:MinSampleValue" => "tiff.minsamplevalue", # TIFF-Tag 280 MinSampleValue ( ) + "IFD0:Model" => "tiff.model", # TIFF-Tag 272 Model () + "IFD0:ModifyDate" => "tiff.datetime", # TIFF-Tag 306 DateTime () + "IFD0:PageNumber" => "tiff.pagenumber", # TIFF-Tag 297 PageNumber () + "IFD0:PhotometricInterpretation" => "tiff.photometricinterpretation", # TIFF-Tag 262 PhotometricInterpretation () + "IFD0:PrimaryChromaticities" => "tiff.primarychromaticities", # TIFF-Tag 319 PrimaryChromaticities () + "IFD0:SamplesPerPixel" => "tiff.samplesperpixel", # TIFF-Tag 277 SamplesPerPixel () + "IFD0:Software" => "tiff.software", # TIFF-Tag 305 Software () + "IFD0:WhitePoint" => "tiff.whitepoint", # TIFF-Tag 318 WhitePoint () + "IFD0:XResolution" => "image.xresolution", # TIFF-Tag 282 XResolution ( Angabe in dpi) + "IFD0:YResolution" => "image.yresolution", # TIFF-Tag 283 YResolution ( Angabe in dpi) +); +my $plugin_name = "SLUBTechnicalMetadataExtractorCheckItTiffPlugin"; +my $classification_group = "Image (Mix)"; +my $driver = Selenium::Chrome->new(); +$driver->debug_on; +$driver->set_implicit_wait_timeout(1000); +$driver->set_timeout('script', 1000); + +print "Try to mechanize adding DNX, using: + host=$host + user=$user + institution=$institution + \n"; + +sub login { + $driver->get("$protocol://$host:${ui_port}/mng?auth=local"); + my $ele_institute = $driver->find_element("institution", "id"); + $driver->find_child_element($ele_institute, "./option[\@value='$institution']", "xpath")->click; + $driver->find_element("userName", "id")->clear; + $driver->find_element("userName", "id")->send_keys($user); + $driver->find_element("password", "id")->clear; + $driver->find_element("password", "id")->send_keys($passwd); + $driver->find_element("login", "id")->click; +} + +sub logout { + $driver->get("$protocol://$host:${ui_port}/mng/action/menus.do?first_time_key=com.exlibris.dps.wrk.general.menu"); + my $ele = $driver->find_element("user", "id")->click; + $driver->pause(); + $ele = $driver->find_element("Logout", "link")->click; +} + +sub _change_to_xxx_format_library { + $driver->get("$protocol://$host:${ui_port}/mng/action/menus.do?first_time_key=com.exlibris.dps.wrk.general.menu"); + $driver->find_element("//a[\@title='Administer the system']", "xpath")->click; + $driver->find_element("General Parameters", "link")->click; + $driver->find_element("modules_button", "id")->click; + $driver->find_element("//li[\@title='format_library']", "xpath")->click; + my $tr = $driver->find_element("//tr[starts-with(td,'format_library_is_global')]", "xpath"); + my $td = $driver->find_child_element($tr, "./td[\@class='form-inline']", "xpath"); + $driver->find_element("generalParameters_model_parameters_2__value_button", "id")->click; + say "click combobox button"; + return $td; +} + +sub change_to_global_format_library { + my $td = _change_to_xxx_format_library(); + $driver->find_child_element($td, "descendant::li[text()='true']", "xpath")->click; + say "select true"; + $driver->find_element("//button[\@value='Update']", "xpath")->click; + say "click update button"; +} + +sub change_to_local_format_library { + my $td = _change_to_xxx_format_library(); + $driver->find_child_element($td, "descendant::li[text()='false']", "xpath")->click; + say "select false"; + $driver->find_element("//button[\@value='Update']", "xpath")->click; + say "click update button"; + $driver->pause(); +} + +sub add_dnx_property($$) { + my $dnx_property = shift; + my $dnx_description = shift; + my $dow = localtime; + $driver->get("$protocol://$host:${ui_port}/mng/action/pageAction.page_xml.page_sig_prop_list.xml.do?pageViewMode=Edit&pageBean.currentUserMode=GLOBAL&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.SigProps.InnerMenu&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.SigProps.InnerMenu&backUrl="); + $driver->pause(); + $driver->find_element("Add Significant Property", "link")->click; + $driver->find_element("selectedSigPropname", "id")->clear; + $driver->find_element("selectedSigPropname", "id")->send_keys("$dnx_property"); + $driver->find_element("selectedSigPropdescription", "id")->clear; + $driver->find_element("selectedSigPropdescription", "id")->send_keys("$dnx_description (automatisiert durch $0 hinzugefügt, $dow)"); + $driver->find_element("SaveSigPropGenDetails", "name")->click; +} + +sub join_dnx_property_to_classification_group($) { + my $dnx_property = shift; + say "try to join dnx property"; + $driver->get("$protocol://$host:${ui_port}/mng/action/pageAction.page_xml.page_classification_list.xml.do?pageViewMode=Edit&pageBean.currentUserMode=GLOBAL&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.Classifications.InnerMenu&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryGLOBAL.mngLibraryHeader.Classifications.InnerMenu&backUrl="); + $driver->pause(); + $driver->find_element("find0.0", "id")->clear; + $driver->find_element("find0.0", "id")->send_keys($classification_group); + $driver->find_element("go", "name")->click; + $driver->find_element("Edit", "link")->click; + $driver->find_element("Related Properties", "link")->click; + $driver->find_element("//form[\@id='classificationDetails']//div[\@class='available']//div//input", "xpath")->clear; + $driver->find_element("//form[\@id='classificationDetails']//div[\@class='available']//div//input", "xpath")->send_keys($dnx_property); + $driver->pause(); + $driver->find_element("Add all", "link")->click; + $driver->find_element("SaveClassificationGenDetails", "name")->click; + $driver->pause(); +} + +sub extractors_add_mapping($$) { + my $dnx_property = shift; + my $exiftool_property = shift; + say "try to add extractor mapping"; + $driver->get("$protocol://$host:${ui_port}//mng/action/pageAction.page_xml.page_extractors_list.xml.do?pageBean.deploymentMode=BUNDLED&pageViewMode=Edit&pageBean.currentUserMode=LOCAL&RenewBean=true&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryLOCAL.mngLibraryHeader.Extractors.InnerMenu&menuKey=com.exlibris.dps.wrk.general.menu.Preservation.AdvancedPreservationActivities.mngLibraryLOCAL.mngLibraryHeader.Extractors.InnerMenu&backUrl="); + $driver->pause(); + $driver->find_element("Custom", "link")->click; + $driver->find_element("find1.0", "id")->clear; + $driver->find_element("find1.0", "id")->send_keys($plugin_name); + $driver->find_element("go", "name")->click; + $driver->find_element("Edit", "link")->click; + $driver->find_element("Add Mapping", "link")->click; + $driver->find_element("pageBeancurrentMappingextractorProperty_input", "id")->clear; + $driver->find_element("pageBeancurrentMappingextractorProperty_button", "id")->click; + $driver->pause(); + $driver->find_element("//li[\@title='$exiftool_property']", "xpath")->click; + $driver->pause(); + $driver->find_element("pageBeancurrentMappingclassificationProperty_input", "id")->clear; + $driver->find_element("pageBeancurrentMappingclassificationProperty_button", "id")->click; + $driver->pause(); + $driver->find_element("//li[\@title='$dnx_property']", "xpath")->click; + $driver->pause(); + $driver->find_element("pageBeancurrentMappingnormalizer_input", "id")->click; + $driver->find_element("pageBeancurrentMappingnormalizer_input", "id")->click; + $driver->find_element("pageBeancurrentMappingnormalizer_input", "id")->clear; + $driver->pause(); + $driver->find_element("page.buttons.operation", "name")->click; + $driver->pause(); +} + +# login +printf colored("Step 1 of 7: login \n", 'bold green'); +login(); + +# change to global format library +printf colored("Step 2 of 7: change to global format library \n", 'bold green'); +change_to_global_format_library(); + +# add dnx property +printf colored("Step 3 of 7: add dnx property \n", 'bold green'); +foreach my $exiftool_property (sort keys %exiftool2dnx) { + my $dnx_property = $exiftool2dnx{ $exiftool_property }; + add_dnx_property($dnx_property, "$dnx_property <- Exiftool '$exiftool_property'"); +} + +# include dnx property to classification group (Image(MIX)) +printf colored("Step 4 of 7: join dnx property to classification group \n", 'bold green'); +foreach my $exiftool_property (sort keys %exiftool2dnx) { + my $dnx_property = $exiftool2dnx{ $exiftool_property }; + join_dnx_property_to_classification_group($dnx_property); +} + +# add mapping +printf colored("Step 5 of 7: extractors add mapping \n", 'bold green'); +foreach my $exiftool_property (sort keys %exiftool2dnx) { + my $dnx_property = $exiftool2dnx{ $exiftool_property }; + extractors_add_mapping($dnx_property, $exiftool_property); +} + +# change to local format library +printf colored("Step 6 of 7: change to local format library \n", 'bold green'); +change_to_local_format_library(); + +# logout +printf colored("Step 7 of 7: logout \n", 'bold green'); +logout(); + +$driver->quit(); +$driver->shutdown_binary(); + +printf colored("Finish! \n", 'bold green');