Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
462cc3e
DBT-422 add podcast publication type
Aleks1754 Oct 12, 2026
5ca85d0
DBT-422 implement podcast browser and audio player
Aleks1754 Oct 12, 2026
2b5dc2b
DBT-422 integrate podcast module into DBT
Aleks1754 Oct 12, 2026
e3e7f49
DBT-422 Update CSS styles
Aleks1754 Oct 19, 2026
7a4746c
DBT-422 fix podcast routing and content handling
Aleks1754 Oct 19, 2026
b567c46
DBT-422 Update NotFound page
Aleks1754 Oct 19, 2026
7cd7319
DBT-422 Fix invalid episode dates and remove unused main.ts
Aleks1754 Oct 20, 2026
0d7fd91
DBT-422 fix audio playback state and error handling
Aleks1754 Oct 20, 2026
2fa77fa
DBT-422 fix nested XML element parsing
Aleks1754 Oct 20, 2026
e00201c
DBT-422 prevent race conditions in podcast search
Aleks1754 Oct 20, 2026
894167c
DBT-422 add whitelist for Solr query parameters
Aleks1754 Oct 20, 2026
982153d
DBT-422 add page parameter to URL
Aleks1754 Oct 20, 2026
3828aa4
DBT-422 use named route for podcast navigation
Aleks1754 Oct 20, 2026
5320089
DBT-422 make playlist header props reactive
Aleks1754 Oct 20, 2026
59de950
DBT-422 fix minor issues
Aleks1754 Oct 20, 2026
c318b2a
DBT-422 fix description overflow detection on resize
Aleks1754 Oct 20, 2026
6f293fb
DBT-422 fix playback toggle after external media controls
Aleks1754 Oct 20, 2026
a7acc11
DBT-422 simplify development index.html
Aleks1754 Oct 20, 2026
819d7f8
DBT-422 move filter configuration to JSON
Aleks1754 Oct 20, 2026
fad60fd
DBT-422 add localization for podcast pages
Aleks1754 Oct 23, 2026
9748eec
DBT-422 preserve language selection across podcast routes
Aleks1754 Oct 23, 2026
bb100ba
DBT-422 polish podcast page states
Aleks1754 Oct 23, 2026
e608601
DBT-422 improve podcast overview layout
Aleks1754 Oct 23, 2026
dfeb0ae
DBT-422 improve playlist layout and episode controls
Aleks1754 Oct 23, 2026
fb2540a
DBT-422 improve responsive player layout
Aleks1754 Oct 23, 2026
c48edcc
DBT-422 standardize code formatting
Aleks1754 Oct 30, 2026
87454fb
DBT-422 fix player layout on mobile devices
Aleks1754 Oct 30, 2026
8d004c3
DBT-422 refine episode ordering, player navigation, and playlist typo…
Aleks1754 Oct 30, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 44 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@
<media.projectBase>${project.build.directory}/media</media.projectBase>
<mir-layout-assets>${project.build.directory}/mir-layout-assets</mir-layout-assets>
<mir.version>2025.06.3-SNAPSHOT</mir.version>
<node.version>v20.19.0</node.version>
<npm.version>10.9.2</npm.version>
<podcast.projectBase>${basedir}/src/main/podcast</podcast.projectBase>
<podcast.targetBase>${project.build.directory}/podcast</podcast.targetBase>
<rcclient.projectBase>${project.build.directory}/rcclient</rcclient.projectBase>
<template.assetsdir>${template.targetdir}/dbt/assets</template.assetsdir>
<template.cssdir>${template.targetdir}/dbt/css</template.cssdir>
Expand Down Expand Up @@ -283,6 +286,31 @@
<arguments>run build</arguments>
</configuration>
</execution>
<execution>
<id>podcast-deps</id>
<goals>
<goal>npm</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<workingDirectory>${podcast.projectBase}</workingDirectory>
<arguments>ci</arguments>
<environmentVariables>
<NPM_CONFIG_CACHE>${project.build.directory}/npm-cache</NPM_CONFIG_CACHE>
</environmentVariables>
</configuration>
</execution>
<execution>
<id>podcast-build</id>
<goals>
<goal>npm</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<workingDirectory>${podcast.projectBase}</workingDirectory>
<arguments>run build -- --outDir=${podcast.targetBase}/dist --emptyOutDir</arguments>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
Expand Down Expand Up @@ -345,6 +373,22 @@
</resources>
</configuration>
</execution>
<execution>
<id>podcast-web-resources</id>
<goals>
<goal>copy-resources</goal>
</goals>
<phase>process-resources</phase>
<configuration>
<outputDirectory>${template.targetdir}/dbt/assets/podcast</outputDirectory>
<resources>
<resource>
<filtering>false</filtering>
<directory>${podcast.targetBase}/dist</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
/*
* This file is part of the Digitale Bibliothek Thüringen repository software.
* Copyright (c) 2000 - 2016
* See <https://www.db-thueringen.de/> and <https://github.com/ThULB/dbt/>
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this
* program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.urmel_dl.dbt.migration;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.mycore.backend.jpa.MCREntityManagerProvider;
import org.mycore.common.events.MCRStartupHandler;
import org.mycore.datamodel.classifications2.MCRCategory;
import org.mycore.datamodel.classifications2.MCRCategoryDAO;
import org.mycore.datamodel.classifications2.MCRCategoryDAOFactory;
import org.mycore.datamodel.classifications2.MCRCategoryID;
import org.mycore.datamodel.classifications2.MCRLabel;
import org.mycore.datamodel.classifications2.impl.MCRCategoryImpl;

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityTransaction;
import jakarta.servlet.ServletContext;

/**
* Adds the podcast publication type to installations whose MIR genre classification
* has already been persisted and is therefore not refreshed from setup resources.
*/
public final class PodcastClassificationInitializer implements MCRStartupHandler.AutoExecutable {

private static final Logger LOGGER = LogManager.getLogger();

private static final MCRCategoryID GENRES_ID = new MCRCategoryID("mir_genres");

private static final MCRCategoryID PODCAST_ID = new MCRCategoryID("mir_genres", "podcast");

private static final int PRIORITY = 998;

@Override
public String getName() {
return PodcastClassificationInitializer.class.getSimpleName();
}

@Override
public int getPriority() {
return PRIORITY;
}

@Override
public void startUp(final ServletContext servletContext) {
MCRCategoryDAO categoryDAO = MCRCategoryDAOFactory.obtainInstance();
EntityManager entityManager = MCREntityManagerProvider.getCurrentEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try {
transaction.begin();
if (categoryDAO.exist(PODCAST_ID)) {
return;
}

if (!categoryDAO.exist(GENRES_ID)) {
LOGGER.warn("Cannot add {} because classification {} does not exist",
PODCAST_ID, GENRES_ID);
return;
}

categoryDAO.addCategory(GENRES_ID, createPodcastCategory());
LOGGER.info("Added publication type {}", PODCAST_ID);
} finally {
if (transaction.isActive()) {
if (transaction.getRollbackOnly()) {
transaction.rollback();
} else {
transaction.commit();
}
}
}
}

private static MCRCategory createPodcastCategory() {
MCRCategory category = new MCRCategoryImpl();
category.setId(PODCAST_ID);
category.getLabels().add(new MCRLabel("de", "Podcast", null));
category.getLabels().add(new MCRLabel("en", "Podcast", null));
category.getLabels().add(new MCRLabel("it", "Podcast", null));
category.getLabels().add(new MCRLabel("x-hosts", "standalone", null));
category.getLabels().add(new MCRLabel("x-mapping",
"marcgt:sound diniPublType:Sound diniPublType2022:Sound schemaOrg:PodcastEpisode "
+ "coarResourceTypes32:c_18cc openAIRE400resourceTypeGeneral:other_research_product",
null));
return category;
}
}
37 changes: 37 additions & 0 deletions src/main/java/de/urmel_dl/dbt/podcast/servlets/PodcastServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* This file is part of the Digitale Bibliothek Thüringen repository software.
* Copyright (c) 2000 - 2026
* See <https://www.db-thueringen.de/> and <https://github.com/ThULB/dbt/>
*
* This program is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*/
package de.urmel_dl.dbt.podcast.servlets;

import java.io.Serial;

import org.jdom2.Document;
import org.jdom2.Element;
import org.mycore.common.content.MCRJDOMContent;
import org.mycore.frontend.servlets.MCRServlet;
import org.mycore.frontend.servlets.MCRServletJob;

/**
* Renders the MIR shell used as the mount point for the podcast Vue application.
*
* <p>The servlet deliberately does not interpret {@code pathInfo}. Every URL below
* {@code /podcast/} receives the same shell; client-side routing is exclusively
* handled by Vue Router.</p>
*/
public class PodcastServlet extends MCRServlet {

@Serial
private static final long serialVersionUID = 1L;

@Override
public void doGetPost(final MCRServletJob job) throws Exception {
final Document document = new Document(new Element("podcast"));
getLayoutService().doLayout(job.getRequest(), job.getResponse(), new MCRJDOMContent(document));
}
}
24 changes: 24 additions & 0 deletions src/main/podcast/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

node_modules
dist
dist-ssr
*.local

# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
.DS_Store
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
25 changes: 25 additions & 0 deletions src/main/podcast/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<!DOCTYPE html>
<html class="no-js" lang="de">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Development mode</title>
<meta content="text/html; charset=UTF-8" http-equiv="content-type">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<meta name="podcast-base-path" content="/" />
<meta name="podcast-application-base-url" content="/mir/" />
<meta name="podcast-locale" content="de" />
<link rel="icon" href="/favicon.png">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.7.2/css/all.min.css">
<script type="module" src="/src/index.ts"></script>
</head>
<body class="d-flex flex-column min-vh-100">
<section class="flex-grow-1">
<div class="container">
<div id="main_content">
<div class="container" ></div>
</div>
</div>
</section>
</body>
</html>
Loading
Loading