import java.util.concurrent.BlockingQueue import org.antlr.stringtemplate.StringTemplate import org.antlr.stringtemplate.StringTemplateGroup import org.antlr.stringtemplate.language.DefaultTemplateLexer import eu.dnetlib.enabling.manager.msro.hope.groovy.RunnableGroovy import eu.dnetlib.hope.domains.common.LandingPage import eu.dnetlib.hope.domains.common.OAIHeader import eu.dnetlib.hope.domains.visual.LIDOCollection import eu.dnetlib.hope.domains.visual.LidoActor import eu.dnetlib.hope.domains.visual.LidoAdminMetadata import eu.dnetlib.hope.domains.visual.LidoCreditLine import eu.dnetlib.hope.domains.visual.LidoDescription import eu.dnetlib.hope.domains.visual.LidoDescriptiveMetadata import eu.dnetlib.hope.domains.visual.LidoEvent import eu.dnetlib.hope.domains.visual.LidoIdentifiers import eu.dnetlib.hope.domains.visual.LidoMaterial import eu.dnetlib.hope.domains.visual.LidoPlace import eu.dnetlib.hope.domains.visual.LidoTitle import eu.dnetlib.hope.domains.visual.TypedSubjects import eu.dnetlib.miscutils.datetime.DateUtils class FESAudioFilesLIDO implements RunnableGroovy { def String templatePath = "/var/lib/hope-scripts/templates" def BlockingQueue resultsQueue, inputQueue; def String repositoryId = ""; /** * Driver namespace for elements in the OAI header. */ def dri = new groovy.xml.Namespace("http://www.driver-repository.eu/namespace/dri", 'dri') def String collectionID = 'Tonarchiv' String providerName = "Archiv der sozialen Demokratie (AdsD)" def generateCollectionRecord = {StringTemplate template, String collectionDate -> def String lPageURL = 'http://archiv2.fes.de/dok_start.fau?prj=fes&dm=Tonarchiv' def String abstractSum=''' Das Tonarchiv des AdsD enthält Tonbänder, Tonkassetten (MC, DAT) sowie Audio-CDs. Die O-Ton-Sammlung des Tonarchivs ist geeignet, in audiovisuellen Dokumenten die Geschichte der SPD, die Entwicklung der multimedialen Darstellung der Partei. (z.B. Wahl-Werbung) sowie die deutsche Geschichte zu dokumentieren. Die frühesten Aufnahmen stammen ca. von 1918. Um das Tonarchiv für die Zukunft erhalten zu können, wurde bereits mit der Digitalisierung auf Audio-CD begonnen. Das heutige AdsD-Tonarchiv ist die konsequente Weiterentwicklung und Ergänzung des 1986 übernommenen SPD-Tonband-Archivs. Die so in die Obhut des AdsD gelangten Tonbänder wurden in den folgenden Jahren technisch überprüft und, wo immer notwendig und möglich, instandgesetzt. Zusammen mit diesem Tonband-Archiv wurden auch einige Schallplatten aus früheren SPD-Produktion (ab ca. 1918) übernommen. Bei den frühesten Schallplatten handelt es sich um Schellack-, Glas-, Folien- und Aluminium-Schallplatten. Von diesen politisch-historischen Tondokumenten wurden in einem ersten Arbeitsschritt zur Sicherung Umschnitte auf Tonband (Senkel) angefertigt. In einigen wenigen Fällen waren nur noch fragmentarische Umschnitte möglich. Bei den Aufzeichnungen handelt es sich um Reichstagsreden, Reden bei Wahl-Veranstaltungen, Kundgebungen, Kongresse, Bundestags-Aufnahmen, Parteitags-Aufnahmen, Kampf- und Arbeiterlieder sowie weitere historische O-Töne. An der Gesamtheit des Ton-Archivs läßt sich die Entwicklung der multimedialen Darstellung der Partei gut nachvollziehen. Der heutige Bestand umfaßt ca. 450 Schallplatten, 5.500 Tonbänder (Senkel), 690 DAT-Kassetten sowie 140 Audio-CDs. Mit diesen inhaltlich außerordentlich wertvollen Ton-Dokumenten kann das Ton-Archiv heute in viele Rundfunk- und Fernseh-Sendungen sowie auch in nicht kommerziellen Projekten wertvolle Ergänzungen einbringen. Auf Anfrage können Umschnitte angefertigt werden.''' def OAIHeader collOaiheader = new OAIHeader(dateOfCollection:collectionDate, repositoryId:repositoryId, setSpec:'', identifier:collectionID, objIdentifier:repositoryId+"::"+collectionID) def LIDOCollection collPostcards = new LIDOCollection(collectionID:collectionID, langCode:'deu', titles:[ new LidoTitle(value:'collection of audiofiles') ], abstractSummaries:[ new LidoDescription(type:'abstract', value:abstractSum) ], creationDates:['1919 - 2012'], accumulationDates:['1996 - 2012'], owners:[providerName], sizeItems:'1994', itemType:'Sound', itemFormatStm:'', associatedPub:'',typedSubjects:[ new TypedSubjects(type:'association', dates:['1919-2012'], places:[ new LidoPlace(preferredName:'Germany') ]) ], subjects:[''], repository:providerName, useRights:"Die Nutzung setzt eine Zustimmung des AdsD oder des jeweiligen Rechteinhabers voraus", accessRights:'Weitere Informationen finden Sie auf unseren Websites', collItemLanguages:['deu'], europeanaType:'text', landingPage:new LandingPage(href:lPageURL, localID:this.collectionID)) def String collection = collPostcards.getXML(template, collOaiheader, providerName, collPostcards) return collection } @Override public void run() { def StringTemplateGroup group = new StringTemplateGroup("visualGroup", templatePath, DefaultTemplateLexer.class); def StringTemplate template = group.getInstanceOf("visualTemplate"); def parser = new XmlParser(false, true); def String input; def String collectionDate = DateUtils.now_ISO8601() def String collection = generateCollectionRecord(template, collectionDate) resultsQueue.put(collection); def c = 1; while(!((input = this.inputQueue.take()).equals("END"))){ def Node xmlRoot = parser.parseText(input) def Node oaiHeaderNode = xmlRoot.'**'.header[0] //Common OAI Header elements def String setSpec = oaiHeaderNode.setSpec.text() //def Node fesRoot = xmlRoot.'**'.Fahnen[0]; def NodeList objects = xmlRoot.'**'.Objekt if(objects.size() > 1) println "Found "+objects.size()+" Objekts" objects.each { String lidoObject = transformObjekt(it, template, collectionDate, collectionID) //Hack for resolved XML entities... //lidoObject = lidoObject.replace("&", "&") //add the Lido Element generated from the current (it) FaustObjekt resultsQueue.put(lidoObject); c++; // println lidoObject // println "***************" template.reset() } } println c +" lido objects enueued" this.resultsQueue.put("END") println "closedQueue" } def transformObjekt = { Node objekt, StringTemplate template, String dateOfColl, String collectionID -> //reset the template for the current Faust-Objekt template.reset() //identifiers def String objId = objekt.Signatur.text() def String mdLanguage = 'deu'; def String repoObjId = this.repositoryId+"::"+objId //oai header def OAIHeader oaiheader = new OAIHeader(dateOfCollection:dateOfColl, repositoryId:this.repositoryId, setSpec:'', identifier:objId, objIdentifier:repoObjId, nonDigitalCollection:true) def src = "Archiv der sozialen Demokratie (AdsD)" def euroType = "TEXT" def LidoIdentifiers lidoIds= new LidoIdentifiers(source:src, localID:objId, parentID:collectionID) template.setAttribute("lido", lidoIds) def List titles = objekt.Titel*.text()+objekt.Untertitel*.text() def String theTitle = titles.join('; ') def List lidoTitles = [ new LidoTitle(langCode:mdLanguage, value:escapeXml(theTitle)) ] def String bemerk = objekt.Bemerkungen?.text() if(bemerk) bemerk = 'Bemerkungen: '+bemerk; def List descriptions = [ objekt.Inhaltliche_x032x_Beschreibung?.text() ]+[bemerk] def String briefDescr = descriptions.join('; ') def LidoDescription descr = new LidoDescription(langCode:mdLanguage, value:escapeXml(briefDescr), type:'brief description') def String techAttribute = (objekt.Tr_x132x_germedium*.text() + objekt.Format*.text()).join('; ') def List theTypedSubjects = getTypedSubjects(objekt) def LidoDescriptiveMetadata lidoDescrMD = new LidoDescriptiveMetadata(lang:mdLanguage, titles:lidoTitles, descriptions:[descr], inscriptions:[], techAttributes:[escapeXml(techAttribute)], workTypes:objekt.Typologie*.text().collect{return escapeXml(it)}, objectMeasurements:objekt.Umfang*.text().collect{return escapeXml(it)}, creationEvent:getCreationEvent(objekt), displaySubjects:objekt.Sachw_x148x_rter*.text().collect{return escapeXml(it)}, typedSubjects:theTypedSubjects, repositoryName:src, collectionItemNumber:objId, owners:objekt.Herkunft*.text().collect{return escapeXml(it)}, europeanaType:euroType) def String rechte = escapeXml(objekt.Rechte?.text()) def String benutz = escapeXml(objekt.Benutzerhinweise?.text()) def String lPage = escapeXml(objekt.Link_x032x_zur_x032x_Beschreibung?.text()) def LandingPage lpage = new LandingPage(href:lPage, localID:lPage) def LidoAdminMetadata lidoAdminMD = new LidoAdminMetadata(lang:mdLanguage, rightsCreditLines:[ new LidoCreditLine(creditLine:rechte), new LidoCreditLine(creditLine:benutz) ], landingPage:lpage, recordType:"item", europeanaRights:'') template.setAttribute("oaiheader", oaiheader) template.setAttribute("lidoDescr", lidoDescrMD) template.setAttribute("lidoAdmin", lidoAdminMD) return template.toString(); } def getCreationEvent = {Node objekt -> def LidoEvent creationEvt = new LidoEvent(type:'creation', preferredName:escapeXml(objekt.HerausgeberIn?.text()), eventPlaces:[], eventDisplayDates:objekt.Datum*.text(), eventActors:[], eventMaterialsTech:[ new LidoMaterial(type:'technique', terms:objekt.Objektbeschreibung*.text().collect{return escapeXml(it)})] ) return creationEvt } def getTypedSubjects = {Node objekt -> def List associatedPersons = objekt.betrifft_x032x_Personen*.text().collect{if(it) return new LidoActor(type:'person', preferredName:escapeXml(it))} def List lidoSubjects = [ new TypedSubjects(type:"association",actors:associatedPersons, events:[], places:[]) ] return lidoSubjects } def escapeXml = {String s -> return s.replaceAll("&", "&").replaceAll(">", ">").replaceAll("<", "<") } @Override public void setResultsQueue(BlockingQueue queue) { this.resultsQueue = queue } @Override public void setInputQueue(BlockingQueue queue) { this.inputQueue = queue } /** * TODO: calling the method from the run() does not work. Kinda groovy strange stuff, I do not know why. */ @Override public void closeResultQueue() { this.resultsQueue.put("END") println "closedQueue" } @Override public void setRepositoryId(String repoId) {this.repositoryId = repoId} }