Skip to content

Commit

Permalink
rss parser finished
Browse files Browse the repository at this point in the history
  • Loading branch information
Jilberta committed Jul 8, 2015
1 parent 0a320bd commit 5b940ad
Show file tree
Hide file tree
Showing 8 changed files with 130 additions and 24 deletions.
18 changes: 18 additions & 0 deletions src/main/java/ge/kuku/movie/parse/core/MovieDo.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public class MovieDo {
private String name;

private String imdbId;
private String language;
private String quality;
private String source;

public String getName() {
Expand All @@ -35,4 +37,20 @@ public String getSource() {
public void setSource(String source) {
this.source = source;
}

public String getLanguage() {
return language;
}

public void setLanguage(String language) {
this.language = language;
}

public String getQuality() {
return quality;
}

public void setQuality(String quality) {
this.quality = quality;
}
}
23 changes: 15 additions & 8 deletions src/main/java/ge/kuku/movie/parse/core/ParserService.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package ge.kuku.movie.parse.core;

import ge.kuku.movie.parse.data.CompositeParser;
import ge.kuku.movie.parse.data.ImoviesEntity;
import ge.kuku.movie.parse.data.Parser;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@Path("parse")
@Consumes({MediaType.APPLICATION_JSON})
Expand All @@ -21,15 +23,20 @@ public Parser getParser() {

@POST
@Path("{id}")
public MovieDo parse(@PathParam("id") String id, @NotNull @Valid MovieDo movieDo) throws IOException {
String res = getParser().parse(movieDo.getName(), id);
if (res == null) {
public List<MovieDo> parse(@PathParam("id") String id, @NotNull @Valid MovieDo movieDo) throws IOException {
List<ImoviesEntity> movieList = getParser().parse(movieDo.getName(), id);
if (movieList == null) {
throw new WebApplicationException(404);
}
movieDo.setName(movieDo.getName());
movieDo.setImdbId(id);
movieDo.setSource(res);
return movieDo;

List<MovieDo> doList = new ArrayList<>();
for (ImoviesEntity imoviesEntity : movieList) {
MovieDo movieDo1 = imoviesEntity.toMovieDo();
movieDo1.setName(movieDo.getName());
movieDo1.setImdbId(id);
doList.add(movieDo1);
}
return doList;
}

}
4 changes: 2 additions & 2 deletions src/main/java/ge/kuku/movie/parse/data/CompositeParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ public static CompositeParser instance() {
}

@Override
public String parse(String movieName, String imdbId) throws IOException {
public List parse(String movieName, String imdbId) throws IOException {
for (Parser parser : childParsers) {
String res = parser.parse(movieName, imdbId);
List res = parser.parse(movieName, imdbId);
if (res != null) {
return res;
}
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/ge/kuku/movie/parse/data/ImoviesEntity.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package ge.kuku.movie.parse.data;

import ge.kuku.movie.parse.core.MovieDo;

public class ImoviesEntity {
private String imoviesId;
private String imdbId;
Expand Down Expand Up @@ -55,4 +57,13 @@ public String getSource() {
public void setSource(String source) {
this.source = source;
}

public MovieDo toMovieDo() {
MovieDo movieDo = new MovieDo();
movieDo.setSource(source);
movieDo.setLanguage(language);
movieDo.setQuality(quality);

return movieDo;
}
}
64 changes: 56 additions & 8 deletions src/main/java/ge/kuku/movie/parse/data/ImoviesParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,25 +13,26 @@
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ImoviesParser implements Parser {

private String jsonApi = "http://www.imovies.ge/services/films/search_new.json.php?term=";
private String rssApi = "http://www.imovies.ge/get_playlist_jwQ_html5.php";

@Override
public String parse(String movieName, String imdbId) throws IOException {
public List parse(String movieName, String imdbId) throws IOException {
List<String> urls = possibleUrlsContaining(movieName);
String pageUrl = whichPageContains(imdbId, urls);
String imoviesId = getImoviesId(pageUrl);
parseRss(imoviesId);
return imoviesId;
System.out.println(imoviesId);
return parseRss(imoviesId);
}

private List<String> possibleUrlsContaining(String movieName) throws IOException {
List<String> urls = new ArrayList<>();
URL url = new URL(jsonApi+movieName.toLowerCase());
System.out.println(url);

ObjectMapper mapper = new ObjectMapper();
JsonNode actualObj = mapper.readTree(url.openStream());
Expand Down Expand Up @@ -73,13 +74,60 @@ private String getImoviesId(String pageUrl) {
return pageUrl.substring(idIndex);
}

private void parseRss(String imoviesId) {
String rssText = null;
private List parseRss(String imoviesId) {
List res = null;
try {
rssText = Unirest.get(rssApi).queryString("movie_id",imoviesId).asString().getBody();
String rssText = Unirest.get(rssApi).queryString("movie_id",imoviesId).asString().getBody();
res = getSources(rssText);
} catch (UnirestException e) {
e.printStackTrace();
}
System.out.println(rssText);
return res;
}

Pattern containsAllRecords = Pattern.compile(".*<jwplayer:source.*");
Pattern containsVideoLangData = Pattern.compile("(?<=lang=\\\")((.*?)(?=\\\"))");
Pattern containsQualityData = Pattern.compile("(?<=label=\\\")((.*?)(?=\\\"))");

private List getSources(String rssContent) {
List<ImoviesEntity> movieList = new ArrayList<>();

Matcher matchLinesToParse = containsAllRecords.matcher(rssContent);
while (matchLinesToParse.find()) {
String matched = matchLinesToParse.group();

String quality = null;
Matcher m = containsQualityData.matcher(matched);
if (m.find()) {
quality = m.group();
}

m = containsVideoLangData.matcher(matched);
while (m.find()) {
String videoData = m.group();
List<ImoviesEntity> sources = getVideoSourceAndLang(videoData);
for (ImoviesEntity entity : sources) {
entity.setQuality(quality);
movieList.add(entity);
}
}
}

return movieList;
}

private List getVideoSourceAndLang(String str) {
List list = new ArrayList<>();
String[] langsAndSources = str.split(",");
for (String langAndSource : langsAndSources) {
String[] arr = langAndSource.split("\\|");
String language = arr[0];
String videoSrc = arr[1];
ImoviesEntity imoviesEntity = new ImoviesEntity();
imoviesEntity.setLanguage(language);
imoviesEntity.setSource(videoSrc);
list.add(imoviesEntity);
}
return list;
}
}
3 changes: 2 additions & 1 deletion src/main/java/ge/kuku/movie/parse/data/Parser.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
package ge.kuku.movie.parse.data;

import java.io.IOException;
import java.util.List;

public interface Parser {

String parse(String movieName, String imdbId) throws IOException;
List parse(String movieName, String imdbId) throws IOException;
}
20 changes: 18 additions & 2 deletions src/test/FakeParser.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,25 @@
import ge.kuku.movie.parse.core.MovieDo;
import ge.kuku.movie.parse.data.ImoviesEntity;
import ge.kuku.movie.parse.data.Parser;

import java.util.*;

public class FakeParser implements Parser {

Map inMemory = new HashMap<>();

@Override
public String parse(String movieName, String imdbId) {
return "asd";
public List parse(String movieName, String imdbId) {
ImoviesEntity val = (ImoviesEntity) inMemory.get(movieName);
if (val == null){
return Collections.emptyList();
}
List l = new ArrayList();
l.add(val);
return l;
}

public void addItem(String movieName, ImoviesEntity movieDo) {
inMemory.put(movieName, movieDo);
}
}
11 changes: 8 additions & 3 deletions src/test/TestParserService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import ge.kuku.movie.parse.core.MovieDo;
import ge.kuku.movie.parse.core.ParserService;
import ge.kuku.movie.parse.data.CompositeParser;
import ge.kuku.movie.parse.data.ImoviesEntity;
import org.glassfish.jersey.server.ResourceConfig;
import org.glassfish.jersey.test.JerseyTest;
import org.junit.Rule;
Expand All @@ -12,6 +13,8 @@
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import java.util.List;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;

Expand Down Expand Up @@ -41,11 +44,13 @@ public void expect_400_1() {
@Test
public void correctParams() {
CompositeParser.instance().removeAll();
CompositeParser.instance().add(new FakeParser());
FakeParser parser = new FakeParser();
parser.addItem("Interstellar", new ImoviesEntity());
CompositeParser.instance().add(parser);

MovieDo mDo = new MovieDo();
mDo.setName("Interstellar");
MovieDo actual = target("parse/tt0816692").request().post(Entity.entity(mDo, MediaType.APPLICATION_JSON)).readEntity(MovieDo.class);
assertFalse(actual.getName().isEmpty());
MovieDo[] actual = target("parse/tt0816692").request().post(Entity.entity(mDo, MediaType.APPLICATION_JSON)).readEntity(MovieDo[].class);
assertFalse(actual.length == 0);
}
}

0 comments on commit 5b940ad

Please sign in to comment.