← Back to team overview

slub.team team mailing list archive

[Merge] lp:~sebastian-meyer/goobi-contrib/update into lp:goobi-contrib

 

Sebastian Meyer has proposed merging lp:~sebastian-meyer/goobi-contrib/update into lp:goobi-contrib.

Requested reviews:
  Saxon State Library Team (slub.team)

For more details, see:
https://code.launchpad.net/~sebastian-meyer/goobi-contrib/update/+merge/208077
-- 
https://code.launchpad.net/~sebastian-meyer/goobi-contrib/update/+merge/208077
Your team Saxon State Library Team is requested to review the proposed merge of lp:~sebastian-meyer/goobi-contrib/update into lp:goobi-contrib.
=== added file '.buildpath'
--- .buildpath	1970-01-01 00:00:00 +0000
+++ .buildpath	2014-02-25 08:43:51 +0000
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<buildpath>
+	<buildpathentry kind="src" path=""/>
+	<buildpathentry kind="con" path="org.eclipse.php.core.LANGUAGE"/>
+</buildpath>

=== modified file 'slub/imageproc/indexer/indexer.php'
--- slub/imageproc/indexer/indexer.php	2013-04-25 14:06:14 +0000
+++ slub/imageproc/indexer/indexer.php	2014-02-25 08:43:51 +0000
@@ -1,5 +1,15 @@
 <?php
 
+$scan = array (
+//	'/mnt/goobi',
+//	'/mnt/goobi2',
+//	'/mnt/goobi3',
+//	'/mnt/goobi4',
+//	'/mnt/goobi5',
+//	'/mnt/goobi6',
+	'/mnt/goobi7',
+);
+
 $roots = array (
 	'/mnt/goobi',
 	'/mnt/goobi2',
@@ -7,6 +17,7 @@
 	'/mnt/goobi4',
 	'/mnt/goobi5',
 	'/mnt/goobi6',
+	'/mnt/goobi7',
 );
 
 $pids = array (
@@ -25,7 +36,9 @@
 	'illustrierte' => 3,
 );
 
-foreach ($roots as $root) {
+$lza_usrgrp = '601.610';
+
+foreach ($scan as $root) {
 
 $clients = scandir($root);
 
@@ -44,7 +57,7 @@
 		foreach ($processes as $process) {
 
 			if ((preg_match('/^.+_[0-9]{8}[0-9A-Z]{1}(-[0-9]+)?(_.+)?$/i', $process)
-						|| preg_match('/^.+_DE-(1a|611)-[0-9]{1,7}_.+$/i', $dir))
+						|| preg_match('/^.+_DE-(1a|611)-[0-9]{1,7}_.+$/i', $process))
 					&& is_dir($dir.'/'.$process)
 					&& file_exists($dir.'/'.$process.'/'.$process.'.xml')
 					&& file_exists($dir.'/'.$process.'/ready-for-indexing')
@@ -81,22 +94,52 @@
 
 			$corrupt = FALSE;
 
-			echo "Indexing $proc ($ppn)...\n";
-
+			echo "Indexing $proc ($ppn)...\n";
+
 			exec('mv -f '.$dir.'/'.$proc.'/'.$proc.'.xml '.$dir.'/'.$proc.'/'.$proc.'_mets.xml');
 
-			fixURN($dir.'/'.$proc.'/'.$proc.'_mets.xml');
+			$processId = fixMETS($dir.'/'.$proc.'/'.$proc.'_mets.xml');
 
 			if (file_exists($dir.'/'.$proc.'/'.$proc.'_anchor.xml')) {
 
-				fixURN($dir.'/'.$proc.'/'.$proc.'_anchor.xml');
+				fixMETS($dir.'/'.$proc.'/'.$proc.'_anchor.xml');
 
 			}
+
+			echo "  Goobi Process ID: $processId\n";
 
 			if (is_dir($dir.'/'.$proc.'/'.$proc.'_tif')) {
 
-				echo "  Images found! Moving all files to ";
+				echo "  Images found! Moving all files to ";
+
+				if (!empty($processId) && file_exists('/mnt/lza/'.$processId)) {
+
+					if (file_exists($dir.'/'.$proc.'/tif.md5')) {
+
+						exec('mv -fu '.$dir.'/'.$proc.'/tif.md5 /mnt/lza/'.$processId.'/');
+
+					} else {
+
+						exec('cd /mnt/lza/'.$processId.' && md5sum images/scans_tif/*.tif > tif.md5');
+
+					}
 
+					if (file_exists($dir.'/'.$proc.'/'.$proc.'_anchor.xml')) {
+
+						exec('cp -fu '.$dir.'/'.$proc.'/'.$proc.'_anchor.xml /mnt/lza/'.$processId.'/');
+
+					}
+
+					exec('cp -fu '.$dir.'/'.$proc.'/'.$proc.'_mets.xml /mnt/lza/'.$processId.'/');
+
+					exec('cd /mnt/lza && chown -R '.$lza_usrgrp.' '.$processId);
+
+				} else {
+
+					exec('rm -rf '.$dir.'/'.$proc.'/tif.md5');
+
+				}
+
 				$update = FALSE;
 
 				foreach ($roots as $root) {
@@ -221,14 +264,14 @@
 
 }
 
-function fixURN($file) {
+function fixMETS($file) {
 
 	$xml = simplexml_load_file($file);
 
 	$xml->registerXPathNamespace('mets', 'http://www.loc.gov/METS/');
 
-	$xml->registerXPathNamespace('mods', 'http://www.loc.gov/mods/v3');
-
+	$xml->registerXPathNamespace('mods', 'http://www.loc.gov/mods/v3');
+
 	$urns = $xml->xpath('//mods:identifier[@type="urn"]');
 
 	foreach ($urns as $urn) {
@@ -237,7 +280,57 @@
 
 	}
 
-	file_put_contents($file, $xml->asXML());
+	$_processId = $xml->xpath('//mets:fileGrp[@USE="LOCAL"]/mets:file/mets:FLocat');
+
+	if (!empty($_processId[0])) {
+
+		$processId = intval(preg_replace('%^file:/{1,3}home/goobi/work/daten/%i', '', (string) $_processId[0]->attributes('http://www.w3.org/1999/xlink')->href));
+
+	} else {
+
+		$processId = 0;
+
+	}
+
+	$_schemaLocations = $xml->xpath('/mets:mets');
+
+	foreach ($_schemaLocations as $_schemaLocation) {
+
+		$_schemas = explode(' ', $_schemaLocation->attributes('http://www.w3.org/2001/XMLSchema-instance')->schemaLocation);
+
+		for ($i = 0; $i < count($_schemas); $i++) {
+
+			if ($_schemas[$i] == 'http://www.loc.gov/mods/v3') {
+
+				$_schemas[$i + 1] = 'http://www.loc.gov/standards/mods/mods.xsd';
+
+			} elseif ($_schemas[$i] == 'http://www.loc.gov/METS/') {
+
+				$_schemas[$i + 1] = 'http://www.loc.gov/standards/mets/mets.xsd';
+
+			}
+
+		}
+
+		$_schemaLocation->attributes('http://www.w3.org/2001/XMLSchema-instance')->schemaLocation = implode(' ', $_schemas);
+
+	}
+
+	$_languages = $xml->xpath('//mods:language[count(./mods:scriptTerm)>0][count(./mods:languageTerm)=0]');
+
+	foreach ($_languages as $_language) {
+
+		$_dom = dom_import_simplexml($_language);
+
+		$_insert = $_dom->insertBefore($_dom->ownerDocument->createElementNS('http://www.loc.gov/mods/v3', 'mods:languageTerm'), $_dom->firstChild);
+
+		$_language = simplexml_import_dom($_insert);
+
+	}
+
+	file_put_contents($file, $xml->asXML());
+
+	return $processId;
 
 }
 

=== modified file 'slub/imageproc/processing/processing.php'
--- slub/imageproc/processing/processing.php	2013-04-25 14:06:14 +0000
+++ slub/imageproc/processing/processing.php	2014-02-25 08:43:51 +0000
@@ -1,14 +1,17 @@
 <?php
 
 $bases = array (
-	'/mnt/goobi',
-	'/mnt/goobi2',
-	'/mnt/goobi3',
-	'/mnt/goobi4',
-	'/mnt/goobi5',
-	'/mnt/goobi6',
+//	'/mnt/goobi',
+//	'/mnt/goobi2',
+//	'/mnt/goobi3',
+//	'/mnt/goobi4',
+//	'/mnt/goobi5',
+//	'/mnt/goobi6',
+	'/mnt/goobi7',
 );
 
+$lza = false;
+
 $scriptpath = dirname(__FILE__);
 
 foreach ($bases as $base) {
@@ -96,135 +99,159 @@
 
 			}
 
-			unset ($output);
-
-			$output = array ();
-
 			if (!empty($ppn)
-					&& !is_dir($root.'/'.$directory.'/'.$directory.'_tif')) {
-
-				echo "No TIFFs available, but XML metadata found. Doing nothing...\n";
-
-				exec('chown -R root.root '.$root.'/'.$directory.'/', $output);
-
-				exec('chmod 644 '.$root.'/'.$directory.'/'.$directory.'.xml', $output);
-
-				exec('touch '.$root.'/'.$directory.'/ready-for-indexing', $output);
-
-				if (!empty($output)) {
-
-					echo '  '.implode("\n  ", $output)."\n";
-
-				}
-
-				echo "Done!\n";
-
+					&& !is_dir($root.'/'.$directory.'/'.$directory.'_tif')) {
+
+				echo "  No TIFFs available, but XML metadata found. Doing nothing...\n";
+
+				exec('chown -R root.root '.$root.'/'.$directory.'/');
+
+				exec('chmod 644 '.$root.'/'.$directory.'/'.$directory.'.xml');
+
+				exec('touch '.$root.'/'.$directory.'/ready-for-indexing');
+
+				echo "Done!\n";
+
 			} elseif (!empty($ppn)
-					&& is_dir($root.'/'.$directory.'/'.$directory.'_tif')) {
-
-				echo "TIFFs and XML metadata found. Doing full image processing...\n";
-
-				$lock = $root.'/'.$directory;
-
-				exec('chown -R root.root '.$lock.'/', $output);
-
-				exec('chmod 755 '.$lock.'/', $output);
-
-				exec('chmod 755 '.$lock.'/'.$directory.'_tif/', $output);
-
-				exec('mkdir -m777 '.$lock.'/'.$directory.'_tif/jpegs', $output);
-
-				$xml = @simplexml_load_file($lock.'/'.$directory.'.xml');
-
-				$xml->registerXPathNamespace('mets', 'http://www.loc.gov/METS/');
-
-				$xml->registerXPathNamespace('mods', 'http://www.loc.gov/mods/v3');
-
-				$xml->registerXPathNamespace('slub', 'http://slub-dresden.de/');
-
-				$_footer = $xml->xpath('//slub:footer');
-
-				if (!empty($_footer[0])) {
-
-					$footer = (string) $_footer[0];
-
-				} else {
-
-					$footer = $client;
-
-				}
-
-				unset ($tiffs);
-
-				$tiffs = scandir($lock.'/'.$directory.'_tif');
-
-				$i = 0;
-
-				foreach ($tiffs as $tiff) {
-
+					&& is_dir($root.'/'.$directory.'/'.$directory.'_tif')) {
+
+				echo "  TIFFs and XML metadata found. Doing full image processing...\n";
+
+				$lock = $root.'/'.$directory;
+
+				exec('chown -R root.root '.$lock.'/');
+
+				exec('chmod 755 '.$lock.'/');
+
+				exec('chmod 755 '.$lock.'/'.$directory.'_tif/');
+
+				exec('mkdir -m777 '.$lock.'/'.$directory.'_tif/jpegs');
+
+				$xml = @simplexml_load_file($lock.'/'.$directory.'.xml');
+
+				$xml->registerXPathNamespace('mets', 'http://www.loc.gov/METS/');
+
+				$xml->registerXPathNamespace('mods', 'http://www.loc.gov/mods/v3');
+
+				$xml->registerXPathNamespace('slub', 'http://slub-dresden.de/');
+
+				$_processId = $xml->xpath('//mets:fileGrp[@USE="LOCAL"]/mets:file/mets:FLocat');
+
+				if (!empty($_processId[0])) {
+
+					$processId = intval(preg_replace('%^file:/{1,3}home/goobi/work/daten/%i', '', (string) $_processId[0]->attributes('http://www.w3.org/1999/xlink')->href));
+
+				} else {
+
+					$processId = 0;
+
+				}
+
+				echo "  Goobi Process ID: $processId\n";
+
+				$_footer = $xml->xpath('//slub:footer');
+
+				if (!empty($_footer[0])) {
+
+					$footer = (string) $_footer[0];
+
+				} else {
+
+					$footer = $client;
+
+				}
+
+				echo "  Using footer: $footer\n";
+
+				unset ($tiffs);
+
+				$tiffs = scandir($lock.'/'.$directory.'_tif');
+
+				$i = 0;
+
+				foreach ($tiffs as $tiff) {
+
 					if (is_file($lock.'/'.$directory.'_tif/'.$tiff)
-							&& preg_match('/^[0-9]{8}\.tif$/', $tiff)) {
-
-						$i++;
-
-						exec('convert '.$lock.'/'.$directory.'_tif/'.$tiff.' -quiet -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 500 -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg', $output);
-
-						exec('montage '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg '.$scriptpath.'/images/'.$footer.'_500.gif -tile 1x2 -geometry +0+0 -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg -gravity southeast -stroke none -fill black -annotate +0+25 \'http://digital.slub-dresden.de/id'.$ppn.'/'.$i.'\' -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 1000 -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg', $output);
-
-						exec('montage '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg '.$scriptpath.'/images/'.$footer.'_1000.gif -tile 1x2 -geometry +0+0 -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg -gravity south -stroke none -fill white -annotate +25+25 \'http://digital.slub-dresden.de/id'.$ppn.'/'.$i.'\' -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg -strip -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.pdf', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 2000 -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg', $output);
-
-						exec('montage '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg '.$scriptpath.'/images/'.$footer.'_2000.gif -tile 1x2 -geometry +0+0 -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg -gravity south -stroke none -fill white -annotate +50+50 \'http://digital.slub-dresden.de/id'.$ppn.'/'.$i.'\' -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg', $output);
-
-						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 150x150 -strip -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.thumbnail.jpg', $output);
-
-					}
-
-				}
-
-				exec('cd '.$lock.'/'.$directory.'_tif/jpegs && pdftk *.pdf cat output '.$ppn.'.pdf', $output);
-
-				exec('cd '.$lock.' && ln -sf '.$directory.'_tif '.$ppn.'_tif', $output);
-
-				exec('cd '.$lock.'/'.$directory.'_tif && rm -f *.tif', $output);
-
-				exec('cd '.$lock.' && ln -sf '.$directory.'_xml '.$ppn.'_ocr', $output);
-
-				exec('cd '.$lock.' && rm -rf '.$directory.'_abbyy', $output);
-
-				exec('cd '.$lock.' && rm -rf '.$directory.'_alto', $output);
-
-				exec('touch '.$lock.'/ready-for-indexing', $output);
-
-				if (!empty($output)) {
-
-					echo '  '.implode("\n  ", $output)."\n";
-
-				}
-
-				echo "Done!\n";
-
-			}
-
-		}
-
-	}
-
-}
-
-}
-
+							&& preg_match('/^[0-9]{8}\.tif$/', $tiff)) {
+
+						$i++;
+
+						exec('convert '.$lock.'/'.$directory.'_tif/'.$tiff.' -quiet -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 500 -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg');
+
+						exec('montage '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg '.$scriptpath.'/images/'.$footer.'_500.gif -tile 1x2 -geometry +0+0 -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg -gravity southeast -stroke none -fill black -annotate +0+25 \'http://digital.slub-dresden.de/id'.$ppn.'/'.$i.'\' -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.small.jpg');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 1000 -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg');
+
+						exec('montage '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg '.$scriptpath.'/images/'.$footer.'_1000.gif -tile 1x2 -geometry +0+0 -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg -gravity south -stroke none -fill white -annotate +25+25 \'http://digital.slub-dresden.de/id'.$ppn.'/'.$i.'\' -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.medium.jpg -strip -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.pdf');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 2000 -quality 75 -strip '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg');
+
+						exec('montage '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg '.$scriptpath.'/images/'.$footer.'_2000.gif -tile 1x2 -geometry +0+0 -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg -gravity south -stroke none -fill white -annotate +50+50 \'http://digital.slub-dresden.de/id'.$ppn.'/'.$i.'\' -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.large.jpg');
+
+						exec('convert '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.original.jpg -scale 150x150 -strip -quality 75 '.$lock.'/'.$directory.'_tif/jpegs/'.$tiff.'.thumbnail.jpg');
+
+					}
+
+				}
+
+				exec('cd '.$lock.'/'.$directory.'_tif/jpegs && pdftk *.pdf cat output '.$ppn.'.pdf');
+
+				exec('cd '.$lock.' && ln -sf '.$directory.'_tif '.$ppn.'_tif');
+
+				if ($lza && !empty($processId)) {
+
+					exec('mkdir -m770 /mnt/lza/'.$processId);
+
+					exec('mkdir -p /mnt/lza/'.$processId.'/images/scans_tif');
+
+					exec('cd '.$lock.'/'.$directory.'_tif && mv -fu *.tif /mnt/lza/'.$processId.'/images/scans_tif/');
+
+				} else {
+
+					exec('cd '.$lock.'/'.$directory.'_tif && rm -rf *.tif');
+
+				}
+
+				if (file_exists($lock.'/'.$directory.'_xml')) {
+
+					if ($lza && !empty($processId)) {
+
+						exec('mkdir -p /mnt/lza/'.$processId.'/ocr/'.$directory.'_xml');
+
+						exec('cd '.$lock.'/'.$directory.'_xml && cp -fu *.xml /mnt/lza/'.$processId.'/ocr/'.$directory.'_xml/');
+
+					}
+
+					exec('cd '.$lock.' && ln -sf '.$directory.'_xml '.$ppn.'_ocr');
+
+				}
+
+				exec('cd '.$lock.' && rm -rf '.$directory.'_abbyy');
+
+				exec('cd '.$lock.' && rm -rf '.$directory.'_alto');
+
+				exec('touch '.$lock.'/ready-for-indexing');
+
+				echo "Done!\n";
+
+			}
+
+		}
+
+	}
+
+}
+
+}
+
 ?>
\ No newline at end of file

=== added directory 'slub/piwik'
=== added directory 'slub/piwik/plugins'
=== added directory 'slub/piwik/plugins/DigitalCollections'
=== added file 'slub/piwik/plugins/DigitalCollections/API.php'
--- slub/piwik/plugins/DigitalCollections/API.php	1970-01-01 00:00:00 +0000
+++ slub/piwik/plugins/DigitalCollections/API.php	2014-02-25 08:43:51 +0000
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * API für Datenanzeige und Archivverwaltung der digitalen Kollektionen der SLUB.
+ * @author Nikolaus Thuemmel
+ * @package DigitalCollections
+ *
+ */
+
+require_once PIWIK_INCLUDE_PATH . '/plugins/DigitalCollections/functions.php';
+
+class Piwik_DigitalCollections_API {
+
+	static private $instance = null;
+
+	static public function getInstance() {
+		if (self::$instance == null) {
+			self::$instance = new self;
+		}
+		return self::$instance;
+	}
+
+	/**
+	 * Anzahl der Kollektionsaufrufe abfragen.
+	 * @return Piwik_DataTable
+	 */
+	public function getCollectionTable( $idSite, $period, $date, $segment = false) {
+		$dataTable = self::getCollectionTableFromArchive($idSite, $period, $date, $segment);
+		self::filterCollectionTableContent($dataTable, "Projekt:", false);
+		return $dataTable;
+	}
+
+	public function getCollectionTableProjects( $idSite, $period, $date, $segment = false) {
+		$dataTable = self::getCollectionTableFromArchive($idSite, $period, $date, $segment);
+		self::filterCollectionTableContent($dataTable, "Projekt:", true);
+		return $dataTable;
+	}
+
+
+	/**
+	 * Gibt eine sortierte DataTable mit Kollektionen aus den Archiven zur�ck.
+	 * @param int $idSite
+	 * @param unknown_type $period
+	 * @param unknown_type $date
+	 * @param boolean $segment
+	 * @return Piwik_DataTable
+	 */
+	protected function getCollectionTableFromArchive($idSite, $period, $date, $segment) {
+	//	defined('PIWIK_INCLUDE_PATH') or die('Restricted access');
+		Piwik_cdebug::clog('getCollectionTableFromArchive: ' . $idSite . ' period: '.$period);
+		Piwik::checkUserHasViewAccess( $idSite );
+
+		$archive = Piwik_Archive::build($idSite, $period, $date, $segment );
+		$dataTable = $archive->getDataTable("DigitalCollections_value");
+
+		Piwik_cdebug::clog('getCollectionTableFromArchive: dataTable: ' . count($dataTable));
+		Piwik_cdebug::clog('getCollectionTableFromArchive: dataTable: ' . print_r($dataTable, 1));
+
+		$dataTable->filter('Sort', array(Piwik_DigitalCollections::$valuefield, 'desc'));
+
+		$dataTable->filter('ColumnCallbackAddMetadata', array( 'label', 'url', 'getCollectionUrlFromID', array($date,$period)));
+		$dataTable->filter('ColumnCallbackReplace', array('label', 'getCollectionNames'));
+		$dataTable->filter('ReplaceColumnNames');
+
+		//INDEX_NB_VISITS-Spalte zur richtigen Graphen-Anzeige hinzuf�gen --> ACHTUNG! Muss im Controller ausgeblendet werden!
+		$rows = $dataTable->getRows();
+		Piwik_cdebug::clog('getCollectionTableFromArchive: rows: '. count($rows));
+		foreach($rows as $i => $row) {
+			Piwik_cdebug::clog('getCollectionTableFromArchive: '.$i);
+			$row->addColumn(Piwik_Archive::INDEX_NB_VISITS, $row->getColumn("visits"));
+		}
+
+		return $dataTable;
+	}
+
+
+	/**
+	 * Filtert Kollektionsdaten nach Strings. -> z.B. Unterscheidung Standard <-> Projekt
+	 * @param Piwik_DataTable $dataTable
+	 * @param String $filter
+	 * @param boolean $bool
+	 */
+	private static function filterCollectionTableContent($dataTable, $filter, $bool) {
+		$rows = $dataTable->getRows();
+		Piwik_cdebug::clog('filterCollectionTableContent: rows: '. count($rows));
+		foreach($rows as $i => $row) {
+			$label = $row->getColumn('label');
+			if( (strpos($label, $filter)!==false) XOR ($bool) ) $dataTable->deleteRow($i);
+		}
+	}
+
+}
+
+function getCollectionUrlFromID($id,$date,$period) {
+	$pidSite = Piwik_FetchOne("SELECT idSite FROM ".Piwik_Common::prefixTable("site_collections")." WHERE cID = ?", $id);
+
+	Piwik_cdebug::clog('getCollectionUrlFromID: ' . 'http://piwik.slub-dresde.de/index.php?module=CoreHome&action=index&date='.$date.'&period='.$period.'&idSite='.$pidSite);
+
+	if(is_numeric($pidSite)) {
+		return "http://piwik.slub-dresden.de/index.php?module=CoreHome&action=index&date=".$date."&period=".$period."&idSite=".$pidSite;
+	}
+}
+
+
+?>

=== added file 'slub/piwik/plugins/DigitalCollections/Controller.php'
--- slub/piwik/plugins/DigitalCollections/Controller.php	1970-01-01 00:00:00 +0000
+++ slub/piwik/plugins/DigitalCollections/Controller.php	2014-02-25 08:43:51 +0000
@@ -0,0 +1,49 @@
+<?php 
+
+/**
+ *
+ * @author Nikolaus Th�+ * @package DigitalCollections
+ *
+ */
+
+require_once PIWIK_INCLUDE_PATH . '/plugins/DigitalCollections/functions.php';
+
+class Piwik_DigitalCollections_Controller extends Piwik_Controller {
+	
+	public function collections($fetch = false) {
+		
+		$view = Piwik_ViewDataTable::factory();
+		$view->init( $this->pluginName,  __FUNCTION__, "DigitalCollections.getCollectionTable" );
+		
+		$this->configView($view);
+		
+		return $this->renderView($view,$fetch);
+	}
+	
+	public function collections_projects($fetch = false) {
+		
+		$view = Piwik_ViewDataTable::factory();
+		$view->init( $this->pluginName,  __FUNCTION__, "DigitalCollections.getCollectionTableProjects" );
+		
+		$this->configView($view);
+		
+		return $this->renderView($view,$fetch);
+	}
+	
+	private function configView($view) {
+		$view->setColumnTranslation(Piwik_DigitalCollections::$valuefield, "Aufrufe");
+		$view->setColumnTranslation('label', "Kollektion");
+		$view->setSortedColumn(Piwik_DigitalCollections::$valuefield,'desc');
+		$view->setColumnsToDisplay( array('label', Piwik_DigitalCollections::$valuefield) );
+		//$view->disableSort();
+		$view->setGraphLimit(8);
+		$view->setLimit(10);
+		$view->disableShowAllColumns();
+		//$view->disableExcludeLowPopulation();
+		$this->setGeneralVariablesView($view);
+	}
+
+}
+
+?>

=== added file 'slub/piwik/plugins/DigitalCollections/DigitalCollections.php'
--- slub/piwik/plugins/DigitalCollections/DigitalCollections.php	1970-01-01 00:00:00 +0000
+++ slub/piwik/plugins/DigitalCollections/DigitalCollections.php	2014-02-25 08:43:51 +0000
@@ -0,0 +1,308 @@
+<?php
+/**
+ * Ordnet aufgerufene Digitalisate in Echtzeit Kollektionen zu; implementiert grafische Schnittstelle.
+ *
+ * @author Nikolaus Th�mmel
+ * @package DigitalCollections
+ *
+ */
+
+require_once PIWIK_INCLUDE_PATH . '/plugins/DigitalCollections/functions.php';
+
+class Piwik_DigitalCollections extends Piwik_Plugin {
+
+
+	public static $valuefield = 'visits';
+
+	/**
+	 * Return information about this plugin.
+	 *
+	 * @see Piwik_Plugin
+	 *
+	 * @return array
+	 */
+	public function getInformation()
+	{
+		return array(
+			'description' => "Ermittelt die Aufrufe digitaler Kollektionen.",
+			'homepage' => 'http://www.slub-dresden.de/',
+			'author' => 'Nikolaus Thuemmel, Alexander Bigga',
+			'author_homepage' => '',
+			'version' => '0.2',
+			'translationAvailable' => false,
+			'TrackerPlugin' => true,
+		);
+	}
+
+
+	/* Erstellt Datenbank f�r Zuordnung Kollektion->idSite
+	 * @see Piwik_Plugin::install()
+	 */
+	public function install() {
+		Piwik_Query("CREATE TABLE IF NOT EXISTS ".Piwik_Common::prefixTable("site_collections")." (ID INT(11) AUTO_INCREMENT PRIMARY KEY, cID INT(11), idSite INT(10))");
+	}
+
+
+	/**
+	 * Widgets f�r Kollektionen registrieren.
+	 * @param Piwik_Event_Notification $notification
+	 */
+	function addWidget($notification) {
+		Piwik_AddWidget('SLUB', 'Kollektionen', 'DigitalCollections', 'collections');
+		Piwik_AddWidget('SLUB', 'Kollektionen - Projekte', 'DigitalCollections', 'collections_projects');
+	}
+
+
+	/**
+	 * Hooks registrieren.
+	 * @see Piwik_Plugin::getListHooksRegistered()
+	 */
+	public function getListHooksRegistered()
+	{
+		return array(
+			'WidgetsList.add' => 'addWidget',
+			'ArchiveProcessing_Day.compute' => 'archiveDay',
+			'ArchiveProcessing_Period.compute' => 'archivePeriod',
+			'Tracker.Action.record' => 'redirectCollections',
+		);
+	}
+
+
+	function archivePeriod( $notification )
+	{
+		Piwik_cdebug::clog('archivePeriod');
+
+		try {
+			$archiveProcessing = $notification->getNotificationObject();
+			if(!$archiveProcessing->shouldProcessReportsForPlugin($this->getPluginName())) {
+				$this->clog("archivePeriod-Error: return");
+//				return;
+			}
+
+	                $dataTableToSum = array(
+                                'DigitalCollections_value',
+        	        );
+	                $archiveProcessing->archiveDataTable($dataTableToSum);
+		} catch(Exception $e) {
+			Piwik_cdebug::clog("archivePeriod-Error: ".$e->getMessage());
+		}
+	}
+
+
+	public function archiveDay( $notification )
+	{
+		Piwik_cdebug::clog('archiveDay');
+		try {
+			$archiveProcessing = $notification->getNotificationObject();
+			if(!$archiveProcessing->shouldProcessReportsForPlugin($this->getPluginName())) {
+				$this->clog("archiveDay-Error: return");
+				return;
+			}
+
+			$recordName = 'DigitalCollections_value';
+			$table = $this->getCollectionData($archiveProcessing);
+			$columnToSortByBeforeTruncation = self::$valuefield;
+			$archiveProcessing->insertBlobRecord($recordName, $archiveProcessing->getDataTableSerialized($table), null, $columnToSortByBeforeTruncation);
+		} catch(Exception $e) {
+			Piwik_cdebug::clog("archiveDay-Error: ".$e->getMessage());
+		}
+	}
+
+
+	/**
+	 * Ordnet f�r den gegebenen Archivzeitraum allen Digitalisat-URLs Kollektionen zu,
+	 * und archiviert diese.
+	 * @param Piwik_ArchiveProcessing_Day $archiveProcessing
+	 * @return Piwik_DataTable
+	 */
+	private function getCollectionData($archiveProcessing) {
+
+		Piwik_cdebug::clog('getCollectionData');
+
+		$collections = array();
+		$query = $archiveProcessing->queryActionsByDimension('idaction_url');
+		while($row = $query->fetch()) {
+			$url = Piwik_FetchOne("SELECT name FROM ".Piwik_Common::prefixTable("log_action")." WHERE idaction = ?", $row["label"]);
+			$idcollections = $this->getCollectionsForURL($url);
+			if(!is_array($idcollections) || count($idcollections)<1) continue;
+			foreach($idcollections as $c) {
+				if(!array_key_exists($c, $collections)) {
+					$collections[$c] = array(self::$valuefield=>1);
+				} else {
+					$collections[$c][self::$valuefield]++;
+				}
+			}
+		}
+
+		return $collections;
+	}
+
+
+	/**
+	 * L�dt Kollektions-IDs aus der TYPO3-Datenbank f�r eine bestimmte URL (und damit ID).
+	 * @param String $url
+	 * @return array
+	 */
+	private function getCollectionsForURL($url) {
+
+		// this function is called on every piwik call
+		// we are only interested in calls for dlf-extension
+		if (strpos($url, "dlf") === FALSE)
+                        return NULL;
+
+		// try to find the id of the digitalisat
+		$urlparsed = parse_url(urldecode($url));
+		// default
+		$id = 0;
+
+		// 1st try:
+		// urls like: http://digital.slub-dresden.de/werkansicht/cache.off?id=5363&tx_dlf[id]=15997&tx_dlf[page]=10
+		if (!empty($urlparsed['query'])) {
+			$qfields = preg_split('/[;&]/', $urlparsed['query']);
+			$params = array();
+    			foreach ($qfields as $param) {
+			        $item = explode('=', $param);
+			 	if (sizeof($item)==2)
+				       $params[$item[0]] = $item[1];
+			}
+			if (isset($params['tx_dlf[id]']))
+				$id = $params['tx_dlf[id]'];
+		}
+
+		// 2nd try:
+		// urls like: http://digital.slub-dresden.de/werkansicht/dlf/2967/57/cache.off
+		if ($id <=0) {
+			$this->clog("getCollectionsForURL: " . $urlparsed['path']);
+			$qsplit = explode("/",$urlparsed['path']);
+			$idpos = array_search('dlf', $qsplit) + 1;
+			$id = intval($qsplit[$idpos]);
+		}
+		$this->clog("getCollectionsForURL(".$url."). id=/". $id."/");
+
+		// none was successful --> abort
+		if ($id <=0)
+			return NULL;
+
+		$mysqli = mysqli_connect("MYSQLSERVER","USER","PASSWORD", "DATABASE");
+		mysqli_set_charset($mysqli, 'utf8');
+
+		// ID DER KOLLEKTIONEN ZUORDNEN
+		$result = mysqli_query($mysqli, "SELECT uid_foreign FROM tx_dlf_relations WHERE ident='docs_colls' AND uid_local=".$id);
+		Piwik_cdebug::clog("getCollectionsForURL: SELECT uid_foreign FROM tx_dlf_relations WHERE ident='docs_colls' AND uid_local=".$id);
+		$collections = array();
+		if ($result) {
+			while($tmpc = mysqli_fetch_row($result)) {
+				$collections[] = $tmpc[0];
+			}
+		} else
+			Piwik_cdebug::clog("getCollectionsForURL(".$url.") --> no result!");
+
+		mysqli_close($mysqli);
+
+		Piwik_cdebug::clog("getCollectionsForURL(".$url.")".print_r($collections, 1));
+
+		return $collections;
+	}
+
+
+	/**
+	 * Log-Erstellung. debugging.
+	 * @param String $str
+	 */
+	private function clog($str) {
+		return;
+		$file = fopen("/var/log/piwik-collection_log.txt", "a");
+		fputs($file, strftime('%c') . ': ' . $str."\n");
+		fclose($file);
+	}
+
+
+
+	/**
+	 * Kollektionen werden an Kollektions-idSites weitergeleitet und f�llen ihre eigene Statistik.
+	 * @param unknown_type $notification
+	 */
+	public function redirectCollections($notification) {
+		try {
+			if($tmp = Piwik_Common::getRequestVar("colacnt","false","string")=="true") return;
+			$openedurl = Piwik_Common::getRequestVar("url");
+			$collections = $this->getCollectionsForURL($openedurl);
+			if($collections==null || count($collections)<1) return;
+			require_once PIWIK_INCLUDE_PATH .'/core/Loader.php';
+
+			$murl = $this->curPageURL();
+			$ua = $_SERVER["HTTP_USER_AGENT"];
+			$acceptLanguage = $_SERVER["HTTP_ACCEPT_LANGUAGE"];
+
+			foreach($collections as $c) {
+				$idSite = Piwik_FetchOne("SELECT idSite FROM ".Piwik_Common::prefixTable("site_collections")." WHERE cID = ?", $c);
+				$name = "(Kollektion) ".getCollectionNames($c);
+
+				//Kollektion hat noch keine idSite! -> wird erstellt
+				if(!is_numeric($idSite)) {
+					Piwik_Query("INSERT INTO ".Piwik_Common::prefixTable("site").
+							" (idsite, name, main_url, ts_created, timezone, currency, excluded_ips, excluded_parameters, `group`) ".
+							"VALUES('', ?, ?, NOW(), 'Europe/Berlin', 'EUR', '', '', 'Digitale Kollektionen')",
+					 		array($name, "slub-dresden.de"));
+					$idSite = Piwik_FetchOne("SELECT LAST_INSERT_ID() FROM ".Piwik_Common::prefixTable("site"));
+					Piwik_Query("INSERT INTO ".Piwik_Common::prefixTable("site_collections")." (ID, cID, idSite) VALUES ('', ?, ?)",array($c,$idSite));
+				}
+
+				//idSite zur Kollektion wurde gel�scht! -> neu erstellen
+				if(Piwik_FetchOne("SELECT COUNT(idsite) FROM ".Piwik_Common::prefixTable("site")." WHERE idsite = ?",$idSite)==0) {
+					Piwik_Query("INSERT INTO ".Piwik_Common::prefixTable("site").
+							" (idsite, name, main_url, ts_created, timezone, currency, excluded_ips, excluded_parameters, `group`) ".
+							"VALUES(?, ?, ?, NOW(), 'Europe/Berlin', 'EUR', '', '', 'Digitale Kollektionen')",
+					 		array($idSite, $name, "slub-dresden.de"));
+				}
+
+				$url = preg_replace("/idsite=[0-9]+/", "idsite=".$idSite, $murl);
+				// Erneute Kollektionsweiterleitung verhindern
+				$url .= "&colacnt=true";
+				// Disable provider plugin
+				$url .= "&dp=1";
+				Piwik_Http::sendHttpRequest($url, 5, $ua, null, 0, $acceptLanguage);
+			}
+		} catch (Exception $e) {
+			$this->clog("redirectCollections-Error: ".$e->getMessage());
+		}
+	}
+
+
+	/**
+	 * Quelle: http://www.webcheatsheet.com/PHP/get_current_page_url.php
+	 * @return string
+	 */
+	private function curPageURL() {
+	 	$pageURL = 'http';
+	 	if (@$_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
+		$pageURL .= "://";
+		if ($_SERVER["SERVER_PORT"] != "80") {
+			$pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
+		} else {
+			$pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
+		}
+		return $pageURL;
+	}
+
+
+}
+
+
+/**
+ * L�st Kollektions-IDs in Namen auf.
+ * @param String $label
+ * @return String
+ */
+function getCollectionNames($label) {
+	Piwik_cdebug::clog('getCollectionNames: '.$label);
+	$mysqlh = mysql_connect("MYSQLSERVER","USER","PASSWORD");
+	mysql_set_charset('utf8', $mysqlh);
+	mysql_select_db("DATABASE",$mysqlh);
+	$result = mysql_query("SELECT label FROM tx_dlf_collections WHERE uid=".$label,$mysqlh);
+	$row = mysql_fetch_row($result);
+	mysql_close($mysqlh);
+	return $row[0];
+}
+
+?>

=== added file 'slub/piwik/plugins/DigitalCollections/functions.php'
--- slub/piwik/plugins/DigitalCollections/functions.php	1970-01-01 00:00:00 +0000
+++ slub/piwik/plugins/DigitalCollections/functions.php	2014-02-25 08:43:51 +0000
@@ -0,0 +1,18 @@
+<?PHP
+
+class Piwik_cdebug {
+       /**
+         * debugging.
+         * @param String $str
+         */
+        public function clog($str) {
+		// deactivated by default
+		return;
+
+                $file = fopen("/var/log/piwik-collection_log.txt", "a");
+                fputs($file, strftime('%c') . ': ' . $str."\n");
+                fclose($file);
+        }
+
+}
+?>