diff cover2musc/cover2music.py @ 0:dcd610585610

INIT
author prymula <prymula76@outlook.com>
date Thu, 21 Sep 2023 22:32:14 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cover2musc/cover2music.py	Thu Sep 21 22:32:14 2023 +0200
@@ -0,0 +1,835 @@
+#!/usr/bin/env python3
+#
+# cover2music - appka do przypisywania obrazków płyt plikom ogg, oga, opus oraz mp3
+# program: Przemysław R. Pietraszczyk
+# rozpoczęto: 26-04-2021
+# licencja: GPL
+# napisano w edytorze: Atom
+
+import gi, os
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk, GdkPixbuf, GLib
+
+import base64
+from mutagen.mp3 import MP3
+from mutagen.id3 import ID3, APIC, error
+from mutagen.oggvorbis import OggVorbis
+from mutagen.oggflac import OggFLAC
+from mutagen.oggopus import OggOpus
+from mutagen.flac import Picture
+import mutagen
+
+file_snd_selected=[]
+file_img_selected=""
+
+#snd_selected=[]
+#COVER ="cover2music.png"
+COVER ="/usr/share/pixmaps/cover2music.png"
+snd_extension="ogg"
+img_extension="png" # dla przykladu
+
+
+UI_INFO = """
+<ui>
+  <menubar name='MenuBar'>
+    <menu action='FileMenu'>
+      <menu action='FileLoad'>
+        <menuitem action='LoadImg' />
+        <menuitem action='LoadOgg' />
+      </menu>
+      <menu action='FileDelete'>
+        <menuitem action='RemoveCover' />
+      </menu>
+      <separator />
+      <menuitem action='FileQuit' />
+    </menu>
+
+    <menu action='ChoicesMenu'>
+      <menuitem action='ChoiceTree'/>
+    </menu>
+
+    <menu action='InfoMenu'>
+      <menuitem action='Help'/>
+      <menuitem action='About'/>
+    </menu>
+  </menubar>
+
+</ui>
+"""
+
+
+class FileChooserIMG(Gtk.Window):
+    def __init__(self):
+        Gtk.Window.__init__(self, title="Wybór plików graficznych")
+        global file_img_selected
+
+        dialog = Gtk.FileChooserDialog(title="Please choose a file", parent=self, action=Gtk.FileChooserAction.OPEN)
+        dialog.add_buttons(
+            Gtk.STOCK_CANCEL,
+            Gtk.ResponseType.CANCEL,
+            Gtk.STOCK_OPEN,
+            Gtk.ResponseType.OK,
+        )
+
+        self.add_filters(dialog)
+
+        response = dialog.run()
+        if response == Gtk.ResponseType.OK:
+            print("Open clicked")
+            print("File selected: " + dialog.get_filename())
+            file_img_selected=dialog.get_filename()
+        elif response == Gtk.ResponseType.CANCEL:
+            print("Cancel clicked")
+
+        dialog.destroy()
+
+    def add_filters(self, dialog):
+        filter_jpeg = Gtk.FileFilter()
+        filter_jpeg.set_name("Pliki JPEG")
+        filter_jpeg.add_mime_type("image/jpeg")
+        dialog.add_filter(filter_jpeg)
+
+        filter_png = Gtk.FileFilter()
+        filter_png.set_name("Pliki PNG")
+        filter_png.add_mime_type("image/png")
+        dialog.add_filter(filter_png)
+
+class FileChooserOgg(Gtk.Window):
+    def __init__(self):
+        Gtk.Window.__init__(self, title="Wybór plików dzwiękowych")
+        global file_snd_selected
+        dialog = Gtk.FileChooserDialog(title="Please choose a file", parent=self, action=Gtk.FileChooserAction.OPEN)
+        dialog.add_buttons(
+            Gtk.STOCK_CANCEL,
+            Gtk.ResponseType.CANCEL,
+            Gtk.STOCK_OPEN,
+            Gtk.ResponseType.OK,
+        )
+
+        self.add_filters(dialog)
+        dialog.set_select_multiple(True)
+        response = dialog.run()
+        if response == Gtk.ResponseType.OK:
+            print("Open clicked")
+            file_snd_selected=dialog.get_filenames()
+
+        elif response == Gtk.ResponseType.CANCEL:
+            print("Cancel clicked")
+
+        dialog.destroy()
+
+    def add_filters(self, dialog):
+
+        filter_ogg = Gtk.FileFilter()
+        filter_ogg.set_name("Pliki OGG")
+        filter_ogg.add_mime_type("audio/ogg")
+        dialog.add_filter(filter_ogg)
+
+        filter_mp3 = Gtk.FileFilter()
+        filter_mp3.set_name("Pliki MP3")
+        filter_mp3.add_mime_type("audio/mp3")
+        dialog.add_filter(filter_mp3)
+
+
+class DialogDeleteProgress(Gtk.Dialog):
+    def __init__(self,parent):
+
+        Gtk.Dialog.__init__(self, title="Postęp", transient_for=parent, flags=0)
+        self.current_snd=0
+        self.props.border_width = 20
+        #self.add_buttons(
+        #    Gtk.STOCK_OK, Gtk.ResponseType.OK
+        #)
+        self.progressbar = Gtk.ProgressBar()
+        self.set_default_size(150, 100)
+        box = self.get_content_area()
+
+        label = Gtk.Label(label="Usuwam okladki z plików\n")
+
+        box.add(label)
+        box.add(self.progressbar)
+        self.divider_next=1/len(file_snd_selected)
+        self.timeout_id = GLib.timeout_add(300, self.on_timeout, len(file_snd_selected))
+        self.activity_mode = False
+        self.show_all()
+
+    def on_timeout(self, user_data):
+
+        #jesli przepytano wszyskie pliki wówczas koniec
+        if self.current_snd == user_data:
+            self.add_buttons(
+                Gtk.STOCK_OK, Gtk.ResponseType.OK
+            )
+            self.show_all()
+            return False
+
+        if self.activity_mode:
+            self.progressbar.pulse()
+        else:
+            new_value = self.progressbar.get_fraction() + self.divider_next
+
+            #if new_value > 1:
+            #    new_value = 0
+
+            self.progressbar.set_fraction(new_value)
+            snd=file_snd_selected[self.current_snd]
+            self.current_snd = self.current_snd +1
+            print ("file selected: ",snd)
+            extension = os.path.splitext(snd)
+            snd_extension=extension[1].replace(".", "")
+            print ("Rozszerzenie pliku dzwiekowego: ", snd_extension)
+
+            type=self.check_file_type(snd)
+            if type == "mp3":
+                self.remove_cover_mp3_generic(snd)
+            elif type == "ogg":
+                self.remove_cover_ogg_generic(snd)
+            elif type == "oga":
+                self.remove_cover_oga_generic(snd)
+            elif type == "opus":
+                self.remove_cover_opus_generic(snd)
+
+        # As this is a timeout function, return True so that it
+        # continues to get called
+        return True
+
+
+    def check_file_type(self,snd):
+
+        magic_numbers = {'ID3v2': bytes([0x49, 0x44, 0x33]),
+                        'ID3v1': bytes([0xFF, 0xF2]),
+                        'ID3': bytes([0xFF, 0xF3]),
+                        'withoutID': bytes([0xFF, 0xFB]),
+                        'ogg': bytes([0x4F, 0x67, 0x67, 0x53])}
+        max_read_size = max(len(m) for m in magic_numbers.values())
+
+        with open(snd, 'rb') as fd:
+            file_head = fd.read()
+            #print(file_head)
+
+        if file_head.startswith(magic_numbers['ID3v2']):
+            print ("Plik MP3- z ID3v2")
+            return "mp3"
+        elif file_head.startswith(magic_numbers['ID3v1']):
+            print ("Plik MP3- z ID3v1")
+            return "mp3"
+        elif file_head.startswith(magic_numbers['ID3']):
+            print ("Plik MP3- z ID3")
+            return "mp3"
+        elif file_head.startswith(magic_numbers['withoutID']):
+            print ("Plik MP3 bez ID3")
+            return "mp3"
+        elif file_head.startswith(magic_numbers['ogg']):
+            print("Kontener OGG")
+            ogg_head=mutagen.File(snd).pprint()[0:20]
+
+            if 'opus' in ogg_head.lower():
+                return "opus"
+            elif 'flac' in ogg_head.lower():
+                return "oga"
+            elif 'vorbis'in ogg_head.lower():
+                return "ogg"
+
+
+
+
+    def remove_cover_mp3_generic(self,snd):
+
+        file = ID3(snd) # Load the file
+        file.delall("APIC") # Delete every APIC tag (Cover art)
+        file.save() # Save the file
+
+    def remove_cover_ogg_generic(self,snd):
+
+        file = OggVorbis(snd)
+        try:
+            artist=file["artist"]
+        except KeyError:
+            artist=""
+        try:
+            title=file["title"]
+        except KeyError:
+            title=""
+        try:
+            year=file["year_of_relase"]
+        except KeyError:
+            year=""
+        try:
+            album=file["album"]
+        except KeyError:
+            album=""
+        try:
+            genre=file["genre"]
+        except KeyError:
+            genre=""
+
+        file.delete()
+        file["year_of_relase"]=year
+        file["artist"]=artist
+        file["title"]=title
+        file["album"]=album
+        file["genre"]=genre
+        file.save()
+
+    def remove_cover_oga_generic(self,snd):
+
+        file = OggFLAC(snd)
+        try:
+            artist=file["artist"]
+        except KeyError:
+            artist=""
+        try:
+            title=file["title"]
+        except KeyError:
+            title=""
+        try:
+            year=file["year_of_relase"]
+        except KeyError:
+            year=""
+        try:
+            album=file["album"]
+        except KeyError:
+            album=""
+        try:
+            genre=file["genre"]
+        except KeyError:
+            genre=""
+
+        file.delete()
+        file["year_of_relase"]=year
+        file["artist"]=artist
+        file["title"]=title
+        file["album"]=album
+        file["genre"]=genre
+        file.save()
+
+    def remove_cover_opus_generic(self,snd):
+
+        file = OggOpus(snd)
+        #year=file["YEAR_OF_RELEASE"]
+        try:
+            artist=file["artist"]
+        except KeyError:
+            artist=""
+        try:
+            title=file["title"]
+        except KeyError:
+            title=""
+        try:
+            year=file["year_of_relase"]
+        except KeyError:
+            year=""
+        try:
+            album=file["album"]
+        except KeyError:
+            album=""
+        try:
+            genre=file["genre"]
+        except KeyError:
+            genre=""
+
+        file.delete()
+        file["year_of_relase"]=year
+        file["artist"]=artist
+        file["title"]=title
+        file["album"]=album
+        file["genre"]=genre
+        file.save()
+
+
+class DialogAddCoverProgress(Gtk.Dialog):
+    def __init__(self,parent):
+
+        Gtk.Dialog.__init__(self, title="Postęp", transient_for=parent, flags=0)
+        self.current_snd=0
+        self.props.border_width = 20
+        #self.add_buttons(
+        #    Gtk.STOCK_OK, Gtk.ResponseType.OK
+        #)
+        self.progressbar = Gtk.ProgressBar()
+        self.set_default_size(150, 100)
+        box = self.get_content_area()
+
+        label = Gtk.Label(label="Dodaję okladkę do plików\n")
+
+        box.add(label)
+        box.add(self.progressbar)
+
+        self.divider_next=1/len(file_snd_selected)
+        self.timeout_id = GLib.timeout_add(300, self.on_timeout, len(file_snd_selected))
+        self.activity_mode = False
+        self.show_all()
+
+    def on_timeout(self, user_data):
+        global img_extension
+        #jesli przepytano wszyskie pliki wówczas koniec
+        if self.current_snd == user_data:
+            self.add_buttons(
+                Gtk.STOCK_OK, Gtk.ResponseType.OK
+            )
+            self.show_all()
+            return False
+
+        if self.activity_mode:
+            self.progressbar.pulse()
+        else:
+            new_value = self.progressbar.get_fraction() + self.divider_next
+
+            #if new_value > 1:
+            #    new_value = 0
+
+            self.progressbar.set_fraction(new_value)
+            snd=file_snd_selected[self.current_snd]
+            self.current_snd = self.current_snd +1
+            print ("file selected: ",snd)
+            extension = os.path.splitext(snd)
+            snd_extension=extension[1].replace(".", "")
+            print ("Rozszerzenie pliku dzwiekowego: ", snd_extension)
+
+            
+            #print ("file selected: ",snd)
+            #extension = os.path.splitext(snd)
+            #snd_extension=extension[1].replace(".", "")
+            #print ("Rozszerzenie pliku dzwiekowego: ", snd_extension)
+
+            if snd_extension.lower() == "ogg":
+
+                file_ = OggVorbis(snd)
+                print("IMAGE FILE: ",file_img_selected)
+                with open(file_img_selected, "rb") as h:
+                    data = h.read()
+
+                    img_extension=img_extension.lower()
+                    picture = Picture()
+                    picture.data = data
+                    picture.type = 17
+                    picture.desc = u"Picture set by cover2music"
+                    picture.mime = u"image/"+img_extension
+                    picture.width = 100
+                    picture.height = 100
+                    picture.depth = 24
+
+                    picture_data = picture.write()
+                    encoded_data = base64.b64encode(picture_data)
+                    vcomment_value = encoded_data.decode("ascii")
+
+                    file_["metadata_block_picture"] = [vcomment_value]
+                    file_.save()
+
+            elif snd_extension.lower() == "oga":
+
+                #for snd in file_snd_selected:
+                file_ = OggFLAC(snd)
+                print("IMAGE FILE: ",file_img_selected)
+                with open(file_img_selected, "rb") as h:
+                    data = h.read()
+
+                    img_extension=img_extension.lower()
+                    picture = Picture()
+                    picture.data = data
+                    picture.type = 17 # 0x7f
+                    picture.desc = u"Picture set by cover2music"
+                    picture.mime = u"image/"+img_extension
+                    picture.width = 100
+                    picture.height = 100
+                    picture.depth = 24
+
+                    picture_data = picture.write()
+                    encoded_data = base64.b64encode(picture_data)
+                    vcomment_value = encoded_data.decode("ascii")
+
+                    file_["metadata_block_picture"] = [vcomment_value]
+                    file_.save()
+
+
+            elif snd_extension.lower() == "opus":
+
+                #for snd in file_snd_selected:
+                file_ = OggOpus(snd)
+                print("IMAGE FILE: ",file_img_selected)
+                with open(file_img_selected, "rb") as h:
+                    data = h.read()
+
+                    img_extension=img_extension.lower()
+                    picture = Picture()
+                    picture.data = data
+                    picture.type = 17 # 0x7f
+                    picture.desc = u"Picture set by cover2music"
+                    picture.mime = u"image/"+img_extension
+                    #picture.width = 100
+                    #picture.height = 100
+                    #picture.depth = 24
+
+                    picture_data = picture.write()
+                    encoded_data = base64.b64encode(picture_data)
+                    vcomment_value = encoded_data.decode("ascii")
+
+                    file_["metadata_block_picture"] = [vcomment_value]
+                    file_.save()
+
+            elif snd_extension.lower() == "mp3":
+                #for snd in file_snd_selected:
+                print ("Dodaje do mp3: ",snd)
+                print ("file_img_selected: ", file_img_selected)
+                file = MP3(snd, ID3=ID3)
+
+                try:
+                    file.add_tags()
+                except error:
+                    pass
+
+                file.tags.add(APIC(mime="image/"+img_extension,type=3,desc=u'Cove by cover2music',data=open(file_img_selected,'rb').read()))
+                file.save()  # save the current changes
+
+            else:
+                print ("źle")
+
+        # As this is a timeout function, return True so that it
+        # continues to get called
+        return True
+
+
+
+class DialogHelp(Gtk.Dialog):
+    def __init__(self, parent):
+        Gtk.Dialog.__init__(self, title="Pomoc", transient_for=parent, flags=0)
+        self.props.border_width = 20
+        self.add_buttons(
+            Gtk.STOCK_OK, Gtk.ResponseType.OK
+        )
+
+        self.set_default_size(150, 100)
+        txt="-jednak samo załadownie obrazka do pliku nie gwarantuje, że zmieni się ikona w menedżerze plików.\n W tym względzie są przyjazne menedżery takie jak PCManFM, jak i nieprzyjazne jak Nemo.\n Jednak w graficznym odtwarzaczu, załadowany obrazek powinien pojawić się zawsze\n\n"
+        label1 = Gtk.Label(label="Aplikacja jest w stanie dodać okładkę do prawie wszystkich plików MP3, oraz do plików OGG (Vorbis),\n OGA (OGG FLAC) oraz OPUS. Możliwe jest również usuwanie okładek z pozostawieniem pozostałych tagów.\n  Pliki można zmieniać pojedynczo jak i grupowo. Okładki odczytywane są w formatach JPEG oraz PNG.\n Należy zadbać wcześniej aby obrazy okładek nie były zbyt duże, optymalna wielkość to 384x384 px.\n\n")
+        label2 = Gtk.Label(label=" Uwagi:\n-format JPEG w plikach OPUS nie jest wspierany \n-mieszana kolekcja plików zakodowanych rożnymi kodekami w kontenerach OGG jest co prawda możliwa,\n  jednak skrypt może zachowywać się niestabilnie\n"+txt)
+        box = self.get_content_area()
+        box.add(label1)
+        box.add(label2)
+        self.show_all()
+
+class DialogAbout(Gtk.Dialog):
+    def __init__(self, parent):
+        Gtk.Dialog.__init__(self, title="O Programie", transient_for=parent, flags=0)
+        self.props.border_width = 20
+        self.add_buttons(
+            Gtk.STOCK_OK, Gtk.ResponseType.OK
+        )
+
+        self.set_default_size(150, 100)
+
+        label = Gtk.Label(label="\tAplikacja napisana na podstawie:\n\nhttps://python-gtk-3-tutorial.readthedocs.io/\n\n\t\t\tWersja: 0.1-3\n\n\t\tPrzemysław R. Pietraszczyk\n\n\t\t\tKwiecień/Maj 2021\n\t\t\tLicencja: GPL\n\n")
+        #label3 = Gtk.Label(label="-jednak samo załadownie obrazka do pliku nie gwarantuje, że zmieni się ikona w menedżerze plików.\n W tym względzie są przyjazne menedżery takie jak PCManFM, jak i nie przyjazne jak Nemo.\n Jednak w graficznym odtwarzaczu, załadowany obrazek powinien pojawić się zawsze.\n\n")
+
+        box = self.get_content_area()
+        box.add(label)
+
+        button = Gtk.LinkButton("http://www.prp.xlx.pl", label="Strona Domowa")
+        box.add(button)
+
+        self.show_all()
+
+class DialogNoSelectIMG(Gtk.Dialog):
+    def __init__(self, parent):
+        Gtk.Dialog.__init__(self, title="Błąd", transient_for=parent, flags=0)
+        self.props.border_width = 20
+        self.add_buttons(
+            Gtk.STOCK_OK, Gtk.ResponseType.OK
+        )
+
+        self.set_default_size(150, 100)
+
+        label = Gtk.Label(label="Nie wybrano żadnego pliku z muzyką!\n")
+
+        box = self.get_content_area()
+        box.add(label)
+
+        self.show_all()
+
+def get_resource_path(rel_path):
+    dir_of_py_file = os.path.dirname(__file__)
+    rel_path_to_resource = os.path.join(dir_of_py_file, rel_path)
+    abs_path_to_resource = os.path.abspath(rel_path_to_resource)
+    return abs_path_to_resource
+
+
+grid = Gtk.Grid()
+
+
+class MyWindow(Gtk.Window):
+
+    def __init__(self):
+        super().__init__()
+
+        self.init_ui()
+
+
+    def init_ui(self):
+        global grid, file_img_selected, snd_extension
+        self.image_new=None
+        #grid = Gtk.Grid()
+        self.props.border_width = 20
+        #self.img_extension="png" # dla przykladu
+        #snd_extension="ogg"
+
+        self.add(grid)
+
+        grid.set_row_spacing(10)
+        grid.set_column_spacing(10)
+        grid.set_column_homogeneous(True) # rozszerza kontrolke z utworami na resztę okna
+
+        action_group = Gtk.ActionGroup(name="my_actions")
+
+        self.add_file_menu_actions(action_group)
+        self.add_info_menu_actions(action_group)
+        self.add_choices_menu_actions(action_group)
+
+        uimanager = self.create_ui_manager()
+        uimanager.insert_action_group(action_group)
+
+        menubar = uimanager.get_widget("/MenuBar")
+
+        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL)
+        box.pack_start(menubar, False, False, 0)
+
+        grid.attach(box, 0, 0, 2, 1)
+        file_img_selected=get_resource_path(COVER)
+        pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale(
+            filename=file_img_selected,
+            width=100,
+            height=100,
+            preserve_aspect_ratio=True)
+
+        self.image = Gtk.Image.new_from_pixbuf(pixbuf)
+        grid.attach(self.image,0,1,1,1)
+
+        quitBtn = Gtk.Button(label="Wykonaj !")
+        quitBtn.set_size_request(60, 30)
+
+        quitBtn.connect("clicked", self.on_button_clicked)
+
+        grid.attach(quitBtn, 0, 2, 1, 1) # lewo, top wielkosc, wysokosc
+
+        self.liststore = Gtk.ListStore(str, str)
+        self.treeview = Gtk.TreeView(model=self.liststore)
+
+        self.renderer_text = Gtk.CellRendererText()
+        self.column_text = Gtk.TreeViewColumn("Wybrane Utwory", self.renderer_text, text=0)
+        self.treeview.append_column(self.column_text)
+
+        self.scrolled_window = Gtk.ScrolledWindow ()
+        self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+
+        self.scrolled_window.add (self.treeview)
+        grid.attach_next_to(self.scrolled_window, self.image ,Gtk.PositionType.RIGHT,6,2)
+
+        self.set_border_width(10)
+        self.set_title("Cover2Music")
+        self.set_default_size(650, 180)
+        self.connect("destroy", Gtk.main_quit)
+
+        self.set_icon_from_file(get_resource_path(COVER))
+
+    def on_button_clicked(self, widget):
+        global file_img_selected, snd_extension
+
+        if len(file_snd_selected)<1:
+            print("nie zaznaczyleś żadnego pliku z muzyką !")
+            dialog = DialogNoSelectIMG(self)
+            response = dialog.run()
+            dialog.destroy()
+            return
+
+
+        progress =DialogAddCoverProgress(self)
+        response = progress.run()
+        progress.destroy()
+
+
+    def add_info_menu_actions(self, action_group):
+        action_info_menu = Gtk.Action(name="InfoMenu", label="Info")
+        action_group.add_action(action_info_menu)
+
+        action_new = Gtk.Action(
+            name="Help",
+            label="Pomoc",
+            tooltip="Create a new file",
+        )
+        action_new.connect("activate", self.on_menu_help)
+        action_group.add_action_with_accel(action_new, None)
+
+        action_new = Gtk.Action(
+            name="About",
+            label="O Programie",
+            tooltip="Create a new file",
+        )
+        action_new.connect("activate", self.on_menu_about)
+        action_group.add_action_with_accel(action_new, None)
+
+    def add_file_menu_actions(self, action_group):
+        action_filemenu = Gtk.Action(name="FileMenu", label="Plik")
+        action_group.add_action(action_filemenu)
+
+        action_fileloadmenu = Gtk.Action(name="FileLoad", stock_id=Gtk.STOCK_NEW)
+        action_group.add_action(action_fileloadmenu)
+
+        action_new = Gtk.Action(
+            name="LoadImg",
+            label="Załaduj okladkę",
+            tooltip="Wybór okladki",
+        )
+        action_new.connect("activate", self.on_menu_file_load_img_generic)
+        action_group.add_action_with_accel(action_new, None)
+
+
+        action_new = Gtk.Action(
+            name="LoadOgg",
+            label="Załaduj muzykę",
+            tooltip="Wybór muzyki",
+        )
+        action_new.connect("activate", self.on_menu_file_load_ogg_generic)
+        action_group.add_action_with_accel(action_new, None)
+
+        action_fileloadmenu = Gtk.Action(name="FileDelete", label="Usuń", stock_id=None)
+        action_group.add_action(action_fileloadmenu)
+
+        action_new = Gtk.Action(
+            name="RemoveCover",
+            label="Usuwa okladkę",
+            tooltip="Usuwa okladkę z pliku",
+        )
+        action_new.connect("activate", self.on_menu_file_erase_cover_all)
+        action_group.add_action_with_accel(action_new, None)
+
+
+        action_filequit = Gtk.Action(name="FileQuit", stock_id=Gtk.STOCK_QUIT)
+        action_filequit.connect("activate", self.on_menu_file_quit)
+        action_group.add_action(action_filequit)
+
+    def add_choices_menu_actions(self, action_group):
+        action_group.add_action(Gtk.Action(name="ChoicesMenu", label="Opcje"))
+
+        three = Gtk.ToggleAction(name="ChoiceTree", label="Pozwolenie")
+        three.connect("toggled", self.on_menu_choices_toggled)
+        action_group.add_action(three)
+
+    # tworzy menu bar
+    def create_ui_manager(self):
+        uimanager = Gtk.UIManager()
+
+        # Throws exception if something went wrong
+        uimanager.add_ui_from_string(UI_INFO)
+
+        # Add the accelerator group to the toplevel window
+        accelgroup = uimanager.get_accel_group()
+        self.add_accel_group(accelgroup)
+        return uimanager
+
+    def on_menu_help(self, widget):
+        dialog = DialogHelp(self)
+        response = dialog.run()
+
+        dialog.destroy()
+
+    def on_menu_about(self, widget):
+        dialog = DialogAbout(self)
+        response = dialog.run()
+
+        dialog.destroy()
+
+
+    def on_menu_file_load_img_generic(self, widget):
+        global grid, file_img_selected, img_extension
+
+        print("A File|New menu item was selected.")
+        file=FileChooserIMG()
+        print ("file:"+str(file_img_selected))
+        pixbuf_new = GdkPixbuf.Pixbuf.new_from_file_at_scale(
+        filename=file_img_selected,
+        width=100,
+        height=100,
+        preserve_aspect_ratio=True)
+
+        if self.image != None:
+            grid.remove(self.image)
+            self.image=None
+        else:
+            grid.remove(self.image_new)
+
+
+        # TODO - pozbyć się self.image_new na rzecz self.image
+        self.image_new = Gtk.Image.new_from_pixbuf(pixbuf_new)
+        grid.attach_next_to(self.image_new, self.scrolled_window,Gtk.PositionType.LEFT,1,1)
+
+        self.show_all()
+
+        extension = os.path.splitext(file_img_selected)
+        #self.img_extension=extension[1].replace(".", "") # tupla (0) wskazuje na nazwe pliku !
+        img_extension=extension[1].replace(".", "") # tupla (0) wskazuje na nazwe pliku !
+
+
+    def on_menu_file_load_ogg_generic(self, widget):
+        global file_snd_selected
+        file=FileChooserOgg()
+        #grid.remove(self.treeview)
+        self.scrolled_window.remove(self.treeview)
+        grid.remove(self.scrolled_window)
+        self.liststore = Gtk.ListStore(str, str)
+        self.treeview.remove_column(self.column_text)
+
+        print ("file selected: ",file_snd_selected)
+
+        for o in file_snd_selected:
+            self.liststore.append([o,""])
+
+        self.scrolled_window = Gtk.ScrolledWindow ()
+        self.scrolled_window.set_policy (Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC)
+
+        self.treeview = Gtk.TreeView(model=self.liststore)
+        self.renderer_text = Gtk.CellRendererText()
+        self.column_text = Gtk.TreeViewColumn("Wybrane Utwory", self.renderer_text, text=0)
+        self.treeview.append_column(self.column_text)
+
+        if self.image != None:
+            self.scrolled_window.add (self.treeview)
+            grid.attach_next_to(self.scrolled_window, self.image ,Gtk.PositionType.RIGHT,6,2)
+        else:
+            self.scrolled_window.add (self.treeview)
+            grid.attach_next_to(self.scrolled_window, self.image_new ,Gtk.PositionType.RIGHT,6,2)
+
+        self.show_all()
+    """
+    def close_progress(self, gparmstring):
+        self.progress.destroy()
+    """
+    def on_menu_file_erase_cover_all(self, widget):
+
+        if len(file_snd_selected)<1:
+            dialog = DialogNoSelectIMG(self)
+            response = dialog.run()
+            dialog.destroy()
+            return
+
+        self.progress =DialogDeleteProgress(self)
+        response = self.progress.run()
+        self.progress.destroy()
+
+
+    def on_menu_file_quit(self, widget):
+        Gtk.main_quit()
+
+    def on_menu_choices_toggled(self, widget):
+        if widget.get_active():
+            print(widget.get_name() + " activated")
+        else:
+            print(widget.get_name() + " deactivated")
+
+    def on_button_press_event(self, widget, event):
+        # Check if right mouse button was preseed
+        if event.type == Gdk.EventType.BUTTON_PRESS and event.button == 3:
+            self.popup.popup(None, None, None, None, event.button, event.time)
+            return True  # event has been handled
+
+
+win = MyWindow()
+win.show_all()
+Gtk.main()