package org.continuouscity;
import java.io.File;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
import org.apache.commons.httpclient.Credentials;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.UsernamePasswordCredentials;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jets3t.service.S3Service;
import org.jets3t.service.S3ServiceException;
import org.jets3t.service.acl.AccessControlList;
import org.jets3t.service.impl.rest.httpclient.RestS3Service;
import org.jets3t.service.model.S3Bucket;
import org.jets3t.service.model.S3Object;
import org.jets3t.service.security.AWSCredentials;
import org.red5.server.adapter.ApplicationAdapter;
import org.red5.server.api.IConnection;
import org.red5.server.api.IContext;
import org.red5.server.api.Red5;
import org.springframework.core.io.Resource;
public class Application
extends ApplicationAdapter {
public String apiURL;
public String apiUser;
public String apiPassword;
public String s3AccessKey;
public String s3SecretKey;
private static final Log log = LogFactory.getLog(Application.class);
public void setApiURL(String url) {
apiURL = url;
}
public void setApiUser(String user) {
apiUser = user;
}
public void setApiPassword(String password) {
apiPassword = password;
}
public void setS3AccessKey(String accessKey) {
s3AccessKey = accessKey;
}
public void setS3SecretKey(String secretKey) {
s3SecretKey = secretKey;
}
public boolean roomConnect(IConnection conn, Object[] params) {
log.debug("New connection attempt from " + conn.getRemoteAddress() + "...");
return super.roomConnect(conn, params);
}
public void roomDisconnect(IConnection conn) {
log.debug("Connection closed by " + conn.getRemoteAddress() + "...");
super.roomDisconnect(conn);
}
public String generateUUID() {
return UUID.randomUUID().toString();
}
public boolean storeVideo(String stream_id) {
log.info("Storing video stream: " + stream_id);
IContext context = new Red5().getContext();
Resource flv = context.getResource("streams/" + stream_id + ".flv");
try {
AWSCredentials credentials = new AWSCredentials(s3AccessKey, s3SecretKey);
S3Service s3 = new RestS3Service(credentials);
S3Bucket bucket = s3.getBucket("xubu");
File file = flv.getFile();
S3Object object = new S3Object(bucket, file);
AccessControlList acl = s3.getBucketAcl(bucket);
object.setAcl(acl);
object.setKey("streams/" + stream_id + ".flv");
object = s3.putObject(bucket, object);
log.info("http://s3.amazonaws.com/" + bucket.getName() + "/" + object.getKey());
file.delete();
return true;
} catch (IOException e) {
log.error(e);
return false;
} catch (S3ServiceException e) {
log.error(e);
return false;
} catch (NoSuchAlgorithmException e) {
log.error(e);
return false;
}
}
public boolean insertPerformance(String stream_id, String name, String city) {
HttpClient client = new HttpClient();
PostMethod post = new PostMethod(apiURL);
NameValuePair[] data = {
new NameValuePair("stream_id", stream_id),
new NameValuePair("actor", name),
new NameValuePair("city", city),
new NameValuePair("public", "true")
};
post.setRequestBody(data);
try {
AuthScope scope = new AuthScope(new URI(apiURL).getHost(), 80, "Restricted Access");
Credentials cred = new UsernamePasswordCredentials(apiUser, apiPassword);
client.getState().setCredentials(scope, cred);
client.getParams().setAuthenticationPreemptive(true);
int status = client.executeMethod(post);
if (status == 201) {
return true;
}
return false;
} catch (HttpException e) {
log.error(e);
return false;
} catch (IOException e) {
log.error(e);
return false;
} catch (URISyntaxException e) {
log.error(e);
return false;
} finally {
post.releaseConnection();
}
}
}