/*
   * 너무 복잡하면 힘들다.
   * 여기서 하던 filtering은 밖으로 뺀다.
   * 그리고 여기서 처리하던 limit, ioexception, 그외 exception도 밖으로 뺀다.
   * db insertion도 밖으로 뺀다.
   * 즉, 여기서는 무조건 값만 받고, 자연스럽게 또는 exception에 의해 return한다.
   * 2차 exception은 애초에 여기서 바로 다시 시도하는 것이 아니기 때문에 고려할 필요 없다.
   *
   * result, exception 정리를 위해 result exception throw로 return 단일화한다.
   */
  public Result getListFromTag(String tag, Range<Long> range) {
    Result.Status status =
        Result.Status.Empty; // default는 not exception으로서 entire range travelled를 뜻한다.
    List<MediaFeedData> result =
        new ArrayList<MediaFeedData>(); // 값 유지를 위해 공간은 만들어두어야 한다. TODO: 다시 확인.

    // TODO: RANGE NULL CHECK 일단 뺐는데, 필요할지 확인.
    long from = range.getMinimum();
    long to = range.getMaximum();

    try {
      // library가 object 구조를 좀 애매하게 해놓아서, 바로 loop 하기보다, 1 cycle은 직접 작성해주는 구조가 되었다.
      TagMediaFeed list = instagram.getRecentMediaTags(tag, null, String.valueOf(to));
      Pagination page = list.getPagination();
      List<MediaFeedData> data = list.getData();

      if (!addFilteredData(result, data, from, to)) { // filter가 안되어야만 다음으로 넘어가고, 아니면 그냥 그대로 끝이다.
        if (page.hasNextPage()) {
          MediaFeed nextList = instagram.getRecentMediaNextPage(page);
          Pagination nextPage = nextList.getPagination();
          List<MediaFeedData> nextData = nextList.getData();

          while (true) {
            if (!addFilteredData(
                result, nextData, from, to)) { // filter가 안되어야만 다음으로 넘어가고, 아니면 그냥 그대로 끝이다.
              if (result != null && result.size() > BATCH) {
                throw new Exception(); // TODO: 밑으로 내려가는지 확인.
              }

              if (nextPage.hasNextPage()) {
                nextList = instagram.getRecentMediaNextPage(nextPage);
                nextPage = nextList.getPagination();
                nextData = nextList.getData();
              } else {
                break;
              }
            } else { // if 자체가 while 안에서 실행되어야 되기 때문에 이렇게 else에서 break 걸어줘야 한다.
              break;
            }
          }
        }
      }
    } catch (Exception e) { // 아래의 단계를 거치게 해야 task loop에서의 처리가 깔끔해진다.
      status = Result.Status.Normal; // 기본적으로 normal.

      if (e instanceof InstagramException) { // 만약 insta exception이라면 exceed로 간주.
        status = Result.Status.Exceed;
      }

      if (result != null && !result.isEmpty()) { // 그런데 만약 full travel이라면 empty로 간주.
        long id = extractId(result.get(result.size() - 1).getId());

        if (id == range.getMinimum()) {
          status = Result.Status.Empty;
        }
      }
    }

    return new Result(status, result);
  }
Example #2
0
  public static void searchPlaces(Instagram instagram, double latitude, double longitude)
      throws Exception {
    int[] distancia = {10, 15, 20, 25};

    MediaFeed feed = instagram.searchMedia(latitude, longitude, null, null, 5000);
    List<MediaFeedData> feeds = feed.getData();
    for (MediaFeedData data : feeds) {
      System.out.printf(
          "Instagram -- Nombre: %s, latitud: %f, longitud: %f\n",
          data.getLocation().getName(),
          data.getLocation().getLatitude(),
          data.getLocation().getLongitude());
      for (int i = 0; i < 4; i++) {
        System.out.println("CON DISTANCIA " + distancia[i]);
        System.out.println();

        ArrayList<Place> places =
            PlacesService.search(
                "",
                data.getLocation().getLatitude(),
                data.getLocation().getLongitude(),
                distancia[i]);
        for (Place place : places) {
          System.out.printf(
              "\tGoogle Places -- Nombre: %s, latitud: %f, longitud: %f, tipos: %s\n",
              place.name, place.latitude, place.longitude, place.types);
        }
        System.out.println();
      }
    }
  }
Example #3
0
  // Usar timestamps para los parametros
  public static void searchMedia(
      Instagram instagram, long fechaInicio, long fechaFin, double latitude, double longitude)
      throws Exception {

    PrintWriter writer = new PrintWriter("output.txt", "UTF-8");
    writer.println("userId;userName;mediaId;tags;createdTime;locationName;latitude;longitude");

    while (fechaInicio < fechaFin) {
      Date minTimeStamp = new Date((long) fechaInicio * 1000);
      Date maxTimeStamp = new Date((long) (fechaInicio + 3600) * 1000);

      System.out.println(minTimeStamp.toString());
      MediaFeed feed = instagram.searchMedia(latitude, longitude, maxTimeStamp, minTimeStamp, 5000);
      List<MediaFeedData> feeds = feed.getData();

      for (MediaFeedData data : feeds) {
        String line = "";

        String userId = data.getUser().getId();
        String userName = data.getUser().getUserName();
        String mediaId = data.getUser().getId();
        String tags = data.getTags().toString();
        String createdTime = data.getCreatedTime();
        String locationName = data.getLocation().getName();
        String locationLatitude = String.valueOf(data.getLocation().getLatitude());
        String locationLongitude = String.valueOf(data.getLocation().getLongitude());

        line +=
            userId
                + ";"
                + userName
                + ";"
                + mediaId
                + ";"
                + tags
                + ";"
                + createdTime
                + ";"
                + locationName
                + ";"
                + locationLatitude
                + ";"
                + locationLongitude;
        writer.println(line);
      }

      fechaInicio += 3600;
    }

    writer.close();
  }
  // 아마 0일 때는 exception 날 수도 있을 것 같다.
  public int getRateRemaining() {
    int remaining = -1;

    try {
      MediaFeed mediaFeed = instagram.getUserFeeds();

      if (mediaFeed != null) { // 혹시 모르니 해준다.
        remaining =
            mediaFeed.getRemainingLimitStatus(); // 여기서도 exception 날 수 있으니 값을 바로 return하지 않는다.
      }
    } catch (InstagramException e) {
      Logger.getInstance().printException(e);
    }

    return remaining;
  }