@Override public void addTrack(Track track) { // Check (uniqueness of) track identifier String id = track.getIdentifier(); if (id == null) { track.setIdentifier(createElementIdentifier()); } tracks.add(track); }
/** * Return the waveform image width build from input track and service configuration. * * @param track source audio/video track with at least one audio channel * @param pixelsPerMinute width of waveform image in pixels per minute * @param minWidth minimum width of waveform image * @param maxWidth maximum width of waveform image * @return waveform image width */ private int getWaveformImageWidth(Track track, int pixelsPerMinute, int minWidth, int maxWidth) { int imageWidth = minWidth; if (track.getDuration() > 0) { int trackDurationMinutes = (int) TimeUnit.MILLISECONDS.toMinutes(track.getDuration()); if (pixelsPerMinute > 0 && trackDurationMinutes > 0) { imageWidth = Math.max(minWidth, trackDurationMinutes * pixelsPerMinute); imageWidth = Math.min(maxWidth, imageWidth); } } return imageWidth; }
foundAudio |= t.hasAudio(); foundVideo |= t.hasVideo(); result.add(t); } else { if (audioFlavor != null && t.hasAudio() && audioFlavor.matches(t.getFlavor()) && !(videoFlavor == null && t.hasVideo())) { foundAudio = true; audioTrack = t; result.add(t); if (videoFlavor != null && t.hasVideo() && videoFlavor.matches(t.getFlavor()) && !(audioFlavor == null && t.hasAudio())) { foundVideo = true; videoTrack = t;
/** * Returns a track or a number of tracks from the media package that together contain video and video. If no such * combination can be found, e. g. there is no video or video at all, an empty array is returned. * * @see org.opencastproject.mediapackage.selector.AbstractMediaPackageElementSelector#select(org.opencastproject.mediapackage.MediaPackage, boolean) */ @Override public Collection<Track> select(MediaPackage mediaPackage, boolean withTagsAndFlavors) { // instead of relying on the broken superclass, we'll inspect every track // Collection<Track> candidates = super.select(mediaPackage); Set<Track> result = new HashSet<Track>(); boolean foundVideo = false; // Look for a track containing video for (Track t : mediaPackage.getTracks()) { if (t.hasVideo() && !foundVideo && (videoFlavor == null || videoFlavor.equals(t.getFlavor()))) { result.add(t); foundVideo = true; } } return result; }
throws MediaInspectionException { try { URI originalTrackUrl = originalTrack.getURI(); MediaPackageElementFlavor flavor = originalTrack.getFlavor(); logger.debug("enrich(" + originalTrackUrl + ") called"); track.setChecksum(originalTrack.getChecksum()); track.setDuration(originalTrack.getDuration()); track.setElementDescription(originalTrack.getElementDescription()); track.setFlavor(flavor); track.setIdentifier(originalTrack.getIdentifier()); track.setMimeType(originalTrack.getMimeType()); track.setReference(originalTrack.getReference()); track.setSize(file.length()); track.setURI(originalTrackUrl); for (String tag : originalTrack.getTags()) { track.addTag(tag); for (Stream stream : originalTrack.getStreams()) { streamsId2Stream.put(stream.getIdentifier(), stream);
protected Option<Track> analyze(Job job, Track audioTrack) throws SoxException { if (!audioTrack.hasAudio()) throw new SoxException("No audio stream available"); if (audioTrack.hasVideo()) throw new SoxException("It must not have a video stream"); audioFile = workspace.get(audioTrack.getURI()); } catch (NotFoundException e) { throw new SoxException("Requested audio track " + audioTrack + " is not found"); logger.info("Analyzing audio track {}", audioTrack.getIdentifier());
if (!track.hasAudio()) { throw new WaveformServiceException("Track has no audio"); mediaFile = workspace.get(track.getURI()); } catch (NotFoundException e) { throw new WaveformServiceException( .concat('-' + track.getIdentifier()).concat("-waveform.png"); }; logger.debug("Start waveform ffmpeg process: {}", StringUtils.join(command, " ")); logger.info("Create waveform image file for track '{}' at {}", track.getIdentifier(), waveformFilePath); waveformFileUri, Type.Attachment, track.getFlavor()); waveformMpe.setIdentifier(IdBuilderFactory.newInstance().newIdBuilder().createNew().compact()); return waveformMpe;
if (!track.hasVideo()) { logger.error("Element {} is not a video track", track.getIdentifier()); throw new TimelinePreviewsException("Element is not a video track"); if (track.getDuration() == null) throw new MediaPackageException("Track " + track + " does not have a duration"); double duration = track.getDuration() / 1000.0; double seconds = duration / (double)(imageCount); seconds = seconds <= 0.0 ? 1.0 : seconds;
mediaFile = workspace.get(track.getURI()); } catch (NotFoundException e) { throw new TimelinePreviewsException( logger.info("Create timeline preview images file for track '{}' at {}", track.getIdentifier(), imageFilePath); throw new TimelinePreviewsException("Generating timeline preview for track " + track.getIdentifier() + " failed: ffmpeg process exited abnormally with exit code " + exitCode); previewsFileUri, MediaPackageElement.Type.Attachment, track.getFlavor()); timelinepreviewsMpe.setFlavor(track.getFlavor()); timelinepreviewsMpe.setIdentifier(IdBuilderFactory.newInstance().newIdBuilder().createNew().compact());
} catch (Exception e) { throw new SilenceDetectionFailedException( "Unable to assemble a remote silence detection request for track " + sourceTrack.getIdentifier()); logger.info( "Start silence detection for track '{}' on remote silence detection service", sourceTrack.getIdentifier()); return resultJob; + sourceTrack.getIdentifier() + " on remote silence detection service", e); } finally { closeConnection(response); + sourceTrack.getIdentifier() + " on remote silence detection service");
for (Track sourceTrack : sourceTracks) { if (!sourceTrack.hasAudio()) { logger.info("Skipping waveform extraction of track {} since it has no audio", sourceTrack.getIdentifier()); continue; logger.info("Creating waveform extraction job for track '{}' in mediapackage '{}'", sourceTrack.getIdentifier(), mediaPackage); waveformJobs.add(waveformJob); } catch (MediaPackageException | WaveformServiceException e) { logger.error("Creating waveform extraction job for track '{}' in media package '{}' failed", sourceTrack.getIdentifier(), mediaPackage, e);
/** * Returns a track or a number of tracks from the media package that together contain audio and video. If no such * combination can be found, e. g. there is no audio or video at all, an empty array is returned. * * @see org.opencastproject.mediapackage.selector.AbstractMediaPackageElementSelector#select(org.opencastproject.mediapackage.MediaPackage, boolean) */ @Override public Collection<Track> select(MediaPackage mediaPackage, boolean withTagsAndFlavors) { // instead of relying on the broken superclass, we'll inspect every track // Collection<Track> candidates = super.select(mediaPackage); Collection<Track> candidates = Arrays.asList(mediaPackage.getTracks()); Set<Track> result = new HashSet<Track>(); boolean foundAudio = false; // Look for a track containing audio for (Track t : candidates) { if (t.hasAudio() && !foundAudio && (audioFlavor == null || audioFlavor.equals(t.getFlavor()))) { result.add(t); foundAudio = true; } } return result; }
/** * {@inheritDoc} * * @see org.opencastproject.mediapackage.MediaPackage#getTracks(org.opencastproject.mediapackage.MediaPackageElementFlavor, * org.opencastproject.mediapackage.MediaPackageReference) */ @Override public Track[] getTracks(MediaPackageElementFlavor flavor, MediaPackageReference reference) { if (flavor == null) throw new IllegalArgumentException("Unable to filter by null criterion"); if (reference == null) throw new IllegalArgumentException("Unable to filter by null reference"); // Go through tracks and remove those that don't match Collection<Track> tracks = loadTracks(); List<Track> candidates = new ArrayList<Track>(tracks); for (Track a : tracks) { if (!flavor.equals(a.getFlavor()) || !reference.matches(a.getReference())) { candidates.remove(a); } } return candidates.toArray(new Track[candidates.size()]); }
@Override public Boolean apply(Track track) { return track.hasVideo(); } };
@Override public Boolean apply(Track track) { return track.hasAudio(); } };
/** * {@inheritDoc} * * @see org.opencastproject.mediapackage.MediaPackage#getTracks(org.opencastproject.mediapackage.MediaPackageElementFlavor) */ @Override public Track[] getTracks(MediaPackageElementFlavor flavor) { if (flavor == null) throw new IllegalArgumentException("Unable to filter by null criterion"); // Go through tracks and remove those that don't match Collection<Track> tracks = loadTracks(); List<Track> candidates = new ArrayList<Track>(tracks); for (Track a : tracks) { if (a.getFlavor() == null || !a.getFlavor().matches(flavor)) { candidates.remove(a); } } return candidates.toArray(new Track[candidates.size()]); }
List<Track> candidates = new ArrayList<Track>(tracks); for (Track t : tracks) { MediaPackageReference r = t.getReference(); if (!reference.matches(r)) { boolean indirectHit = false;
@Override public Job publish(MediaPackage mediaPackage, Track track) throws PublicationException { final String trackId = track.getIdentifier(); List<BasicNameValuePair> params = new ArrayList<BasicNameValuePair>(); params.add(new BasicNameValuePair("mediapackage", MediaPackageParser.getAsXml(mediaPackage))); params.add(new BasicNameValuePair("elementId", trackId)); HttpPost post = new HttpPost(); HttpResponse response = null; try { post.setEntity(new UrlEncodedFormEntity(params)); response = getResponse(post); if (response != null) { logger.info("Publishing {} to youtube", trackId); return JobParser.parseJob(response.getEntity().getContent()); } } catch (Exception e) { throw new PublicationException("Unable to publish track " + trackId + " from mediapackage " + mediaPackage + " using a remote youtube publication service", e); } finally { closeConnection(response); } throw new PublicationException("Unable to publish track " + trackId + " from mediapackage " + mediaPackage + " using a remote youtube publication service"); }
Job job = null; for (Track track : elements) { if (track.hasVideo()) { logger.info("Skipping track {} since it contains a video stream", track); continue;
sourceTrack.getIdentifier(), mediaPackage.getIdentifier().compact()); } catch (MediaPackageException | TimelinePreviewsException ex) { logger.error("Creating timeline previews job for track '{}' in media package '{}' failed with error {}", sourceTrack.getIdentifier(), mediaPackage.getIdentifier().compact(), ex.getMessage());