Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
e7af808
did part of linked-video code
pk1m Apr 18, 2012
5a30694
youtube embedd working
pk1m Apr 18, 2012
0368168
comments - add/remove, remove video working
pk1m Apr 19, 2012
99370c2
got the thumbnails to work
pk1m Apr 19, 2012
8b46262
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m Apr 23, 2012
5b7a389
fixed some small bugs like remove not working and added videos to fav…
pk1m Apr 23, 2012
9bcecd8
removed NOOOO
pk1m Apr 23, 2012
e9671e4
made linkedvideo inherit from post, correctly shows up in news feed
pk1m Apr 23, 2012
5fb7482
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m Apr 24, 2012
a5bdb24
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m Apr 25, 2012
a9cdcba
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m Apr 25, 2012
5a26029
removed timeline backup files and bootstrap.zip
pk1m Apr 25, 2012
af0d814
removed timeline backup files and bootstrap.zip
pk1m Apr 25, 2012
d5295a3
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m Apr 26, 2012
7a76a91
updated my files to the changes made in Likeable
pk1m Apr 26, 2012
5681ca7
fixed small regex problem to let it correctly accept certain videos
pk1m Apr 26, 2012
fd180ed
pulling from master
pk1m Apr 30, 2012
e70b02a
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m May 4, 2012
1811494
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m May 7, 2012
a9c8f56
fork messed up restarting
pk1m May 7, 2012
ac2c295
copied main repo over
pk1m May 7, 2012
8041e4c
fixed error works now with post
pk1m May 7, 2012
266eec2
clean
pk1m May 7, 2012
8f4c480
added vimeo code but error in jsonStringFromURL
pk1m May 9, 2012
9f07e2c
vimeo links works
pk1m May 10, 2012
fc3866c
Merge branch 'master' of github.com:w7cook/OpenBook
pk1m May 10, 2012
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
263 changes: 263 additions & 0 deletions app/controllers/Videos.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,263 @@
package controllers;

import java.io.*;
import play.*;
import play.data.validation.Error;
import play.libs.*;
import play.libs.WS.*;
import play.mvc.*;
import play.db.jpa.*;
import models.*;

import java.util.*;
import java.util.regex.*;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

import java.io.IOException;

import java.nio.charset.Charset;
import java.io.Reader;
import java.net.URL;
import java.net.MalformedURLException;

import com.google.gson.*;


@With(Secure.class)
public class Videos extends OBController {


public static void listLinkedVideos(long ownerId){
User user = User.findById(ownerId);
List<LinkedVideo> videos = LinkedVideo.find("owner = ? order by createdAt asc", user).fetch();
render(videos);
}

public static void listMyLinkedVideos(){
User user = user();

if(user == null)
forbidden();

List<LinkedVideo> videos = LinkedVideo.find("owner = ? order by createdAt asc", user).fetch();
renderTemplate("Videos/listLinkedVideos.html", videos);
}

public static void showLinkedVideo(Long linkedVideoID){
LinkedVideo vid = LinkedVideo.findById(linkedVideoID);
render(vid);
}

public static void createLinkedVideo(String video_title, String video_link, String video_caption){
validation.required(video_title).message("Video title is required");
validation.required(video_link).message("Link must not be blank");
validation.url(video_link).message("Link must be a valid URL (ex. http://www.example.com)");

char link_type = decipherLinkType(video_link);
validation.isTrue(link_type != '\u0000').message("Link must be a valid vimeo, youtube or dailymotion video link.");

Logger.info("A log message: " + link_type);
validation.isTrue(isValidVideo(video_link)).message("Link must be a valid video");

User usr = user();

if(validation.hasErrors()){
renderTemplate("Videos/listLinkedVideos.html");
}
else{

LinkedVideo new_vid = new LinkedVideo(usr, video_title, video_link, video_caption, (int)link_type, getVideoId(video_link, link_type));

//
// new_vid.thoseWhoLike = new HashSet<User>();
// new_vid.comments = new ArrayList<Comment>();

new_vid.thumbnail_url = getThumb(new_vid.video_id, link_type);

new_vid.save();

showLinkedVideo(new_vid.id);
}

}


public static void uploadVideo(){

}

public static void createUploadedVideo(){

}

public static char decipherLinkType(String link){

Pattern YOUTUBE = Pattern.compile("(?:https?://)?(?:www\\.)?(?:youtu\\.be/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)[?=&+%\\w\\-]*");
Pattern DAILYMOTION = Pattern.compile("(?:https?://)?(?:www\\.)?dailymotion\\.com/video/([\\w\\d]{6})(?:_.*)?");
Pattern VIMEO = Pattern.compile("(?:https?://)?(?:www\\.)?vimeo\\.com/([\\d]+)");

Matcher y = YOUTUBE.matcher(link);
Matcher d = DAILYMOTION.matcher(link);
Matcher v = VIMEO.matcher(link);

if (y.matches())
return 'y';
else if(d.matches())
return 'd';
else if(v.matches())
return 'v';
else
return '\u0000';

}

public static String getVideoId(String link, char link_type){

Pattern YOUTUBE = Pattern.compile("https?://(?:www\\.)?(?:youtu\\.be/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)[?=&+%\\w\\-]*");
Pattern DAILYMOTION = Pattern.compile("https?://(?:www\\.)?dailymotion\\.com/video/([\\w\\d]{6})(?:_.*)?");
Pattern VIMEO = Pattern.compile("https?://(?:www\\.)?vimeo\\.com/([\\d]+)");

Matcher m;
String videoId = "";
if(link_type == 'y'){
m = YOUTUBE.matcher(link);
if(m.find()){
videoId = m.group(1);
}
}
else if(link_type == 'd'){
m = DAILYMOTION.matcher(link);
if(m.find()){
videoId = m.group(1);
}
}
else if(link_type == 'v'){
m = VIMEO.matcher(link);
if(m.find()){
videoId = m.group(1);
Logger.info("MGROUP: " + m.group(1));
}
}

return videoId;
}

public static String getThumb(String video_id, char link_type){

if(link_type == 'y'){
return "http://img.youtube.com/vi/" + video_id + "/1.jpg";
}
else if(link_type =='d'){
return "http://www.dailymotion.com/thumbnail/160x120/video/" + video_id + "/";
}
else if(link_type =='v'){
String info_url = "http://www.vimeo.com/api/v2/video/" + video_id + ".json";
String json_text = jsonStringFromUrl(info_url);

Logger.info("JSON TEXT: " + json_text);

JsonParser parser = new JsonParser();

JsonArray json_array = (JsonArray)parser.parse(json_text);
JsonElement json_element = json_array.get(0);

JsonObject json_object = (JsonObject)parser.parse(json_element.toString());


return json_object.get("thumbnail_small").getAsString();

}

return "blah";
}

public static String jsonStringFromUrl (String url){

String json_text = "";
try{
URL json_url = new URL(url);

Logger.info("URL: " + url);

InputStream inputstream = json_url.openStream();
InputStreamReader is_reader = new InputStreamReader(inputstream, Charset.forName("UTF-8"));
BufferedReader b_reader = new BufferedReader(is_reader);

json_text = readerToString(b_reader);

} catch (MalformedURLException e){
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
}


return json_text;
}

private static String readerToString(Reader reader) {
StringBuilder builder = new StringBuilder();

try{
int i = 0;
while ((i = reader.read()) != -1) {
builder.append((char) i);
}
} catch (IOException e){
e.printStackTrace();
}

return builder.toString();
}

private static boolean isValidVideo(String link){
WS web_serv = new WS();
WS.WSRequest ws_request = web_serv.url(link);
WS.HttpResponse response = ws_request.get();

if(response.getStatus() == 200 || response.getStatus() == 301)
return true;
else
return false;
}

public static void addComment(long vid_id, String comment){
LinkedVideo vid = LinkedVideo.findById(vid_id);
vid.addComment(user(), comment);

showLinkedVideo(vid_id);
}

public static void removeComment(long comment_id){
Comment com = Comment.findById(comment_id);
LinkedVideo vid = (LinkedVideo) com.parentObj;
if (!com.owner.equals(user()))
forbidden();
com.delete();

showLinkedVideo(vid.id);

}

public static void removeLinkedVideo(long video_id){
LinkedVideo vid = LinkedVideo.findById(video_id);
User owner = vid.owner;
if (!owner.equals(user()))
forbidden();
List<Comment> comments = vid.comments();

for(int i = 0; i < comments.size(); i++){
Comment comment = comments.remove(i);
comment.delete();
}
vid.delete();

listLinkedVideos(owner.id);
}



}
77 changes: 77 additions & 0 deletions app/models/LinkedVideo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package models;

import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;
import play.data.validation.*;
import java.util.regex.*;

@Entity
public class LinkedVideo extends Post {

@Required
@URL public String link;

public int link_type;
public String video_id;

public String thumbnail_url;

@Required
public String title;

public String caption;

@Required
@ManyToOne
@JoinTable(name="LinkedVideoToUser")
public User owner;


public LinkedVideo(User owner, String title, String link, String caption, int link_type, String video_id){
super(owner, owner, "");
this.title = title;
this.owner = owner;
this.link = link;
this.caption = caption;
this.link_type = link_type;
this.video_id = video_id;

}

public void addCaption(String caption){
this.caption = caption;
}
// 1 = small 2 = big
protected String getEmbedHtml(int size){

if(size == 1){
if(link_type == 'y')
return "<iframe class=\"youtube-player\" type=\"text/html\" width=\"420\" height=\"255\" src=\"http://www.youtube.com/embed/" + video_id + "\" frameborder=\"0\"> </iframe>";
else if (link_type == 'd')
return "<iframe src=\"http://www.dailymotion.com/embed/video/" + video_id + "/\" width=\"420\" height=\"255\" frameborder=\"0\"></iframe>";
else if(link_type == 'v')
return "<iframe src=\"http://player.vimeo.com/video/" + video_id + "\" width=\"420\" height=\"255\" frameborder=\"0\" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>";
else
return "";
}
else if(size == 2){
if(link_type == 'y')
return "<iframe class=\"youtube-player\" type=\"text/html\" width=\"560\" height=\"340\" src=\"http://www.youtube.com/embed/" + video_id + "\" frameborder=\"0\"> </iframe>";
else if (link_type == 'd')
return "<iframe src=\"http://www.dailymotion.com/embed/video/" + video_id + "/\" width=\"560\" height=\"340\" frameborder=\"0\"></iframe>";
else if(link_type == 'v')
return "<iframe src=\"http://player.vimeo.com/video/" + video_id + "\" width=\"560\" height=\"340\" frameborder=\"0\" webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>";
}

return "";
}

public List<Comment> comments() {
return Comment.find("parentObj = ? order by createdAt asc", this).fetch();
}




}
4 changes: 4 additions & 0 deletions app/models/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,10 @@ public Profile getProfile(){
@ElasticSearchIgnore
@OneToMany(mappedBy="owner")
public Set<Question> questions;

@ElasticSearchIgnore
@OneToMany(mappedBy = "owner", cascade=CascadeType.ALL)
public List<LinkedVideo> videos; //videos of the user

@OneToMany(mappedBy = "subscriber", cascade = CascadeType.ALL)
public List<RSSFeed> feeds;
Expand Down
Loading