Package org.openmeetings.app.remote

Source Code of org.openmeetings.app.remote.FLVRecorderService

package org.openmeetings.app.remote;

import java.io.File;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import org.openmeetings.app.data.basic.AuthLevelmanagement;
import org.openmeetings.app.data.basic.Sessionmanagement;
import org.openmeetings.app.data.conference.Roommanagement;
import org.openmeetings.app.data.flvrecord.FlvRecordingDaoImpl;
import org.openmeetings.app.data.flvrecord.FlvRecordingLogDaoImpl;
import org.openmeetings.app.data.flvrecord.FlvRecordingMetaDataDaoImpl;
import org.openmeetings.app.data.flvrecord.beans.FLVRecorderObject;
import org.openmeetings.app.data.flvrecord.converter.FlvInterviewConverterTask;
import org.openmeetings.app.data.flvrecord.converter.FlvInterviewReConverterTask;
import org.openmeetings.app.data.flvrecord.converter.FlvRecorderConverterTask;
import org.openmeetings.app.data.flvrecord.listener.ListenerAdapter;
import org.openmeetings.app.data.flvrecord.listener.StreamAudioListener;
import org.openmeetings.app.data.flvrecord.listener.StreamScreenListener;
import org.openmeetings.app.data.flvrecord.listener.StreamTranscodingListener;
import org.openmeetings.app.data.user.Usermanagement;
import org.openmeetings.app.data.user.dao.UsersDaoImpl;
import org.openmeetings.app.persistence.beans.flvrecord.FlvRecording;
import org.openmeetings.app.persistence.beans.flvrecord.FlvRecordingLog;
import org.openmeetings.app.persistence.beans.recording.RoomClient;
import org.openmeetings.app.remote.red5.ClientListManager;
import org.openmeetings.app.remote.red5.ScopeApplicationAdapter;
import org.openmeetings.utils.math.CalendarPatterns;
import org.red5.logging.Red5LoggerFactory;
import org.red5.server.api.IConnection;
import org.red5.server.api.IScope;
import org.red5.server.api.Red5;
import org.red5.server.api.service.IPendingServiceCall;
import org.red5.server.api.service.IPendingServiceCallback;
import org.red5.server.api.service.IServiceCapableConnection;
import org.red5.server.api.stream.IStreamListener;
import org.red5.server.stream.ClientBroadcastStream;
import org.slf4j.Logger;


public class FLVRecorderService implements IPendingServiceCallback {
 
  private static final Logger log = Red5LoggerFactory.getLogger(FLVRecorderService.class, ScopeApplicationAdapter.webAppRootKey);

  //Spring Beans
  private ClientListManager clientListManager = null;
  private FlvRecordingDaoImpl flvRecordingDaoImpl = null;
  private FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDaoImpl = null;
  private UsersDaoImpl usersDaoImpl;
  private Roommanagement roommanagement;
  private FlvRecorderConverterTask flvRecorderConverterTask;
  private FlvInterviewConverterTask flvInterviewConverterTask;
  private FlvInterviewReConverterTask flvInterviewReConverterTask;
  private FlvRecordingLogDaoImpl flvRecordingLogDaoImpl;
  private ScopeApplicationAdapter scopeApplicationAdapter = null;
 
  public void resultReceived(IPendingServiceCall arg0) {
    // TODO Auto-generated method stub
   
  }

  public ClientListManager getClientListManager() {
    return this.clientListManager;
  }
  public void setClientListManager(ClientListManager clientListManager) {
    this.clientListManager = clientListManager;
  }
 
  public FlvRecordingDaoImpl getFlvRecordingDaoImpl() {
    return flvRecordingDaoImpl;
  }
  public void setFlvRecordingDaoImpl(FlvRecordingDaoImpl flvRecordingDaoImpl) {
    this.flvRecordingDaoImpl = flvRecordingDaoImpl;
  }

  public FlvRecordingMetaDataDaoImpl getFlvRecordingMetaDataDaoImpl() {
    return flvRecordingMetaDataDaoImpl;
  }
  public void setFlvRecordingMetaDataDaoImpl(
      FlvRecordingMetaDataDaoImpl flvRecordingMetaDataDaoImpl) {
    this.flvRecordingMetaDataDaoImpl = flvRecordingMetaDataDaoImpl;
  }
 
  public UsersDaoImpl getUsersDaoImpl() {
    return usersDaoImpl;
  }
  public void setUsersDaoImpl(UsersDaoImpl usersDaoImpl) {
    this.usersDaoImpl = usersDaoImpl;
  }
 
  public Roommanagement getRoommanagement() {
    return roommanagement;
  }
  public void setRoommanagement(Roommanagement roommanagement) {
    this.roommanagement = roommanagement;
  }
 
  public FlvRecorderConverterTask getFlvRecorderConverterTask() {
    return flvRecorderConverterTask;
  }
  public void setFlvRecorderConverterTask(
      FlvRecorderConverterTask flvRecorderConverterTask) {
    this.flvRecorderConverterTask = flvRecorderConverterTask;
  }
 
  public FlvInterviewConverterTask getFlvInterviewConverterTask() {
    return flvInterviewConverterTask;
  }
  public void setFlvInterviewConverterTask(
      FlvInterviewConverterTask flvInterviewConverterTask) {
    this.flvInterviewConverterTask = flvInterviewConverterTask;
  }
 
  public FlvInterviewReConverterTask getFlvInterviewReConverterTask() {
    return flvInterviewReConverterTask;
  }
  public void setFlvInterviewReConverterTask(
      FlvInterviewReConverterTask flvInterviewReConverterTask) {
    this.flvInterviewReConverterTask = flvInterviewReConverterTask;
  }

  public FlvRecordingLogDaoImpl getFlvRecordingLogDaoImpl() {
    return flvRecordingLogDaoImpl;
  }
  public void setFlvRecordingLogDaoImpl(
      FlvRecordingLogDaoImpl flvRecordingLogDaoImpl) {
    this.flvRecordingLogDaoImpl = flvRecordingLogDaoImpl;
  }
 
  public ScopeApplicationAdapter getScopeApplicationAdapter() {
    return scopeApplicationAdapter;
  }
  public void setScopeApplicationAdapter(
      ScopeApplicationAdapter scopeApplicationAdapter) {
    this.scopeApplicationAdapter = scopeApplicationAdapter;
  }

  public RoomClient checkForRecording(){
    try {
     
      IConnection current = Red5.getConnectionLocal();
      String streamid = current.getClient().getId();
     
      log.debug("getCurrentRoomClient -2- "+streamid);
     
      RoomClient currentClient = this.clientListManager.getClientByStreamId(streamid);
     
      HashMap<String,RoomClient> roomClientList = this.clientListManager.getClientListByRoom(currentClient.getRoom_id());
     
      for (Iterator<String> iter = roomClientList.keySet().iterator();iter.hasNext();) {
       
        RoomClient rcl = roomClientList.get(iter.next());
       
        if (rcl.getIsRecording()) {
         
          return rcl;
         
        }
       
      }
     
      return null;
     
    } catch (Exception err) {
      err.printStackTrace();
      log.error("[checkForRecording]",err);
    }
    return null;
  }
 
  private static String generateFileName(Long flvRecording_id, String streamid) throws Exception{
    String dateString = CalendarPatterns.getTimeForStreamId(new java.util.Date());
    return "rec_"+flvRecording_id+"_stream_"+streamid+"_"+dateString;
   
  }
 
  public String recordMeetingStream(String roomRecordingName, String comment, Boolean isInterview){
    try {
     
      IConnection current = Red5.getConnectionLocal();
      RoomClient currentClient = this.clientListManager.getClientByStreamId(current.getClient().getId());
      Long room_id = currentClient.getRoom_id();

      Date now = new Date();
     
      //Receive flvRecordingId
      Long flvRecordingId = this.flvRecordingDaoImpl.addFlvRecording("", roomRecordingName, null, currentClient.getUser_id(),
                  room_id, now, null, currentClient.getUser_id(), comment, currentClient.getStreamid(),
                  currentClient.getVWidth(),currentClient.getVHeight(), isInterview);
     
      //Update Client and set Flag
      currentClient.setIsRecording(true);
      currentClient.setFlvRecordingId(flvRecordingId);
      this.clientListManager.updateClientByStreamId(current.getClient().getId(), currentClient);
     
      //get all stream and start recording them
      Collection<Set<IConnection>> conCollection = current.getScope().getConnections();
      for (Set<IConnection> conset : conCollection) {
        for (IConnection conn : conset) {
          if (conn != null) {
            if (conn instanceof IServiceCapableConnection) {
              RoomClient rcl = this.clientListManager.getClientByStreamId(conn.getClient().getId());
             
              log.debug("is this users still alive? :"+rcl);
             
              //FIXME: Check if this function is really in use at the moment 
              if (rcl.getIsScreenClient() != null && rcl.getIsScreenClient()) {
                  //continue;
                } else {
                ((IServiceCapableConnection) conn).invoke("startedRecording",new Object[] { currentClient }, this);
              }
             
              //If its the recording client we need another type of Meta Data
              if (rcl.getIsScreenClient()) {
             
                if (rcl.getFlvRecordingId() != null && rcl.getScreenPublishStarted() != null && rcl.getScreenPublishStarted()) {
                 
                  String streamName_Screen = generateFileName(flvRecordingId, rcl.getStreamPublishName().toString());
                 
                  Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl.addFlvRecordingMetaData(flvRecordingId,
                                      rcl.getFirstname()+" "+rcl.getLastname(), now,
                                            false, false, true, streamName_Screen, rcl.getInterviewPodId());
                 
                  //Start FLV Recording
                  recordShow(conn, rcl.getStreamPublishName(), streamName_Screen, flvRecordingMetaDataId, true, isInterview);
                 
                  //Add Meta Data
                  rcl.setFlvRecordingMetaDataId(flvRecordingMetaDataId);
                 
                  this.clientListManager.updateClientByStreamId(rcl.getStreamid(), rcl);
               
                }
               
              } else if
              //if the user does publish av, a, v
              //But we only record av or a, video only is not interesting
              (rcl.getAvsettings().equals("av") ||
                  rcl.getAvsettings().equals("a") ||
                  rcl.getAvsettings().equals("v")){ 
               
                String streamName = generateFileName(flvRecordingId, String.valueOf(rcl.getBroadCastID()).toString());
               
                //Add Meta Data
                boolean isAudioOnly = false;
                if (rcl.getAvsettings().equals("a")){
                  isAudioOnly = true;
                }
               
                boolean isVideoOnly = false;
                if (rcl.getAvsettings().equals("v")){
                  isVideoOnly = true;
                }
               
                Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl.addFlvRecordingMetaData(flvRecordingId,
                                  rcl.getFirstname()+" "+rcl.getLastname(), now,
                                        isAudioOnly, isVideoOnly, false, streamName, rcl.getInterviewPodId());
               
                rcl.setFlvRecordingMetaDataId(flvRecordingMetaDataId);
               
                this.clientListManager.updateClientByStreamId(rcl.getStreamid(), rcl);
               
                //Start FLV recording
                recordShow(conn, String.valueOf(rcl.getBroadCastID()).toString(), streamName, flvRecordingMetaDataId, false, isInterview);
               
              }
               
            }
          }
        }   
      }
     
      return roomRecordingName;
     
    } catch (Exception err) {
      log.error("[recordMeetingStream]",err);
    }
    return null;
  }
 
  /**
   * @deprecated
   * @param conn
   * @param broadcastid
   * @param streamName
   * @throws Exception
   */
  private static void _recordShow(IConnection conn, String broadcastid, String streamName) throws Exception {
    log.debug("Recording show for: " + conn.getScope().getContextPath());
    log.debug("Name of CLient and Stream to be recorded: "+broadcastid);   
    //log.debug("Application.getInstance()"+Application.getInstance());
    log.debug("Scope "+conn);
    log.debug("Scope "+conn.getScope());
    // Get a reference to the current broadcast stream.
    ClientBroadcastStream stream = (ClientBroadcastStream) ScopeApplicationAdapter.getInstance()
        .getBroadcastStream(conn.getScope(), broadcastid);
    try {
      // Save the stream to disk.
      stream.saveAs(streamName, false);
    } catch (Exception e) {
      log.error("Error while saving stream: " + streamName, e);
    }
  }
 
  /**
   * Start recording the published stream for the specified broadcast-Id
   * @param conn
   * @param broadcastid
   * @param streamName
   * @param flvRecordingMetaDataId
   * @throws Exception
   */
  private static void recordShow(IConnection conn, String broadcastid,
      String streamName, Long flvRecordingMetaDataId, boolean isScreenData, Boolean isInterview) throws Exception {
    try {
      log.debug("Recording show for: " + conn.getScope().getContextPath());
      log.debug("Name of CLient and Stream to be recorded: "+broadcastid);   
      //log.debug("Application.getInstance()"+Application.getInstance());
      log.debug("Scope "+conn);
      log.debug("Scope "+conn.getScope());
      // Get a reference to the current broadcast stream.
      ClientBroadcastStream stream = (ClientBroadcastStream) ScopeApplicationAdapter.getInstance()
          .getBroadcastStream(conn.getScope(), broadcastid);
   
     
      // Save the stream to disk.
      if (isScreenData) {
        stream.addStreamListener(new StreamScreenListener(streamName, conn.getScope(), flvRecordingMetaDataId, isScreenData, isInterview));
      } else {
          
        log.debug("### stream "+stream);
        log.debug("### streamName "+streamName);
        log.debug("### conn.getScope() "+conn.getScope());
        log.debug("### flvRecordingMetaDataId "+flvRecordingMetaDataId);
        log.debug("### isScreenData "+isScreenData);
        log.debug("### isInterview "+isInterview);
       
        if (isInterview) {
         
          //Additionally record the Video Signal
          stream.addStreamListener(new StreamScreenListener("AV_"+streamName, conn.getScope(), flvRecordingMetaDataId, isScreenData, isInterview));
        }
       
        stream.addStreamListener(new StreamAudioListener(streamName, conn.getScope(), flvRecordingMetaDataId, isScreenData, isInterview));
      }
      //Just for Debug Purpose
      //stream.saveAs(streamName+"_DEBUG", false);
    } catch (Exception e) {
      log.error("Error while saving stream: " + streamName, e);
    }
  }
 
  /**
   * @deprecated
   * @param conn
   * @param broadcastId
   */
  public void _stopRecordingShow(IConnection conn, String broadcastId) {
    try {
     
      log.debug("** stopRecordingShow: "+conn);
      log.debug("### Stop recording show for broadcastId: "+ broadcastId + " || " + conn.getScope().getContextPath());
     
      Object streamToClose = ScopeApplicationAdapter.getInstance().
                      getBroadcastStream(conn.getScope(), broadcastId);
     
      if (streamToClose == null) {
        log.debug("Could not aquire Stream, maybe already closed");
      }
     
      ClientBroadcastStream stream = (ClientBroadcastStream) streamToClose;
      // Stop recording.
      stream.stopRecording();
     
    } catch (Exception err) {
      log.error("[stopRecordingShow]",err);
    }
  }
 
  /**
   * Stops recording the publishing stream for the specified
   * IConnection.
   *
   * @param conn
   */
  public void stopRecordingShow(IConnection conn, String broadcastId, Long flvRecordingMetaDataId) {
    try {
     
      log.debug("** stopRecordingShow: "+conn);
      log.debug("### Stop recording show for broadcastId: "+ broadcastId + " || " + conn.getScope().getContextPath());
     
      Object streamToClose = ScopeApplicationAdapter.getInstance().
                      getBroadcastStream(conn.getScope(), broadcastId);
     
      if (streamToClose == null) {
        log.debug("Could not aquire Stream, maybe already closed");
      }
     
      ClientBroadcastStream stream = (ClientBroadcastStream) streamToClose;

      if (stream.getStreamListeners() != null) {
       
        for (Iterator<IStreamListener> iter = stream.getStreamListeners().iterator();iter.hasNext();) {
         
          IStreamListener iStreamListener = iter.next();
         
          ListenerAdapter listenerAdapter = (ListenerAdapter) iStreamListener;
         
          log.debug("Stream Closing ?? "+listenerAdapter.getFlvRecordingMetaDataId()+ " " +flvRecordingMetaDataId);
         
          if (listenerAdapter.getFlvRecordingMetaDataId().equals(flvRecordingMetaDataId)) {
            log.debug("Stream Closing :: "+flvRecordingMetaDataId);
            listenerAdapter.closeStream();
          }
         
        }
       
        for (IStreamListener iStreamListener : stream.getStreamListeners()) {
          stream.removeStreamListener(iStreamListener);
        }
     
      }
     
      // Just for Debugging
      //stream.stopRecording();
     
    } catch (Exception err) {
      log.error("[stopRecordingShow]",err);
    }
  }
 
  public Long stopRecordAndSave(IScope scope, RoomClient currentClient, Long storedFlvRecordingId){
    try {
      log.debug("stopRecordAndSave "+currentClient.getUsername()+","+currentClient.getUserip());
     
      //get all stream and stop recording them
      Collection<Set<IConnection>> conCollection = scope.getConnections();
      for (Set<IConnection> conset : conCollection) {
        for (IConnection conn : conset) {
          if (conn != null) {
            if (conn instanceof IServiceCapableConnection) {
             
              RoomClient rcl = ClientListManager.getInstance().getClientByStreamId(conn.getClient().getId());
             
              //FIXME: Check if this function is really in use at the moment 
//              if (!rcl.getIsScreenClient()) {
//                ((IServiceCapableConnection) conn).invoke("stoppedRecording",new Object[] { currentClient }, this);
//              }
             
              log.debug("is this users still alive? :"+rcl);
             
              if (rcl.getIsScreenClient()) {
               
                if (rcl.getFlvRecordingId() != null && rcl.getScreenPublishStarted() != null && rcl.getScreenPublishStarted()) {
               
                  //Stop FLV Recording
                  stopRecordingShow(conn, rcl.getStreamPublishName(),rcl.getFlvRecordingMetaDataId());
                 
                  //Update Meta Data
                  this.flvRecordingMetaDataDaoImpl.updateFlvRecordingMetaDataEndDate(rcl.getFlvRecordingMetaDataId(),new Date());
                }
               
              } else if (rcl.getAvsettings().equals("av") ||
                  rcl.getAvsettings().equals("a") ||
                  rcl.getAvsettings().equals("v")){ 
               
                stopRecordingShow(conn, String.valueOf(rcl.getBroadCastID()).toString(), rcl.getFlvRecordingMetaDataId() );
               
                //Update Meta Data
                this.flvRecordingMetaDataDaoImpl.updateFlvRecordingMetaDataEndDate(rcl.getFlvRecordingMetaDataId(),new Date());
               
              }
             
            }
          }
        }
      }       
     
      //Store to database
      Long flvRecordingId = currentClient.getFlvRecordingId();
     
      //In the Case of an Interview the stopping client does not mean that its actually the recording client
      if (storedFlvRecordingId != null) {
        flvRecordingId = storedFlvRecordingId;
      }
     
      if (flvRecordingId != null) {
     
        this.flvRecordingDaoImpl.updateFlvRecordingEndTime(flvRecordingId, new Date(), currentClient.getOrganization_id());
       
        //Reset values
        currentClient.setFlvRecordingId(null);
        currentClient.setIsRecording(false);
       
        this.clientListManager.updateClientByStreamId(currentClient.getStreamid(), currentClient);
       
        log.debug("this.flvRecorderConverterTask ",this.flvRecorderConverterTask);
       
        FlvRecording flvRecording = this.flvRecordingDaoImpl.getFlvRecordingById(flvRecordingId);
     
        if (flvRecording.getIsInterview() == null || !flvRecording.getIsInterview()) {
         
          this.flvRecorderConverterTask.startConversionThread(flvRecordingId);
         
        } else {
         
          this.flvInterviewConverterTask.startConversionThread(flvRecordingId);
         
        }
       
      }
     
    } catch (Exception err) {
     
      log.error("[-- stopRecordAndSave --]",err);
    }
    return new Long(-1);
  }
 
  public RoomClient checkLzRecording() {
    try {
      IConnection current = Red5.getConnectionLocal();
      String streamid = current.getClient().getId();
     
      log.debug("getCurrentRoomClient -2- "+streamid);
     
      RoomClient currentClient = this.clientListManager.getClientByStreamId(streamid);
     
     
      log.debug("getCurrentRoomClient -#########################- "+currentClient.getRoom_id());
     
      HashMap<String,RoomClient> roomList = this.clientListManager.getClientListByRoomAll(currentClient.getRoom_id());
     
      for (Iterator<String> iter = roomList.keySet().iterator();iter.hasNext();) {
       
        RoomClient rcl = roomList.get(iter.next());
       
        if (rcl.getIsRecording()) {
          return rcl;
        }
       
      }
     
     
    } catch (Exception err) {
      log.error("[checkLzRecording]",err);
    }
    return null;
  }
 
  public void stopRecordingShowForClient(IConnection conn, RoomClient rcl) {
    try {
      //this cannot be handled here, as to stop a stream and to leave a room is not
      //the same type of event.
      //StreamService.addRoomClientEnterEventFunc(rcl, roomrecordingName, rcl.getUserip(), false);
      log.error("### stopRecordingShowForClient: "+rcl.getIsRecording()+","+rcl.getUsername()+","+rcl.getUserip());
     
      if (rcl.getIsScreenClient()) {
       
        if (rcl.getFlvRecordingId() != null && rcl.getScreenPublishStarted() != null && rcl.getScreenPublishStarted()) {
       
          //Stop FLV Recording
          //FIXME: Is there really a need to stop it manually if the user just
          //stops the stream?
          stopRecordingShow(conn, rcl.getStreamPublishName(), rcl.getFlvRecordingMetaDataId());
         
          //Update Meta Data
          this.flvRecordingMetaDataDaoImpl.updateFlvRecordingMetaDataEndDate(rcl.getFlvRecordingMetaDataId(),new Date());
        }
       
      } else if ((rcl.getAvsettings().equals("a") || rcl.getAvsettings().equals("v")
          || rcl.getAvsettings().equals("av"))){
       
        //FIXME: Is there really a need to stop it manually if the user just
        //stops the stream?
        stopRecordingShow(conn,String.valueOf(rcl.getBroadCastID()).toString(), rcl.getFlvRecordingMetaDataId());
       
        //Update Meta Data
        this.flvRecordingMetaDataDaoImpl.updateFlvRecordingMetaDataEndDate(rcl.getFlvRecordingMetaDataId(),new Date());
      }
     
    } catch (Exception err) {
      log.error("[stopRecordingShowForClient]",err);
    }
  }
 
  public void addRecordingByStreamId(IConnection conn, String streamId,
      RoomClient rcl, Long flvRecordingId) {
    try {
     
      FlvRecording flvRecording = this.flvRecordingDaoImpl.getFlvRecordingById(flvRecordingId);
     
      Date now = new Date();
     
      //If its the recording client we need another type of Meta Data
      if (rcl.getIsScreenClient()) {
     
        if (rcl.getFlvRecordingId() != null && rcl.getScreenPublishStarted() != null && rcl.getScreenPublishStarted()) {
         
          String streamName_Screen = generateFileName(flvRecordingId, rcl.getStreamPublishName().toString());
         
          log.debug("##############  ADD SCREEN OF SHARER :: "+rcl.getStreamPublishName());
         
          Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl.addFlvRecordingMetaData(flvRecordingId,
                              rcl.getFirstname()+" "+rcl.getLastname(), now,
                                    false, false, true, streamName_Screen, rcl.getInterviewPodId());
         
          //Start FLV Recording
          recordShow(conn, rcl.getStreamPublishName(), streamName_Screen, flvRecordingMetaDataId, true, flvRecording.getIsInterview());
         
          //Add Meta Data
          rcl.setFlvRecordingMetaDataId(flvRecordingMetaDataId);
         
          this.clientListManager.updateClientByStreamId(rcl.getStreamid(), rcl);
       
        }
       
      } else if
      //if the user does publish av, a, v
      //But we only record av or a, video only is not interesting
      (rcl.getAvsettings().equals("av") ||
          rcl.getAvsettings().equals("a") ||
          rcl.getAvsettings().equals("v")){ 
       
        String streamName = generateFileName(flvRecordingId, String.valueOf(rcl.getBroadCastID()).toString());
       
        //Add Meta Data
        boolean isAudioOnly = false;
        if (rcl.getAvsettings().equals("a")){
          isAudioOnly = true;
        }
        boolean isVideoOnly = false;
        if (rcl.getAvsettings().equals("v")){
          isVideoOnly = true;
        }
       
        Long flvRecordingMetaDataId = this.flvRecordingMetaDataDaoImpl.addFlvRecordingMetaData(flvRecordingId,
                          rcl.getFirstname()+" "+rcl.getLastname(), now,
                                isAudioOnly, isVideoOnly, false, streamName, rcl.getInterviewPodId());
       
        //Start FLV recording
        recordShow(conn, String.valueOf(rcl.getBroadCastID()).toString(), streamName, flvRecordingMetaDataId, false, flvRecording.getIsInterview());
       
        rcl.setFlvRecordingMetaDataId(flvRecordingMetaDataId);
       
        this.clientListManager.updateClientByStreamId(rcl.getStreamid(), rcl);
       
      }
       
    } catch (Exception err) {
      log.error("[addRecordingByStreamId]",err);
   
  }
 
  public FlvRecording getFlvRecordingWithMetaData(String SID, Long flvRecordingId) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            FlvRecording flvRecording = this.flvRecordingDaoImpl.getFlvRecordingById(flvRecordingId);
           
            flvRecording.setFlvRecordingMetaData(this.flvRecordingMetaDataDaoImpl.getFlvRecordingMetaDataByRecording(flvRecordingId));
           
            if (flvRecording.getInsertedBy() != null) {
              flvRecording.setCreator(this.usersDaoImpl.getUser(flvRecording.getInsertedBy()));
            }
           
            if (flvRecording.getRoom_id() != null) {
              flvRecording.setRoom(this.roommanagement.getRoomById(flvRecording.getRoom_id()));
            }
           
            flvRecording.setFlvRecordingLog(this.flvRecordingLogDaoImpl.getFLVRecordingLogByRecordingId(flvRecordingId));
           
            return flvRecording;
           
          }
    } catch (Exception err){
      log.error("[getFlvRecordingWithMetaData] ",err);
      err.printStackTrace();
    }
    return null;
  }
 
  public List<FlvRecordingLog> getFlvRecordingLog(String SID, Long flvRecordingId) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            return this.flvRecordingLogDaoImpl.getFLVRecordingLogByRecordingId(flvRecordingId);
           
          }
    } catch (Exception err){
      log.error("[getFlvRecordingLog] ",err);
      err.printStackTrace();
    }
    return null;
  }
 
  public Long deleteFLVOrFolder(String SID, Long flvRecordingId) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
         
          System.out.println("deleteFLVOrFolder "+flvRecordingId);
         
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            log.debug("deleteFLVOrFolder "+flvRecordingId);
           
            this.flvRecordingDaoImpl.deleteFlvRecording(flvRecordingId);
           
            return flvRecordingId;
          }
    } catch (Exception err){
      log.error("[deleteFLVOrFolder] ",err);
    }
    return null;
  }
 

  public List<FlvRecording> getFLVExplorerByParent(String SID, Long parentFileExplorerItemId, Boolean isOwner) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            log.debug("parentFileExplorerItemId "+parentFileExplorerItemId);
           
            if (parentFileExplorerItemId == 0) {
              if (isOwner) {
               
                return this.flvRecordingDaoImpl.getFlvRecordingByOwner(users_id, parentFileExplorerItemId);
               
              } else {
               
                return this.flvRecordingDaoImpl.getFlvRecordingsPublic();
               
              }
            } else {
             
              return this.flvRecordingDaoImpl.getFlvRecordingByParent(parentFileExplorerItemId);
            }
           
          }
    } catch (Exception err){
      log.error("[getFLVExplorerByParent] ",err);
    }
    return null;
  }
 

  public Long addFolder(String SID, Long parentFileExplorerItemId, String fileName,
              Boolean isOwner, Long organization_id) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            log.debug("addFolder "+parentFileExplorerItemId);
           
            if (parentFileExplorerItemId == 0 && isOwner) {
             
              return this.flvRecordingDaoImpl.addFlvFolderRecording("", fileName,
                  null, //FileSize
                  users_id,
                  null, null, null, //Long room_id, Date recordStart, Date recordEnd
                  users_id, //OwnerID => only set if its directly root in Owner Directory, other Folders and Files
              //maybe are also in a Home directory but just because their parent is
                  "", parentFileExplorerItemId,
                  organization_id);
             
            } else {
             
              return this.flvRecordingDaoImpl.addFlvFolderRecording("", fileName,
                  null, //FileSize
                  users_id,
                  null, null, null, //Long room_id, Date recordStart, Date recordEnd
                  null, //OwnerID => only set if its directly root in Owner Directory, other Folders and Files
              //maybe are also in a Home directory but just because their parent is
                  "", parentFileExplorerItemId,
                  organization_id);
             
            }
             
          }
    } catch (Exception err){
      log.error("[addFolder] ",err);
    }
    return null;
  }
 
  public Long moveFile(String SID, Long flvRecordingId, Long newParentFileExplorerItemId,
      Boolean isOwner, Boolean moveToHome) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
         
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            log.debug("moveFile "+flvRecordingId);
           
            this.flvRecordingDaoImpl.moveFile(flvRecordingId, newParentFileExplorerItemId, isOwner, users_id);
       
            FlvRecording flvRecording = this.flvRecordingDaoImpl.getFlvRecordingById(flvRecordingId);
           
            if (moveToHome) {
              //set this file and all subfiles and folders the ownerId
              this.setFileToOwnerOrRoomByParent(flvRecording, users_id);
             
            } else {
              //set this file and all subfiles and folders the room_id
              this.setFileToOwnerOrRoomByParent(flvRecording, null);
             
            }
          }
    } catch (Exception err){
      log.error("[moveFile] ",err);
    }
    return null;
  }
 
  private void setFileToOwnerOrRoomByParent(FlvRecording flvRecording,
      Long usersId) {
    try {
     
      flvRecording.setOwnerId(usersId);
     
      this.flvRecordingDaoImpl.updateFlvRecording(flvRecording);
     
      List<FlvRecording> subFLVItems = this.flvRecordingDaoImpl.getFlvRecordingByParent(flvRecording.getFlvRecordingId());
     
      for (FlvRecording subFLVItem : subFLVItems) {
        this.setFileToOwnerOrRoomByParent(subFLVItem, usersId);
      }
     
    } catch (Exception err){
      log.error("[setFileToOwnerOrRoomByParent] ",err);
    }
  }

  public Long updateFileOrFolderName(String SID, Long flvRecordingId, String fileName) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            log.debug("updateFileOrFolderName "+flvRecordingId);
           
            this.flvRecordingDaoImpl.updateFileOrFolderName(flvRecordingId, fileName);
           
            return flvRecordingId;
          }
    } catch (Exception err){
      log.error("[updateFileOrFolderName] ",err);
    }
    return null;
  }
 
  public FLVRecorderObject getFLVExplorerByRoom(String SID, Long organization_id) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            FLVRecorderObject fileExplorerObject = new FLVRecorderObject();
           
            //User Home Recordings
            List<FlvRecording> homeFlvRecordings = this.flvRecordingDaoImpl.getFlvRecordingRootByOwner(users_id);
            long homeFileSize = 0;
           
            for (FlvRecording homeFlvRecording : homeFlvRecordings) {
              homeFileSize += this.getSizeOfDirectoryAndSubs(homeFlvRecording);
            }
           
            fileExplorerObject.setUserHome(homeFlvRecordings);
            fileExplorerObject.setUserHomeSize(homeFileSize);
           
            //Public Recordings by Organization
            List<FlvRecording> publicFlvRecordings = this.flvRecordingDaoImpl.getFlvRecordingRootByPublic(organization_id);
            long publicFileSize = 0;
           
            for (FlvRecording publicFlvRecording : publicFlvRecordings) {
              publicFileSize += this.getSizeOfDirectoryAndSubs(publicFlvRecording);
            }
            fileExplorerObject.setRoomHome(publicFlvRecordings);
            fileExplorerObject.setRoomHomeSize(publicFileSize);
           
            return fileExplorerObject;
           
          }
    } catch (Exception err){
      log.error("[getFileExplorerByRoom] ",err);
    }
    return null;
  }

  private long getSizeOfDirectoryAndSubs(FlvRecording baseFlvRecording) {
    try {
     
      long fileSize = 0;
     
      File tFile = new File (ScopeApplicationAdapter.webAppPath + File.separatorChar
          + "streams" + File.separatorChar + "hibernate" + File.separatorChar
          + baseFlvRecording.getFileHash());
      if (tFile.exists()) {
        fileSize += tFile.length();
      }
     
      File dFile = new File (ScopeApplicationAdapter.webAppPath + File.separatorChar
          + "streams" + File.separatorChar + "hibernate" + File.separatorChar
          + baseFlvRecording.getAlternateDownload());
      if (dFile.exists()) {
        fileSize += dFile.length();
      }
     
      File iFile = new File (ScopeApplicationAdapter.webAppPath + File.separatorChar
          + "streams" + File.separatorChar + "hibernate" + File.separatorChar
          + baseFlvRecording.getPreviewImage());
      if (iFile.exists()) {
        fileSize += iFile.length();
      }
     
      List<FlvRecording> flvRecordings = this.flvRecordingDaoImpl.getFlvRecordingByParent(baseFlvRecording.getFlvRecordingId());
     
      for (FlvRecording flvRecording : flvRecordings) {
        fileSize += this.getSizeOfDirectoryAndSubs(flvRecording);
      }
     
     
      return fileSize;
     
    } catch (Exception err){
      log.error("[getSizeOfDirectoryAndSubs] ",err);
    }
    return 0;
  }
 
  public Long restartInterviewConversion(String SID, Long flvRecordingId, Integer leftSideLoud, Integer rightSideLoud,
      Integer leftSideTime, Integer rightSideTime) {
    try {
      Long users_id = Sessionmanagement.getInstance().checkSession(SID);
          Long user_level = Usermanagement.getInstance().getUserLevelByID(users_id)
          if (AuthLevelmanagement.getInstance().checkUserLevel(user_level)){ 
           
            log.debug("updateFileOrFolderName "+flvRecordingId);
           
            FlvRecording flvRecording = this.flvRecordingDaoImpl.getFlvRecordingById(flvRecordingId);
           
            if (flvRecording.getIsInterview() == null || !flvRecording.getIsInterview()) {
              return -1L;
            }
           
            flvRecording.setPreviewImage(null);
           
            flvRecording.setProgressPostProcessing(0);
           
            this.flvRecordingDaoImpl.updateFlvRecording(flvRecording);
           
            this.flvInterviewReConverterTask.startConversionThread(flvRecordingId, leftSideLoud, rightSideLoud, leftSideTime, rightSideTime);
           
          }
    } catch (Exception err){
      log.error("[restartInterviewConversion] ",err);
    }
    return null;
  }
 
}
TOP

Related Classes of org.openmeetings.app.remote.FLVRecorderService

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.