Συλλογικός προγραμματισμός: eradio-playlist-generator  Το θέμα επιλύθηκε

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό simosx » 06 Ιούλ 2011, 14:42

@pmav99: πολύ ωραία. Σε πρόσθεσα στην ομάδα ubuntu-gr οπότε μπορείς να βάλεις τον παραπάνω κώδικα στο αποθετήριο. Το πρώτο σημαντικό είναι να δουλεύει για το σύνολο των σταθμών που θέλουμε να επεξεργαστούμε. Στο μέλλον θα δούμε αν υπάρχει ενδεχομένως πιο απλός τρόπος επεξεργασίας.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό sv1jsb » 06 Ιούλ 2011, 14:43

Μια λύση με regular expressions και την προσθήκη αντικειμένου για κάθε media.
Κώδικας: Επιλογή όλων

import codecs # open()
import re

RADIOLIST = 'radiolist.js'
class MediaData:
def __init__(self,title=None,city=None,id=None,logo=None):
self.title=title
self.city=city
self.id=id
self.logo=logo

class PlaylistGenerator:
def __init__(self):
with codecs.open(RADIOLIST, 'r', 'iso-8859-7') as f:
text = f.readlines() # Create a list with the lines
text = text[1:-1] # Remove first and last lines
text[-1] += "," # Add a comma at the last entry
mediadata=[]
for line in text:
line = line[2:-4] # clean-up each line
pedia = re.search(r'(mediatitle): (".*?").*?(city): (".*?").*?(mediaid): (\d+).*?(logo): (".*?")',line)
mediadata.append(MediaData(pedia.group(2),pedia.group(4),pedia.group(6),pedia.group(8)))
for md in mediadata:
print md.title, md.city, md.id, md.logo

if __name__ == '__main__':
playlist = PlaylistGenerator()
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό simosx » 06 Ιούλ 2011, 14:48

sv1jsb έγραψε: pedia = re.search(r'(mediatitle): (".*?").*?(city): (".*?").*?(mediaid): (\d+).*?(logo): (".*?")',line)


Νομίζω ότι η γραμμή αυτή είναι η κρίσιμη για να αναλύει εύκολα και σωστά το αρχείο.

Μπορεί να μπει στο αποθετήριο.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό sv1jsb » 06 Ιούλ 2011, 14:56

Κάνε μια διαλογή και ότι θέλεις ανέβασε το. Δεν γνωρίζω πως έχεις σκεφθεί το αποτέλεσμα αλλά νομίζω με το αντικείμενο MediaData είναι πιο ευανάγνωστος ο κώδικας.
Programming blog
Γνώσεις ⇛ Linux: Καλά ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 10.04 64bit
Προδιαγραφές ⇛ Phenom II │ 8GB │ 2xATI 5670 │ HD Audio │ TFT 23"
Άβαταρ μέλους
sv1jsb
babeTUX
babeTUX
 
Δημοσιεύσεις: 88
Εγγραφή: 01 Ιουν 2011, 23:50
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό simosx » 06 Ιούλ 2011, 15:12

sv1jsb έγραψε:Κάνε μια διαλογή και ότι θέλεις ανέβασε το. Δεν γνωρίζω πως έχεις σκεφθεί το αποτέλεσμα αλλά νομίζω με το αντικείμενο MediaData είναι πιο ευανάγνωστος ο κώδικας.


Ο στόχος της εργασίας αυτής είναι να προσεγγίσουμε το αποτέλεσμα με την προσφορά του καθένα. Είναι εντάξει να γίνουν αλλαγές, μικρές και μεγάλες.
Ο απώτερος στόχος είναι να φτιάξουμε ένα πρόγραμμα ώστε να παράγει αρχεία .pls και .xspf όπου μπορούμε να τα εισάγουμε στο Rhythmbox ή Banshee και να ακούμε ραδιόφωνο.
Πιστεύω ότι είμαστε αρκετά κοντά, ωστόσο η προσπάθεια που κάνουμε έχει νόημα όταν ο καθένας προσφέρει κάτι από την πλευρά του.
Οπότε, τα commit+push μπορούν να γίνουν ελεύθερα.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό pmav99 » 06 Ιούλ 2011, 15:39

@sv1jsb
Έχεις δίκιο ότι η σύνταξη με "." είναι πιο εύχρηστη από αυτή του dictionary. Τελείως ενημερωτικά, σαν μια πιο lightweight εναλλακτική, αντί για custom κλάση μπορεί να χρησιμοποιηθεί ένα namedtuple.

Κώδικας: Επιλογή όλων
from collections import namedtuple
MediaData = namedtuple('MediaData', ['title','city', 'id', 'logo'])
a = MediaData(title="Ubuntu", city="Athens", id="1", logo="no")
print a.city


Το βασικό του πλεονέκτημα έναντι της custom κλάσης είναι ότι είναι immutable.

Άλλος τύπος γενικού container είναι το Bunch. Εδώ σε πιο light έκδοση
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό simosx » 06 Ιούλ 2011, 16:25

pmav99 έγραψε:@sv1jsb
Έχεις δίκιο ότι η σύνταξη με "." είναι πιο εύχρηστη από αυτή του dictionary. Τελείως ενημερωτικά, σαν μια πιο lightweight εναλλακτική, αντί για custom κλάση μπορεί να χρησιμοποιηθεί ένα namedtuple.

Κώδικας: Επιλογή όλων
from collections import namedtuple
MediaData = namedtuple('MediaData', ['title','city', 'id', 'logo'])
a = MediaData(title="Ubuntu", city="Athens", id="1", logo="no")
print a.city


Το βασικό του πλεονέκτημα έναντι της custom κλάσης είναι ότι είναι immutable.

Άλλος τύπος γενικού container είναι το Bunch. Εδώ σε πιο light έκδοση


Δεν το ήξερα το «namedtuple» και φαίνεται καλό.

Το επόμενο βήμα θα ήταν να χρησιμοποιήσουμε τη δομή που έχει δημιουργηθεί ώστε να παράγουμε ένα XML αρχείο που θα είναι η λίστα αναπαραγωγής για .xspf, http://www.xspf.org/quickstart/
Το αρχείο .xml μπορεί να γίνει με το χέρι, ή να γίνει με κάποια βιβλιοθήκη που παράγει XML σε Python (αρκεί να είναι στις βασικές βιβλιοθήκες της Python).

Για το .pls, http://en.wikipedia.org/wiki/PLS_%28file_format%29 νομίζω ότι μπορεί να βγει αρκετά εύκολα.

Οπότε, κάντε ελεύθερα το commit+push για τον υπάρχων κώδικα και συνεχίζουμε.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό medigeek » 06 Ιούλ 2011, 17:39

simosx έγραψε:Υπάρχει και είναι το αρχείο radiolist.js.

Δεν φαινόταν εντάξει στο https://github.com/ubuntu-gr/eradio-pla ... diolist.js
Έφτιαξα ένα script που κατεβάζει το mediadata_1.js και παράγει ένα utf-8 radiolist.js:
https://github.com/ubuntu-gr/eradio-pla ... diolist.py
Καλό για αρχή. :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό pmav99 » 06 Ιούλ 2011, 17:45

Είναι νομίζω καλύτερο να μην υπάρχει σκόρπιος κώδικας μέσα σε ένα module. Κάνοντας import το getradiolist.py γεμίζει clutter το namespace.

Κώδικας: Επιλογή όλων
def get_radio_list():
...

if __name__ == "__main__":
get_radio_list()

Έτσι τρέχει κανονικά και από το command line και μπορείς να το κάνεις και import όπου θέλεις. Επίσης, νομίζω ότι μπορεί κάλλιστα η get_radio_list να γίνει μια μέθοδος της κλάσης αντί να είναι σε ξεχωριστό module.
pmav99
seniorTUX
seniorTUX
 
Δημοσιεύσεις: 574
Εγγραφή: 05 Ιούλ 2008, 14:29
Εκτύπωση

Re: Συλλογικός προγραμματισμός: eradio-playlist-generator

Δημοσίευσηαπό medigeek » 06 Ιούλ 2011, 17:54

έγραψε:super(PlaylistGenerator, self).__init__()

Αυτό τι κάνει; :?

pmav99 έγραψε:αντί για custom κλάση μπορεί να χρησιμοποιηθεί ένα namedtuple.

Υπάρχει και το dict() για παρόμοια χρήση, χωρίς επιπλέον module.
Τώρα ποιο είναι πιο lightweight δε γνωρίζω. :P

pmav99 έγραψε:Επίσης, νομίζω ότι μπορεί κάλλιστα η get_radio_list να γίνει μια μέθοδος της κλάσης αντί να είναι σε ξεχωριστό module.

Συμφωνοι θα το φτιάξω τώρα :)
Κύπριος; Κόπιασε στο ubuntu-cy! ┃ Launchpad Debian Github
Οδηγός για νεοεισερχόμενους -- Αρχικές οδηγίες για αρχάριους χρήστες του Ubuntu

1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 12.10 quantal 3.5.0-21-generic 64bit (en_US.UTF-8, GNOME cinnamon2d), Ubuntu 3.5.0-19-generic, Windows 7
3 Intel Core2 Duo CPU E6550 2.33GHz ‖ RAM 5970 MiB ‖ MSI MS-7235
4 nVidia G73 [GeForce 7300 GT] [10de:0393] {nvidia}
5 eth0: Realtek RTL-8110SC/8169SC Gigabit Ethernet [10ec:8167] (rev 10)
Άβαταρ μέλους
medigeek
Freedom
Freedom
 
Δημοσιεύσεις: 5023
Εγγραφή: 24 Μάιος 2008, 14:49
Τοποθεσία: Σερβία/Κύπρος
Launchpad: medigeek
IRC: savvas
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι