Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Qt4 Application [QT3 Application]  (gelezen 33977 keer)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #25 Gepost op: 2008/05/17, 01:29:35 »
msn: profoxlinux.be maar mn msn doet momenteel raar en kan niet connecten :P

#!/usr/bin/python
#
#    FLV2MP3 - Youtube ripper. Download music from youtube and convert it to mp3.
#    Copyright (C) 2008  Koenux Projects
#
#    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 3 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 program.  If not, see .
#
#    Met dank aan ProfoX voor de hulp.
#

import sys, urllib2, re, string
from ytr_UI import Ui_Form


try:
    from PyQt4 import QtGui, QtCore, QtNetwork
except ImportError:
    print "pakket \"python-qt4\" is niet geinstalleerd. Installeer dit pakket en probeer het opnieuw. Controleer ook of het pakket \"ffmpeg\" is geinstalleerd.";
    sys.exit()
class flv2mp3(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.debug = False
        for arg in sys.argv:
            if(arg == "--debug"):
                 self.debug = True

        # GUI interface
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.setWindowIcon(QtGui.QIcon('ytr.png'))
        self.resize(500, 350)
        self.ui.stopKnop.setEnabled(False)
       
        # Dir autocompletion
        self.dirCompleter = QtGui.QCompleter(self)
        dirModel = QtGui.QDirModel(self.dirCompleter)
        dirModel.setSorting(QtCore.QDir.Name|QtCore.QDir.DirsLast)
        dirModel.setFilter(QtCore.QDir.AllDirs|QtCore.QDir.NoDotAndDotDot)
        self.dirCompleter.setModel(dirModel)
        self.dirCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.ui.locatieInput.setCompleter(self.dirCompleter)

        # Settings
        self.convertTO = 'mp3' # default

        self.extention = '.mp3'
        self.tmpfilename = '/tmp/flv2mp3_tmp'
        self.baseurl = '/get_video.php?video_id='
        self.overwriteIfExists = 0
        self.abort = False
       
        self.mimeIndex = {
           'mp3': "ffmpeg -i \""+self.tmpfilename+"\" ",
           'mpeg': "ffmpeg -i \""+self.tmpfilename+"\" -acodec mpeg4aac -ab 56 -ar 22050 -b 500 -s 320x240 ",
           'avi':  "ffmpeg -i \""+self.tmpfilename+"\" -acodec copy -ab 56 -ar 22050 -b 500 -s 320x240 ",
           'ogg': "ffmpeg -i \""+self.tmpfilename+"\" "
        }

        # Locatie
        self.ui.locatieInput.setText(QtCore.QDir.homePath());

        # Voortgangsbalk
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)

        # voor downloaden en converteren
        self.http = QtNetwork.QHttp(self)
        self.qproc = QtCore.QProcess(self)

        # Connections
        self.connect(self.http, QtCore.SIGNAL('dataReadProgress(int,int)'), self.updateDownloadProgress)
        self.connect(self.http, QtCore.SIGNAL('responseHeaderReceived(const QHttpResponseHeader &)'), self.handleHeaderResponse)
        self.connect(self.http, QtCore.SIGNAL('done(bool)'), self.convert)
        self.connect(self.qproc, QtCore.SIGNAL('finished(int,QProcess::ExitStatus)'), self.convertFinished)
        self.connect(self.ui.stopKnop, QtCore.SIGNAL('clicked()'), self.abortall)
        self.connect(self.ui.quitknop, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
        self.connect(self.ui.ripknop, QtCore.SIGNAL("clicked()"), self.ripstart)
        self.connect(self.ui.convertTO, QtCore.SIGNAL("activated(QString)"), self.updateConvertTO)
        self.connect(self.ui.overwriteIfExists, QtCore.SIGNAL("stateChanged(int)"), self.updateOverwrite)

    def abortall(self):
        self.abort = True
        self.http.abort()
        self.http.close()
        self.tmpfile.close()
        QtCore.QFile.remove(self.tmpfilename)
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)
        self.ui.output.setText("Gestopt.")
       
    def handleHeaderResponse(self, resp):
        code = resp.statusCode()
        # Handle redirection
        if (code >= 300 and code < 400 and resp.hasKey("location")):
            location = QtCore.QUrl(resp.value("location"))
            self.http.setHost(location.host())
            self.http.get(location.toString(), self.tmpfile)
        if self.debug:
            print "resp.statusCode: "+str(code)
           

    def updateConvertTO(self,CTO):
        if self.abort == False:
            self.convertTO = str(CTO)
            if self.debug:
                 print "User set converTO to: "+ CTO


    def updateOverwrite(self,val):
        self.overwriteIfExists = int(val)
        if self.debug:
            print "User set overwriteIfExists to: "+ str(val)


    def updateDownloadProgress(self, done, total):
        self.ui.progressbar.setMaximum(total)
        self.ui.progressbar.setValue(done)


    def ripstart(self):
        self.abort = False
        d = QtCore.QDir ()
        if d.exists(self.ui.locatieInput.text()) == True:
            try:
                urltorip = self.ui.yuriInput.text()
                opener1 = urllib2.build_opener()
                page1 = opener1.open(str(urltorip))
                self.urlsource = page1.read()
                page1.close()
            except ValueError:
                self.ui.output.setText("Error: Kon url niet behandelen.")
            else:
                self.parsePage()
        else:
            self.ui.output.setText("De folder waar u het bestand in wil opslaan is\nniet schrijfbaar, of bestaat niet")


    def parsePage(self):        

        data = self.urlsource.split('\n')
        if self.debug:
             print self.urlsource
        dat = False
        self.ui.output.setText("Zoeken naar var")
        for line in data:
              kooktoestel = string.find(str(line),'fullscreenUrl');
              if kooktoestel !=  -1:
                   dat = line;
                   break
        if ( not dat ):
               self.ui.output.setText("Fout: De door u op gegeven pagina is geen\n(of een onjuiste) youtube pagina.")
        else :
               movienamepat = re.compile( "title=(.*)\s*'" )
               vindnaam = movienamepat.search( dat )
               self.ui.output.setText("videonaam rippen")
               if vindnaam != None:
                   self.videonaam = vindnaam.group(1)
               else :
                   self.ui.output.setText("Error: videonaam niet gevonden!")
                   self.videonaam = 'Unknown'
               self.ui.output.setText("videourl rippen")
               pat = re.compile( "video_id=(.*)\s*&title(.*)" )
               vind = pat.search( dat )
               if vind != None:
                   self.videourl = vind.group(1)
                   if(self.debug):
                       print "Video url found: "+ self.videourl
                   self.checkBeforeDownload()
               else :
                   self.ui.output.setText("Error: videourl niet gevonden. Kan video niet downloaden.")
                   videourl = 'Niet gevonden'
   

    def checkBeforeDownload(self):
       if self.debug:
           print self.convertTO
       f = QtCore.QFile ( self.ui.locatieInput.text()+"/"+self.videonaam+"."+self.convertTO );
       print self.ui.locatieInput.text()+"/"+self.videonaam
       if(f.exists()):
           print self.overwriteIfExists
           if( not self.overwriteIfExists or self.overwriteIfExists != 2):
                self.ui.output.setText("De outputfile bestaat al.")
           else:
                self.ui.output.setText("Even geduld aub... Het kan even duren voordat\nhet bestand gedownload is.")
                QtCore.QFile.remove(self.ui.locatieInput.text()+"/"+self.videonaam+"."+self.convertTO)
                self.download()
       else:
           self.ui.output.setText("Even geduld aub... Het kan even duren voordat\nhet bestand gedownload is.")
           self.download()


    def download(self):
        self.tmpfile = QtCore.QFile(self.tmpfilename)
        if (self.tmpfile.open(QtCore.QIODevice.WriteOnly)):
            self.http.setHost("www.youtube.com")
            self.http.get(self.baseurl+self.videourl, self.tmpfile)
            self.ui.progressbar.show()
            self.ui.stopKnop.setEnabled(True)
        else:
            self.ui.output.setText("Error: kon tijdelijk bestand niet aanmaken.")


    def convert(self):
        if str(self.convertTO) != "Niet converteren":
            if self.abort == False:
                 command = self.mimeIndex[self.convertTO] + "\""+str(self.ui.locatieInput.text())+"/"+self.videonaam+"."+self.convertTO+"\""
                 if self.debug:
                    print "Execute command: "+command
                 self.qproc.setProcessChannelMode(QtCore.QProcess.MergedChannels);
                 self.qproc.start(command)
                 if(self.debug):
                    print self.qproc.readAll(); # Debugs
                 self.ui.output.setText("Bezig met converteren. Even geduld aub...")
        else:

             QtCore.QFile.copy(self.tmpfilename, self.ui.locatieInput.text()+"/"+self.videonaam+".flv")
             self.ui.output.setText("Gereed")


    def convertFinished(self, exitCode, exitStatus):
        QtCore.QFile.remove(self.tmpfilename)
        if(self.debug):
            print "Convert Finished"
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)

        if(self.debug):
            print self.qproc.readAll(); # Debug

        if (exitCode == 0 and exitStatus == QtCore.QProcess.NormalExit):
            self.ui.output.setText("Gereed")
        else:
            self.ui.output.setText("Het converteren is mislukt.\n Indien er toch een media bestand is aangemaakt, is dit waarschijnlijk corrupt.")
        self.ui.stopKnop.setEnabled(False)


app = QtGui.QApplication(sys.argv)
f = flv2mp3()
f.show()
sys.exit(app.exec_())
Paar kleine aanpassingen.. (taalfoutje veranderd, \n gezet tussen lange lijnen, stopknop alleen enablen wanneer download is begonnen) maar het leukste dat ik heb toegevoegd is dit:
       # Dir autocompletion
        self.dirCompleter = QtGui.QCompleter(self)
        dirModel = QtGui.QDirModel(self.dirCompleter)
        dirModel.setSorting(QtCore.QDir.Name|QtCore.QDir.DirsLast)
        dirModel.setFilter(QtCore.QDir.AllDirs|QtCore.QDir.NoDotAndDotDot)
        self.dirCompleter.setModel(dirModel)
        self.dirCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.ui.locatieInput.setCompleter(self.dirCompleter)
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #26 Gepost op: 2008/05/17, 12:34:50 »
Citaat van: vlerknozem
Zou het ook mogelijk zijn om hiervoor een DEB te maken? Dat is me nog niet gelukt. De deb werkte gaf geen fouten, maar deed ook niets. lijkt me iets fijner dan een shell script :)
voila: http://ifile.it/xb9fsji
kijk maar eens of er nog dingen veranderd moeten worden (beschrijving ofzo). hij werkt in ieder geval.

tof programma moet ik zeggen, in windows gebruikte ik ook zoiets. zeer handig.


ow, ook even erbij zeggen dat ik de shortcut file heb aangepast. ik heb hier een desktop file van gemaakt en hij staat nu bij toepassingen=>audio en video

Qt4 Application [QT3 Application]
« Reactie #27 Gepost op: 2008/05/17, 13:08:04 »
A nice! Bedankt. Ik heb even de boel uitgepakt, en ik snap het nu ongeveer. Ik was niet verder gekomen dan een bestand control. Alleen waar dient het bestand debian-binary precies voor?

Ja het is inderdaad beter om de shortcut naar het menu te doen ipv desktop. Zeker omdat desktop en bureablad vaak verschillen.

Vandaag maar experimenteren met bazaar enzo.

Qt4 Application [QT3 Application]
« Reactie #28 Gepost op: 2008/05/17, 19:37:18 »
blijkbaar zit dat debian-binary bestand er altijd als ge een deb uitakt. weet ook niet wat het doet.
dat control bestandje is eigenlijk maar 1 van de paar bestandjes die ge nodig hebt.

nuja, nu ik toch bezig ben: het zou wat makkelijker zijn voor beginnelingen als ge een "browse" knopke zet om te kiezen waar op te slaan.
ook is het misschien beter als ge de "stop" knop grijs maakt als er geen proces bezig is.

ik heb het daarjuist nog eens gebruikt, een filmpje opgeslaan in avi, maar de kwaliteit was echt slecht. nu zal dat waarschijnlijk niet iets met uw programma maar met ffmpeg te maken hebben denk ik...

Qt4 Application [QT3 Application]
« Reactie #29 Gepost op: 2008/05/17, 19:55:52 »
In de laatste versie zit als het goed is een autocomplete in de locatie. Dus browse zou niet meer echte nodig zijn, hoewel ik het wel erin kan doen.

De stopknop grijs ( disabled ) kwam profoX al mee.

De kwaliteit van de avi wordt idd slecht door ffmpeg, of door mijn manier van aanroepen van ffmpeg.

'avi':  "ffmpeg -i \""+self.tmpfilename+"\" -acodec copy -ab 56 -ar 22050 -b 500 -s 320x240 ",

De commando wordt dus:
ffmpeg -i /tmp/tmp/flv2mp3_tmp -acodec copy -ab 56 -ar 22050 -b 500 -s 320x240 naamvanvideo.avi

Misschien dat het iets anders moet voor beter kwaliteit.

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #30 Gepost op: 2008/05/18, 04:25:49 »
Browseknop:

Ergens bij alle connections:
Citaat
self.connect(self.ui.browseknop, QtCore.SIGNAL("clicked()"), self.browseSaveLocation)
en deze functie:
Citaat
def browseSaveLocation(self):
        directory = QtGui.QFileDialog.getExistingDirectory(self, "Opslaan in map...", self.ui.locatieInput.text())
        if (not directory.isEmpty()):
            self.ui.locatieInput.setText(directory)
Voor die browseknop zelf zou ik een QToolButton gebruiken, in Qt Designer.
Updated .ui:

 Form
 
 
   
    0
    0
    526
    300
   

 

 
   YTRipper - YouTube ripper 1.0 Alpha
 

 
   
   
     
     
     

     
      Qt::LeftToRight
     

     
      false
     

     
      background-color: #dbba75;
padding: 5px;
text-align: center;

     

     
      <html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'FreeSerif'; font-size:9pt; font-weight:400; font-style:normal;">
<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:xx-large; font-weight:600;"><span style=" font-size:13pt; color:#000000;">YTRipper</span></p></body></html>

     

     
      Qt::RichText
     

     
      Qt::AlignCenter
     

     
      true
     

     
      0
     

   

   

   
   
     
     
       
        &Youtube URL:
       

       
        yuriInput
       

     

     

     
     
     

     
     
       
        &Opslaan in:
       

       
        locatieInput
       

     

     

     
     
       
       
       

       
       
         
          ...
         

       

       

     

     

     
     
       
       
         mp3
       

       

       
       
         avi
       

       

       
       
         mpeg
       

       

       
       
         ogg
       

       

     

     

     
     
       
        Overschrijf bestand indien het al bestaat
       

     

     

   

   

   
   
     
      Qt::Vertical
     

     
     
       20
       40
     

     

   

   

   
   
     
     
       75
       true
     

     

     
     
     

     
      Qt::AlignCenter
     

   

   

   
   
     
      Qt::Vertical
     

     
     
       20
       40
     

     

   

   

   
   
     
     
       
       
         1
         0
       

       

       
        24
       

     

     

     
     
       
        Qt::Horizontal
       

       
       
         40
         20
       

       

     

     

     
     
       
        &Rip
       

     

     

     
     
       
        &Stop
       

     

     

     
     
       
        &Sluiten
       

     

     

   

   

 

 

 
 
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #31 Gepost op: 2008/05/18, 04:35:08 »
Citaat van: vlerknozem
De kwaliteit van de avi wordt idd slecht door ffmpeg, of door mijn manier van aanroepen van ffmpeg.

'avi':  "ffmpeg -i \""+self.tmpfilename+"\" -acodec copy -ab 56 -ar 22050 -b 500 -s 320x240 ",

De commando wordt dus:
ffmpeg -i /tmp/tmp/flv2mp3_tmp -acodec copy -ab 56 -ar 22050 -b 500 -s 320x240 naamvanvideo.avi

Misschien dat het iets anders moet voor beter kwaliteit.
-ab zet de audio bitrate op 56 kbps, dit is héél weinig.. hercodering geeft sowieso al kwaliteitsverlies, maar hercoderen naar 56 kbps geeft heel erg veel kwaliteitsverlies in de audio.. ik zou het standaard houden op min. 128 kbps voor de hercodering, misschien zelfs 192 kbps.

-ar zet de audio sampling freq (sample rate) op 22050 Hz. Misschien zou 44100 Hz een betere kwaliteit kunnen geven.

-b 500 zet de video bitrate op 500 kbps.. te weinig om de videokwaliteit genoeg te behouden.. probeer eens wat andere waarden.. 1000, 1500? ik weet ook niet goed wat je nodig hebt om van het bronmateriaal een deftig (niet te groot, kwaliteit hoog genoeg) bestand te maken.

-s is goed, want bronmaterieel heeft sowieso QVGA (320x240) resolutie als ik me niet vergis.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #32 Gepost op: 2008/05/18, 21:19:18 »
UI Update

 Form
 
 
   
    0
    0
    526
    300
   

 

 
   YTRipper - YouTube ripper 1.0 Alpha
 

 
   
   
     
     
     

     
      Qt::LeftToRight
     

     
      false
     

     
      background-color: #dbba75;
padding: 5px;
text-align: center;

     

     
      <html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'FreeSerif'; font-size:9pt; font-weight:400; font-style:normal;">
<p style=" margin-top:18px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:xx-large; font-weight:600;"><span style=" font-size:13pt; color:#000000;">YTRipper</span></p></body></html>

     

     
      Qt::RichText
     

     
      Qt::AlignCenter
     

     
      true
     

     
      0
     

   

   

   
   
     
     
       
        &Youtube URL:
       

       
        yuriInput
       

     

     

     
     
     

     
     
       
        &Opslaan in:
       

       
        locatieInput
       

     

     

     
     
       
       
       

       
       
         
          ...
         

       

       

     

     

     
     
       
       
         mp3
       

       

       
       
         avi
       

       

       
       
         mpeg
       

       

       
       
         ogg
       

       

       
       
         Niet converteren
       

       

     

     

     
     
       
        Overschrijf bestand indien het al bestaat
       

     

     

   

   

   
   
     
      Qt::Vertical
     

     
     
       20
       40
     

     

   

   

   
   
     
     
       75
       true
     

     

     
     
     

     
      Qt::AlignCenter
     

   

   

   
   
     
      Qt::Vertical
     

     
     
       20
       40
     

     

   

   

   
   
     
     
       
       
         1
         0
       

       

       
        24
       

     

     

     
     
       
        Qt::Horizontal
       

       
       
         40
         20
       

       

     

     

     
     
       
        &Rip
       

       
        /usr/share/icons/gnome/24x24/actions/document-save-as.png
       

     

     

     
     
       
        &Stop
       

       
        /usr/share/icons/gnome/24x24/actions/gtk-cancel.png
       

     

     

     
     
       
        &Sluiten
       

       
        /usr/share/icons/gnome/24x24/actions/application-exit.png
       

     

     

   

   

 

 

 
 
Python update
#!/usr/bin/python
#
#    ytripper - Youtube ripper. Download music from youtube and convert it to mp3.
#    Copyright (C) 2008  Koenux Projects
#
#    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 3 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 program.  If not, see .
#
#    Met dank aan ProfoX voor de hulp.
#

import sys, urllib2, re, string
from ytr_UI import Ui_Form


try:
    from PyQt4 import QtGui, QtCore, QtNetwork
except ImportError:
    print "pakket \"python-qt4\" is niet geinstalleerd. Installeer dit pakket en probeer het opnieuw. Controleer ook of het pakket \"ffmpeg\" is geinstalleerd.";
    sys.exit()
class ytripper(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.debug = False
        for arg in sys.argv:
            if(arg == "--debug"):
                 self.debug = True

        # GUI interface
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.setWindowIcon(QtGui.QIcon('ytr.png'))
        self.resize(500, 350)
        self.ui.stopKnop.setEnabled(False)
       
        # Dir autocompletion
        self.dirCompleter = QtGui.QCompleter(self)
        dirModel = QtGui.QDirModel(self.dirCompleter)
        dirModel.setSorting(QtCore.QDir.Name|QtCore.QDir.DirsLast)
        dirModel.setFilter(QtCore.QDir.AllDirs|QtCore.QDir.NoDotAndDotDot)
        self.dirCompleter.setModel(dirModel)
        self.dirCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive)
        self.ui.locatieInput.setCompleter(self.dirCompleter)

        # Settings
        self.convertTO = 'mp3' # default

        self.extention = '.mp3'
        self.tmpfilename = '/tmp/ytripper_tmp'
        self.baseurl = '/get_video.php?video_id='
        self.overwriteIfExists = 0
        self.abort = False
       
        self.mimeIndex = {
           'mp3': "ffmpeg -i \""+self.tmpfilename+"\" ",
           'mpeg': "ffmpeg -i \""+self.tmpfilename+"\" -acodec copy -ab 256 -ar 44100 -b 55000 -s 960x600 ",
           'avi':  "ffmpeg -i \""+self.tmpfilename+"\" -acodec copy -vcodec mpeg4 -ab 256 -ar -f avi 44100 -b 55000 -s 960x600 ",
           'ogg': "ffmpeg -i \""+self.tmpfilename+"\" "
        }

        # Locatie
        self.ui.locatieInput.setText(QtCore.QDir.homePath());

        # Voortgangsbalk
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)

        # voor downloaden en converteren
        self.http = QtNetwork.QHttp(self)
        self.qproc = QtCore.QProcess(self)

        # Connections
        self.connect(self.http, QtCore.SIGNAL('dataReadProgress(int,int)'), self.updateDownloadProgress)
        self.connect(self.http, QtCore.SIGNAL('responseHeaderReceived(const QHttpResponseHeader &)'), self.handleHeaderResponse)
        self.connect(self.http, QtCore.SIGNAL('done(bool)'), self.convert)
        self.connect(self.qproc, QtCore.SIGNAL('finished(int,QProcess::ExitStatus)'), self.convertFinished)
        self.connect(self.ui.stopKnop, QtCore.SIGNAL('clicked()'), self.abortall)
        self.connect(self.ui.quitknop, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
        self.connect(self.ui.ripknop, QtCore.SIGNAL("clicked()"), self.ripstart)
        self.connect(self.ui.convertTO, QtCore.SIGNAL("activated(QString)"), self.updateConvertTO)
        self.connect(self.ui.overwriteIfExists, QtCore.SIGNAL("stateChanged(int)"), self.updateOverwrite)
        self.connect(self.ui.browseknop, QtCore.SIGNAL("clicked()"), self.browseSaveLocation)


    def browseSaveLocation(self):
        directory = QtGui.QFileDialog.getExistingDirectory(self, "Opslaan in map...", self.ui.locatieInput.text())
        if (not directory.isEmpty()):
             self.ui.locatieInput.setText(directory)


    def abortall(self):
        self.abort = True
        self.http.abort()
        self.http.close()
        self.tmpfile.close()
        QtCore.QFile.remove(self.tmpfilename)
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)
        self.ui.output.setText("Gestopt.")
        self.ready()

       
    def busy(self):
        self.ui.quitknop.setEnabled(False)
        self.ui.ripknop.setEnabled(False)
        self.ui.stopKnop.setEnabled(True)
        #self.ui.locatieInput.setEnabled(False) # Deze disablen we pas bij convert. Dan kan de gebruik nog van gedachte wisselen.
        self.ui.yuriInput.setEnabled(False)
        #self.ui.convertTO.setEnabled(False)
        self.ui.overwriteIfExists.setEnabled(False) # Zelfde als bij locatieInput

    def ready(self):
        self.ui.quitknop.setEnabled(True)
        self.ui.ripknop.setEnabled(True)
        self.ui.stopKnop.setEnabled(False)
        self.ui.locatieInput.setEnabled(True)
        self.ui.yuriInput.setEnabled(True)
        self.ui.overwriteIfExists.setEnabled(True)
        self.ui.convertTO.setEnabled(True)


    def handleHeaderResponse(self, resp):
        code = resp.statusCode()
        # Handle redirection
        if (code >= 300 and code < 400 and resp.hasKey("location")):
            location = QtCore.QUrl(resp.value("location"))
            self.http.setHost(location.host())
            self.http.get(location.toString(), self.tmpfile)
        if self.debug:
            print "resp.statusCode: "+str(code)
           

    def updateConvertTO(self,CTO):
        if self.abort == False:
            self.convertTO = str(CTO)
            if self.debug:
                 print "User set converTO to: "+ CTO


    def updateOverwrite(self,val):
        self.overwriteIfExists = int(val)
        if self.debug:
            print "User set overwriteIfExists to: "+ str(val)


    def updateDownloadProgress(self, done, total):
        self.ui.progressbar.setMaximum(total)
        self.ui.progressbar.setValue(done)


    def ripstart(self):
        self.busy()
        self.abort = False
        d = QtCore.QDir ()
        if d.exists(self.ui.locatieInput.text()) == True:
            try:
                urltorip = self.ui.yuriInput.text()
                opener1 = urllib2.build_opener()
                page1 = opener1.open(str(urltorip))
                self.urlsource = page1.read()
                page1.close()
            except ValueError:
                self.ready()
                self.ui.output.setText("Error: Kon url niet behandelen.")
            else:
                self.parsePage()
        else:
            self.ready()
            self.ui.output.setText("De folder waar u het bestand in wil opslaan is\nniet schrijfbaar, of bestaat niet")


    def parsePage(self):        
        data = self.urlsource.split('\n')
        if self.debug:
             print self.urlsource
        dat = False
        self.ui.output.setText("Zoeken naar var")
        for line in data:
              kooktoestel = string.find(str(line),'fullscreenUrl');
              if kooktoestel !=  -1:
                   dat = line;
                   break
        if ( not dat ):
               self.ready()
               self.ui.output.setText("Fout: De door u op gegeven pagina is geen\n(of een onjuiste) youtube pagina.")
        else :
               movienamepat = re.compile( "title=(.*)\s*'" )
               vindnaam = movienamepat.search( dat )
               self.ui.output.setText("videonaam rippen")
               if vindnaam != None:
                   self.videonaam = vindnaam.group(1)
               else :
                   self.ready()
                   self.ui.output.setText("Error: videonaam niet gevonden!")
                   self.videonaam = 'Unknown'
               self.ui.output.setText("videourl rippen")
               pat = re.compile( "video_id=(.*)\s*&title(.*)" )
               vind = pat.search( dat )
               if vind != None:
                   self.videourl = vind.group(1)
                   if(self.debug):
                       print "Video url found: "+ self.videourl
                   self.checkBeforeDownload()
               else :
                   self.ready()
                   self.ui.output.setText("Error: videourl niet gevonden. Kan video niet downloaden.")
                   videourl = 'Niet gevonden'
   

    def checkBeforeDownload(self):
       if self.debug:
           print self.convertTO

       locatie = QtCore.QString(self.ui.locatieInput.text()+"/").append(self.videonaam).append("."+self.convertTO)
       if self.debug:
           print self.convertTO
           QtCore.qDebug(locatie.toAscii().data())
       f = QtCore.QFile (locatie);

       #print locatie
       if(f.exists()):
           print self.overwriteIfExists
           if( not self.overwriteIfExists or self.overwriteIfExists != 2):
                self.ready()
                self.ui.output.setText("De outputfile bestaat al.")
           else:
                self.ui.output.setText("Even geduld aub... Het kan even duren voordat\nhet bestand gedownload is.")
                QtCore.QFile.remove(self.ui.locatieInput.text()+"/"+self.videonaam+"."+self.convertTO)
                self.download()
       else:
           self.ui.output.setText("Even geduld aub... Het kan even duren voordat\nhet bestand gedownload is.")
           self.download()


    def download(self):
        self.tmpfile = QtCore.QFile(self.tmpfilename)
        if (self.tmpfile.open(QtCore.QIODevice.WriteOnly)):
            self.http.setHost("www.youtube.com")
            self.http.get(self.baseurl+self.videourl, self.tmpfile)
            self.ui.progressbar.show()
        else:
            self.ready()
            self.ui.output.setText("Error: kon tijdelijk bestand niet aanmaken.")


    def convert(self):
        self.ui.locatieInput.setEnabled(False)
        self.ui.convertTO.setEnabled(False)
        if str(self.convertTO) != "Niet converteren":
            if self.abort == False:
                 command = self.mimeIndex[self.convertTO] + "\""+QtCore.QString(self.ui.locatieInput.text()+"/").append(self.videonaam).append("."+self.convertTO)+"\""
                 #if self.debug:
                    #print "Execute command: "+command
                 self.qproc.setProcessChannelMode(QtCore.QProcess.MergedChannels);
                 self.qproc.start(command)
                 if(self.debug):
                    print self.qproc.readAll(); # Debugs
                 self.ui.output.setText("Bezig met converteren. Even geduld aub...")
        else:

             QtCore.QFile.copy(self.tmpfilename, self.ui.locatieInput.text()+"/"+self.videonaam+".flv")
             self.ui.output.setText("Gereed")


    def convertFinished(self, exitCode, exitStatus):
        self.ready()
        QtCore.QFile.copy(QtCore.QString(self.ui.locatieInput.text()+"/").append(self.videonaam).append("."+self.convertTO), QtCore.QString(self.ui.locatieInput.text()+"/").append(self.videonaam).append("."+self.convertTO))
        QtCore.QFile.remove(self.tmpfilename)
        if(self.debug):
            print "Convert Finished"
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)

        if(self.debug):
            print self.qproc.readAll(); # Debug

        if (exitCode == 0 and exitStatus == QtCore.QProcess.NormalExit):
            self.ui.output.setText("Gereed")
        else:
            self.ui.output.setText("Het converteren is mislukt.\n Indien er toch een media bestand is aangemaakt, is dit waarschijnlijk corrupt.")
        self.ui.stopKnop.setEnabled(False)

app = QtGui.QApplication(sys.argv)
f = ytripper()
f.show()
sys.exit(app.exec_())
Ik ben nu behoorlijk aan het experimenteren. Eerst met de waardes die jij gaf en nu zelfs overdreven met:
'avi':  "ffmpeg -i \""+self.tmpfilename+"\" -acodec copy -vcodec mpeg4 -ab 256 -ar -f avi 44100 -b 55000 -s 960x600 ",Nog steeds geen vooruitgang. Het geluid ben ik wel tevreden mee.

Qt4 Application [QT3 Application]
« Reactie #33 Gepost op: 2008/05/19, 01:08:40 »
Ik probeer het project op launchpad te krijg.

bzr push bzr+ssh://koenux@bazaar.launchpad.net/~koenux/ytripper/mainGeeft de volgende error:koen@koenux-server1-generic:~/Bureaublad/ytripper_1.0alpha-3_i386$ bzr push bzr+ssh://koenux@bazaar.launchpad.net/~koenux/ytripper/main
Permission denied (publickey).
bzr: ERROR: Connection closed: please check connectivity and permissions (and try -Dhpss if further diagnosis is required)
koen@koenux-server1-generic:~/Bureaublad/ytripper_1.0alpha-3_i386$ ssh: connect to host launchpad.net port 22: Connection timed out
ssh: connect to host launchpad.net port 22: Connection timed out
koen@koenux-server1-generic:~/Bureaublad/ytripper_1.0alpha-3_i386$
Ik heb al een SSH-key geupload naar launchpad. Doe ik iets fout?

Edit
http://bazaar.launchpad.net/~koenux/ytripper/main/changes :D

Qt4 Application [QT3 Application]
« Reactie #34 Gepost op: 2008/05/21, 00:07:04 »
Hmm ik heb dus nu een taalbestand:
http://bazaar.launchpad.net/~koenux/ytripper/main/annotate/vlerkknozem%40gmail.com-20080519155827-wgqoncqhgdduev9e?file_id=ytr_nl.ts-20080519155723-9yanfbvkqvwamrm7-4

Maar hoe wordt dan eigenlijk de gebruikte taal bepaald? In YTRipper zelf is dus nu alles engels. Ik neem aan dat ik iets moet veranderen in ytr.py?

Edit
Ik zie net dat ik in QT4 Linquist ook kan kiezen voor "Release as" en dan wordt het een *.qm bestand.

Edit2
Ik denk dat het deze functie is:
bool QTranslator::load ( const QString & filename, const QString & directory = QString(), const QString & search_delimiters = QString(), const QString & suffix = QString() )

Echter krijg ik steeds de fout:
Citaat
TypeError: first argument of unbound method QTranslator.load() must be a QTranslator instance
Ik weet niet precies wat je juiste syntax is, en of dit überhaubt wel is wat ik zoek.

Edit 3
Nice.... Vertaling werkt :D
qtTranslator  = QtCore.QTranslator()
qtTranslator.load('translations/ytr_nl.qm')
app.installTranslator(qtTranslator)
Alleen hoe zit dit nou? Als ik nu deze code er zo in zet dan kan pietje uit Nederland het lezen. Greetje die geen nederlands kan wil natuurlijk engels. Hoe fix ik dat? Kan ik default language dat greetje heeft ingesteld bij haar installatie opvragen en mbv die info de vertaling gebruiken? Of gebeurd dit al automatisch?

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #35 Gepost op: 2008/05/21, 01:37:04 »
Vanzelfsprekend kan je het ook handmatig instellen met die load() functie, dit is vaak handig voor Windows-gebruikers e.d. omdat die geen 'taalsysteem' hebben zoals Linux. Bij o.a. Linux wordt de taal automatisch vanzelf gekozen als je dit wil...

Zie de docu bij 'Internationalization': http://doc.trolltech.com/4.4/i18n.html#produce-translations

code snippet:
            QTranslator qtTranslator;
             qtTranslator.load("qt_" + QLocale::system().name(),
                     QLibraryInfo::location(QLibraryInfo::TranslationsPath));
             app.installTranslator(&qtTranslator);

             QTranslator myappTranslator;
             myappTranslator.load("myapp_" + QLocale::system().name());
             app.installTranslator(&myappTranslator);
Als je QLocale::system().name() gebruikt moet het formaat wel zijn zoals bv. nl_NL en nl_BE voor Nederlandstalige files
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #36 Gepost op: 2008/05/21, 03:20:24 »
Alweer bedankt beste profoX :)

Ik heb gekozen voor de tweede optie. Ik heb de nieuwste alpha nog niet naar launchpad geupload. Ik heb wel een nieuwe DEB en RPM op mijn site gezet.

Overigens heb ik onderaan de pagina op http://koenuxhost.no-ip.org/~YTRipper/index.php het volgende gezet: "Met dank aan profoX voor de technische hulp, en Nunslaughter voor het maken van de eerste deb. ". Als jullie dat liever niet hebben haal ik het weg.

Qt4 Application [QT3 Application]
« Reactie #37 Gepost op: 2008/05/21, 09:09:03 »
begint er echt goed uit te zien!

toch heb ik nog wat opmerkingen (kleintjes ;)).
de bijgevoegde bestanden van de .deb moeten wat opgeruimd worden. in de deb van alpha5 zit bijvoorbeeld nog de deb van alpha3 in. ook staat er een backup-file bij (usr/share/ytripper/ytr.py~).
ook zou ik bij de omschrijving 1 hoofdlijn gebruiken, en dan wat info eronder.

nu lees ik hier over vertalingen, en zie ook een taalbestand (denk ik toch) in de deb zitten, maar toch is mijn programma nog in het engels.
er is ook geen icoontje voor het programma geselecteerd. dus als ge bijvoorbeeld awn gebruik, ziet ge een lelijk wit venstertje op de balk staan.

Qt4 Application [QT3 Application]
« Reactie #38 Gepost op: 2008/05/21, 15:17:24 »
Wat betreft opruimen heb je zeker gelijk. Maar ja, daarvoor is het ook nog een alpha :D

Maar in de alpha 5 zie ik dus geen alpha3? Ik heb wel zoiets gehad inderdaad. Maar dacht ik verwijderd te hebben. Die backupfiles vind ik zo irritant! Ik vergeet ze inderdaad  op te ruimen. Ik zal de omschrijven eens wat leuker maken.

De laatste alpha5 heeft inderdaad taalondersteuning. Alpha4 had wel een taalbestand, maar daar werd verder niks mee gedaan.  Ik heb zelf overigens wel mijn applicatie in het Nederlands, dus weet niet precies waarom jij dit niet hebt.

Er is inderdaad geen icon. Die had ik er ooit wel geingezet dacht ik, maar die is eruit gegaan - denk ik - doordat ik eerst alle grafische dingen direct in de source deed, en dat profoX daarna een uitje had gebakken, maar geen icon erbij had gedaan. Dat ga ik nu even fixen :)

Edit
Wat betreft de icon, die zat er wel in, alleen was de path incorrect sinds dat ik het deb tijdperk in ging.

Edit2
Heb al de verbeteringen aangebracht, maar heb hem nog even niet geupload. Dat doe ik straks wel, kan ik er eventueel nog iets anders aan doen.

Qt4 Application [QT3 Application]
« Reactie #39 Gepost op: 2008/05/21, 16:49:25 »
hmm, hier een screenshot van de deb. er staat toch wel de deb van alpha 3 bij.
[img=http://img241.imageshack.us/img241/8272/ytripperxz9.th.png]


ik zou ook even het control bestand aanpassen. verander dit even:
Architecture: all
dan is het ook te installeren op een 64-bit systeem. anders krijgen zij een error als ze de deb openen.

ok, ik ben benieuwd naar de volgende versie alweer :)


edit: ik weet niet hoe de vertaling werkt met python en qt, maar ik vind niks terug over die 2 nl bestandjes in de sourcecode.

Qt4 Application [QT3 Application]
« Reactie #40 Gepost op: 2008/05/21, 19:09:25 »
ik had al een alpha6 geupload.. Ik zal de architecture zo ff aanpassen.

Helemaal onder aan ytr.py zou hetvolgende moeten staan:
app = QtGui.QApplication(sys.argv)
qtTranslator  = QtCore.QTranslator()
qtTranslator.load('/usr/share/ytripper/translations/'+QtCore.QLocale.system().name())
app.installTranslator(qtTranslator)
Edit

Misschien bij jou was mis gegaan bij een herinstallatie?
Probeer eens:
sudo apt-get remove --purge ytripperWaarschijnlijk geeft het wel een fout door een oudere, niet 'schone' deb waar nog een .pyc bestandje inzit. Die moet je dan eventueel even handmatig verwijderen.

Installeer daarna de laatste versie (alpha6) en dan moet hij het goed doen denk ik.

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #41 Gepost op: 2008/05/22, 17:38:51 »
De screenshots op de ytripper site zien er bij mij een klein beetje distorted (lichtjes uitgerekt) uit (firefox 3.0b5).. geen zoomprobleem, want de zoom staat uit en op andere sites is alles in orde..

PS: translation support etc. is nog niet toegepast in de bzr branch?
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #42 Gepost op: 2008/05/22, 23:46:27 »
Het lichtjes uitgerekt van de screenshots heeft waarschijnlijk de volgende oorzaak; Wanneer men een klein scherpje heeft, 800x600 bijvoorbeeld dan gingen de schreenshots over de teksts. Dus heb ik de width 100% mee gegeven zodat ze geresized worden. Ik moet denk ik 95% gaan gebruiken ofzo.

Ik heb inderdaad nog geen update gedaan in launchpad. Dit doe ik vandaag of morgen.

Vandaag heb ik besloten ook meerdere websites dan alleen youtube te ondersteunen. Eigenlijk zou ik de naam hierdoor weer moeten veranderen, maar ik denk dat ik dat niet doe. Daarnaast heb ik besloten de site automatisch te detecteren ipv een combobox dat ik ook even in gedachte had. Dat wordt denk ik te vol.

123video.nl heb ik vandaag laten ondersteunen ( nog niet geupload! dit wordt alpha 7 )
Dit was een stuk moeilijker dan youtube. Na wat onderzoek en hulp van downloadhelper heb ik uiteindelijk een succesvolle update kunnen maken aan de source.

De volgende defs heb ik erbij gemaak / aangepast.  ( youtube bevat de oude allereerste manier )

    def ripstart(self):
        self.busy()
        self.abort = False
        d = QtCore.QDir ()
        if d.exists(self.ui.locatieInput.text()) == True:
            try:
                urltorip = self.ui.yuriInput.text()
                pat = re.compile( "http://(.*)\s*/" )
                vind = pat.search( str(urltorip) )
                self.website = vind.group(1)
                opener1 = urllib2.build_opener()
                page1 = opener1.open(str(urltorip))
                self.urlsource = page1.read()
                page1.close()
            except ValueError:
                self.ready()
                self.ui.output.setText(QtGui.QApplication.translate("Form", "Failed to handle url.", None, QtGui.QApplication.UnicodeUTF8))
            else:
                self.checksite()
        else:
            self.ready()
            self.ui.output.setText(QtGui.QApplication.translate("Form", "The folder isn't readable or doesn't exists.", None, QtGui.QApplication.UnicodeUTF8))


    def checksite(self):
        if self.website == "youtube.com" or self.website == "www.youtube.com":
             self.host = 'youtube.com'
             self.baseurl = '/get_video.php?video_id='
             self.youtube()
        elif self.website == "www.123video.nl":
             self.host = '85.17.191.45'
             self.baseurl = ''
             self.i123video()


   def i123video(self):
        data = self.urlsource.split('\n')
        videonaamP = re.compile( "(.*?)\s* -(.*?)" )
        videoidP = re.compile( "123video_fs\\.swf\\?mediaSrc=(.*?)\s*\\&" )
        print videoidP
        videonaamS = videonaamP.search( str(data) )
        videoidS = videoidP.search( str(data) )
        self.videonaam = videonaamS.group(1)
        videoid = videoidS.group(1)
        path = int(videoid) / 1000
        self.videourl = '/'+str(path)+'/'+str(videoid)+'.flv'
        print self.videourl
        print self.videonaam
        if self.videourl == None:
            self.ui.output.setText(QtGui.QApplication.translate("Form", "Error: Video url not found. Couldn't download the video,", None, QtGui.QApplication.UnicodeUTF8))
            self.ready()
        else:
            self.checkBeforeDownload()
De rest is het zelfde. Enkel heb ik in download de host ook even aangepast. Ik ga nu werken aan de error handling. De i bij i123video is gewoon omdat je geen integers op het begin van een def mag hebben.

Heeft iemand nog suggesties voor meerdere sites?

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #43 Gepost op: 2008/05/23, 00:19:35 »
Ik zou een soort van plugin architectuur maken :) dat hij bv. een dir plugins/ scant en aan de hand daarvan je meerdere sites kan ondersteunen, zodat mensen ook makkelijk nieuwe websites toe kunnen voegen door een sample plug-in bestandje aan te passen..

...en ik zou de naam wel veranderen... anders staat het zo lullig he :P

FlashVideoRipper ofzo.. of FLVRipper.. of Flipper :P *kuch*

sites die ik ook wel eens gebruik naast YouTube:
http://www.vimeo.com/
http://video.google.com/ (nouja, google video toont video's van verschillende websites + van eigen website)
http://revver.com/
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #44 Gepost op: 2008/05/23, 00:35:17 »
Top idee profoX!

Alleen hoe zou ik dat erin moeten bouwen?

Ik neem aan dat ik gewoon de map "plugins/" moet doorscannen op plugin bestanden. Elk bestand moet gecontrolleert worden op fouten, en als er een fout inzit de plugin negeren. Zou ik dan het beste gebruik kunnen maken van XML bestandjes? Ik had gezien dat python dit ook kon parsen.

Maar dit lijkt me zelf best moeilijk. Op youtube bijvoorbeeld krijg ik de videonaam uit de url, en bij 123video uit de title tag. ( eigenlijk liever uit een divje ergens onder ).  En wat ook het lastige is, is dat  bij youtube bijvoorbeeld de url van de video met een simpele rexExp uit de source van de html pagina is te vissen. Bij 123video moet ik naast de regExp ook nog een som gebruiken ( id delen door 1000 ) om de map te krijgen. Hierachter ben ik gekomen door de swf te decomplilen :)

Dus het lijkt me nog al wat... Maar ik zal erover brainstormen

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #45 Gepost op: 2008/05/23, 01:21:05 »
Je kan ook 'plug-ins' maken die eigenlijk python scriptjes zijn. Dat lijkt me nog het meest flexibele in dit geval.
Morgen, als ik zin heb, zal ik eens proberen vimeo en revver te ondersteunen :)
..tenminse, als bazaar dan geüpdatet is.. commit + push?
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #46 Gepost op: 2008/05/23, 02:16:07 »
Oke dan :)

Ik heb even een soort 'structuur' voor plugins bedacht. Ik heb dus twee plugins in die structuur geschreven. Morgen zal ik proberen te zorgen dat de plugins gebruikt kunnen worden. Als ik iets niet voorelkaar krijg geef ik wel een gil :)

voorbeeld van een plug ( youtube )
##################################################
######### Plugin for youtube - by koenux #########
#
# input vars:
#   - data: string -> downloaded html page
#
# output vars:
#   - plugin_id: string -> unique id for plugin
#   - website: string -> trigger for plugin
#   - host: string -> host from video
#   - baseurl: string -> baseurl from site
#   - videoname: string -> name from video
#   - videourl: string -> full url from video
###################################################

# plug info
plugin_id = 'youtube'
website = 'youtube.com'

# find videoname
vnpat = re.compile( "title=(.*)\s*'" )
vnfnd = vnpat.search( data )

# find video url
vupat = re.compile( "video_id=(.*)\s*&title(.*)" )
vufnd = vupat.search( data )


# results
host = 'youtube.com'
baseurl '/get_video.php?video_id='
videoname = vnfnd.group(1)
videourl = vufnd.group(1)
Voorbeeld van een plugin voor 123video:
##################################################
######### Plugin for 123video.nl - by koenux #########
#
# input vars:
#   - data: string -> downloaded html page
#
# output vars:
#   - plugin_id: string -> unique id for plugin
#   - website: string -> trigger for plugin
#   - host: string -> host from video
#   - baseurl: string -> baseurl from site
#   - videoname: string -> name from video
#   - videourl: string -> full url from video
###################################################

# plug info
plugin_id = '123video'
website = '123video.nl'

# find videoname
vnpat = re.compile( re.compile( "(.*?)\s* -(.*?)" )
vnfnd = vnpat.search( data )

# find video url
vupat = re.compile( "123video_fs\\.swf\\?mediaSrc=(.*?)\s*\\&" )
vufnd = vupat.search( data )
videoid = vufnd.group(1)
path = int(videoid) / 1000

# results
host = '85.17.191.45'
baseurl ''
videoname = vnfnd.group(1)
videourl = '/'+str(path)+'/'+str(videoid)+'.flv'
Het is dus de bedoeling dat een plug herkent wordt door haar unieke id. Als iemand in ytripper invuld 'www.youtube.com/derestvandeuri' dan wordt in de variabele website gekeken of die erin zit met een string search.
De rest van de 'output' variabele zullen dan gebruikt worden.

Is deze voorstel van pluginstructuur goed, of moet er nog iets aan verbeterd worden?

Ps, als je de vimeo en revver ondersteuning wil schrijven kan ik beter even de huidige ytr.py geven...
Zie: http://koenuxhost.no-ip.org/~YTRipper/dev/ytr.py

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #47 Gepost op: 2008/05/23, 02:40:34 »
Citaat van: vlerknozem
Is deze voorstel van pluginstructuur goed, of moet er nog iets aan verbeterd worden?
Ik vind het wel goed zo.

Citaat van: vlerknozem
Ps, als je de vimeo en revver ondersteuning wil schrijven kan ik beter even de huidige ytr.py geven...
Zie: http://koenuxhost.no-ip.org/~YTRipper/dev/ytr.py
Is het niet véél simpeler om je bazaar branch gewoon te updaten door middel van een commit en push? meestal wordt dat bij elke kleine verandering gedaan.. (wordt zelfs afgeraden om teveel veranderingen in 1 commit te doen omdat dat gewoon onoverzichtelijk is) maar jij packaged vaker .debs dan dat je de bazaar branch updatet :P dat heb ik nog nooit meegemaakt
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #48 Gepost op: 2008/05/23, 03:39:11 »
Hahaha :P eens moet de eerste keer zijn he..

Ik zal morgen een update doen... Eigenlijk lag ik al in bed maar ik kan niet slapen :P Kan nu niet veel doen zonder lenzen.

Edit
Bazaar is geupdate. Nu ga ik beginnen aan de plugin ondersteuning :)

Qt4 Application [QT3 Application]
« Reactie #49 Gepost op: 2008/05/23, 16:24:07 »
Ik ben al een end

   def loadplugins(self):
        pt = QtCore.QDir(self.pluginpathAll)
        pt.setFilter(QtCore.QDir.Files | QtCore.QDir.Hidden | QtCore.QDir.NoSymLinks)
        if pt.isReadable():
           lst = QtCore.QDirIterator(self.pluginpathAll, QtCore.QDir.Files)

           while lst.hasNext():
              self.loadedplugins.append(lst.next())
 
        else:
           print 'dir not readable'
Nu probeer ik dus de plugins te laden:

   def usePlugin(self):
        plugin = ""
        for x in self.loadedplugins:
            print "zoek "+ str(self.website) + " in "+ str(x)
           

            if plugin == plugin_id:
               plugin = plugin_id
               break
        if plugin == "":
            print "Geen plugin gevonden voor deze site"
        else:
            print plugin
Maar ik heb geen idee hoe ik een plugin dan zeg maar include. Ik heb al eval() geprobeerd maar die geeft een error bij '=' tekens bij het definieeren van variabelen in de plugins.

Edit:
exec() schijnt wel te werken. Enkel nog wat fouten in de plugin fixen.

Is er ook iets om een plugin te checken op fouten om te voorkomen dat de hele applicatie 'crashed' ?

Edit2:
Plugin support werkt :D Plugins worden geladen vanaf /usr/share/ytripper/plugins/ en van /home/$USER/.ytripper/