Nieuws:

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

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

Qt4 Application [QT3 Application]
« Gepost op: 2008/05/12, 14:59:24 »
Hoi,

Ik ben nu bezig met qt designer een app te maken.
Ik heb eigenlijk qua design alles af.. Nu de functionaliteit nog. De sluitbutton werkt zoals het hoort. Echter nu wil ik een simpel test slot maken.

Nu heb ik deze code
void Form5::convert()
{
    Form5.lineEdit1.setFocus(true);
}
Ik koppel de button "convert" aan het slot convert(). Deze wordt prima gevonden dus. Echter wanneer ik nu vrolijk test en op de betreffende button klik wordt de focus niet gelegd op lineEdit1.

Daarnaast vraag ik me af hoe ik een shell command kan gebruiken. Of is dit niet mogelijk?

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #1 Gepost op: 2008/05/12, 15:39:30 »
Eén grote tip: laat Qt 3 vallen en concentreer je op Qt 4. Qt 3 is bij wijze van spreken nog van de Middeleeuwen. Het integreert momenteel misschien beter met KDE 3, maar dat is dan ook een versie van KDE die de komende jaren steeds minder belangrijk zal worden en zal verdwijnen. Qt 4 is minstens 200 keer beter, gestructureerder en moderner ;)

Maar over je programma: setFocus() kan je niet aanroepen met een boolean argument. En je neemt een omweg, want setFocus() is zelf ook een slot, simpeler zou dus zijn om de button "convert" aan het slot setFocus() van die lineEdit1 te hangen als dat het enige is wat moet gebeuren.

Kijk ook eens of de terminal geen foutmelding geeft bij het uitvoeren van het programma, want signal/slot-verbindingen worden in run-time pas gelegd.

Shell commando's gebruiken: Met Qt kan je QProcess gebruiken. Zie de API documentatie en de voorbeelden.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #2 Gepost op: 2008/05/12, 16:06:41 »
Ik heb nu qt4-designer... Maar dit voorbeeldje was alleen even om te testen :)

Maar ik wil het eigenlijk toch maar met pyqt doen... Maar hoe kan ik van dit grafische nu een werkende app krijgen? Ik wil  dus wanneer je op de knop "Convert" klikt, dat er een commando wordt uitgevoerd met de oa de tekst uit een QTextEdit als input

Qt4 Application [QT3 Application]
« Reactie #3 Gepost op: 2008/05/12, 23:58:36 »
Oke... Ik ben even geheel overnieuw begonnen en ben nu best ver:

#!/usr/bin/python

# icon.py

import sys
import os
from PyQt4 import QtGui, QtCore
import urllib2


class flv2mp3(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        # window layout
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('flv2mp3 - youtube ripper 1.01')
        self.setWindowIcon(QtGui.QIcon('icons/favicon-vfl1123.png'))
        self.resize(500, 350);

        # Label
        self.mainlabel = QtGui.QLabel('

FLV2MP3

Kopieer de url van een youtube filmpje, en plak het in de input balk.', self)
        self.mainlabel.resize(500,90)

        # Youtube uri
        self.yuriLabel = QtGui.QLabel('Youtube URL:', self)
        self.yuriInput = QtGui.QLineEdit(self)
        self.yuriLabel.setGeometry(10, 80, 100, 20)
        self.yuriInput.setGeometry(90, 80, 400, 20)

        # Naam
        self.mp3naamLabel = QtGui.QLabel('Mp3 naam:', self)
        self.mp3naamInput = QtGui.QLineEdit(self)
        self.mp3naamLabel.setGeometry(10, 110, 100, 20)
        self.mp3naamInput.setGeometry(90, 110, 400, 20)

        # Locatie
        self.locatieLabel = QtGui.QLabel('Opslaan in:', self)
        self.locatieInput = QtGui.QLineEdit(self)
        self.locatieLabel.setGeometry(10, 140, 100, 20)
        self.locatieInput.setGeometry(90, 140, 400, 20)
        self.locatieInput.setText('~/Bureaublad/');

        # Ripknop
        ripknop = QtGui.QPushButton('Rip', self)
        ripknop.setGeometry(10, 10, 60, 35)

        # Sluitknop
        quit = QtGui.QPushButton('Sluiten', self)
        quit.setGeometry(10, 10, 60, 35)

        hbox = QtGui.QHBoxLayout()
        hbox.addStretch(1)
        hbox.addWidget(ripknop)
        hbox.addWidget(quit)

        vbox = QtGui.QVBoxLayout()
        vbox.addStretch(1)
        vbox.addLayout(hbox)

        self.setLayout(vbox)


        self.connect(quit, QtCore.SIGNAL('clicked()'),
            QtGui.qApp, QtCore.SLOT('quit()'))
        self.connect(ripknop, QtCore.SIGNAL("clicked()"), self.ripstart)

    def ripstart(self):
        dirname = '/home/koen/Youtube/'
        baseurl="http://youtube.com/get_video.php?"
        urltorip = "http://testurl.nl" # Dit werkt, maar als ik deze gebruik werkt het niet:: self.yuriInput.text()
        nameofvideo = self.mp3naamInput.text()
        if not os.path.isdir(dirname):
            os.mkdir(dirname)

        opener1 = urllib2.build_opener()
        page1 = opener1.open(urltorip)
        tempfile = page1.read()

        filename = dirname+'urlsource.txt'
        fOut = open(filename, "wb")
        fOut.write(tempfile)
        fOut.close()

        print urltorip;

app = QtGui.QApplication(sys.argv)
flv2mp3 = flv2mp3()
flv2mp3.show()
sys.exit(app.exec_())
Dit werkt dus al. Echter aks ik dus de url van het bestand dat gedownload wordt definieer vanuit de lineedit dan krijg ik deze error:
koen@koenux-server1-generic:~/Bureaublad/flv2mp3$ python flv2mp3.py
Traceback (most recent call last):
  File "flv2mp3.py", line 77, in ripstart
    page1 = opener1.open(urltorip)
  File "/usr/lib/python2.5/urllib2.py", line 373, in open
    protocol = req.get_type()
AttributeError: get_type

print urltorip geeft overigens wel de url die ik had ingevoerd.

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #4 Gepost op: 2008/05/13, 01:38:01 »
Het probleem is dat je een QString terugkrijgt en geen normale string, probeer dit:
urltorip = str(self.yuriInput.text())

Nog een paar opmerkingen:

* /home/koen bestaat natuurlijk niet bij iedereen.. probeer eens QtCore.QDir.homePath()
* baseurl wordt niet gebruikt?
* gebruik QLayouts om de items netjes op het scherm te krijgen
(en overweeg om je formulier in qt designer te ontwerpen, lijkt me handiger)
* ik zie waar je naartoe wil door de source naar een file te schrijven, maar dat lijkt me onnodig.. hou die tekst gewoon allemaal in het geheugen.. zomaar bestandjes aanmaken vind ik creepy.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #5 Gepost op: 2008/05/13, 13:47:42 »
1) Dat was idd nog een issue, maar je geeft me de oplossing :)
2) Baseurl wordt NOG niet gebruikt, maar straks wel.
3) Ik zal daar eens mee aan de slag gaan.
4) Bedankt voor de tip.

A kijk, ik zal str() eens proberen toe te passen. Ik zat al zoiets te denken.

Bedankt voor de tips. Ik kom zo denk ik al een stuk verder :)

Qt4 Application [QT3 Application]
« Reactie #6 Gepost op: 2008/05/13, 19:16:52 »
Ik ben al best ver... Alleen mijn laatste probleem is dat het venster grijs wordt als hij bezig is, en andere berichten gewoon niet mededeeld.

http://koenuxhost.no-ip.org/~vlerknozem/flv2mp3.py.txt

Maar goed. Het programma opzich werk al :)

Edit:
zie ook:
http://koenuxhost.no-ip.org/~vlerknozem/

Qt4 Application [QT3 Application]
« Reactie #7 Gepost op: 2008/05/15, 01:45:15 »
Dan zit ik nog met een brandende vraag.

Iedere keer als ik bijvoorbeeld de tekstlabel 'output' wil updaten met nieuwe informatie dan doet hij het niet. Alleen op het einde zet hij de waarde 'done' wel in de tekstlabel. Is er een mogelijkheid om dit op te lossen?

Qt4 Application [QT3 Application]
« Reactie #8 Gepost op: 2008/05/15, 02:07:08 »
Misschien wel handig in je 2e linkje erbij te zetten wat het proggie is en wat het doet ??
I don't suffer from insanity, I enjoy every minute of it.
Microsoft geeft je een raam, Linux geeft je een heel huis :D

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #9 Gepost op: 2008/05/15, 02:50:17 »
Citaat van: vlerknozem
Dan zit ik nog met een brandende vraag.

Iedere keer als ik bijvoorbeeld de tekstlabel 'output' wil updaten met nieuwe informatie dan doet hij het niet. Alleen op het einde zet hij de waarde 'done' wel in de tekstlabel. Is er een mogelijkheid om dit op te lossen?
Dat komt waarschijnlijk door het feit dat je main GUI thread geblokkeerd wordt door je download- en encodeerfunctie in python.. ik zal morgen eens proberen om het anders op te lossen.
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 #10 Gepost op: 2008/05/15, 04:33:14 »
Heb vannacht hard gewerkt aan een presentatie van me, en dacht van: ach, morgen heb ik toch geen school, laat ik maar wat gaan programmeren ;)

Dit zou al heel wat problemen moeten oplossen :)

flv2mp3.py
#!/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, os, urllib2, re, string
try:
    from PyQt4 import QtGui, QtCore, QtNetwork
except ImportError:
    print "pakket \"python-qt4\" is niet geinstalleerd. Installeer dit pakket en probeer het opnieuw. Controlleer ook of het pakket \"ffmpeg\" is geinstalleerd.";
    sys.exit()
from flv2mp3_ui import Ui_Form

class flv2mp3(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        # GUI interface
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.setWindowIcon(QtGui.QIcon('icons/favicon-vfl1123.png'))
        self.resize(500, 350)

        # 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.qproc = QtCore.QProcess()

        # 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.quitknop, QtCore.SIGNAL('clicked()'), QtGui.qApp, QtCore.SLOT('quit()'))
        self.connect(self.ui.ripknop, QtCore.SIGNAL("clicked()"), self.ripstart)

    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)

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

    def ripstart(self):
        urltorip = self.ui.yuriInput.text()
        opener1 = urllib2.build_opener()
        page1 = opener1.open(str(urltorip))
        urlsource = page1.read()
        data = urlsource.split('\n')

        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 line ):
               self.ui.output.setText("Fout. URL is waarschijnlijk geen 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)
                   self.ui.output.setText("Even geduld aub...\nHet kan even duren voordat het bestand gedownload is.")
                   self.download()
               else :
                   self.ui.output.setText("error: videourl niet gevonden. Kan video niet downloaden.")
                   videourl = 'Niet gevonden'

    def download(self):
        baseurl="/get_video.php?video_id="
        self.tmpfile = QtCore.QFile("/tmp/flv2mp3_tmp")
        if (self.tmpfile.open(QtCore.QIODevice.WriteOnly)):
            self.http.setHost("www.youtube.com")
            self.http.get(baseurl+self.videourl, self.tmpfile)
            self.ui.progressbar.show()
        else:
            self.ui.output.setText("error: kon tijdelijk bestand niet aanmaken.")

    def convert(self):
        saveindir = str(self.ui.locatieInput.text())
        command = str("ffmpeg -i \"/tmp/flv2mp3_tmp\" \""+saveindir+"/"+self.videonaam+".mp3\"");
        self.qproc.start(command)
        self.ui.output.setText("Bezig met converteren.")

    def convertFinished(self, exitCode, exitStatus):
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)
        if (exitCode == 0 and exitStatus == QtCore.QProcess.NormalExit):
            self.ui.output.setText("Gereed")
        else:
            self.ui.output.setText("Error: converteren mislukt.")

app = QtGui.QApplication(sys.argv)
flv2mp3 = flv2mp3()
flv2mp3.show()
sys.exit(app.exec_())
flv2mp3.ui

 Form
 
 
   
    0
    0
    476
    327
   

 

 
   flv2mp3 - youtube ripper 0.99
 

 
   
   
     
      <h1>FLV2MP3</h1>Kopieer de url van een youtube filmpje, en plak het in de input balk.
     

     
      Qt::RichText
     

     
      true
     

   

   

   
   
     
     
       
        &Youtube URL:
       

       
        yuriInput
       

     

     

     
     
     

     
     
       
        &Opslaan in:
       

       
        locatieInput
       

     

     

     
     
     

   

   

   
   
     
      Qt::Vertical
     

     
     
       20
       40
     

     

   

   

   
   
     
     
       75
       true
     

     

     
     
     

     
      Qt::AlignCenter
     

   

   

   
   
     
      Qt::Vertical
     

     
     
       20
       40
     

     

   

   

   
   
     
     
       
       
         1
         0
       

       

       
        24
       

     

     

     
     
       
        Qt::Horizontal
       

       
       
         40
         20
       

       

     

     

     
     
       
        &Rip
       

     

     

     
     
       
        &Sluiten
       

     

     

   

   

 

 

 
 
Wat heb ik aangepast:

* in plaats van die blocking urllib2 gebruiken we nu QHttp van Qt zelf met een aantal verbindingen.. als kers op de taart zit er dan ook maar een voortgangsbalk bij in nu voor het downloaden omdat dat vrij simpel is met QHttp.
* maar hoewel QHttp zeer geavanceerd is, is het niet altijd even simpel, en hij kan zomaar geen redirects uit zichzelf, dus hebben we een handleHeaderResponse functie gemaakt om de redirect af te handelen
* converteren via ffmpeg gaat nu via QProcess in plaats van die blocking write functie.. zo zal de GUI niet vastzitten tijdens het converteren.
* de GUI is in een .ui file gegooid (met designer-qt4) en we hebben er een layout opgeknald
* heb hier en daar ook nog wat kleine dingetjes aangepast..

Hopelijk heb ik niks stukgedaan :P

Als je het programma wil testen of wat dan ook moet je er eerst voor zorgen dat je de .ui file van qt designer compileert naar een python module, en dat zal je dus ook moeten doen wanneer je de .ui file aanpast met designer, en dat doe je zo:

pyuic4 flv2mp3.ui > flv2mp3_ui.py

Mensen die het programma alleen maar willen gebruiken zijn natuurlijk niet veel met die .ui file, dus je moet er altijd voor zorgen dat je het naar een .py file omzet met pyuic4.

Zo zou het er ongeveer uit moeten zijn als het werkt:
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #11 Gepost op: 2008/05/15, 10:21:17 »
Damn, super bedankt profoX!

Ik had al een nieuwe versie. In deze versie heb ik jou verbeteringen aangebracht.

flv2mp3.py
#!/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, os, urllib2, re, string
import subprocess as sp
from flv2mp3_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. Controlleer 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('icons/favicon-vfl1123.png'))
        self.resize(500, 350)

        self.convertTO = ''
        self.convertTODefault = 'mp3'
        self.tmpfilename = '/tmp/flv2mp3_tmp'
        self.baseurl = 'http://youtube.com/get_video.php?video_id='

        # 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.qproc = QtCore.QProcess()

        # 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.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)

    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):
        self.convertTO = CTO
        if self.debug:
            print "User set converTO to: "+ CTO


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


    def timerEvent(self, event):
        if self.step >= 100:
            self.timer.stop()
            return
        self.step = self.step + 1
        self.ui.pbar.setValue(self.step)


    def ripstart(self):
        self.ui.output.setText("Even geduld aub... Het kan even duren voordat\nhet bestand gedownload is.")
        try:
            urltorip = self.ui.yuriInput.text()
            opener1 = urllib2.build_opener()
            page1 = opener1.open(str(urltorip))
            self.urlsource = page1.read()

        except ValueError:
            self.ui.output.setText("Error: Kon url niet behandelen.")
        else:
            self.parsePage()


    def parsePage(self):        

        data = self.urlsource.split('\n')

        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 line ):
               self.ui.output.setText("Fout: De door u op gegeven pagina is geen, 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.download()
               else :
                   self.ui.output.setText("error: videourl niet gevonden. Kan video niet downloaden.")
                   videourl = 'Niet gevonden'
     
    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.ui.output.setText("error: kon tijdelijk bestand niet aanmaken.")


    def convert(self):
        if self.debug:
           print "Converting video to: "+self.convertTO
        if( not self.convertTO ):
            self.convertTO = self.convertTODefault
            if self.debug:
                print "convertTO was empty. Set convertTO to mp3"

        saveindir = str(self.ui.locatieInput.text())
        if self.convertTO == "mp3":
            command = "ffmpeg -i \""+self.tmpfilename+"\" \""+saveindir+"/"+self.videonaam+".mp3\""
        elif self.convertTO == "mpeg":
            command = "ffmpeg -i \""+self.tmpfilename+"\" -ab 56 -ar 22050 -b 500 -s 320x240 "+ saveindir+"/"+self.videonaam+".mpg\""
        else:
            print "Fatal error: no converTO type."
            sys.exit()

        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.")


    def convertFinished(self, exitCode, exitStatus):
        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("Error: converteren mislukt met errorcode"+str(exitCode)+".")


app = QtGui.QApplication(sys.argv)
f = flv2mp3()
f.show()
sys.exit(app.exec_())
Ik heb ook even een optie tot debug erbij gezet. Enkel nog een 'flv2mp3 --debug' optie maken voor de terminal :)
Krijg nu helaas alleen de medeling 'videourl rippen' en 'gereed'. Zal wel ergens een kleine fout gemaakt hebben. Helaas werkt het converteren naar mpeg nog niet goed, of ik heb te weinig geduld.

Edit:
Code updated

Ik krijg nu de debug output:
Citaat
koen@koenux-server1-generic:~/Bureaublad/flv2mp3$ python flv2mp3.py --debug
Video url found: zpdzEr1Risk&l=12&sk=vqKXyRz30LyAGxa0llXCRm7D0jgscKWWC&fmt_map=&t=OEgsToPDskKSWuF8KOXgFPZjslWqeP9Y&hl=en&plid=AARNQSflG-pEzfvkAAAAoAAAAAA&sdetail=f%253Arelated%252C
resp.statusCode: 303
resp.statusCode: 200
Execute command: ffmpeg -i "/tmp/flv2mp3_tmp" "/home/koen/Foucault pendulum.mp3"
Wat er op doet lijken dat convertFinished niet wordt aangeroepen

Edit 2:
Ik ben tot de conclusie gekomen dat dit gebeurd wanneer de output file al bestaat. Dus  moet ik controleren of deze al bestaat, en eventueel een _1 achter de naam zetten. Nu kan het zijn dat deze ook bestaat. Is het slim om met een for door te gaan tot ik een nieuwe naam heb, of is er een betere oplossing? Een random code erachter zetten is ook een optie.

Edit 3:
Code updated
Ik krijg nu een segmentation fault:
Citaat
koen@koenux-server1-generic:~/Bureaublad/flv2mp3$ python flv2mp3.py --debug
User set converTO to: mpeg
Video url found: uF6Rd8iy4CM&l=331&sk=N7De-Wtp9_MeZi3HhBHGqyoYmkVwX1anC&fmt_map=&t=OEgsToPDskLbct5GlLIuIZKtOe4OuZmg&hl=en&plid=AARNQcH6lLbrbjrvAAAAoAAAAAA
resp.statusCode: 303
resp.statusCode: 200
Segmentation fault
Edit 4:
Na het handmatig verwijderen van de tmp video deed ie het gewoon weer. Dus nadat ie klaar is laat ik hem automatisch de tmp video maar verwijderen.

Qt4 Application [QT3 Application]
« Reactie #12 Gepost op: 2008/05/15, 13:16:57 »
Oke. Ik ben al stukken verder :)

Bugs:
- Segmentation fault bij mpeg als output
- Enkele mededelingen worden niet in ui.output verwerkt.

Todo:
- Cancel button om het proces te beeindigen.
- Configuratie systeem om het standaardformaat etc grafisch aan te passen. Dus niet met gedit ed.
- Bugs fixen :)

flv2mp3.py
#!/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, os, urllib2, re, string
import subprocess as sp
from flv2mp3_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. Controlleer 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('icons/favicon-vfl1123.png'))
        self.resize(500, 350)

        self.convertTO = ''
        self.convertTODefault = 'mp3'
        self.extention = '.mp3'
        self.tmpfilename = '/tmp/flv2mp3_tmp'
        self.baseurl = 'http://youtube.com/get_video.php?video_id='
        self.overwriteIfExists = 0


        # 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.qproc = QtCore.QProcess()

        # 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.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 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):
        self.convertTO = CTO
        self.extention = "."+CTO
        if self.debug:
            print "User set converTO to: "+ CTO


    def updateOverwrite(self,val):
        self.overwriteIfExists = 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 timerEvent(self, event):
        if self.step >= 100:
            self.timer.stop()
            return
        self.step = self.step + 1
        self.ui.pbar.setValue(self.step)


    def ripstart(self):
        self.ui.output.setText("Even geduld aub... Het kan even duren voordat\nhet bestand gedownload is.")
        try:
            urltorip = self.ui.yuriInput.text()
            opener1 = urllib2.build_opener()
            page1 = opener1.open(str(urltorip))
            self.urlsource = page1.read()

        except ValueError:
            self.ui.output.setText("Error: Kon url niet behandelen.")
        else:
            self.parsePage()


    def parsePage(self):        

        data = self.urlsource.split('\n')

        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 line ):
               self.ui.output.setText("Fout: De door u op gegeven pagina is geen, 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):
       f = QtCore.QFile ( self.ui.locatieInput.text()+"/"+self.videonaam+self.extention );
       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:
                QtCore.QFile.remove(self.ui.locatieInput.text()+"/"+self.videonaam+self.extention)
                self.download()
       else:
           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.ui.output.setText("error: kon tijdelijk bestand niet aanmaken.")


    def convert(self):
        if self.debug:
           print "Converting video to: "+self.convertTO
        if( not self.convertTO ):
            self.convertTO = self.convertTODefault
            if self.debug:
                print "convertTO was empty. Set convertTO to mp3"

        saveindir = str(self.ui.locatieInput.text())
        if self.convertTO == "mp3":
            command = "ffmpeg -i \""+self.tmpfilename+"\" \""+saveindir+"/"+self.videonaam+self.extention+"\""
        elif self.convertTO == "mpeg":
            command = "ffmpeg -i \""+self.tmpfilename+"\" -ab 56 -ar 22050 -b 500 -s 320x240 "+ saveindir+"/"+self.videonaam+self.extention+"\""
        else:
            print "Fatal error: no converTO type."
            sys.exit()

        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.")


    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("Error: converteren mislukt met errorcode"+str(exitCode)+".")


app = QtGui.QApplication(sys.argv)
f = flv2mp3()
f.show()
sys.exit(app.exec_())
flv2mp3_UI.py
# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'flv2mp3.ui'
#
# Created: Thu May 15 08:02:21 2008
#      by: PyQt4 UI code generator 4.3.3
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(QtCore.QSize(QtCore.QRect(0,0,476,327).size()).expandedTo(Form.minimumSizeHint()))

        self.vboxlayout = QtGui.QVBoxLayout(Form)
        self.vboxlayout.setObjectName("vboxlayout")

        self.label = QtGui.QLabel(Form)
        self.label.setTextFormat(QtCore.Qt.RichText)
        self.label.setWordWrap(True)
        self.label.setObjectName("label")
        self.vboxlayout.addWidget(self.label)

        self.gridlayout = QtGui.QGridLayout()
        self.gridlayout.setObjectName("gridlayout")

        self.label_2 = QtGui.QLabel(Form)
        self.label_2.setObjectName("label_2")
        self.gridlayout.addWidget(self.label_2,0,0,1,1)

        self.yuriInput = QtGui.QLineEdit(Form)
        self.yuriInput.setObjectName("yuriInput")
        self.gridlayout.addWidget(self.yuriInput,0,1,1,1)

        self.label_3 = QtGui.QLabel(Form)
        self.label_3.setObjectName("label_3")
        self.gridlayout.addWidget(self.label_3,1,0,1,1)

        self.locatieInput = QtGui.QLineEdit(Form)
        self.locatieInput.setObjectName("locatieInput")
        self.gridlayout.addWidget(self.locatieInput,1,1,1,1)
        self.vboxlayout.addLayout(self.gridlayout)

        self.convertTO = QtGui.QComboBox(Form)
        self.gridlayout.addWidget(self.convertTO,2,1,1,1)
        self.convertTO.setObjectName("convertTO")

        self.overwriteIfExists = QtGui.QCheckBox(Form)
        self.gridlayout.addWidget(self.overwriteIfExists,3,1,1,1)
        self.convertTO.setObjectName("overwriteIfExists")

        spacerItem = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
        self.vboxlayout.addItem(spacerItem)

        self.output = QtGui.QLabel(Form)

        font = QtGui.QFont()
        font.setWeight(75)
        font.setBold(True)
        self.output.setFont(font)
        self.output.setAlignment(QtCore.Qt.AlignCenter)
        self.output.setObjectName("output")
        self.vboxlayout.addWidget(self.output)

        spacerItem1 = QtGui.QSpacerItem(20,40,QtGui.QSizePolicy.Minimum,QtGui.QSizePolicy.Expanding)
        self.vboxlayout.addItem(spacerItem1)

        self.hboxlayout = QtGui.QHBoxLayout()
        self.hboxlayout.setObjectName("hboxlayout")

        self.progressbar = QtGui.QProgressBar(Form)

        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(1)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.progressbar.sizePolicy().hasHeightForWidth())
        self.progressbar.setSizePolicy(sizePolicy)
        self.progressbar.setProperty("value",QtCore.QVariant(24))
        self.progressbar.setObjectName("progressbar")
        self.hboxlayout.addWidget(self.progressbar)

        spacerItem2 = QtGui.QSpacerItem(40,20,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
        self.hboxlayout.addItem(spacerItem2)

        self.ripknop = QtGui.QPushButton(Form)
        self.ripknop.setObjectName("ripknop")
        self.hboxlayout.addWidget(self.ripknop)

        self.quitknop = QtGui.QPushButton(Form)
        self.quitknop.setObjectName("quitknop")
        self.hboxlayout.addWidget(self.quitknop)
        self.vboxlayout.addLayout(self.hboxlayout)
        self.label_2.setBuddy(self.yuriInput)
        self.label_3.setBuddy(self.locatieInput)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        Form.setWindowTitle(QtGui.QApplication.translate("Form", "flv2mp3 - youtube ripper 0.99", None, QtGui.QApplication.UnicodeUTF8))
        self.overwriteIfExists.setText(QtGui.QApplication.translate("Form", "Overschrijf bestand indien het al bestaat.", None, QtGui.QApplication.UnicodeUTF8))
        self.label.setText(QtGui.QApplication.translate("Form", "

FLV2MP3

Kopieer de url van een youtube filmpje, en plak het in de input balk.", None, QtGui.QApplication.UnicodeUTF8))
        self.label_2.setText(QtGui.QApplication.translate("Form", "&Youtube URL:", None, QtGui.QApplication.UnicodeUTF8))
        self.label_3.setText(QtGui.QApplication.translate("Form", "&Opslaan in:", None, QtGui.QApplication.UnicodeUTF8))
        self.ripknop.setText(QtGui.QApplication.translate("Form", "&Rip", None, QtGui.QApplication.UnicodeUTF8))
        self.quitknop.setText(QtGui.QApplication.translate("Form", "&Sluiten", None, QtGui.QApplication.UnicodeUTF8))
        self.convertTO.addItem(QtGui.QApplication.translate("Form", "mp3", None, QtGui.QApplication.UnicodeUTF8))
        self.convertTO.addItem(QtGui.QApplication.translate("Form", "mpeg", None, QtGui.QApplication.UnicodeUTF8))

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #13 Gepost op: 2008/05/15, 15:00:53 »
Ziet er al best leuk uit. Als je wil dat ik er ook nog wat naar kijk, moet je de .ui ook erbij uploaden.
En is de naam "flv2mp3" nog wel geschikt wanneer je meerdere formaten wil gaan ondersteunen? :P
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #14 Gepost op: 2008/05/15, 15:05:29 »
Hmm ja :P

Ik heb eigenlijk niet met de designer gewerkt. De nieuwe velden zijn gewoon toegevoegd aan de layouts die jij had gemaakt. Ik zal nog wel even een uitje maken. Zijn wel niet lekker om rouw te eten he ;)

de naam is idd misschien niet meer zo geschikt, dus ik ga wel iets anders verzinnen... Miscchien gewoon "youtube rippen" ofzo. Overigens heb ik al weer een update van flv2mp3.py. Ik heb nu de commands voor ffmpeg in een array gezet.

Qt4 Application [QT3 Application]
« Reactie #15 Gepost op: 2008/05/15, 15:50:24 »
Damn, best lastig werken met een Layout.

Maar ik heb het uitje voor je gebakken, volgens mij klopt hij zo:

 Form
 
 
   
    0
    0
    476
    425
   

 

 
   YTRipper - YouTube ripper 1.0 Alpha
 

 
   
   
     
      <h1>YTRipper</h1>Kopieer de url van een youtube filmpje, en plak het in de input balk.
     

     
      Qt::RichText
     

     
      true
     

   

   

   
   
     
      0
     

     
     
       
        &Youtube URL:
       

       
        yuriInput
       

     

     

     
     
     

     
     
       
        &Opslaan in:
       

       
        locatieInput
       

     

     

     
     
       
       
         mp3
       

       

       
       
         mpeg
       

       

     

     

     
     
     

     
     
       
        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
       

     

     

     
     
       
        &Sluiten
       

     

     

   

   

 

 

 
 
En de laatste versie van flv2mp3.py:
#!/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 flv2mp3_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. Controlleer 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('icons/favicon-vfl1123.png'))
        self.resize(500, 350)

        self.convertTO = 'mp3' # default

        self.extention = '.mp3'
        self.tmpfilename = '/tmp/flv2mp3_tmp'
        self.baseurl = 'http://youtube.com/get_video.php?video_id='
        self.overwriteIfExists = 0

        self.mimeIndex = {
           'mp3': "ffmpeg -i \""+self.tmpfilename+"\" ",
           'mpeg': "ffmpeg -i \""+self.tmpfilename+"\" -ab 56 -ar 22050 -b 500 -s 320x240 ",
           'avi': "ffmpeg -i \""+self.tmpfilename+"\" -ab 56 -ar 22050 -b 500 -s 320x240 ",
           'ogg': "ffmpeg -i \""+self.tmpfilename+"\" -acodec vorbis -aq 50 "
        }

        # 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.qproc = QtCore.QProcess()

        # 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.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 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):
        self.convertTO = str(CTO)
        if self.debug:
            print "User set converTO to: "+ CTO


    def updateOverwrite(self,val):
        self.overwriteIfExists = str(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 timerEvent(self, event):
        if self.step >= 100:
            self.timer.stop()
            return
        self.step = self.step + 1
        self.ui.pbar.setValue(self.step)


    def ripstart(self):
        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()
            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 niet schrijfbaar, of bestaat ")


    def parsePage(self):        

        data = self.urlsource.split('\n')

        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 line ):
               self.ui.output.setText("Fout: De door u op gegeven pagina is geen, 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()
        else:
            self.ui.output.setText("error: kon tijdelijk bestand niet aanmaken.")


    def convert(self):
        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.")


    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 deze waarschijnlijk corrupt.")


app = QtGui.QApplication(sys.argv)
f = flv2mp3()
f.show()
sys.exit(app.exec_())
Edit
Bug MPEG gefixed. Bleek een Memory error te zijn omdat ik str() was vergeten in:
   def updateConvertTO(self,CTO):
        self.convertTO = str(CTO)
        if self.debug:
            print "User set converTO to: "+ CT
O

Edit 2
Code update.
De dir waar het bestand naar toe wordt geschreven door ffmpeg wordt nu eerst gecontrolleerd of het wel bestaat. Zo ja dan wordt pas de urlsource gedownload, etc.

Qt4 Application [QT3 Application]
« Reactie #16 Gepost op: 2008/05/16, 17:02:18 »
Het werkt nu al perfect. Ik heb de nieuwste versie online gezet in een tarball. De ui zit er ook in.
http://koenuxhost.no-ip.org/~vlerknozem/

Ik ben al zeer tevreden. Alleen als ik de boel naar ogg wil converteren geeft ffmpeg een fout.

Nu maar brainstormen of ik nog iets erbij maak :)

Nogmaals super bedankt voor de hulp profoX :)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #17 Gepost op: 2008/05/16, 23:59:19 »
Hmm. Het werkt bij mij niet meer, vlerknozem.
Dit:
self.baseurl = 'http://youtube.com/get_video.php?video_id='
moet zijn:
self.baseurl = '/get_video.php?video_id='
QHttp is nogal een beetje gevoelig voor dat soort zaken, blijkbaar.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #18 Gepost op: 2008/05/17, 00:07:27 »
Hmmm bij mij werkt het wel... Maar ik zal het veranderen.

Wel raar dan dat hij het bij jou niet doet. Ik heb nog enkele verbeteringen uitgebracht, maar nog niet online gezet. Ga ik zo doen.  Heb de optie "Niet converteren" toegevoegd ( de ui nog niet geupdate ), en heb gekeken naar een bugje.

Laatste bug die ik kreeg is bij het drukken op de stopknop. Als je daarna weer op convert klikt krijgt hij een alleen lezen error en een segmentation fault

QIODevice::write: ReadOnly device
QIODevice::write: ReadOnly device
QIODevice::write: ReadOnly device
QIODevice::write: ReadOnly device
/usr/bin/ytripper: line 2: 12449 Segmentation fault      python /usr/share/ytripper/ytr.py $1

Ik dacht dat ik misschien de tmp file moest sluiten enzo. Dit in dus abortall:
   def abortall(self):
        self.abort = True
        self.http.abort
        self.tmpfile.close()
        QtCore.QFile.remove(self.tmpfilename)
        self.ui.progressbar.hide()
        self.ui.progressbar.setValue(0)
        self.ui.output.setText("Gestopt.")
Wellicht een kleinigheidje.

Edit
Tarball geupdate.

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #19 Gepost op: 2008/05/17, 00:46:12 »
Oei. Ik weet niet precies wat er mis is wanneer je abort en daarna opnieuw wil downloaden,
maar het zit hier ergens :) ik zal eens zoeken..
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7f3906fa26e0 (LWP 17505)]
0x00007f3903a02f4b in QIODevice::write () from /usr/lib/libQtCore.so.4
(gdb) bt
#0  0x00007f3903a02f4b in QIODevice::write () from /usr/lib/libQtCore.so.4
#1  0x00007f38fe8599a5 in ?? () from /usr/lib/libQtNetwork.so.4
#2  0x00007f38fe85ad0f in QHttp::qt_metacall () from /usr/lib/libQtNetwork.so.4
#3  0x00007f38feb56f85 in ?? ()
   from /usr/lib/python2.5/site-packages/PyQt4/QtNetwork.so
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #20 Gepost op: 2008/05/17, 00:53:57 »
Bug fixed :D
   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.")
Tarball maar weer updaten :)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #21 Gepost op: 2008/05/17, 00:57:32 »
Damn, ik had het ook gevonden :P good job

edit: pssst, waarom gooi je dit appje niet op Launchpad en de source in Bazaar? :) zo heb je een revision control systeem en een bug tracker.. en hoef je niet telkens tarballs te updaten.
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #22 Gepost op: 2008/05/17, 01:03:33 »
Haha ik wist wel dat je het zou vinden :) Het schoot me zo opeens te binnen om even nog te zoeken naar abort op de site. Toen zag ik de  close.

Alleen nu nog kijken of ik naar ogg kan converteren. Dan is ie helemaal klaar, hoewel ik misschien nog een configuratie systeem erin wil hebben. Dan kan je instellen wat je standaard locatiedir is enzo. Maar weet nog niet precies hoe ik dat ga aanpakken. Maar dat komt dan in de beta.

Misschien straks maar een topicje in etalage maken :)

edit
Ja dat ga ik ook maar doen idd :)

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 :)

Offline profoX

  • Lid
    • wesley
    • Lionslink
Qt4 Application [QT3 Application]
« Reactie #23 Gepost op: 2008/05/17, 01:15:30 »
Mjah. Deftige debs maken moet je kunnen ;) (Ik kan het ook niet)

Configuratiesysteem maak je zo simpel of uitgebreid als je zelf wil.

Als je bv. wil dat bepaalde settings worden bijgehouden moet je eens kijken naar QSettings :)
http://doc.trolltech.com/4.4/qsettings.html

... ik ga btw ook nog snel even een kleine usability verbetering toevoegen om de
modulariteit, flexibiliteit en kracht van Qt 4 aan te tonen :P

ps: is het eigenlijk de bedoeling om naar Ogg Theora (video) of naar Ogg Vorbis (geluid) te converteren? :P

edit: zit je niet op IRC ofzo? praat gemakkelijker over dit.. #python-nl bijvoorbeeld, of #qt :) (op de Freenode server)
Human Knowledge Belongs To The World -- Antitrust (2001)
Nederlandstalige Ubuntu documentatie van Ubuntu-NL (wiki)

Qt4 Application [QT3 Application]
« Reactie #24 Gepost op: 2008/05/17, 01:19:38 »
Nee zit niet op IRC. Zit wel op msn. Even kijken hoe dat IRC werkt.

"ps: is het eigenlijk de bedoeling om naar Ogg Theora (video) of naar Ogg Vorbis (geluid) te converteren?"
Weet niet of het echt zinvol is maar vond het wel leuk:P

Overigens hoe werkt dat bazaar precies? Heb wel de tut gevonden: http://doc.bazaar-vcs.org/bzr.dev/en/mini-tutorial/index.html

Maar sudo apt-get install bazaar wil niet baten. Welke repo heb ik daarvoor nodig?

Edit
Hoe werkt IRC eigenlijk? Moet ik een account aanmaken? Ik probeer op de server sterling.freenode.net via pidgin maar dat lukt niet echt.