+
+ {{ getPodcastTitle(podcast) }}
+
+
+
+
+ + {{ getPodcastAuthors(podcast) }} +
+ +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.
+ */ +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)); + } +} diff --git a/src/main/podcast/.gitignore b/src/main/podcast/.gitignore new file mode 100644 index 00000000..a547bf36 --- /dev/null +++ b/src/main/podcast/.gitignore @@ -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? diff --git a/src/main/podcast/index.html b/src/main/podcast/index.html new file mode 100644 index 00000000..5ec419be --- /dev/null +++ b/src/main/podcast/index.html @@ -0,0 +1,25 @@ + + + + ++ {{ stateDescription }} +
++ {{ t('podcast.state.error.description') }} +
++ {{ + audioError + ? t('podcast.player.status.unavailable') + : isLoading + ? t('podcast.player.status.buffering') + : playerStore.isPlaying + ? t('podcast.player.status.playing') + : t('podcast.player.status.paused') + }} +
+ ++ {{ playerStore.episode?.title }} +
+ ++ {{ playerStore.playlistTitle }} +
+ ++ {{ t('podcast.episode.empty') }} +
+ ++ +
+ + ++ {{ getPodcastAuthors(podcast) }} +
+ ++ {{ t('podcast.hero.eyebrow') }} +
++ {{ t('podcast.hero.description') }} +
++ {{ t('podcast.notFound.description') }} +
+ +