tweetlr 0.1.11 → 0.1.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -27,6 +27,7 @@ module Processors
27
27
  url = image_url_tco link, embedly_key if link.index 't.co'
28
28
  url = image_url_lockerz link if link.index 'lockerz.com'
29
29
  url = image_url_path link if link.index 'path.com'
30
+ url = image_url_foursqaure link if link.index '4sq.com'
30
31
  url = image_url_embedly link, embedly_key if url.nil? #just try embed.ly for anything else. could do all image url processing w/ embedly, but there's probably some kind of rate limit invovled.
31
32
  elsif photo? link
32
33
  url = link
@@ -37,20 +38,20 @@ module Processors
37
38
  def self.photo?(link)
38
39
  link =~ PIC_REGEXP
39
40
  end
40
-
41
+ #extract the image of a foursquare.com pic
42
+ def self.image_url_foursqaure(link_url)
43
+ service_url = link_url_redirect link_url #follow possible redirects
44
+ link_url = service_url if service_url #if there's no redirect, service_url will be nil
45
+ response = Processors::Http::http_get link_url
46
+ image_url = parse_html_for '.commentPhoto img', Nokogiri::HTML.parse(response.body_str)
47
+ return image_url
48
+ end
41
49
  #extract the image of a path.com pic
42
50
  def self.image_url_path(link_url)
43
51
  service_url = link_url_redirect link_url #follow possible redirects
44
52
  link_url = service_url if service_url #if there's no redirect, service_url will be nil
45
- image_url = nil
46
- html_response = Processors::Http::http_get link_url
47
- html_doc = Nokogiri::HTML.parse(html_response.body_str)
48
- if html_doc
49
- photo_container_div = html_doc.css("img.photo-image")
50
- if photo_container_div && photo_container_div.first && photo_container_div.first.attributes["src"]
51
- image_url = photo_container_div.first.attributes["src"].value
52
- end
53
- end
53
+ response = Processors::Http::http_get link_url
54
+ image_url = parse_html_for 'img.photo-image', Nokogiri::HTML.parse(response.body_str)
54
55
  return image_url
55
56
  end
56
57
 
@@ -144,5 +145,16 @@ module Processors
144
145
  def self.extract_id(link)
145
146
  link.split('/').last if link.split('/')
146
147
  end
148
+ #parse html doc for element signature
149
+ def self.parse_html_for(element_signature, html_doc)
150
+ image_url= nil
151
+ if html_doc
152
+ photo_container_div = html_doc.css(element_signature)
153
+ if photo_container_div && photo_container_div.first && photo_container_div.first.attributes["src"]
154
+ image_url = photo_container_div.first.attributes["src"].value
155
+ end
156
+ end
157
+ image_url
158
+ end
147
159
  end
148
160
  end
data/lib/tweetlr.rb CHANGED
@@ -9,7 +9,7 @@ require 'uri'
9
9
 
10
10
  class Tweetlr
11
11
 
12
- VERSION = '0.1.11'
12
+ VERSION = '0.1.12'
13
13
 
14
14
  API_ENDPOINT_TWITTER = 'http://search.twitter.com/search.json'
15
15
  API_ENDPOINT_TUMBLR = 'http://www.tumblr.com'
@@ -3,6 +3,7 @@ require 'spec_helper'
3
3
  describe Processors::PhotoService do
4
4
  before :each do
5
5
  @links = {
6
+ :foursquare => 'http://4sq.com/x4p87N',
6
7
  :path => 'http://path.com/p/KQd57',
7
8
  :instagram => "http://instagr.am/p/DzCWn/",
8
9
  :twitpic => "http://twitpic.com/449o2x",
@@ -20,12 +21,17 @@ describe Processors::PhotoService do
20
21
  link = Processors::PhotoService::find_image_url 'im mocked anyways'
21
22
  link.should == 'http://s3-media4.ak.yelpcdn.com/bphoto/py1D5XEyOHcOcg6GJD3SEQ/l.jpg'
22
23
  end
24
+ it "does find an image for foursquare that is not he profile pic" do
25
+ stub_foursquare
26
+ link = Processors::PhotoService::find_image_url @links[:foursquare]
27
+ link.index('userpix_thumbs').should_not be
28
+ end
23
29
  it "should find a picture's url from the supported services" do
24
30
  @links.each do |service,link|
25
31
  send "stub_#{service}"
26
32
  url = Processors::PhotoService::find_image_url link
27
33
  url.should be, "service #{service} not working!"
28
- check_pic_url_extraction service if [:instagram,:picplz,:yfrog,:imgly,:not_listed].index service
34
+ check_pic_url_extraction service if [:instagram,:picplz,:yfrog,:imgly,:foursqaure,:not_listed].index service
29
35
  end
30
36
  end
31
37
  it "finds path images for redirected moments as well" do
data/spec/spec_helper.rb CHANGED
@@ -427,4 +427,571 @@ def stub_path
427
427
  </html>^
428
428
  end
429
429
 
430
+ def stub_foursquare
431
+ Curl::Easy.any_instance.stub(:perform).and_return Curl::Easy.new
432
+ Curl::Easy.any_instance.stub(:body_str).and_return %^<?xml version="1.0" encoding="UTF-8"?>
433
+
434
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
435
+ <html xmlns:fb="http://www.facebook.com/2008/fbml" xmlns:og="http://opengraphprotocol.org/schema/" xmlns:lift="http://liftweb.net" xmlns="http://www.w3.org/1999/xhtml">
436
+ <head>
437
+ <meta content="text/html; charset=UTF-8" http-equiv="content-type" />
438
+ <meta content="foursquare" name="description" />
439
+ <meta content="foursquare" name="application-name" />
440
+
441
+ <meta content="Start the foursquare App" name="msapplication-tooltip" />
442
+ <meta content="/" name="msapplication-starturl" />
443
+ <meta content="width=1024;height=768" name="msapplication-window" />
444
+ <meta content="name=Recent Check-ins; action-uri=/; icon-uri=/favicon.ico" name="msapplication-task" />
445
+ <meta content="name=Profile;action-uri=/user;icon-uri=/favicon.ico" name="msapplication-task" />
446
+ <meta content="name=History;action-uri=/history;icon-uri=/favicon.ico" name="msapplication-task" />
447
+ <meta content="name=Badges;action-uri=/badges;icon-uri=/favicon.ico" name="msapplication-task" />
448
+ <meta content="name=Stats;action-uri=/stats;icon-uri=/favicon.ico" name="msapplication-task" />
449
+
450
+
451
+ <title>foursquare :: Sven @ kopiba</title>
452
+ <link href="https://static-s.foursquare.com/favicon-c62b82f6120e2c592a3e6f3476d66554.ico" type="image/x-icon" rel="icon" />
453
+ <link href="https://static-s.foursquare.com/favicon-c62b82f6120e2c592a3e6f3476d66554.ico" type="image/x-icon" rel="shortcut icon" />
454
+ <link href="https://static-s.foursquare.com/img/touch-icon-ipad-1d5a99e90171f6a0cc2f74920ec24021.png" sizes="72x72" rel="apple-touch-icon-precomposed" />
455
+ <link href="https://playfoursquare.s3.amazonaws.com/press/logo/foursquare-logo.svg" type="image/svg" rel="logo" />
456
+ <link href="https://static-s.foursquare.com/opensearch-6b463ddc6a73b41a3d4b1c705d814fcf.xml" title="foursquare" type="application/opensearchdescription+xml" rel="search" />
457
+
458
+ <link href="https://static-s.foursquare.com/styles/reset-ba1d59b0e53d380b12b3e97a428b3314.css" type="text/css" rel="stylesheet" />
459
+ <link href="https://static-s.foursquare.com/facebox/facebox-29383c5fc530ed391a05276abeb1959a.css" type="text/css" rel="stylesheet" />
460
+
461
+
462
+
463
+ <link href="https://static-s.foursquare.com/styles/master-redesign-e811ecb709c2414dbd8bbb382f312aa1.css" type="text/css" rel="stylesheet" />
464
+
465
+
466
+
467
+
468
+
469
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript" id="jquery"></script>
470
+
471
+
472
+
473
+
474
+ <script type="text/javascript">
475
+ var _kmq = _kmq || [];
476
+ function _kms(u){
477
+ setTimeout(function(){
478
+ var s = document.createElement('script'); var f = document.getElementsByTagName('script')[0]; s.type = 'text/javascript'; s.async = true;
479
+ s.src = u; f.parentNode.insertBefore(s, f);
480
+ }, 1);
481
+ }
482
+ // Use this for dev
483
+ //_kms('//i.kissmetrics.com/i.js');_kms('//doug1izaerwt3.cloudfront.net/0c1574f4c7da92b07e34862fcc6c505d531a957c.1.js');
484
+ </script>
485
+
486
+
487
+ <script type="text/javascript">
488
+ // Use this for production
489
+ _kms('//i.kissmetrics.com/i.js');_kms('//doug1izaerwt3.cloudfront.net/033f1ff04dc072af9d77e05e3fe10ed9b6ea4fcf.1.js');
490
+ </script>
491
+
492
+
493
+
494
+ <script src="https://static-s.foursquare.com/scripts/build/en/chrome/root-d0d815376f0111b37b1b2f3786ff5314.js" type="text/javascript"></script>
495
+ <script src="https://static-s.foursquare.com/scripts/build/en/foursquare/root-5c88202943112aa3305dcb2f9425a601.js" type="text/javascript"></script>
496
+
497
+
498
+
499
+
500
+
501
+
502
+
503
+
504
+
505
+
506
+
507
+
508
+
509
+ <script type="text/javascript">
510
+ (function() {
511
+ window.fourSq = window.fourSq || {};
512
+ window.fourSq.api = window.fourSq.api || {};
513
+ window.fourSq.fb = window.fourSq.fb || {};
514
+ window.fourSq.user = window.fourSq.user || {};
515
+ window.fourSq.debugLevel = function() { return fourSq.debug.Level.OFF; };
516
+
517
+ /**
518
+ * Setup API domain and token
519
+ */
520
+ window.fourSq.api.config = {
521
+ API_BASE: 'https://api.foursquare.com/',
522
+ API_TOKEN: 'QEJ4AQPTMMNB413HGNZ5YDMJSHTOHZHMLZCAQCCLXIX41OMP',
523
+ API_IFRAME: 'https://api.foursquare.com/xdreceiver.html',
524
+ CLIENT_VERSION: '20111109'
525
+ };
526
+
527
+ /**
528
+ * Useful values for current user.
529
+ */
530
+ window.fourSq.user.config = {
531
+ USER_PROFILE: undefined,
532
+ USER_LAT: 0,
533
+ USER_LNG: 0,
534
+ // Only used for display.
535
+ SU6: false,
536
+ LOCALE: 'en_US'
537
+ };
538
+
539
+ window.fourSq.fb.config = {
540
+ APP_ID: 86734274142,
541
+ SCOPE: 'offline_access,publish_stream,user_checkins,friends_checkins,user_location,user_birthday'
542
+ };
543
+
544
+ document.domain = 'foursquare.com';
545
+ })();
546
+ </script>
547
+
548
+
549
+
550
+ <script type="text/javascript">
551
+ $(function() {
552
+ $('a[rel*=facebox]').facebox();
553
+ $('.linkify').linkify();
554
+
555
+ var search = $('#search input').placeholder();
556
+ if ($.trim(search.val()) != '') {
557
+ search.keydown();
558
+ }
559
+ })
560
+ </script>
561
+
562
+
563
+
564
+
565
+ <meta content="NOINDEX" name="ROBOTS" />
566
+
567
+
568
+ <script src="https://maps.google.com/maps/api/js?sensor=false" type="text/javascript"></script>
569
+
570
+
571
+ <script src="https://static-s.foursquare.com/scripts/build/en/foursquare/comments-be605309e291ccdcaa2c7d2645743741.js" type="text/javascript"></script>
572
+
573
+
574
+ <script src="https://static-s.foursquare.com/scripts/build/en/foursquare/checkin-detail-page-2d377f73b6d6318b813cc6db39651fff.js" type="text/javascript"></script>
575
+
576
+
577
+ <script type="text/javascript">
578
+ $(function() {
579
+ var options = {
580
+ el: $('body')
581
+ }
582
+
583
+ options['lat'] = 53.558831084738;
584
+ options['lng'] = 9.963698387145996;
585
+ options['fuzzy'] = false;
586
+ options['venue'] = {"id":"v4b169255f964a52072ba23e3","venue":{"id":"4b169255f964a52072ba23e3","name":"kopiba","contact":{"phone":"4940343824","formattedPhone":"040\/343824","twitter":"kopiba"},"location":{"address":"Beim Grünen Jäger 24","lat":53.558831084738,"lng":9.963698387145996,"postalCode":"20357","city":"Hamburg","country":"Germany"},"categories":[{"id":"4bf58dd8d48988d16d941735","name":"Café","pluralName":"Cafés","shortName":"Café","icon":{"prefix":"https:\/\/foursquare.com\/img\/categories\/food\/cafe_","sizes":[32,44,64,88,256],"name":".png"},"primary":true}],"verified":true,"stats":{"checkinsCount":2903,"usersCount":478,"tipCount":26}}};
587
+
588
+
589
+
590
+ options['checkinId'] = '4f0c401ae4b020a8d96fb0b1';
591
+
592
+
593
+ if(typeof FRIENDS_PHOTOS_JSON != 'undefined') {
594
+ options = _.extend(options, {friendsPhotosJson: FRIENDS_PHOTOS_JSON});
595
+ }
596
+
597
+ if(typeof STREAM_PHOTOS_JSON != 'undefined') {
598
+ options = _.extend(options, {streamPhotosJson: STREAM_PHOTOS_JSON});
599
+ }
600
+
601
+ new fourSq.views.CheckinDetailPage(options);
602
+ });
603
+ </script>
604
+
605
+
606
+ </head>
607
+ <body>
608
+
609
+
610
+
611
+ <div id="wrapper">
612
+
613
+
614
+ <div id="header">
615
+
616
+
617
+
618
+ <div class="wrap loggedOut translate">
619
+ <a id="logo" href="/">foursquare</a>
620
+ <form id="search" method="get" action="/search">
621
+ <input placeholder="Search people and places..." name="q" type="text" />
622
+ <button>Search</button>
623
+ </form>
624
+ <div id="loginLink"><a href="/login">Log in</a></div>
625
+ <div id="menu"><a href="/signup">Sign up</a></div>
626
+ </div>
627
+
628
+ </div>
629
+ <div id="lift__noticesContainer__"></div>
630
+
631
+
632
+
633
+
634
+
635
+ <div class="translate wrap" id="signupPrompt">
636
+ <h3>foursquare helps you keep up with friends, discover what's nearby, save money &amp; unlock rewards</h3>
637
+ <a class="greenButton biggerButton" href="/signup/?source=nav">Get Started Now</a>
638
+ <iframe scrolling="no" allowTransparency="true" src="https://www.facebook.com/plugins/facepile.php?app_id=86734274142&amp;amp;width=600&amp;amp;max_rows=1" style="border:none; overflow:hidden; width:600px; height: 70px;" frameborder="0"></iframe>
639
+ </div>
640
+
641
+ <style type="text/css">
642
+ #loginBeforeActionPopup {
643
+ padding: 10px;
644
+ width: 500px;
645
+ }
646
+ #loginBeforeActionPopup h2 {font-size: 21px;}
647
+ #loginBeforeActionPopup #signupPopup {}
648
+ #loginBeforeActionPopup #signupPopup p {
649
+ float: left;
650
+ line-height: 18px;
651
+ margin: 15px 0;
652
+ padding-top: 2px;
653
+ width: 330px;
654
+ }
655
+ #loginBeforeActionPopup #signupPopup .newGreenButton {
656
+ font-size: 18px;
657
+ height: 40px;
658
+ float: right;
659
+ line-height: 40px;
660
+ margin: 15px 0;
661
+ text-transform: none;
662
+ width: 140px;
663
+ }
664
+ #loginBeforeActionPopup #loginPopup {
665
+ border-top: 1px solid #d9d9d9;
666
+ padding-top: 10px;
667
+ }
668
+ #loginBeforeActionPopup #loginPopup .linkStyle {
669
+ border: none;
670
+ background: none;
671
+ color: #2398c9;
672
+ cursor: pointer;
673
+ font: inherit;
674
+ font-weight: bold;
675
+ padding: 0;
676
+ margin: 0;
677
+ }
678
+ #loginBeforeActionPopup #loginPopup .linkStyle:hover {text-decoration: underline;}
679
+ </style>
680
+
681
+ <div style="display:none;" class="translate" id="loginBeforeActionPopup">
682
+
683
+ <h2 class="newh2">Join foursquare to <span id="loginActionLabel">do that</span></h2>
684
+ <form method="POST" action="/signup/pre-signup">
685
+ <input value="" type="hidden" name="actionKey" id="loginActionKey" />
686
+ <input value="" type="hidden" name="source" id="loginSource" />
687
+ <input value="" type="hidden" name="continue" id="loginContinue" />
688
+ <div id="signupPopup">
689
+ <p>Foursquare helps you meet up with friends and find<br />new places to experience in your neighborhood.</p>
690
+ <input value="Get Started" name="signupSubmit" class="newGreenButton greenButton translate" type="submit" />
691
+ <div style="clear: both;"></div>
692
+ </div>
693
+ <div id="loginPopup">
694
+ <strong>Already a foursquare user?</strong> <input value="Log in" name="loginSubmit" class="linkStyle" type="submit" /> to continue.
695
+ </div>
696
+ </form>
697
+
698
+ </div>
699
+
700
+
701
+
702
+
703
+
704
+ <div class="wrap" id="container">
705
+
706
+
707
+
708
+
709
+
710
+
711
+
712
+
713
+
714
+ <div class="twoColumns" id="checkinPage">
715
+ <div class="wideColumn">
716
+
717
+
718
+ <div id="userCheckin">
719
+ <div id="userPic">
720
+ <a href="/sven_kr"><img src="https://img-s.foursquare.com/userpix_thumbs/ZXPGHBJTWWSTMXN1.jpg" alt="Sven K." width="110" class="notranslate" height="110" /></a>
721
+ </div>
722
+ <div id="userDetails">
723
+ <h2><a href="/sven_kr">Sven K.</a> checked in to <a href="/v/kopiba/4b169255f964a52072ba23e3">kopiba</a> </h2>
724
+ <p class="shout linkify">#coffeediary</p>
725
+
726
+ <p class="date">
727
+ 8 hours ago via <em><a href="https://foursquare.com/download/#/iphone">foursquare for iPhone</a></em>
728
+ </p>
729
+
730
+
731
+
732
+
733
+
734
+
735
+
736
+
737
+
738
+
739
+
740
+
741
+ </div>
742
+ </div>
743
+
744
+
745
+ <div>
746
+ <script type="text/javascript">
747
+ // <![CDATA[
748
+ var STREAM_PHOTOS_JSON = "{\"count\":1,\"items\":[{\"id\":\"4f0c4020e4b0261c93fd4ede\",\"createdAt\":1326202912,\"url\":\"https:\u005c/\u005c/img-s.foursquare.com\u005c/pix\u005c/NKFGXXX41TIQJA0P25ZYSUYKUUROQLLWGUXXSA5ABUQFDDYE.jpg\",\"sizes\":{\"count\":4,\"items\":[{\"url\":\"https:\u005c/\u005c/img-s.foursquare.com\u005c/pix\u005c/NKFGXXX41TIQJA0P25ZYSUYKUUROQLLWGUXXSA5ABUQFDDYE.jpg\",\"width\":537,\"height\":720},{\"url\":\"https:\u005c/\u005c/img-s.foursquare.com\u005c/derived_pix\u005c/NKFGXXX41TIQJA0P25ZYSUYKUUROQLLWGUXXSA5ABUQFDDYE_300x300.jpg\",\"width\":300,\"height\":300},{\"url\":\"https:\u005c/\u005c/img-s.foursquare.com\u005c/derived_pix\u005c/NKFGXXX41TIQJA0P25ZYSUYKUUROQLLWGUXXSA5ABUQFDDYE_100x100.jpg\",\"width\":100,\"height\":100},{\"url\":\"https:\u005c/\u005c/img-s.foursquare.com\u005c/derived_pix\u005c/NKFGXXX41TIQJA0P25ZYSUYKUUROQLLWGUXXSA5ABUQFDDYE_36x36.jpg\",\"width\":36,\"height\":36}\u005d},\"user\":{\"id\":\"304170\",\"firstName\":\"Sven\",\"lastName\":\"K.\",\"photo\":\"https:\u005c/\u005c/img-s.foursquare.com\u005c/userpix_thumbs\u005c/ZXPGHBJTWWSTMXN1.jpg\",\"gender\":\"male\",\"homeCity\":\"Hamburg, Germany\"},\"visibility\":\"friends\"}\u005d}";
749
+ // ]]>
750
+ </script>
751
+ <div id="comments">
752
+
753
+ <div id="4f0c4020e4b0261c93fd4ede" class="comment withPhoto">
754
+ <div class="commentLeft">
755
+ <a href="/sven_kr"><img src="https://img-s.foursquare.com/userpix_thumbs/ZXPGHBJTWWSTMXN1.jpg" alt="Sven K." width="60" class="notranslate" height="60" /></a>
756
+ </div>
757
+ <div class="commentPhoto">
758
+ <span title="Delete your image?" class="flagDelete">
759
+
760
+ </span>
761
+ <img src="https://img-s.foursquare.com/pix/NKFGXXX41TIQJA0P25ZYSUYKUUROQLLWGUXXSA5ABUQFDDYE.jpg" />
762
+ </div>
763
+ </div>
764
+
765
+ </div>
766
+
767
+
768
+
769
+
770
+
771
+
772
+
773
+
774
+ <div class="translate" id="cantComment">
775
+ Only <span class="notranslate">Sven's</span> friends can see comments and add their own.
776
+ </div>
777
+
778
+
779
+ </div>
780
+
781
+ </div>
782
+
783
+ <div class="narrowColumn">
784
+
785
+
786
+
787
+
788
+
789
+ <div id="venueDetails" class="box">
790
+ <div id="venueIcon">
791
+ <img src="https://static-s.foursquare.com/img/categories/food/cafe-f0c1523ad255a6e9e65e27c2ca02576c.png" class="thumb" />
792
+ <img src="https://static-s.foursquare.com/img/specials/check-in-f870bc36c0cc2a842fac06c35a6dccdf.png" class="specialImage" title="Check-in Special" />
793
+ </div>
794
+ <div class="vcard" id="venueName">
795
+ <h5 class="fn org"><a href="/v/kopiba/4b169255f964a52072ba23e3">kopiba</a></h5>
796
+ <p>Hamburg</p>
797
+ <div class="hiddenAddress">
798
+ <span class="adr"><span class="street-address">Beim Grünen Jäger 24</span><br /><span class="locality">Hamburg</span>, <span class="region"></span> <span class="postal-code">20357</span><br /><span class="tel">040/343824</span><br /></span>
799
+ </div>
800
+ </div>
801
+ <div id="listControlHolder"></div>
802
+ <div id="vmap"></div>
803
+
804
+ </div>
805
+
806
+
807
+ <div class="box">
808
+ <div class="statsBlock translate">
809
+ <div class="stat">
810
+ <strong>Total<br />People</strong><br /><span class="notranslate">478</span>
811
+ </div>
812
+ <div class="stat">
813
+ <strong>Total<br />Checkins</strong><br /><span class="notranslate">2903</span>
814
+ </div>
815
+ <div class="stat">
816
+ <strong>Here<br />Now</strong><br /><span class="notranslate">1</span>
817
+ </div>
818
+ </div>
819
+ </div>
820
+
821
+
822
+
823
+
824
+
825
+
826
+
827
+
828
+
829
+
830
+ </div>
831
+ <div style="clear: both;"></div>
832
+ </div>
833
+
834
+ <script type="text/javascript">
835
+ $('.delete').tooltip();
836
+ $('.flagDelete').tooltip();
837
+ </script>
838
+
839
+
840
+
841
+ <div id="containerFooter">
842
+ <div class="wideColumn">
843
+ <ul class="translate">
844
+ <li><a href="https://foursquare.com/about">About</a></li>
845
+ <li><a href="https://foursquare.com/apps">Apps</a></li>
846
+ <li><a href="http://blog.foursquare.com">Blog</a></li>
847
+ <li><a href="http://developers.foursquare.com">Developers</a></li>
848
+ <li><a href="http://foursquare.com/help">Help</a></li>
849
+ <li><a href="https://foursquare.com/jobs/">Jobs</a></li>
850
+ <li><a href="https://foursquare.com/legal/privacy">Privacy</a></li>
851
+ <li><a href="https://foursquare.com/legal/terms">Terms</a></li>
852
+ <li><a href="http://store.foursquare.com">Store</a></li>
853
+ <li>
854
+
855
+
856
+
857
+
858
+ <script type="text/javascript">
859
+ //<![CDATA[
860
+ // IMPORTANT: This is what does the redirect to the correct domain
861
+ fourSq.i18n.redirect();
862
+ // ]]>
863
+ </script>
864
+
865
+
866
+ <script type="text/javascript">
867
+ //<![CDATA[
868
+ $(function() {
869
+ $('#currentLanguage a').text(fourSq.i18n.currentLang());
870
+ });
871
+ // ]]>
872
+ </script>
873
+
874
+ <span id="currentLanguage">
875
+ <a rel="facebox" href="#languagesContainer"></a>
876
+ </span>
877
+
878
+ <div style="display:none" class="translate" id="languagesContainer">
879
+ Do none of the words on this site make sense to you? Select your
880
+ favorite language below for greater clarity:
881
+ <ul class="languages notranslate">
882
+ <li><a onclick="fourSq.i18n.setLang('en'); return false;" href="#">English</a></li><li><a onclick="fourSq.i18n.setLang('it'); return false;" href="#">Italiano</a></li><li><a onclick="fourSq.i18n.setLang('de'); return false;" href="#">Deutsch</a></li><li><a onclick="fourSq.i18n.setLang('es'); return false;" href="#">Español</a></li><li><a onclick="fourSq.i18n.setLang('fr'); return false;" href="#">Français</a></li><li><a onclick="fourSq.i18n.setLang('ja'); return false;" href="#">日本語</a></li><li><a onclick="fourSq.i18n.setLang('th'); return false;" href="#">ภาษาไทย</a></li><li><a onclick="fourSq.i18n.setLang('ko'); return false;" href="#">한국어</a></li><li><a onclick="fourSq.i18n.setLang('ru'); return false;" href="#">Русский</a></li><li><a onclick="fourSq.i18n.setLang('pt'); return false;" href="#">Português</a></li><li><a onclick="fourSq.i18n.setLang('id'); return false;" href="#">Bahasa Indonesia</a></li>
883
+ </ul>
884
+ </div>
885
+ </li>
886
+ </ul>
887
+ </div>
888
+ <div class="narrowColumn translate">
889
+ foursquare © 2011 <img src="https://static-s.foursquare.com/img/chrome/iconHeart-03e49accc507d9d99e7e4dfaa73868cb.png" height="9" width="11" alt="" /> Lovingly made in NYC &amp; SF
890
+ </div>
891
+ </div>
892
+ </div>
893
+ </div>
894
+
895
+ <div id="footer">
896
+ <div style="display: none;" class="wrap">
897
+ <p class="right">Discover more brands in the <a href="/pages">page gallery</a>.</p>
898
+ <p>Follow these brands to unlock badges and find interesting tips around your city!</p>
899
+
900
+
901
+ <ul><li><a href="/vh1"><img src="https://static-s.foursquare.com/img/footer/vh1-bb870b187d4e4378457e4a8e7df33e28.png" height="50" /></a></li><li><a href="/luckymagazine"><img src="https://static-s.foursquare.com/img/footer/luckymagazine-81550ed80bb77ddf9fa7e09c94ef4ac3.png" height="50" /></a></li><li><a href="/askmen"><img src="https://static-s.foursquare.com/img/footer/askmen-32a19bae424cafba11d7131fbc763f6d.png" height="50" /></a></li><li><a href="/eater"><img src="https://static-s.foursquare.com/img/footer/eater-5a8d27da22828104e13b0a4a50a74db8.png" height="50" /></a></li><li><a href="/joinred"><img src="https://static-s.foursquare.com/img/footer/joinred-6b8edbfec8aeb5e256f7824ca757cb81.png" height="50" /></a></li><li><a href="/bbcamerica"><img src="https://static-s.foursquare.com/img/footer/bbcamerica-d777b112c51696700dbd348e1b1e6817.png" height="50" /></a></li></ul>
902
+
903
+ </div>
904
+ </div>
905
+
906
+ <div id="overlayFrame">
907
+ <div id="overlayPage">
908
+ <div id="photoDetails">
909
+ <div class="wrap">
910
+ <img src="https://static-s.foursquare.com/img/gallery-next-4fe893b7a611387276ef45cd74632759.png" height="32" width="32" alt="" class="navControl" id="next" />
911
+ <img src="https://static-s.foursquare.com/img/gallery-prev-6da401eecb2e8a276e2a89bea5ac3819.png" height="32" width="32" alt="" class="navControl" id="previous" />
912
+ <img width="32" height="32" alt="" src="" id="userPic" />
913
+ <h5 id="userName"><a href="#"></a></h5>
914
+ <p id="date"></p>
915
+ </div>
916
+ </div>
917
+ <div id="mainPhoto"></div>
918
+
919
+ <div style="display:none" class="flagFrame unknown">
920
+ <div class="flagForm translate">
921
+ <h3>Flag this Photo</h3>
922
+ <ul>
923
+ <li><input id="spam_scam" value="spam_scam" type="radio" name="problem" /> <label for="spam_scam">Spam/Scam</label></li>
924
+ <li><input id="nudity" value="nudity" type="radio" name="problem" /> <label for="nudity">Nudity</label></li>
925
+ <li><input id="hate_violence" value="hate_violence" type="radio" name="problem" /> <label for="hate_violence">Hate/Violence</label></li>
926
+ <li><input id="illegal" value="illegal" type="radio" name="problem" /> <label for="illegal">Illegal</label></li>
927
+ <li><input id="unrelated" value="unrelated" type="radio" name="problem" /> <label for="unrelated">Unrelated</label></li>
928
+ </ul>
929
+ <p class="noProblemMessage">Please select a problem.</p>
930
+ <p><input class="submitFlag greenButton" value="Submit Flag" name="submitFlag" type="button" name="problem" /></p>
931
+ </div>
932
+ <div class="flagStatus translate">
933
+ <div class="status success">
934
+ <h3>Flag this Photo</h3>
935
+ <p>Your flag was submitted successfully.</p>
936
+ </div>
937
+ <div class="status failure">
938
+ <h3>Flag this Photo</h3>
939
+ <p>Your flag did not submit. Please try again later.</p>
940
+ </div>
941
+ </div>
942
+ </div>
943
+ </div>
944
+ </div>
945
+
946
+
947
+
948
+ <script src="https://ssl.google-analytics.com/ga.js" type="text/javascript"></script>
949
+
950
+
951
+
952
+ <script type="text/javascript">
953
+ try {
954
+ var pageTracker = _gat._getTracker('UA-2322480-5');
955
+ pageTracker._trackPageview();
956
+ pageTracker._trackPageLoadTime();
957
+ } catch(err) {
958
+ }
959
+ </script>
960
+ <script type="text/javascript">var _sf_startpt=(new Date()).getTime()</script>
961
+ <script type="text/javascript">
962
+ var _sf_async_config={uid:11280,domain:'foursquare.com'};
963
+ if (window.chartbeat_path) {
964
+ _sf_async_config.path = chartbeat_path;
965
+ }
966
+ (function(){
967
+ function loadChartbeat() {
968
+ window._sf_endpt=(new Date()).getTime();
969
+ var e = document.createElement('script');
970
+ e.setAttribute('language', 'javascript');
971
+ e.setAttribute('type', 'text/javascript');
972
+ e.setAttribute('src',
973
+ (('https:' == document.location.protocol) ? 'https://s3.amazonaws.com/' : 'http://') +
974
+ 'static.chartbeat.com/js/chartbeat.js');
975
+ document.body.appendChild(e);
976
+ }
977
+ var oldonload = window.onload;
978
+ window.onload = (typeof window.onload != 'function') ?
979
+ loadChartbeat : function() { oldonload(); loadChartbeat(); };
980
+ })();
981
+
982
+ </script>
983
+
984
+
985
+
986
+
987
+
988
+
989
+ <script src="/ajax_request/liftAjax.js" type="text/javascript"></script>
990
+
991
+
992
+ </body>
993
+ </html>
994
+ ^
995
+ end
996
+
430
997
 
data/tweetlr.gemspec CHANGED
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = "tweetlr"
3
- s.version = "0.1.11"
3
+ s.version = "0.1.12"
4
4
  s.author = "Sven Kraeuter"
5
5
  s.email = "sven.kraeuter@gmail.com"
6
6
  s.homepage = "http://tweetlr.5v3n.com"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tweetlr
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.11
4
+ version: 0.1.12
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-01-04 00:00:00.000000000Z
12
+ date: 2012-01-10 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: daemons
16
- requirement: &2153108980 !ruby/object:Gem::Requirement
16
+ requirement: &2156595140 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *2153108980
24
+ version_requirements: *2156595140
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: eventmachine
27
- requirement: &2153108520 !ruby/object:Gem::Requirement
27
+ requirement: &2156594520 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *2153108520
35
+ version_requirements: *2156594520
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: curb
38
- requirement: &2153108100 !ruby/object:Gem::Requirement
38
+ requirement: &2156593180 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :runtime
45
45
  prerelease: false
46
- version_requirements: *2153108100
46
+ version_requirements: *2156593180
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: json
49
- requirement: &2153107560 !ruby/object:Gem::Requirement
49
+ requirement: &2156592660 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *2153107560
57
+ version_requirements: *2156592660
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: nokogiri
60
- requirement: &2153107140 !ruby/object:Gem::Requirement
60
+ requirement: &2156592180 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *2153107140
68
+ version_requirements: *2156592180
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: rake
71
- requirement: &2153106720 !ruby/object:Gem::Requirement
71
+ requirement: &2156591640 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :development
78
78
  prerelease: false
79
- version_requirements: *2153106720
79
+ version_requirements: *2156591640
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: rspec
82
- requirement: &2153106260 !ruby/object:Gem::Requirement
82
+ requirement: &2156591040 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :development
89
89
  prerelease: false
90
- version_requirements: *2153106260
90
+ version_requirements: *2156591040
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: rdoc
93
- requirement: &2153105820 !ruby/object:Gem::Requirement
93
+ requirement: &2156590440 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,7 +98,7 @@ dependencies:
98
98
  version: '0'
99
99
  type: :development
100
100
  prerelease: false
101
- version_requirements: *2153105820
101
+ version_requirements: *2156590440
102
102
  description: tweetlr crawls twitter for a given term, extracts photos out of the collected
103
103
  tweets' short urls and posts the images to tumblr.
104
104
  email: sven.kraeuter@gmail.com