Digg Gezgini

PyDigg modülünü yazarken Digg apisinden haberim yoktu. Bu apiden az önce haberdar oldum. PyDigg modülünü kullanarak Digg Gezgini adında bir program geliştirmiştim. Program içerisindeki digg.com a bağlı rss adreslerini arttırma işlemi için bu siteye girdiğimde api kısmı gözüme çarptı. Ardından kısa süre içerisinde programın apiyi kullanarak işlevini yerine getirmesini sağladım. PyDigg modülüne göre doğal olarak epey hızlı çalışıyor.

Programın amacı hem digg.com içeriğine ulaşmak hem de digg.com sitesine girmeden içeriklerin kaynak adreslerine yönelebilmek. Şu anda bunu gerçekleştirebiliyor. Test sürümü olduğu için daha çok değişiklik geçireceği kesin. Kodlara aşağıdan ulaşabilirsiniz. Çalıştırabilmeniz için wxPython kütüphanesine ihtiyacınız var.

dg.py:

 
# -*- coding: utf-8 -*-
 
"""
 
      {
      Digg.com haber başlıklarına göz atmanızı ve bu haberleri okumak için digg.com
      sitesine uğramadan sizi kaynak adrese yönlendiren bir program.
      }
 
      {Test Sürümü}
 
      Copyright (C) {11 Aralık 2007} {Ömer Ücel}
 
      omerucel@gmail.com
      http://omerucel.com/gunluk/digg-gezgini/
 
      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 of the License, or (at your option)
 
      any later version.
 
      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 library; if not, write to the Free Software Foundation, Inc., 59 Temple
 
      Place, Suite 330, Boston, MA 02111-1307 USA
 
"""
 
import wx
import thread
import urllib2
import webbrowser
import wx.lib.newevent
 
from wx.lib.splitter import MultiSplitterWindow
 
(KategoriAlPostala, EVT_TI_KATEGORI_AL) = wx.lib.newevent.NewEvent()
(BaslikAlPostala, EVT_TI_BASLIK_AL) = wx.lib.newevent.NewEvent()
 
API_KEY = "http%3A%2F%2Fomerucel.com%2fgunluk%2fdigg%2dgezgini"
 
class ThreadKategoriAl:
    def __init__(self,parent):
        self.parent = parent
        self.adres = "http://services.digg.com/topics?type=json&appkey=%s" %(API_KEY)
 
    def Start(self):
        self.running = True
        thread.start_new_thread(self.Run, ())
 
    def IsRunning(self):
        return self.running
 
    def Run(self):
        kategoriler = eval(urllib2.urlopen(self.adres).read())
 
        wx.PostEvent(self.parent,KategoriAlPostala(kategoriler=kategoriler))
        self.running = False 
 
class ThreadBaslikAl:
    def __init__(self,parent,kategori):
        self.parent = parent
        self.adres = "http://services.digg.com/stories/topic/%s?type=json&count=40&appkey=%s" %(kategori,API_KEY)
 
    def Start(self):
        self.running = True
        thread.start_new_thread(self.Run, ())
 
    def IsRunning(self):
        return self.running
 
    def Run(self):
        basliklar = eval(urllib2.urlopen(self.adres).read())
 
        wx.PostEvent(self.parent,BaslikAlPostala(basliklar=basliklar))
        self.running = False 
 
class Cerceve(wx.Frame):
    def __init__(self,parent,ID,title):
        wx.Frame.__init__(self,parent,ID,title,
                          wx.DefaultPosition,
                          wx.Size(650,450))
 
        # Alınan kategorileri tutar.
        self.kategoriler = {}
 
        # Alınan başlıkları tutar.
        self.basliklar = {}
 
        # Olay atamaları yapılıyor.
        self.Bind(wx.EVT_CLOSE,self.ProgramCikis)
        self.Bind(wx.EVT_SIZE,self.ProgramBoyutDegisimi)
 
        self.CenterOnScreen()
 
        # Panel oluşturuluyor.
        self.panel = wx.Panel(self,-1)
 
        # Taşıyıcı oluşturuluyor.
        self.kutu_tasiyici = wx.BoxSizer(wx.HORIZONTAL)
        self.bolum_ayirici = MultiSplitterWindow(self,style=wx.SP_LIVE_UPDATE)
        self.kutu_tasiyici.Add(self.bolum_ayirici,1,wx.EXPAND)
 
        # Rss listesi bölümü
        self.BolumRss()
        self.BolumIcerik()
 
        self.panel.SetSizer(self.kutu_tasiyici)
        self.kutu_tasiyici.Fit(self.panel)
        self.Fit()
 
        self.durum_cubugu = self.CreateStatusBar()
 
        self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGED,self.BolumBoyutDegisimi)
        self.Bind(wx.EVT_SPLITTER_SASH_POS_CHANGING,self.BolumBoyutDegisimi)
 
        # Thread Bind
        self.Bind(EVT_TI_KATEGORI_AL,self.ThreadIslem_KategoriAl)
        self.Bind(EVT_TI_BASLIK_AL,self.ThreadIslem_BaslikAl)
 
        self.durum_cubugu.SetStatusText("Kategoriler alınıyor...")
        self.thread_kategori_al = ThreadKategoriAl(self)
        self.thread_kategori_al.Start()
 
    def BolumBoyutDegisimi(self,olay=None):
        self.il.SetSize((self.GetSize()[0]-olay.GetSashPosition()-20,self.GetSize()[1]-30))
        self.il.SetColumnWidth(0,self.GetSize()[0]-olay.GetSashPosition()-20)
 
    def BolumRss(self):
        self.rl = wx.ListCtrl(self.bolum_ayirici,wx.NewId(),size=(200,450),style=wx.LC_REPORT)
        self.rl.Bind(wx.EVT_LEFT_DCLICK,self.AcKategori)
        self.rl.InsertColumn(0,"Kategoriler",format=wx.LIST_FORMAT_LEFT,width=200)
 
        self.bolum_ayirici.AppendWindow(self.rl,200)
 
    def BolumIcerik(self):
        self.il = wx.ListCtrl(self.bolum_ayirici,wx.NewId(),size=(400,450),style=wx.LC_REPORT)
        self.il.Bind(wx.EVT_LEFT_DCLICK,self.AcBaslik)
        self.il.InsertColumn(0,"Başlıklar",format=wx.LIST_FORMAT_LEFT,width=400)
 
        self.bolum_ayirici.AppendWindow(self.il,400)
 
    def AcKategori(self,olay=None):
        eleman = self.rl.GetNextItem(-1,state = wx.LIST_STATE_SELECTED)
        if eleman:
            self.durum_cubugu.SetStatusText("Başlıklar alınıyor...")
            self.thread_baslik_al = ThreadBaslikAl(self,self.kategoriler[self.rl.GetItemText(eleman)])
            self.thread_baslik_al.Start()
 
    def AcBaslik(self,olay=None):
        eleman = self.il.GetNextItem(-1,state = wx.LIST_STATE_SELECTED)
        if eleman:
            adres = self.basliklar[self.il.GetItemText(eleman)]
            adres = adres.replace("\\","")
            self.durum_cubugu.SetStatusText("Başlık açılıyor...")
            webbrowser.open_new_tab(adres)
            self.durum_cubugu.SetStatusText("Başlık açıldı.")
 
    def ThreadIslem_KategoriAl(self,olay):
        no = 0
        for i in olay.kategoriler["topics"]:
            eleman = self.rl.InsertStringItem(0,i["name"])
            self.rl.SetItemData(eleman,no)
            kategori = { i["name"] : i["short_name"]}
            self.kategoriler.update(kategori)
            no +=1
        self.durum_cubugu.SetStatusText("Kategoriler alındı.")
 
    def ThreadIslem_BaslikAl(self,olay):
        no = 0
        self.basliklar = {}
        self.il.DeleteAllItems()
        for i in olay.basliklar["stories"]:
            eleman = self.il.InsertStringItem(0,i["title"])
            self.il.SetItemData(eleman,no)
            baslik = { i["title"] : i["link"]}
            self.basliklar.update(baslik)
            no +=1
 
        self.durum_cubugu.SetStatusText("Başlıklar alındı.")
 
    def ProgramBoyutDegisimi(self,olay=None):
        self.bolum_ayirici.SetSize((olay.GetSize()[0],olay.GetSize()[1]-30))
        self.il.SetSize((olay.GetSize()[0]-205,olay.GetSize()[1]-30))
        self.il.SetColumnWidth(0,olay.GetSize()[0]-205)
        self.Update()
        self.Refresh()
 
    def ProgramCikis(self,olay=None):
        try:
            self.thread_baslik_al.Stop()
        except:
            pass
 
        try:
            self.thread_kategori_al.Stop()
        except:
            pass
 
        self.Destroy()
 
if __name__=="__main__":
    uyg=wx.App(0)
    cerceve=Cerceve(None,-1,"Digg Gezgini - Test Sürümü")
    cerceve.Show(True)
    uyg.MainLoop()
 

Tags: ,

Leave a Reply