/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.marmotta.ldclient.provider.youtube;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.http.NameValuePair;
import org.apache.http.client.utils.URLEncodedUtils;
import org.apache.marmotta.ldclient.api.endpoint.Endpoint;
import org.apache.marmotta.ldclient.api.ldclient.LDClientService;
import org.apache.marmotta.ldclient.api.provider.DataProvider;
import org.apache.marmotta.ldclient.exception.DataRetrievalException;
import org.apache.marmotta.ldclient.model.ClientResponse;
import org.openrdf.model.Resource;
import org.openrdf.model.impl.URIImpl;
import org.openrdf.repository.Repository;
import org.openrdf.repository.RepositoryConnection;
import org.openrdf.repository.RepositoryException;
import org.openrdf.repository.sail.SailRepository;
import org.openrdf.sail.memory.MemoryStore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Date;
import java.util.List;
/**
* A data provider that allows to wrap the different Youtube Videos pages, linking with the actual
* entity
*
* @author Sebastian Schaffert
* @author Sergio Fernández
*/
public class YoutubeVideoPagesProvider implements DataProvider {
private static final String YOUTUBE_V = "http://www.youtube.com/v/";
private static final String YOUTUBE_WATCH = "http://www.youtube.com/watch";
private static final String YOUTUBE_GDATA = "http://gdata.youtube.com/feeds/api/videos/";
private static final String FOAF_PRIMARY_TOPIC = "http://xmlns.com/foaf/0.1/primaryTopic";
private static Logger log = LoggerFactory.getLogger(YoutubeVideoPagesProvider.class);
@Override
public String getName() {
return "YouTube Page";
}
@Override
public String[] listMimeTypes() {
return new String[] {
"text/html"
};
}
@Override
public ClientResponse retrieveResource(String resource, LDClientService client, Endpoint endpoint) throws DataRetrievalException {
Repository triples = new SailRepository(new MemoryStore());
RepositoryConnection conn;
try {
triples.initialize();
conn = triples.getConnection();
} catch (RepositoryException e) {
String msg = "Error initializing in-memory repository connection: " + e.getMessage();
log.error(msg);
throw new RuntimeException(msg, e);
}
String uri = resource;
URI objUri;
try {
objUri = new URI(uri);
} catch (URISyntaxException e) {
throw new RuntimeException("URI '" + uri + "'could not be parsed, it is not a valid URI");
}
String video_id = null;
if (uri.startsWith(YOUTUBE_V)) { // YouTube short watch video URL
String[] p_components = objUri.getPath().split("/");
video_id = p_components[p_components.length - 1];
} else if (resource.startsWith(YOUTUBE_WATCH)) { // YouTube watch video URL
List<NameValuePair> params = URLEncodedUtils.parse(objUri, "UTF-8");
for (NameValuePair pair : params) {
if ("v".equals(pair.getName())) {
video_id = pair.getValue();
break;
}
}
} else if (uri.startsWith(YOUTUBE_GDATA)) { // GData URI
video_id = StringUtils.removeStart(uri, YOUTUBE_GDATA);
}
if (StringUtils.isBlank(video_id)) {
String msg = "Not valid video id found in '" + uri + "'";
log.error(msg);
throw new DataRetrievalException(msg);
} else {
try {
conn.add(new URIImpl(uri), new URIImpl(FOAF_PRIMARY_TOPIC), new URIImpl(YoutubeVideoProvider.YOUTUBE_BASE_URI + video_id), (Resource)null);
// FIXME: add inverse triple, but maybe at the YoutubeVideoProvider
conn.close();
} catch (RepositoryException e) {
String msg = "Error adding triples: " + e.getMessage();
log.error(msg);
throw new RuntimeException(msg, e);
}
ClientResponse clientResponse = new ClientResponse(200, triples);
clientResponse.setExpires(DateUtils.addYears(new Date(), 10));
return clientResponse;
}
}
}