156 lines
3.6 KiB
Python
156 lines
3.6 KiB
Python
# -*- coding: utf-8 -*-
|
|
# OpenLase - a realtime laser graphics toolkit
|
|
#
|
|
# Copyright (C) 2009-2011 Hector Martin "marcan" <hector@marcansoft.com>
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation, either version 2 or version 3.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License
|
|
# along with this program; if not, write to the Free Software
|
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
import pylase as ol
|
|
from math import pi
|
|
import threading
|
|
import twitter
|
|
import time
|
|
import math
|
|
import sys
|
|
|
|
class LaserThread(threading.Thread):
|
|
def __init__(self):
|
|
threading.Thread.__init__(self)
|
|
self.die = False
|
|
self.tweets = None
|
|
|
|
def shade(self, coord, color):
|
|
x, y = coord
|
|
if abs(x) > 1:
|
|
return (x, y), color
|
|
#y *= (1+0.2*math.cos(x))
|
|
if abs(x) > 0.8:
|
|
c = 1 - (abs(x) - 0.8) / 0.2
|
|
if c > 1:
|
|
c = 1
|
|
elif c < 0:
|
|
c = 0
|
|
color = color & 0xff
|
|
color = ol.C_GREY(int(color * c))
|
|
return (x, y), color
|
|
|
|
def run(self):
|
|
if ol.init(10) < 0:
|
|
return
|
|
params = ol.RenderParams()
|
|
params.render_flags = ol.RENDER_NOREORDER | ol.RENDER_GRAYSCALE
|
|
params.on_speed = 2/120.0
|
|
params.off_speed = 2/30.0
|
|
params.flatness = 0.000001
|
|
ol.setRenderParams(params)
|
|
ol.setPixelShader(self.shade)
|
|
time = 0
|
|
frames = 0
|
|
cur_tweets = self.tweets
|
|
xpos = 0
|
|
idx = 0
|
|
startpos = 1.3
|
|
while not self.die:
|
|
ol.loadIdentity3()
|
|
ol.loadIdentity()
|
|
|
|
if cur_tweets is None and self.tweets is not None:
|
|
cur_tweets = self.tweets
|
|
idx = 0
|
|
xpos = startpos
|
|
|
|
w = 0
|
|
#print cur_tweets
|
|
if cur_tweets is not None:
|
|
font = ol.getDefaultFont()
|
|
w = ol.getStringWidth(font, 0.4, cur_tweets[idx])
|
|
col = ol.C_WHITE
|
|
#print "Render %f %s 0x%x"%(xpos, cur_tweets[idx], col)
|
|
ol.drawString(font, (xpos,0.1), 0.4, col, cur_tweets[idx])
|
|
|
|
#print "render"
|
|
ftime = ol.renderFrame(60)
|
|
#print "done"
|
|
xpos -= 0.6*ftime
|
|
if xpos < (-w-1) and cur_tweets is not None:
|
|
xpos = startpos
|
|
idx += 1
|
|
idx %= len(cur_tweets)
|
|
if self.tweets != cur_tweets:
|
|
idx = 0
|
|
cur_tweets = self.tweets
|
|
print "Reset and update"
|
|
print "Finished, new idx: %d"%idx
|
|
frames += 1
|
|
time += ftime
|
|
ol.shutdown()
|
|
|
|
cmap = {
|
|
u'Á': 'A',
|
|
u'É': 'E',
|
|
u'Í': 'I',
|
|
u'Ó': 'O',
|
|
u'Ú': 'U',
|
|
u'Ü': 'U',
|
|
}
|
|
|
|
search = sys.argv[1]
|
|
|
|
olt = LaserThread()
|
|
print "Starting thread"
|
|
olt.start()
|
|
print "Thread running"
|
|
|
|
try:
|
|
api = twitter.Api()
|
|
since_id = None
|
|
|
|
tweets = []
|
|
|
|
while True:
|
|
try:
|
|
s = api.GetSearch(search, since_id=since_id, lang=None)
|
|
except:
|
|
olt.tweets = ["Twitter Error: NO FUNCIONA INTERNEEEEE!!!"]
|
|
time.sleep(1)
|
|
since_id = -1
|
|
tweets = []
|
|
print "Fetch error"
|
|
continue
|
|
|
|
if len(s) == 0:
|
|
time.sleep(10)
|
|
continue
|
|
print "Fetched %d tweets"%len(s)
|
|
since_id = s[0].id
|
|
tweets = s + tweets
|
|
tweets = tweets[:10]
|
|
strings = []
|
|
print "New tweetset:"
|
|
for t in tweets:
|
|
itext = u"@%s: %s"%(t.user.screen_name, t.text)
|
|
itext = itext.replace(">", ">").replace("<", "<").replace(""", '"').replace("\n", " ")
|
|
text = u""
|
|
for c in itext:
|
|
if c in cmap:
|
|
c = cmap[c]
|
|
text += c
|
|
strings.append(text.encode('iso-8859-1', 'replace'))
|
|
print "-->", itext
|
|
olt.tweets = strings
|
|
time.sleep(10)
|
|
except:
|
|
olt.die = True
|
|
olt.join()
|
|
raise
|