Skip to content

Commit

Permalink
Merge r/16.x into develop
Browse files Browse the repository at this point in the history
  • Loading branch information
lkiesow committed Sep 13, 2024
2 parents c21d2fd + c6b40b1 commit 5f46acf
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 159 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -38,155 +38,96 @@ dropdowns below.

<details>

<summary>amberscript-attach-transcription.xml</summary>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<definition xmlns="http://workflow.opencastproject.org">
<id>amberscript-attach-transcripts</id>
<title>Attach caption/transcripts generated by AmberScript</title>
<tags />
<description>Attach transcription generated by the AmberScript service.
This is an internal workflow, started by the Transcription Service.
</description>
<configuration_panel />

<operations>

<!-- Attach caption/transcript -->

<operation id="amberscript-attach-transcription"
fail-on-error="true"
exception-handler-workflow="partial-error"
description="Attach captions/transcription">
<configurations>
<!-- This is filled out by the transcription service when starting this workflow -->
<configuration key="transcription-job-id">${transcriptionJobId}</configuration>
<!-- Caption generated will have the default flavor based on the target-caption-format e.g. captions/vtt -->
<configuration key="target-caption-format">vtt</configuration>
<configuration key="target-tag">engage-download</configuration>
</configurations>
</operation>

<!-- Merge caption/transcript to existing publication and republish -->
<operation id="publish-engage"
fail-on-error="true"
exception-handler-workflow="partial-error"
description="Distribute and publish to engage server">
<configurations>
<configuration key="download-source-flavors">dublincore/*,security/*</configuration>
<configuration key="download-source-tags">engage-download</configuration>
<configuration key="strategy">merge</configuration>
<configuration key="check-availability">false</configuration>
</configurations>
</operation>

<operation
id="republish-oaipmh"
exception-handler-workflow="partial-error"
description="Update recording metadata in default OAI-PMH repository">
<configurations>
<configuration key="source-flavors">dublincore/*,security/*</configuration>
<configuration key="download-source-tags">engage-download</configuration>
<configuration key="repository">default</configuration>
</configurations>
</operation>

<!-- Archive media package -->

<operation id="snapshot"
fail-on-error="true"
exception-handler-workflow="partial-error"
description="Archive media package">
<configurations>
<configuration key="source-flavors">*/*</configuration>
</configurations>
</operation>

<!-- Clean up work artifacts -->

<operation
id="cleanup"
fail-on-error="false"
description="Remove temporary processing artifacts">
<configurations>
<configuration key="delete-external">true</configuration>
<!-- FixMe Don't clean up ACLs until workflow service no longer looks for them in the WFR. -->
<configuration key="preserve-flavors">security/*</configuration>
</configurations>
</operation>

</operations>

</definition>
<summary>amberscript-attach-transcription.yaml</summary>

```yaml
---
id: amberscript-attach-transcription
title: Attach caption/transcripts generated by AmberScript
description: Attach transcription generated by the AmberScript service.
This is an internal workflow, started by the Transcription Service.

operations:

- id: amberscript-attach-transcription
fail-on-error: true
exception-handler-workflow: partial-error
description: Attach captions/transcription
configurations:
- transcription-job-id: ${transcriptionJobId}
- target-caption-format: vtt
- target-flavor: captions/delivery
- target-tags: engage-download

- id: publish-engage
fail-on-error: true
exception-handler-workflow: partial-error
description: Distribute and publish to engage server
configurations:
- download-source-flavors: "dublincore/*,security/*"
- download-source-tags: engage-download
- strategy: merge
- check-availability: false

- id: snapshot
fail-on-error: true
exception-handler-workflow: partial-error
description: Archive media package
configurations:
- source-flavors: "*/*"

- id: cleanup
fail-on-error: false
description: Remove temporary processing artifacts
configurations:
- delete-external: false
- preserve-flavors: "security/*"
```
</details>
<details>
<summary>amberscript-start-transcription.xml</summary>

```xml
<?xml version="1.0" encoding="UTF-8"?>
<definition xmlns="http://workflow.opencastproject.org">
<id>amberscript-start-transcription</id>
<title>Start AmberScript Transcription</title>
<tags>
<tag>archive</tag>
</tags>
<description>Start the AmberScript transcription</description>

<operations>

<operation
id="defaults"
description="Applying default values for AmberScript Transcriptions">
<configurations>
<configuration key="skipFlavor">captions/vtt</configuration>
<configuration key="language">en</configuration>
<configuration key="jobtype">direct</configuration>
</configurations>
</operation>

<operation
id="encode"
fail-on-error="true"
exception-handler-workflow="partial-error"
description="Encoding audio for transcription">
<configurations>
<configuration key="source-flavor">*/source</configuration>
<configuration key="target-flavor">audio/mp3</configuration>
<configuration key="target-tags">transcript</configuration>
<configuration key="encoding-profile">audio-mp3</configuration>
</configurations>
</operation>

<operation
id="amberscript-start-transcription"
max-attempts="3"
retry-strategy="hold"
fail-on-error="true"
exception-handler-workflow="partial-error"
description="Start AmberScript transcription job">
<configurations>
<configuration key="source-tag">transcript</configuration>
<configuration key="language">${language}</configuration>
<configuration key="jobtype">${jobtype}</configuration>
<configuration key="skip-if-flavor-exists">${skipFlavor}</configuration>
</configurations>
</operation>

</operations>

</definition>
<summary>amberscript-start-transcription.yaml</summary>
```yaml
---
id: amberscript-start-transcription
title: Start AmberScript Transcription
tags:
- archive

description: Start AmberScript transcription

operations:
- id: encode
fail-on-error: false
exception-handler-workflow: partial-error
description: Encoding audio for transcription
configurations:
- source-flavor: "*/source"
- target-flavor: audio/mp3
- target-tags: transcript
- encoding-profile: audio-mp3

- id: amberscript-start-transcription
max-attempts: 3
retry-strategy: hold
fail-on-error: false
exception-handler-workflow: partial-error
description: Start AmberScript transcription job
configurations:
- source-tag: transcript
- language: de
- jobtype: direct
- skip-if-flavor-exists: captions/vtt
```
</details>
### Step 4: Include workflow operations into your workflow
Integrate AmberScript workflow operations by including the provided workflow file `amberscript-start-transcription.xml`
Integrate AmberScript workflow operations by including the provided workflow file `amberscript-start-transcription.yaml`
into your existing workflow:

```
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,10 @@ public List<Playlist> getPlaylists(int limit, int offset, SortCriterion sortCrit

public List<Playlist> getAllForAdministrativeRead(Date from, Date to, int limit)
throws IllegalStateException, UnauthorizedException {
if (!this.securityService.getUser().hasRole(GLOBAL_ADMIN_ROLE)) {
throw new UnauthorizedException("Only admins can call this method");
final var user = securityService.getUser();
final var orgAdminRole = securityService.getOrganization().getAdminRole();
if (!user.hasRole(GLOBAL_ADMIN_ROLE) && !user.hasRole(orgAdminRole)) {
throw new UnauthorizedException("Only (org-)admins can call this method");
}

try {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -170,10 +170,12 @@ public List<Playlist> getAllForAdministrativeRead(Date startDate, Date endDate,
final var criteriaBuilder = em.getCriteriaBuilder();
final var criteriaQuery = criteriaBuilder.createQuery(Playlist.class);
final var from = criteriaQuery.from(Playlist.class);
final var org = securityService.getOrganization().getId();
final var select = criteriaQuery.select(from)
.where(
criteriaBuilder.greaterThanOrEqualTo(from.get("updated"), startDate),
criteriaBuilder.lessThan(from.get("updated"), endDate)
criteriaBuilder.lessThan(from.get("updated"), endDate),
criteriaBuilder.equal(from.get("organization"), org)
)
.orderBy(criteriaBuilder.asc(from.get("updated")));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@
import org.opencastproject.search.api.SearchResultList;
import org.opencastproject.search.api.SearchService;
import org.opencastproject.security.api.AuthorizationService;
import org.opencastproject.security.api.SecurityConstants;
import org.opencastproject.security.api.SecurityService;
import org.opencastproject.security.api.UnauthorizedException;
import org.opencastproject.series.api.SeriesException;
import org.opencastproject.series.api.SeriesService;
Expand Down Expand Up @@ -78,9 +80,19 @@ static Jsons.Obj harvest(
SearchService searchService,
SeriesService seriesService,
AuthorizationService authorizationService,
SecurityService securityService,
PlaylistService playlistService,
Workspace workspace
) throws UnauthorizedException, SeriesException {
final var org = securityService.getOrganization().getId();

var user = securityService.getUser();
var orgAdminRole = securityService.getOrganization().getAdminRole();
var isAdmin = user.hasRole(SecurityConstants.GLOBAL_ADMIN_ROLE) || user.hasRole(orgAdminRole);
if (!isAdmin) {
throw new UnauthorizedException(user, "Only (org-) admins can access the Tobira harvest API");
}

// ===== Retrieve information about events, series, and playlists =============================
//
// In this step, we always request `preferredAmount + 1` in order to figure out the values for
Expand All @@ -89,6 +101,7 @@ static Jsons.Obj harvest(
// Retrieve episodes from index.
final SearchSourceBuilder q = new SearchSourceBuilder().query(
QueryBuilders.boolQuery()
.must(QueryBuilders.termQuery(SearchResult.ORG, org))
.must(QueryBuilders.rangeQuery(SearchResult.MODIFIED_DATE).gte(since.getTime()))
.must(QueryBuilders.termQuery(SearchResult.TYPE, SearchService.IndexEntryType.Episode)))
.sort(SearchResult.MODIFIED_DATE, SortOrder.ASC)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
import org.opencastproject.playlists.PlaylistService;
import org.opencastproject.search.api.SearchService;
import org.opencastproject.security.api.AuthorizationService;
import org.opencastproject.security.api.SecurityService;
import org.opencastproject.series.api.SeriesService;
import org.opencastproject.util.Jsons;
import org.opencastproject.util.doc.rest.RestParameter;
Expand Down Expand Up @@ -102,6 +103,7 @@ public class TobiraEndpoint {
private SearchService searchService;
private SeriesService seriesService;
private AuthorizationService authorizationService;
private SecurityService securityService;
private PlaylistService playlistService;
private Workspace workspace;

Expand All @@ -125,6 +127,11 @@ public void setAuthorizationService(AuthorizationService service) {
this.authorizationService = service;
}

@Reference
public void setSecurityService(SecurityService service) {
this.securityService = service;
}

@Reference
public void setPlaylistService(PlaylistService service) {
this.playlistService = service;
Expand Down Expand Up @@ -206,7 +213,7 @@ public Response harvest(
var json = Harvest.harvest(
preferredAmount,
new Date(since),
searchService, seriesService, authorizationService, playlistService, workspace);
searchService, seriesService, authorizationService, securityService, playlistService, workspace);

// TODO: encoding
return Response.ok(json.toJson()).build();
Expand Down
Loading

0 comments on commit 5f46acf

Please sign in to comment.