From 178789690f5b83e77ce9415abcf51659735a8bbb Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sat, 12 Jun 2021 17:50:56 +0200 Subject: [PATCH] Create and edit steps for external audio and video assets. --- .../librecms/assets/ExternalAudioAsset.java | 8 + .../librecms/assets/ExternalVideoAsset.java | 7 + .../assets/AbstractBookmarkCreateStep.java | 102 ++++++++ .../AbstractContactableEntityEditStep.java | 1 - .../assets/BookmarkCreateStep.java | 66 +---- .../assets/CmsAssetEditSteps.java | 3 +- .../assets/ExternalAudioAssetCreateStep.java | 64 +++++ .../assets/ExternalAudioAssetEditStep.java | 244 ++++++++++++++++++ .../ExternalAudioAssetEditStepModel.java | 58 +++++ .../assets/ExternalVideoAssetCreateStep.java | 64 +++++ .../assets/ExternalVideoAssetEditStep.java | 244 ++++++++++++++++++ .../ExternalVideoAssetEditStepModel.java | 54 ++++ .../assets/bookmark/edit-bookmark.xhtml | 2 +- .../create-external-audio-asset.xhtml | 79 ++++++ .../edit-external-audio-asset.xhtml | 207 +++++++++++++++ .../create-external-video-asset.xhtml | 80 ++++++ .../edit-external-video-asset.xhtml | 208 +++++++++++++++ .../ui/MvcAssetStepsBundle.properties | 87 +++++++ .../ui/MvcAssetStepsBundle_de.properties | 87 +++++++ 19 files changed, 1597 insertions(+), 68 deletions(-) create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractBookmarkCreateStep.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetCreateStep.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStep.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStepModel.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetCreateStep.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStep.java create mode 100644 ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStepModel.java create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-audio-asset/create-external-audio-asset.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-audio-asset/edit-external-audio-asset.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/create-external-video-asset.xhtml create mode 100644 ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/edit-external-video-asset.xhtml diff --git a/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java b/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java index a9e0ff5d0..3eb7c7de6 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ExternalAudioAsset.java @@ -19,7 +19,11 @@ package org.librecms.assets; import com.arsdigita.cms.ui.assets.forms.ExternalAudioAssetForm; + import org.hibernate.envers.Audited; +import org.librecms.ui.contentsections.assets.ExternalAudioAssetCreateStep; +import org.librecms.ui.contentsections.assets.ExternalAudioAssetEditStep; +import org.librecms.ui.contentsections.assets.MvcAssetEditKit; import java.io.Serializable; import java.util.Objects; @@ -48,6 +52,10 @@ import static org.librecms.assets.AssetConstants.*; labelBundle = ASSETS_BUNDLE, descriptionKey = "external_audio_asset.description", descriptionBundle = ASSETS_BUNDLE) +@MvcAssetEditKit( + createStep = ExternalAudioAssetCreateStep.class, + editStep = ExternalAudioAssetEditStep.class +) public class ExternalAudioAsset extends Bookmark implements Serializable { private static final long serialVersionUID = 1190735204910197490L; diff --git a/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java b/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java index aae470a54..2b9fb529d 100644 --- a/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java +++ b/ccm-cms/src/main/java/org/librecms/assets/ExternalVideoAsset.java @@ -21,6 +21,9 @@ package org.librecms.assets; import com.arsdigita.cms.ui.assets.forms.ExternalVideoAssetForm; import org.hibernate.envers.Audited; +import org.librecms.ui.contentsections.assets.ExternalVideoAssetCreateStep; +import org.librecms.ui.contentsections.assets.ExternalVideoAssetEditStep; +import org.librecms.ui.contentsections.assets.MvcAssetEditKit; import java.io.Serializable; import java.util.Objects; @@ -46,6 +49,10 @@ import static org.librecms.assets.AssetConstants.*; labelBundle = ASSETS_BUNDLE, descriptionKey = "external_video_asset.description", descriptionBundle = ASSETS_BUNDLE) +@MvcAssetEditKit( + createStep = ExternalVideoAssetCreateStep.class, + editStep = ExternalVideoAssetEditStep.class +) public class ExternalVideoAsset extends Bookmark implements Serializable { private static final long serialVersionUID = -2927375812188779049L; diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractBookmarkCreateStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractBookmarkCreateStep.java new file mode 100644 index 000000000..4489adb71 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractBookmarkCreateStep.java @@ -0,0 +1,102 @@ +/* + * Copyright (C) 2021 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.assets; + +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.assets.Bookmark; +import org.librecms.contentsection.AssetRepository; + +import java.util.Locale; +import java.util.Map; +import java.util.Optional; + +import javax.inject.Inject; + +/** + * Abstract base class for create steps of assets derivated from + * {@link Bookmark}. + * + * @author Jens Pelzetter + * @param + */ +public abstract class AbstractBookmarkCreateStep extends AbstractMvcAssetCreateStep { + + @Inject + private AssetRepository assetRepository; + + @Inject + private GlobalizationHelper globalizationHelper; + + private String bookmarkDescription; + + private String url; + + @Override + public String getBundle() { + return MvcAssetStepsConstants.BUNDLE; + } + + public String getUrl() { + return url; + } + + public String getBookmarkDescription() { + return bookmarkDescription; + } + + @Override + protected String setAssetProperties( + final T bookmark, final Map formParams + ) { + url = Optional + .ofNullable(formParams.get("url")) + .filter(value -> value.length > 0) + .map(value -> value[0]) + .orElse(""); + bookmarkDescription = Optional + .ofNullable(formParams.get("description")) + .filter(value -> value.length > 0) + .map(value -> value[0]) + .orElse(""); + + if (url.isEmpty() || url.matches("\\s*")) { + addMessage( + "warning", + globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("bookmark.create.url.missing") + ); + return showCreateStep(); + } + + bookmark.setUrl(url); + bookmark + .getDescription() + .addValue(new Locale(getInitialLocale()), bookmarkDescription); + assetRepository.save(bookmark); + + return String.format( + "redirect:/%s/assets/%s/%s/@bookmark-edit", + getContentSectionLabel(), + getFolderPath(), + getName() + ); + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java index 0d5fce649..4d00bee0d 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/AbstractContactableEntityEditStep.java @@ -34,7 +34,6 @@ import org.librecms.ui.contentsections.ContentSectionNotFoundException; import java.util.List; import java.util.Optional; -import java.util.concurrent.Callable; import java.util.stream.Collectors; import javax.inject.Inject; diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/BookmarkCreateStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/BookmarkCreateStep.java index 168f2ab8d..ac4466f6b 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/BookmarkCreateStep.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/BookmarkCreateStep.java @@ -20,11 +20,6 @@ package org.librecms.ui.contentsections.assets; import org.libreccm.l10n.GlobalizationHelper; import org.librecms.assets.Bookmark; -import org.librecms.contentsection.AssetRepository; - -import java.util.Locale; -import java.util.Map; -import java.util.Optional; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; @@ -36,18 +31,11 @@ import javax.inject.Named; */ @RequestScoped @Named("CmsBookmarkCreateStep") -public class BookmarkCreateStep extends AbstractMvcAssetCreateStep { - - @Inject - private AssetRepository assetRepository; +public class BookmarkCreateStep extends AbstractBookmarkCreateStep { @Inject private GlobalizationHelper globalizationHelper; - private String bookmarkDescription; - - private String url; - @Override public String showCreateStep() { return "org/librecms/ui/contentsection/assets/bookmark/create-bookmark.xhtml"; @@ -67,61 +55,9 @@ public class BookmarkCreateStep extends AbstractMvcAssetCreateStep { .getText("bookmark.description"); } - @Override - public String getBundle() { - return MvcAssetStepsConstants.BUNDLE; - } - - public String getUrl() { - return url; - } - - public String getBookmarkDescription() { - return bookmarkDescription; - } - @Override protected Class getAssetClass() { return Bookmark.class; } - @Override - protected String setAssetProperties( - final Bookmark bookmark, final Map formParams - ) { - url = Optional - .ofNullable(formParams.get("url")) - .filter(value -> value.length > 0) - .map(value -> value[0]) - .orElse(""); - bookmarkDescription = Optional - .ofNullable(formParams.get("description")) - .filter(value -> value.length > 0) - .map(value -> value[0]) - .orElse(""); - - if (url.isEmpty() || url.matches("\\s*")) { - addMessage( - "warning", - globalizationHelper - .getLocalizedTextsUtil(getBundle()) - .getText("bookmark.create.url.missing") - ); - return showCreateStep(); - } - - bookmark.setUrl(url); - bookmark - .getDescription() - .addValue(new Locale(getInitialLocale()), bookmarkDescription); - assetRepository.save(bookmark); - - return String.format( - "redirect:/%s/assets/%s/%s/@bookmark-edit", - getContentSectionLabel(), - getFolderPath(), - getName() - ); - } - } diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/CmsAssetEditSteps.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/CmsAssetEditSteps.java index a2d14dc46..9aadc15d8 100644 --- a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/CmsAssetEditSteps.java +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/CmsAssetEditSteps.java @@ -18,7 +18,6 @@ */ package org.librecms.ui.contentsections.assets; - import java.util.HashSet; import java.util.Set; @@ -33,6 +32,8 @@ public class CmsAssetEditSteps implements MvcAssetEditSteps { final Set> classes = new HashSet<>(); classes.add(BookmarkEditStep.class); + classes.add(ExternalAudioAssetEditStep.class); + classes.add(ExternalVideoAssetEditStep.class); classes.add(FileAssetEditStep.class); classes.add(LegalMetadataEditStep.class); classes.add(OrganizationEditStep.class); diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetCreateStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetCreateStep.java new file mode 100644 index 000000000..9095cfe54 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetCreateStep.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2021 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.assets; + +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.assets.ExternalAudioAsset; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("CmsExternalAudioAssetCreateStep") +public class ExternalAudioAssetCreateStep + extends AbstractBookmarkCreateStep { + + @Inject + private GlobalizationHelper globalizationHelper; + + @Override + public String showCreateStep() { + return "org/librecms/ui/contentsection/assets/external-audio-asset/create-external-audio-asset.xhtml"; + } + + @Override + public String getLabel() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("externalaudioasset.label"); + } + + @Override + public String getDescription() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("externalaudioasset.description"); + } + + @Override + protected Class getAssetClass() { + return ExternalAudioAsset.class; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStep.java new file mode 100644 index 000000000..0377a776d --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStep.java @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2021 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.assets; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.security.AuthorizationRequired; +import org.librecms.assets.ExternalAudioAsset; +import org.librecms.assets.LegalMetadata; +import org.librecms.contentsection.AssetRepository; +import org.librecms.ui.contentsections.AssetPermissionsChecker; +import org.librecms.ui.contentsections.ContentSectionNotFoundException; + +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.servlet.http.HttpServletRequest; +import javax.transaction.Transactional; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Context; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAssetEditSteps.PATH_PREFIX + "external-audio-asset-edit") +@Controller +@MvcAssetEditStepDef( + bundle = MvcAssetStepsConstants.BUNDLE, + descriptionKey = "externalaudioasset.editstep.description", + labelKey = "externalaudioasset.editstep.label", + supportedAssetType = ExternalAudioAsset.class +) +public class ExternalAudioAssetEditStep extends BookmarkEditStep { + + @Inject + private AssetStepsDefaultMessagesBundle messageBundle; + + @Inject + private AssetPermissionsChecker assetPermissionsChecker; + + @Inject + private AssetRepository assetRepo; + + @Inject + private AssetUi assetUi; + + @Inject + private ExternalAudioAssetEditStepModel editStepModel; + + @Context + private HttpServletRequest request; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Override + protected void init() throws ContentSectionNotFoundException, + AssetNotFoundException { + super.init();; + + if (getAsset() instanceof ExternalAudioAsset) { + editStepModel.setLegalMetadata( + getExternalAudioAsset().getLegalMetadata() + ); + + final StringBuilder baseUrlBuilder = new StringBuilder(); + editStepModel.setBaseUrl( + baseUrlBuilder + .append(request.getScheme()) + .append("://") + .append(request.getServerName()) + .append(addServerPortToBaseUrl()) + .append(addContextPathToBaseUrl()) + .toString() + ); + } else { + throw new AssetNotFoundException( + assetUi.showAssetNotFound( + getContentSection(), getAssetPath() + ), + String.format( + "No asset for path %s found in section %s.", + getAssetPath(), + getContentSection().getLabel() + ) + ); + } + } + + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String showStep( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + return "org/librecms/ui/contentsection/assets/external-audio-asset/edit-external-audio-asset.xhtml"; + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + public ExternalAudioAsset getExternalAudioAsset() { + return (ExternalAudioAsset) getBookmark(); + } + + @POST + @Path("/legalmetadata") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String setLegalMetadata( + @FormParam("legalMetadataIdentifier") + final String legalMetadataIdentifier + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + final Identifier identifier = identifierParser + .parseIdentifier(legalMetadataIdentifier); + final Optional legalMetadataResult; + switch (identifier.getType()) { + case ID: + legalMetadataResult = assetRepo.findById( + Long.parseLong(identifier.getIdentifier()), + LegalMetadata.class + ); + break; + case UUID: + legalMetadataResult = assetRepo.findByUuidAndType( + identifier.getIdentifier(), + LegalMetadata.class + ); + break; + default: + legalMetadataResult = assetRepo + .findByPath(identifier.getIdentifier()) + .map(result -> (LegalMetadata) result); + break; + } + if (!legalMetadataResult.isPresent()) { + return showLegalMetadataNotFound(legalMetadataIdentifier); + } + + final LegalMetadata legalMetadata = legalMetadataResult.get(); + + getExternalAudioAsset().setLegalMetadata(legalMetadata); + assetRepo.save(getExternalAudioAsset()); + + return buildRedirectPathForStep(); + } + + @POST + @Path("/legalmetadata/@remove") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removeLegalMetadata() { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + getExternalAudioAsset().setLegalMetadata(null); + assetRepo.save(getExternalAudioAsset()); + + return buildRedirectPathForStep(); + } + + private String showLegalMetadataNotFound( + final String legalMetadataIdentifer + ) { + models.put("legalMetadataIdentifier", legalMetadataIdentifer); + return "org/librecms/ui/contentsection/assets/external-audio-asset/legal-metadata-not-found.xhtml"; + } + + private String addServerPortToBaseUrl() { + if (request.getServerPort() == 80 || request.getServerPort() == 443) { + return ""; + } else { + return String.format(":%d", request.getServerPort()); + } + } + + private String addContextPathToBaseUrl() { + if (request.getServletContext().getContextPath() == null + || request.getServletContext().getContextPath().isEmpty()) { + return "/"; + } else { + return request.getServletContext().getContextPath(); + } + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStepModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStepModel.java new file mode 100644 index 000000000..07d6a5b3a --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalAudioAssetEditStepModel.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2021 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.assets; + +import org.librecms.assets.LegalMetadata; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("CmsExternalAudioAssetEditStepModel") +public class ExternalAudioAssetEditStepModel { + + private String baseUrl; + + private LegalMetadata legalMetadata; + + public LegalMetadata getLegalMetadata() { + return legalMetadata; + } + + protected void setLegalMetadata(final LegalMetadata legalMetadata) { + this.legalMetadata = legalMetadata; + } + + public String getLegalMetadataType() { + return LegalMetadata.class.getName(); + } + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetCreateStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetCreateStep.java new file mode 100644 index 000000000..adad65542 --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetCreateStep.java @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2021 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.assets; + +import org.libreccm.l10n.GlobalizationHelper; +import org.librecms.assets.ExternalVideoAsset; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("CmsExternalVideoAssetCreateStep") +public class ExternalVideoAssetCreateStep + extends AbstractBookmarkCreateStep { + + @Inject + private GlobalizationHelper globalizationHelper; + + @Override + public String showCreateStep() { + return "org/librecms/ui/contentsection/assets/external-video-asset/create-external-video-asset.xhtml"; + } + + @Override + public String getLabel() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("externalvideoasset.label"); + } + + @Override + public String getDescription() { + return globalizationHelper + .getLocalizedTextsUtil(getBundle()) + .getText("externalvideoasset.description"); + } + + @Override + protected Class getAssetClass() { + return ExternalVideoAsset.class; + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStep.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStep.java new file mode 100644 index 000000000..9be3c797c --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStep.java @@ -0,0 +1,244 @@ +/* + * Copyright (C) 2021 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.assets; + +import org.libreccm.api.Identifier; +import org.libreccm.api.IdentifierParser; +import org.libreccm.security.AuthorizationRequired; +import org.librecms.assets.ExternalVideoAsset; +import org.librecms.assets.LegalMetadata; +import org.librecms.contentsection.AssetRepository; +import org.librecms.ui.contentsections.AssetPermissionsChecker; +import org.librecms.ui.contentsections.ContentSectionNotFoundException; + +import java.util.Optional; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Inject; +import javax.mvc.Controller; +import javax.mvc.Models; +import javax.servlet.http.HttpServletRequest; +import javax.transaction.Transactional; +import javax.ws.rs.FormParam; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Context; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Path(MvcAssetEditSteps.PATH_PREFIX + "external-video-asset-edit") +@Controller +@MvcAssetEditStepDef( + bundle = MvcAssetStepsConstants.BUNDLE, + descriptionKey = "externalvideoasset.editstep.description", + labelKey = "externalvideoasset.editstep.label", + supportedAssetType = ExternalVideoAsset.class +) +public class ExternalVideoAssetEditStep extends BookmarkEditStep { + + @Inject + private AssetStepsDefaultMessagesBundle messageBundle; + + @Inject + private AssetPermissionsChecker assetPermissionsChecker; + + @Inject + private AssetRepository assetRepo; + + @Inject + private AssetUi assetUi; + + @Inject + private ExternalVideoAssetEditStepModel editStepModel; + + @Context + private HttpServletRequest request; + + @Inject + private IdentifierParser identifierParser; + + @Inject + private Models models; + + @Override + protected void init() throws ContentSectionNotFoundException, + AssetNotFoundException { + super.init();; + + if (getAsset() instanceof ExternalVideoAsset) { + editStepModel.setLegalMetadata( + getExternalVideoAsset().getLegalMetadata() + ); + + final StringBuilder baseUrlBuilder = new StringBuilder(); + editStepModel.setBaseUrl( + baseUrlBuilder + .append(request.getScheme()) + .append("://") + .append(request.getServerName()) + .append(addServerPortToBaseUrl()) + .append(addContextPathToBaseUrl()) + .toString() + ); + } else { + throw new AssetNotFoundException( + assetUi.showAssetNotFound( + getContentSection(), getAssetPath() + ), + String.format( + "No asset for path %s found in section %s.", + getAssetPath(), + getContentSection().getLabel() + ) + ); + } + } + + @GET + @Path("/") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + @Override + public String showStep( + @PathParam(MvcAssetEditSteps.SECTION_IDENTIFIER_PATH_PARAM) + final String sectionIdentifier, + @PathParam(MvcAssetEditSteps.ASSET_PATH_PATH_PARAM_NAME) + final String assetPath + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + if (assetPermissionsChecker.canEditAsset(getAsset())) { + return "org/librecms/ui/contentsection/assets/external-video-asset/edit-external-video-asset.xhtml"; + } else { + return assetUi.showAccessDenied( + getContentSection(), + getAsset(), + messageBundle.get("asset.edit.denied")); + } + } + + public ExternalVideoAsset getExternalVideoAsset() { + return (ExternalVideoAsset) getBookmark(); + } + + @POST + @Path("/legalmetadata") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String setLegalMetadata( + @FormParam("legalMetadataIdentifier") + final String legalMetadataIdentifier + ) { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + final Identifier identifier = identifierParser + .parseIdentifier(legalMetadataIdentifier); + final Optional legalMetadataResult; + switch (identifier.getType()) { + case ID: + legalMetadataResult = assetRepo.findById( + Long.parseLong(identifier.getIdentifier()), + LegalMetadata.class + ); + break; + case UUID: + legalMetadataResult = assetRepo.findByUuidAndType( + identifier.getIdentifier(), + LegalMetadata.class + ); + break; + default: + legalMetadataResult = assetRepo + .findByPath(identifier.getIdentifier()) + .map(result -> (LegalMetadata) result); + break; + } + if (!legalMetadataResult.isPresent()) { + return showLegalMetadataNotFound(legalMetadataIdentifier); + } + + final LegalMetadata legalMetadata = legalMetadataResult.get(); + + getExternalVideoAsset().setLegalMetadata(legalMetadata); + assetRepo.save(getExternalVideoAsset()); + + return buildRedirectPathForStep(); + } + + @POST + @Path("/legalmetadata/@remove") + @AuthorizationRequired + @Transactional(Transactional.TxType.REQUIRED) + public String removeLegalMetadata() { + try { + init(); + } catch (ContentSectionNotFoundException ex) { + return ex.showErrorMessage(); + } catch (AssetNotFoundException ex) { + return ex.showErrorMessage(); + } + + getExternalVideoAsset().setLegalMetadata(null); + assetRepo.save(getExternalVideoAsset()); + + return buildRedirectPathForStep(); + } + + private String showLegalMetadataNotFound( + final String legalMetadataIdentifer + ) { + models.put("legalMetadataIdentifier", legalMetadataIdentifer); + return "org/librecms/ui/contentsection/assets/external-video-asset/legal-metadata-not-found.xhtml"; + } + + private String addServerPortToBaseUrl() { + if (request.getServerPort() == 80 || request.getServerPort() == 443) { + return ""; + } else { + return String.format(":%d", request.getServerPort()); + } + } + + private String addContextPathToBaseUrl() { + if (request.getServletContext().getContextPath() == null + || request.getServletContext().getContextPath().isEmpty()) { + return "/"; + } else { + return request.getServletContext().getContextPath(); + } + } + +} diff --git a/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStepModel.java b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStepModel.java new file mode 100644 index 000000000..6b9309fcb --- /dev/null +++ b/ccm-cms/src/main/java/org/librecms/ui/contentsections/assets/ExternalVideoAssetEditStepModel.java @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2021 LibreCCM Foundation. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02110-1301 USA + */ +package org.librecms.ui.contentsections.assets; + +import org.librecms.assets.LegalMetadata; + +import javax.enterprise.context.RequestScoped; +import javax.inject.Named; + +/** + * + * @author Jens Pelzetter + */ +@RequestScoped +@Named("CmsExternalVideoAssetEditStepModel") +public class ExternalVideoAssetEditStepModel { + + private String baseUrl; + + private LegalMetadata legalMetadata; + + public LegalMetadata getLegalMetadata() { + return legalMetadata; + } + + protected void setLegalMetadata(final LegalMetadata legalMetadata) { + this.legalMetadata = legalMetadata; + } + + public String getBaseUrl() { + return baseUrl; + } + + protected void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } + +} diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/bookmark/edit-bookmark.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/bookmark/edit-bookmark.xhtml index acd56e077..93dd45c2b 100644 --- a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/bookmark/edit-bookmark.xhtml +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/bookmark/edit-bookmark.xhtml @@ -73,7 +73,7 @@ -
#{CmsBookmarkEditStep.url}
+ ]> + + + + +
+

#{CmsAssetsStepsDefaultMessagesBundle["externalaudioasset.createform.title"]}

+ + + + + +
+ + + + + + + + + + + + #{CmsAssetsStepsDefaultMessagesBundle['createform.cancel']} + + + + + +
+ +
+ diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-audio-asset/edit-external-audio-asset.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-audio-asset/edit-external-audio-asset.xhtml new file mode 100644 index 000000000..4aa53fb22 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-audio-asset/edit-external-audio-asset.xhtml @@ -0,0 +1,207 @@ +]> + + + + + + + + +

#{CmsAssetsStepsDefaultMessagesBundle['externalaudioasset.editstep.url.header']}

+ + +
+ +
+ +
+ + + + +

#{CmsAssetsStepsDefaultMessagesBundle['externalaudioasset.editstep.legalmetadata.title']}

+ + + + + +
+ +
+
+ +
+ + +
+ +
+
+
#{CmsAssetsStepsDefaultMessagesBundle['externalaudioasset.editstep.legelmetadata.rightsholder']}
+
#{CmsExternalAudioAssetEditStepModel.legalMetadata.rightsHolder}
+
+
+
#{CmsAssetsStepsDefaultMessagesBundle['externalaudioasset.editstep.legelmetadata.creator']}
+
#{CmsExternalAudioAssetEditStepModel.legalMetadata.creator}
+
+
+
+
+ + +
+ +
+ + + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/create-external-video-asset.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/create-external-video-asset.xhtml new file mode 100644 index 000000000..2821488bb --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/create-external-video-asset.xhtml @@ -0,0 +1,80 @@ +]> + + + + +
+

#{CmsAssetsStepsDefaultMessagesBundle["externalvideoasset.createform.title"]}

+ + + + + +
+ + + + + + + + + + + + #{CmsAssetsStepsDefaultMessagesBundle['createform.cancel']} + + + + + +
+ +
+ + diff --git a/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/edit-external-video-asset.xhtml b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/edit-external-video-asset.xhtml new file mode 100644 index 000000000..df2af4d65 --- /dev/null +++ b/ccm-cms/src/main/resources/WEB-INF/views/org/librecms/ui/contentsection/assets/external-video-asset/edit-external-video-asset.xhtml @@ -0,0 +1,208 @@ +]> + + + + + + + + +

#{CmsAssetsStepsDefaultMessagesBundle['externalvideoasset.editstep.url.header']}

+ + +
+ +
+ +
+ + + + +

#{CmsAssetsStepsDefaultMessagesBundle['externalvideoasset.editstep.legalmetadata.title']}

+ + + + + +
+ +
+
+ +
+ + +
+ +
+
+
#{CmsAssetsStepsDefaultMessagesBundle['externalvideoasset.editstep.legelmetadata.rightsholder']}
+
#{CmsExternalVideoAssetEditStepModel.legalMetadata.rightsHolder}
+
+
+
#{CmsAssetsStepsDefaultMessagesBundle['externalvideoasset.editstep.legelmetadata.creator']}
+
#{CmsExternalVideoAssetEditStepModel.legalMetadata.creator}
+
+
+
+
+ + +
+ +
+ + + + diff --git a/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle.properties b/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle.properties index 9f60282ca..7b84729bc 100644 --- a/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle.properties +++ b/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle.properties @@ -289,3 +289,90 @@ organization.editstep.description=Edit an organization. organization.editstep.label=Edit organization organization.createform.title=Create new organization organization.editstep.header=Edit Organization {0} +externalaudioasset.label=External Audio file +externalaudioasset.description=An external audio file, for example a podcast. +externalaudioasset.editstep.description=Edit external audio asset +externalaudioasset.editstep.label=Edit external audio asset +externalaudioasset.createform.title=Create new external audio asset +externalaudioasset.editstep.header=Edit external audio asset {0} +externalaudioasset.editstep.url.header=URL of the external audio file +externalaudioasset.editstep.url.edit=Edit URL +externalaudioasset.editstep.url.edit.title=Edit URL +externalaudioasset.editstep.url.edit.close=Cancel +externalaudioasset.editstep.url.edit.help=The URL of the external audio file +externalaudioasset.editstep.url.edit.label=External Audio File URL +externalaudioasset.editstep.url.edit.submit=Save +externalaudioasset.editstep.description.add_button.label=Add localized description +externalaudioasset.editstep.description.add.cancel=Cancel +externalaudioasset.editstep.description.add.locale.help=The locale of the localized description. +externalaudioasset.editstep.description.add.locale.label=Locale +externalaudioasset.editstep.description.add.submit=Add localized description +externalaudioasset.editstep.description.add.title=Add localized description +externalaudioasset.editstep.description.add.value.help=The localized description text. +externalaudioasset.editstep.description.add.value.label=Description +externalaudioasset.editstep.description.edit_button.label=Edit localized description +externalaudioasset.editstep.description.edit.cancel=Abbrechen +externalaudioasset.editstep.description.edit.submit=Save +externalaudioasset.editstep.description.edit.title=Edit localized description +externalaudioasset.editstep.description.edit.value.help=The localized description text. +externalaudioasset.editstep.description.edit.value.label=Description +externalaudioasset.editstep.description.remove_button.label=Remove localized description +externalaudioasset.editstep.description.remove.cancel=Cancel +externalaudioasset.editstep.description.remove.submit=Remove localized description +externalaudioasset.editstep.description.remove.text=Are you sure to remove the following localized description: +externalaudioasset.editstep.description.remove.title=Remove localized description +externalaudioasset.editstep.description.title=Localized Description +externalaudioasset.editstep.legalmetadata.title=Legal Metadata +externalaudioasset.editstep.legalmetadata.set=Set legal metadata +externalaudioasset.editstep.legelmetadata.remove.close=Cancel +externalaudioasset.editstep.legelmetadata.remove.title=Remove legel metadata +externalaudioasset.editstep.legelmetadata.remove.message=Are you sure to remove the legal metadata? +externalaudioasset.editstep.legelmetadata.remove.submit=Remove legal metadata +externalaudioasset.editstep.legelmetadata.rightsholder=Rights Holder +externalaudioasset.editstep.legelmetadata.creator=Creator +externalvideoasset.label=External Audio File +externalvideoasset.description=An external audio file, for example a podcast. +externalvideoasset.label=External video +externalvideoasset.description=An external video, for example a video on YouTube. +externalvideoasset.editstep.description=Edit external audio asset +externalvideoasset.editstep.label=Edit external audio asset +externalvideoasset.editstep.description=Edit external video asset +externalvideoasset.editstep.label=Edit external video asset +externalvideoasset.createform.title=Create new external audio asset +externalvideoasset.createform.title=Create new external video asset +externalvideoasset.editstep.header=Edit external audio asset {0} +externalvideoasset.editstep.url.header=URL of the external audio file +externalvideoasset.editstep.url.edit=Edit URL +externalvideoasset.editstep.url.edit.title=Edit URL +externalvideoasset.editstep.url.edit.close=Cancel +externalvideoasset.editstep.url.edit.help=The URL of the external audio file +externalvideoasset.editstep.url.edit.label=External Audio File URL +externalvideoasset.editstep.url.edit.submit=Save +externalvideoasset.editstep.description.add_button.label=Add localized description +externalvideoasset.editstep.description.add.cancel=Cancel +externalvideoasset.editstep.description.add.locale.help=The locale of the localized description. +externalvideoasset.editstep.description.add.locale.label=Locale +externalvideoasset.editstep.description.add.submit=Add localized description +externalvideoasset.editstep.description.add.title=Add localized description +externalvideoasset.editstep.description.add.value.help=The localized description text. +externalvideoasset.editstep.description.add.value.label=Description +externalvideoasset.editstep.description.edit_button.label=Edit localized description +externalvideoasset.editstep.description.edit.cancel=Abbrechen +externalvideoasset.editstep.description.edit.submit=Save +externalvideoasset.editstep.description.edit.title=Edit localized description +externalvideoasset.editstep.description.edit.value.help=The localized description text. +externalvideoasset.editstep.description.edit.value.label=Description +externalvideoasset.editstep.description.remove_button.label=Remove localized description +externalvideoasset.editstep.description.remove.cancel=Cancel +externalvideoasset.editstep.description.remove.submit=Remove localized description +externalvideoasset.editstep.description.remove.text=Are you sure to remove the following localized description: +externalvideoasset.editstep.description.remove.title=Remove localized description +externalvideoasset.editstep.description.title=Localized Description +externalvideoasset.editstep.legalmetadata.title=Legal Metadata +externalvideoasset.editstep.legalmetadata.set=Set legal metadata +externalvideoasset.editstep.legelmetadata.remove.close=Cancel +externalvideoasset.editstep.legelmetadata.remove.title=Remove legel metadata +externalvideoasset.editstep.legelmetadata.remove.message=Are you sure to remove the legal metadata? +externalvideoasset.editstep.legelmetadata.remove.submit=Remove legal metadata +externalvideoasset.editstep.legelmetadata.rightsholder=Rights Holder +externalvideoasset.editstep.legelmetadata.creator=Creator diff --git a/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle_de.properties b/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle_de.properties index 56a35aaac..6a5097374 100644 --- a/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle_de.properties +++ b/ccm-cms/src/main/resources/org/librecms/ui/MvcAssetStepsBundle_de.properties @@ -289,3 +289,90 @@ organization.editstep.description=Organization bearbeiten. organization.editstep.label=Organization bearbeiten organization.createform.title=Neue Organization anlegen organization.editstep.header=Organization {0} bearbeiten +externalaudioasset.label=Externe Audio-Datei +externalaudioasset.description=Eine externe Audio-Datei, z.B. ein Podcast. +externalvideoasset.label=Externes Video +externalvideoasset.description=Ein externes Video, z.B. auf YouTube. +externalaudioasset.editstep.description=Externe Audio-Datei bearbeiten +externalaudioasset.editstep.label=Externe Audio-Datei bearbeiten +externalvideoasset.editstep.description=Externes Video bearbeiten +externalvideoasset.editstep.label=Edit external video asset +externalaudioasset.createform.title=Neue externe Audio-Datei anlegen +externalvideoasset.createform.title=Neues externes Video anlegen +externalaudioasset.editstep.header=Externes Audio Asset {0} bearbeiten +externalaudioasset.editstep.url.header=URL der externen Audio-Datei +externalaudioasset.editstep.url.edit=URL bearbeiten +externalaudioasset.editstep.url.edit.title=URL bearbeiten +externalaudioasset.editstep.url.edit.close=Abbrechen +externalaudioasset.editstep.url.edit.help=Die URL der externen Audio-Datei. +externalaudioasset.editstep.url.edit.label=Externe Audio-Datei URL +externalaudioasset.editstep.url.edit.submit=Speichern +externalaudioasset.editstep.description.add_button.label=Lokalisierte Beschreibung hinzuf\u00fcgen +externalaudioasset.editstep.description.add.cancel=Abbrechen +externalaudioasset.editstep.description.add.locale.help=Die Sprache der lokaliserten Beschreibung. +externalaudioasset.editstep.description.add.locale.label=Sprache +externalaudioasset.editstep.description.add.submit=Lokaliserte Beschreibung hinzuf\u00fcgen +externalaudioasset.editstep.description.add.title=Lokalisierte Beschreibung hinzuf\u00fcgen +externalaudioasset.editstep.description.add.value.help=Der Text der lokalisierten Beschreibung. +externalaudioasset.editstep.description.add.value.label=Beschreibung +externalaudioasset.editstep.description.edit_button.label=Lokaliserte Beschreibung bearbeiten +externalaudioasset.editstep.description.edit.cancel=Abbrechen +externalaudioasset.editstep.description.edit.submit=Speichern +externalaudioasset.editstep.description.edit.title=Lokaliserte Beschreibung bearbeiten +externalaudioasset.editstep.description.edit.value.help=Der Text der lokalisierten Beschreibung. +externalaudioasset.editstep.description.edit.value.label=Beschreibung +externalaudioasset.editstep.description.remove_button.label=Lokaliserte Beschreibung entfernen +externalaudioasset.editstep.description.remove.cancel=Abbrechen +externalaudioasset.editstep.description.remove.submit=Lokalisierte Beschreibung entfernen +externalaudioasset.editstep.description.remove.text=Sind Sie sicher, dass Sie die folgende lokalisierte Beschreibung entfernen wollen: +externalaudioasset.editstep.description.remove.title=Lokaliserte Beschreibung entfernen +externalaudioasset.editstep.description.title=Lokaliserte Beschreibung +externalaudioasset.editstep.legalmetadata.title=Rechtliche Informationen +externalaudioasset.editstep.legalmetadata.set=Rechtliche Informationen setzen +externalaudioasset.editstep.legelmetadata.remove.close=Abbrechen +externalaudioasset.editstep.legelmetadata.remove.title=Rechtliche Informationen entfernen +externalaudioasset.editstep.legelmetadata.remove.message=Sind Sie sicher, dass Sie die rechtlichen Informationen entfernen wollen? +externalaudioasset.editstep.legelmetadata.remove.submit=Rechtliche Informationen entfernen +externalaudioasset.editstep.legelmetadata.rightsholder=Rechte-Inhaber +externalaudioasset.editstep.legelmetadata.creator=K\u00fcnstler +externalvideoasset.label=Externes Video +externalvideoasset.description=Eine externe Audio-Datei, z.B. ein Podcast. +externalvideoasset.editstep.description=Externe Audio-Datei bearbeiten +externalvideoasset.editstep.label=Externe Audio-Datei bearbeiten +externalvideoasset.createform.title=Neue externe Audio-Datei anlegen +externalvideoasset.editstep.header=Externes Audio Asset {0} bearbeiten +externalvideoasset.editstep.url.header=URL der externen Audio-Datei +externalvideoasset.editstep.url.edit=URL bearbeiten +externalvideoasset.editstep.url.edit.title=URL bearbeiten +externalvideoasset.editstep.url.edit.close=Abbrechen +externalvideoasset.editstep.url.edit.help=Die URL der externen Audio-Datei. +externalvideoasset.editstep.url.edit.label=Externe Audio-Datei URL +externalvideoasset.editstep.url.edit.submit=Speichern +externalvideoasset.editstep.description.add_button.label=Lokalisierte Beschreibung hinzuf\u00fcgen +externalvideoasset.editstep.description.add.cancel=Abbrechen +externalvideoasset.editstep.description.add.locale.help=Die Sprache der lokaliserten Beschreibung. +externalvideoasset.editstep.description.add.locale.label=Sprache +externalvideoasset.editstep.description.add.submit=Lokaliserte Beschreibung hinzuf\u00fcgen +externalvideoasset.editstep.description.add.title=Lokalisierte Beschreibung hinzuf\u00fcgen +externalvideoasset.editstep.description.add.value.help=Der Text der lokalisierten Beschreibung. +externalvideoasset.editstep.description.add.value.label=Beschreibung +externalvideoasset.editstep.description.edit_button.label=Lokaliserte Beschreibung bearbeiten +externalvideoasset.editstep.description.edit.cancel=Abbrechen +externalvideoasset.editstep.description.edit.submit=Speichern +externalvideoasset.editstep.description.edit.title=Lokaliserte Beschreibung bearbeiten +externalvideoasset.editstep.description.edit.value.help=Der Text der lokalisierten Beschreibung. +externalvideoasset.editstep.description.edit.value.label=Beschreibung +externalvideoasset.editstep.description.remove_button.label=Lokaliserte Beschreibung entfernen +externalvideoasset.editstep.description.remove.cancel=Abbrechen +externalvideoasset.editstep.description.remove.submit=Lokalisierte Beschreibung entfernen +externalvideoasset.editstep.description.remove.text=Sind Sie sicher, dass Sie die folgende lokalisierte Beschreibung entfernen wollen: +externalvideoasset.editstep.description.remove.title=Lokaliserte Beschreibung entfernen +externalvideoasset.editstep.description.title=Lokaliserte Beschreibung +externalvideoasset.editstep.legalmetadata.title=Rechtliche Informationen +externalvideoasset.editstep.legalmetadata.set=Rechtliche Informationen setzen +externalvideoasset.editstep.legelmetadata.remove.close=Abbrechen +externalvideoasset.editstep.legelmetadata.remove.title=Rechtliche Informationen entfernen +externalvideoasset.editstep.legelmetadata.remove.message=Sind Sie sicher, dass Sie die rechtlichen Informationen entfernen wollen? +externalvideoasset.editstep.legelmetadata.remove.submit=Rechtliche Informationen entfernen +externalvideoasset.editstep.legelmetadata.rightsholder=Rechte-Inhaber +externalvideoasset.editstep.legelmetadata.creator=K\u00fcnstler