[Risolto] Vedere e cancellare AVI in sequenza

Installazione, configurazione e utilizzo di applicativi multimediali, masterizzazione, acquisizione e codec audio/video, streaming e altro.
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4433
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da UbuNuovo »

Nuzzopippo bell'idea! :birra:

Ti dico i miei malfunzionamenti.
ho provato il tuo script con Python 3.8.10, senza creare un ambiente venv, con i pacchetti:
python3-tk 3.8.10
python3-magic 2:0.4.15-3
python3-vlc 3.07110-2
ho Ubuntu Mate 20.04 con tema scuro (misto).

Purtroppo con python sono una schiappa.
Dopo aver cliccato su "Dir. origine" (o su "Dir. destinazione") la finestra che si apre mostra solo l'icona della cartella ma non i file.
Per farli comparire devo trascinarci sopra il puntatore del mouse, tenendo premuto il tasto sinistro.
Potrebbe essere un bug di gtk? La finestra che si apre non ha niente del mio tema grafico (scuro).
Immagine
il pulsante con la scritta "Stop" non stoppa mai, mentre i pulsanti ⏯ e ⏹ funzionano ma non sempre;
spiego: dopo aver utilizzato il pulsante play/pause (⏯) il pulsante stop (⏹) non mi funziona più.
Salva l'Ucraina! 🇺🇦
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da nuzzopippo »

Ciao @UbuNuovo

Allora :
Riguardo alle icone delle finestre di apertura delle directory "suppongo" sia un problema correlato all'ambiente grafico, non l'ho trovata ma in un'altra discussione è stato segnalato lo stesso problema, non ricordo quale gestore ma forse era proprio mate, forse una qualche particolare inferenza tkinter-gtk, io non la ho mai riscontrata ma se mi è possibile farò qualche prova.

Il pulsante con la scritta "Stop" stoppa ... solo che ha un time.sleep da 5 secondi ... messo apposta per vedere di rimediare a messaggi di mancanza del buffer che emette il thread di lettura di VLC prima di fermarsi, l'ho lasciato li, dipende dall'accennato fallimento di gestire direttamente quel thread, non son riuscito ad accedervi. Prova a commentarlo o a ridurlo, lo trovi nel callback del pulsante, classe ViewPanel medodo "_on_stop(self)"

Riguardo ai 5 secondi, ho appurato che è all'incirca il tempo minimo perché la libreria vlc riesca a leggere i metadati del file, e quindi fornirmi il tempo di durata, ovvio, sul mio sistema, e lasciando quel tempo al vlc per "chiudere" la mancanza di buffer non viene segnalata.

Per il resto che Te ne sembra? È un giocattolo, certo, ma mi diverte giocarci ;)

[Edit] ... non ho "caricato" il giocattolo di accorgimenti tipo gestione asincrona etc, quindi in quei cinque secondi la GUI non è reattiva ed il pulsante non viene "rilasciato", cosa che ho ritenuto andasse bene, in caso di utente troppo cliccoso vi sarebbe da temere interferenze tra chiusura-caricamento consecutivamente troppo vicini, principalmente su macchine datate (tipo la mia)

[Ri-Edit] Riguardo :
il pulsante con la scritta "Stop" non stoppa mai, mentre i pulsanti ⏯ e ⏹ funzionano ma non sempre;
spiego: dopo aver utilizzato il pulsante play/pause (⏯) il pulsante stop (⏹) non mi funziona più.
In effetti mi son dimenticato di instanziare una variabile (self._pause) in fase di inizializzazione di ViewPanel, dovrebbe essere instanziata e posta a "False", per altro, c'è sempre quello sleep che ho citato, pare proprio che incasina le cose, abbassandolo son comparsi problemi del genere anche a me, commentandolo sembra andar bene ma dovrò approfondire un po', domani mi studio un po' quello che viene a succedere, forse è una questione di refresh della GUI non sincronizzato con lo stato del lettore.
Ultima modifica di nuzzopippo il domenica 7 novembre 2021, 19:03, modificato 1 volta in totale.
Fatti non foste a viver come bruti ...
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4433
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da UbuNuovo »

Sì, avevo visto quei 'time.sleep(5)', infatti anche aspettando ben oltre i 5 secondi, il video non si fermava.
Riprovo:
faccio partire il video, premo il pulsante Stop, il pulsante si disattiva ma il video non si interrompe,
premo su Play e il video si ferma come se fosse in pausa, il pulsante Play si disattiva e il pulsante Stop si attiva,
premo Stop e dopo 5 secondi il video si chiude.
Ho capito! Quanto detto sopra, si verifica se premo Stop troppo presto dopo l'avvio del video;
se lo premo dopo che il video è stato riprodotto per più di 5 secondi funziona regolarmente.

versione modificata:
Ho commentato tutti e tre i time.sleep(5) e a me funziona benissimo.
Gli errori get_buffer() failed li ho anche dal solo Vlc.

Quindi penso che, per chi deve scegliere i video da cancellare in base a quanto rappresentato nel video è ottimo;
per chi deve scegliere i video da cancellare in base alla qualità del filmato, occorrerebbe vedere il video in dimensioni originali.

edit: con i time.sleep commentati non funziona il cursore della timeline, mettendo time.sleep a 1, mi funziona tutto ed è abbastanza reattivo.
Salva l'Ucraina! 🇺🇦
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da nuzzopippo »

UbuNuovo ha scritto:
domenica 7 novembre 2021, 18:41
Ho commentato tutti e tre i time.sleep(5) e a me funziona benissimo.
Hai commentato anche quello nel metodo _play(self) di ViewPanel? Se si, Ti funziona bene? Dico questo perché sul mio sistema non riesce a configurare correttamente lo slider temporale se il thread di vlc non carica prima i dati ... comunque, considerando i casini che danno gli sleep provvederò a sostituirli con tempi di aggiornamento dati ritardato a livello di GUI, poi posto il codice modificato.

Per altro, hai provato la copia e lo spostamento dei files tra direttrici?
Fatti non foste a viver come bruti ...
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4433
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da UbuNuovo »

È vero, l'avevo scritto nell'edit nel mio post precedente; gli si deve dare almeno un secondo.
Per copia e spostamento nessun problema ;)
Salva l'Ucraina! 🇺🇦
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da nuzzopippo »

Allora :

Concentrandomi sugli aspetti di visualizzazione mi son rivisto il codice e ricalibrato il tutto eliminando l'uso di time per gli sleep, che era ciò che dava problemi, e ritardato di un minuto l'aggiornamento dei dati dal player, inoltre ho ritardato di un decimo di secondo la valutazione di stato della finestra con adeguamento della attivazione dei controlli, su di una macchina più prestante del mio catorcio casalingo il tutto sembra fluido e coerente, in caso il ritardo per la acquisizione dei dati da player sia insufficiente (per macchina lenta) l'istruzione da modificare sarebbe :

Codice: Seleziona tutto

            self.master.after(1000, self._set_time_slider)
nel metodo _play(self) di ViewPanel.

Inoltre ho ristrutturato il codice rassegnandomi ai messaggi di buffer insufficiente e cercando di snellire un minimo i processi e corretto un bug logico che a volte interferiva con il pulsante di pausa del ViewPanel.
Da tener presente che il pulsante di "⏹" del ViewPanel ferma la visualizzazione ma non azzera i riferimenti, una seguente pressione del pulsante "⏯" riavvia da zero la visualizzazione, è il pulsante "Stop" del pannello principale che azzera i riferimenti e ricodifica l'attivazione dei comandi.
L'insieme sembra molto più fluido della versione già postata.

Il codice aggiornato (426 righe)

Codice: Seleziona tutto

# -*- coding: utf-8 -*-

import tkinter as tk
from tkinter import filedialog
from tkinter import messagebox as msgb
import vlc
import os
import magic
import shutil


class ViewPanel(tk.Frame):
    '''Un pannello dedicato alla visualizzazione dei video'''
    def __init__(self, master, ctrl=True, *args, **kwargs):
        self.master = master
        super().__init__(self.master, *args, **kwargs)
        self.video = ''
        self.started = False
        self._pause = False
        self.last_time = 0
        self.lbl_title = tk.Label(self, text='Nessun Video', justify='left')
        self.lbl_title.grid(row=0, column=0, sticky='ew')
        self.v_panel = tk.Canvas(self, bg='black')
        self.v_panel.grid(row=1, column=0, sticky='nsew')
        if ctrl:
            p_ctrl = tk.Frame(self)
            p_ctrl.grid(row=2, column=0, sticky='ew')
            bt_play = tk.Button(p_ctrl, font='Webdings',
                                text='\uF038\uF03B', command=self._on_play)
            bt_play.grid(row=0, column=0, sticky='s')
            bt_stop = tk.Button(p_ctrl, font='Webdings',
                                text='\uF03C', command=self._on_stop)
            bt_stop.grid(row=0, column=1, sticky='s')
            self.sc_time = tk.Scale(p_ctrl, from_=0, to=1000, orient=tk.HORIZONTAL,
                                    showvalue=0, command=self._on_time)
            self.sc_time.grid(row=0, column=2, sticky='ew')
            lbl = tk.Label(p_ctrl, font='Webdings', text='\uF056')
            lbl.grid(row=0, column=3, sticky='s')
            self.sc_vol = tk.Scale(p_ctrl, from_=0, to=100, orient=tk.HORIZONTAL, 
                                   showvalue=0, command=self._on_volume)
            #self.sc_vol.bind('<ButtonRelease-1>', self._on_time)
            self.sc_vol.grid(row=0, column=4, sticky='ew')
            p_ctrl.grid_columnconfigure(2, weight=1)
        self.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        # player vlc
        self.instance = vlc.Instance('--no-xlib')
        self.player = self.instance.media_player_new()
        self.player.set_xwindow(self.v_panel.winfo_id())
    
    def _on_play(self):
        if self.started:
            if self._pause:
                self.player.play()
            else:
                self.player.pause()
            self._pause = not self._pause

    def _play(self):
        if self.started: return
        if self.player.play():  # vlc da -1 se fallisce
            msgb.showerror('Non riesco ad avviare il video.')
        else:
            self._pause = False
            self.started = True
            self.master.after(1000, self._set_time_slider)

    def _set_time_slider(self):
        t = self.player.get_length()
        if t > 0:
            self.sc_time.config(to=t)
        vol = self.player.audio_get_volume()
        self.sc_vol.set(vol)
        self.sc_vol.update()
        self._on_tmpplay()

    def _on_stop(self):
        if self.player and self.started:
            self.player.stop()
            self._pause = True
            #self.started = False
            self.last_time = 0
            self.sc_time.set(0)

    def _on_volume(self, evt=None):
        if self.player and self.started:
            vol = self.sc_vol.get()
            if self.player.audio_set_volume(vol):
                msgb.showerror('Aggiustamento volume fallito')

    def _on_time(self, evt=None):
        if not (self.player and self.started): return
        t = self.sc_time.get()
        if t != self.last_time:
            self.last_time = t
            self.player.set_time(t)

    def set_video(self, f_name):
        if not os.path.isfile(f_name): return
        self.video = str(f_name)
        media = self.instance.media_new(str(self.video))
        self.player.set_media(media)
        self.lbl_title.configure(text=os.path.basename(self.video))
        self.update()
        self._pause = False
        self.started = False
        self._play()
    
    def close_video(self):
        if self.player and self.started:
            self.player.stop()
            self.video = ''
            self.sc_time.set(0)
            self.sc_vol.set(0)
            self.started = False
            self._pause = False
    
    def _on_tmpplay(self):
        if not self.video: return
        if self.player:
            t = self.player.get_time()
            if t > 0:
                self.last_time = t
                self.sc_time.set(t)
                self.sc_time.update()
        self.master.after(1000, self._on_tmpplay)


class MyApp(tk.Tk):
    def __init__(self):
        self.is_play = False
        self.start_dir = os.path.expanduser('~')
        self.end_dir = ''
        self.sel_video = []
        super().__init__()
        self.title('Video Organizer')
        # controlli selezione video originali
        p_list = tk.Frame(self)
        p_list.grid(row=0, column=0, sticky='ns')
        lbl_f_o = tk.Label(p_list, text='Video originali', justify='left')
        lbl_f_o.grid(row=0, column=0, columnspan=3, padx=5, pady=5,sticky='ew')
        self.l_film = tk.Listbox(p_list)
        self.l_film.grid(row=1, column=0, columnspan=3, padx=5, pady=5, sticky='nsEW')
        self.b_play = tk.Button(p_list, text='Play', command=self._on_play)
        self.b_play.grid(row=2, column=0, padx=5, pady=5, sticky='nsew')
        self.b_stop = tk.Button(p_list, text='Stop', command=self._on_stop)
        self.b_stop.grid(row=2, column=1, padx=5, pady=5, sticky='nsew')
        self.b_del = tk.Button(p_list, text='Cancella', command=self._on_del)
        self.b_del.grid(row=2, column=2, padx=5, pady=5, sticky='nsew')
        p_list.grid_rowconfigure(1, weight=1)
        p_list.grid_columnconfigure(0, weight=1, uniform='a')
        p_list.grid_columnconfigure(1, weight=1, uniform='a')
        p_list.grid_columnconfigure(2, weight=1, uniform='a')
        # pannello video
        self.viewer = ViewPanel(self)
        self.viewer.grid(row=0, column=1, padx=5, pady=5, sticky='nsew')
        # controlli copia o spostamento video
        p_d_list = tk.Frame(self)
        p_d_list.grid(row=0, column=2, sticky='ns')
        lbl_f_d = tk.Label(p_d_list, text='Video da lavorare', justify='left')
        lbl_f_d.grid(row=0, column=0, columnspan=4, padx=5, pady=5,sticky='ew')
        self.l_d_film = tk.Listbox(p_d_list)
        self.l_d_film.grid(row=1, column=0, columnspan=4, padx=5, pady=5, sticky='nsew')
        self.b_copy = tk.Button(p_d_list, text='Copia', command=self._on_copy)
        self.b_copy.grid(row=2, column=0, padx=5, pady=5, sticky='nsew')
        self.b_move = tk.Button(p_d_list, text='Sposta', command=self._on_move)
        self.b_move.grid(row=2, column=1, padx=5, pady=5, sticky='nsew')
        self.b_nolist = tk.Button(p_d_list, text='Annulla', command=self._on_undo)
        self.b_nolist.grid(row=2, column=2, padx=5, pady=5, sticky='nsew')
        self.b_exec = tk.Button(p_d_list, text='Esegui', command=self._on_execute)
        self.b_exec.grid(row=2, column=3, padx=5, pady=5, sticky='nsew')
        p_d_list.grid_rowconfigure(1, weight=1)
        p_d_list.grid_columnconfigure(0, weight=1, uniform='b')
        p_d_list.grid_columnconfigure(1, weight=1, uniform='b')
        p_d_list.grid_columnconfigure(2, weight=1, uniform='b')
        p_d_list.grid_columnconfigure(3, weight=1, uniform='b')
        # comandi generali
        p_command = tk.Frame(self)
        p_command.grid(row=1, column=0, columnspan=3, sticky='ew')
        self.b_o_dir = tk.Button(p_command, text='Dir. origine', command=self._on_origin)
        self.b_o_dir.grid(row=0, column=0, padx=5, pady=5, sticky='ew')
        self.b_d_dir = tk.Button(p_command, text='Dir. destinazione', command=self._on_dest)
        self.b_d_dir.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
        self.b_exit = tk.Button(p_command, text='Chiudi programma', command=self._on_exit)
        self.b_exit.grid(row=0, column=2, padx=5, pady=5, sticky='ew')
        p_command.grid_columnconfigure(0, weight=1, uniform='c')
        p_command.grid_columnconfigure(1, weight=1, uniform='c')
        p_command.grid_columnconfigure(2, weight=1, uniform='c')
        # report di sessione
        p_report = tk.Frame(self)
        p_report.grid(row=2, column=0, columnspan=3, padx=5, pady=5, sticky='nsew')
        self.t_rep = tk.Text(p_report, font='Courier 10', height=15, wrap='none', padx=5, pady=5)
        self.t_rep.grid(row=0, column=0, sticky='nsew')
        v_scroll = tk.Scrollbar(p_report, orient=tk.VERTICAL, command=self.t_rep.yview)
        v_scroll.grid(row=0, column=1, sticky='ns')
        self.t_rep.configure(yscrollcommand=v_scroll.set)
        p_report.rowconfigure(0, weight=1)
        p_report.columnconfigure(0, weight=1)

        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(1, weight=1)

        self.update()
        l = self.winfo_reqwidth()
        h = self.winfo_reqheight()
        self.minsize(l, h)

        self._evaluate_self()

    def _on_play(self):
        indexes = self.l_film.curselection()
        if not indexes: return
        name = self.l_film.get(indexes[0])
        if not name: return
        if not self.start_dir: return
        f_name = os.path.join(self.start_dir, name)
        self.is_play = True
        self.viewer.set_video(f_name)
        self.after(100, self._evaluate_self)

    def _on_stop(self):
        self.viewer.close_video()
        self.is_play = False
        self.after(100, self._evaluate_self)

    def _on_del(self):
        indexes = self.l_film.curselection()
        if not indexes: return
        name = self.l_film.get(indexes[0])
        if not name: return
        try:
            os.unlink(os.path.join(self.start_dir, name))
        except OSError as e:
            msgb.showerror(repr(e))
            return
        msg = '\n\nCancellato file "%s" dalla directory origine.' % name
        self.t_rep.insert('end', msg)
        self._get_videos()
        self.after(100, self._evaluate_self)

    def _on_copy(self):
        indexes = self.l_film.curselection()
        if not indexes: return
        name = self.l_film.get(indexes[0])
        if not name: return
        if not self.end_dir: return
        tot_f = [f for f in os.listdir(self.end_dir) if
                 os.path.isfile(os.path.join(self.end_dir, f))]
        if name in tot_f:
            msgb.showerror(None, 'Video già esistente nella destinazione')
            return
        names = [x['name'] for x in self.sel_video]
        if name in names:
            msgb.showerror(None, 'Video già selezionato')
            return
        item = {}
        item['name'] = name
        item['action'] = 'copy'
        self.sel_video.append(item)
        self.l_d_film.insert('end', item['name'])
        self.after(100, self._evaluate_self)

    def _on_move(self):
        indexes = self.l_film.curselection()
        if not indexes: return
        name = self.l_film.get(indexes[0])
        if not name: return
        if not self.end_dir: return
        tot_f = [f for f in os.listdir(self.end_dir) if
                 os.path.isfile(os.path.join(self.end_dir, f))]
        if name in tot_f:
            msgb.showerror(None, 'Video già esistente nella destinazione')
            return
        names = [x['name'] for x in self.sel_video]
        if name in names:
            msgb.showerror(None, 'Video già selezionato')
            return
        item = {}
        item['name'] = name
        item['action'] = 'move'
        self.sel_video.append(item)
        self.l_d_film.insert('end', item['name'])
        self.l_d_film.itemconfigure(self.l_d_film.size() -1, fg='red')
        self.after(100, self._evaluate_self)

    def _on_undo(self):
        indexes = self.l_d_film.curselection()
        if not indexes: return
        index = indexes[0]
        self.l_d_film.delete(index)
        del(self.sel_video[index])
        self.after(100, self._evaluate_self)

    def _on_execute(self):
        self._copy_or_move_list()

    def _on_origin(self):
        d_o = filedialog.askdirectory(initialdir=self.start_dir)
        if d_o:
            if os.path.exists(d_o) and os.path.isdir(d_o):
                self.start_dir = d_o
                msg = '\nSelezionata directory di origine : %s' % self.start_dir
                self.t_rep.insert('end', msg)
                self._get_videos()

    def _on_dest(self):
        d_e = filedialog.askdirectory(initialdir=self.start_dir)
        if d_e:
            if os.path.exists(d_e) and os.path.isdir(d_e):
                self.end_dir = d_e
                msg = '\n\nSelezionata directory di destinazione : %s' % self.end_dir
                self.t_rep.insert('end', msg)
                self._get_dest_videos()
                self._verify_duples()

    def _on_exit(self):
        self.destroy()
    
    # ***************************
    # *** METODI DELLA CLASSE ***
    # ***************************

    def _evaluate_self(self):
        self.b_play.configure(state='disabled')
        self.b_stop.configure(state='disabled')
        self.b_del.configure(state='disabled')
        self.b_copy.configure(state='disabled')
        self.b_move.configure(state='disabled')
        self.b_nolist.configure(state='disabled')
        self.b_exec.configure(state='disabled')
        self.b_d_dir.configure(state='disabled')
        films_num = self.l_film.size()
        if films_num:
            if self.is_play:
                self.b_stop.configure(state='normal')
            else:
                self.b_play.configure(state='normal')
                self.b_del.configure(state='normal')
                self.b_copy.configure(state='normal')
                self.b_move.configure(state='normal')
                if not self.end_dir:
                    self.b_d_dir.configure(state='normal')
                films_num = self.l_d_film.size()
                if films_num:
                    self.b_nolist.configure(state='normal')
                    self.b_exec.configure(state='normal')
    
    def _get_videos(self):
        self.l_film.delete(0, 'end')
        tot_f = [f for f in os.listdir(self.start_dir) if
                 os.path.isfile(os.path.join(self.start_dir, f))]
        if not tot_f:
            msg = '\n - Nessun file video trovato'
            self.t_rep.insert('end', msg)
            return
        for f in tot_f:
            if 'video' in magic.from_file(os.path.join(self.start_dir, f), mime=True):
                self.l_film.insert('end', f)
                msg = '\n - Video : %s' % f
                self.t_rep.insert('end', msg)
        self.after(100, self._evaluate_self)
    
    def _get_dest_videos(self):
        tot_f = [f for f in os.listdir(self.end_dir) if
                 os.path.isfile(os.path.join(self.end_dir, f))]
        if not tot_f:
            msg = '\n - Nessun file trovato'
            self.t_rep.insert('end', msg)
            return
        count = 0
        for f in tot_f:
            if 'video' in magic.from_file(os.path.join(self.end_dir, f), mime=True):
                count += 1
        msg = '\n - presenti %d files di cui %d sono video' % (len(tot_f), count)
        self.t_rep.insert('end', msg)
        self.after(100, self._evaluate_self)
    
    def _verify_duples(self):
        tot_f = [f for f in os.listdir(self.end_dir) if
                 os.path.isfile(os.path.join(self.end_dir, f))]
        duplicate = 0
        for i in range(self.l_film.size()):
            name = self.l_film.get(i)
            if name in tot_f:
                self.l_film.itemconfigure(i, fg='violet')
                duplicate += 1
        if duplicate:
            msg = '\n - %d video della directory origine già presenti nella destinazione.' % duplicate
            self.t_rep.insert('end', msg)

    def _copy_or_move_list(self):
        msg = '\n\nESECUZIONE OPERAZIONI IMPOSTATE :'
        self.t_rep.insert('end', msg)
        try:
            for item in self.sel_video:
                f_or = os.path.join(self.start_dir, item['name'])
                f_dest = os.path.join(self.end_dir, item['name'])
                if item['action'] == 'copy':
                    shutil.copy(f_or, f_dest)
                    msg = '\n - copia di %s effettuata' % item['name']
                    self.t_rep.insert('end', msg)
                elif item['action'] == 'move':
                    shutil.move(f_or, f_dest)
                    msg = '\n - spostamento di %s effettuato' % item['name']
                else:
                    msgb.showerror('Errore nella applicazione: azione non valida')
                    return
        except OSError as e:
            msgb.showerror(repr(e))
            return
        msg = '\n\nSituazione di %s risultante:' % self.start_dir
        self.t_rep.insert('end', msg)
        self._get_videos()
        self._verify_duples()
        msg = '\n\nSituazione di %s risultante:' % self.end_dir
        self.t_rep.insert('end', msg)
        self._get_dest_videos()
        self.l_d_film.delete(0, 'end')
        self.sel_video = []
        self.after(100, self._evaluate_self)



if __name__ == '__main__':
    app = MyApp()
    app.mainloop()
... naturalmente, è solo un divertimento, un "giocattolo" se vogliamo ma potrebbe anche servire a qualcosa, se c'è qualche interessato e viene una idea la dica che si continua a giocare :D

Ciao (e grazie delle segnalazioni @UbuNuovo :birra: )
Fatti non foste a viver come bruti ...
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4433
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da UbuNuovo »

Ho provato il nuovo script, funziona tutto regolarmente ma mi sono accorto che, se si sposta il cursore della timeline a fine corsa, il video risulta finito e non è più possibile cambiare punto di riproduzione, si deve cliccare Stop e poi Play per far ripartire il video.
Questo comportamento avviene anche nel primo script. Non so se sia voluto, ma sarebbe meglio poter usare la timeline anche dopo aver raggiunto la fine.

Fare questo genere di esperimenti insegna tantissimo.
Strano non si sia fatto vivo nessun altro. Potresti mettere questo programma nella sezione Progetti della comunità,(mi pare), in modo da ottenere l'attenzione di altri "pythonisti".
Salva l'Ucraina! 🇺🇦
Avatar utente
nuzzopippo
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1624
Iscrizione: giovedì 12 ottobre 2006, 11:34

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da nuzzopippo »

UbuNuovo ha scritto:
lunedì 8 novembre 2021, 14:18
Fare questo genere di esperimenti insegna tantissimo.
Verissimo, è proprio il motivo per cui li faccio ;)
A parte gli scherzi, si impara molto di più provando e riprovando senza "volere" un risultato che fissandosi un obiettivo da raggiungere ad ogni costo, fa scoprire cosa a cui non si pensa di solito. E la Tua segnalazione è esattamente questo : un evento cui non avevo pensato e, conseguentemente non è gestito, probabilmente lo stato di esecuzione completato disattiva il player e gli fa perdere riferimento al file, nello output di vlc vedo segnali

Codice: Seleziona tutto

[00007f60d40600a0] aom decoder error: Failed to decode frame: Corrupt frame detected (Reference frame containing this frame's initial frame context is unavailable.)
Che mi fanno pensare proprio a questo

Comunque, allo stato rimane possibile premere il pulsante "⏹" e quindi "⏯" per far riprendere il video, ovviamente se non si è premuto il tasto "Stop" nei controlli principali ... l'alternativa sarebbe verificare lo stato di vlc ed evantualmente riavviare la riproduzione facendola partire nel callback della timeline ... non è che mi sembri una idea grandiosa, anche se credo si possa fare, in fin dei conti il fine non è la riproduzione video che nel contesto è più che altro un supporto a processi decisionali dell'user.
UbuNuovo ha scritto:
lunedì 8 novembre 2021, 14:18
Strano non si sia fatto vivo nessun altro.
beh ... si, anch'io mi aspettavo un po' di interesse, non tanto dai "pythonisti", (nelle utenze "programmatori" di questo ed altri forum ho visto raramente "giocare", quasi sempre chi scrive mira ad un suo problema specifico) quanto da parte di utenti "normali" con qualche idea da proporre per migliorare il "giocattolo", giusto p.e. cose tipo provvedere dalla gui stessa a crearsi sub-directory per archiviare diverse categorie di filmati, oppure vedere un po' se e come creare play-list da utilizzare con vari lettori, o altro ... insomma, qualcosa su cui giocare collettivamente e che, magari, alla fine attirasse anche persone interessare alla programmazione per scambi di idee e tecniche, al fine di "imparare" non di "realizzare"
UbuNuovo ha scritto:
lunedì 8 novembre 2021, 14:18
Potresti mettere questo programma nella sezione Progetti della comunità,(mi pare), in modo da ottenere l'attenzione di altri "pythonisti".
Questo scriptino? Ma dai, è una cosetta indegna di essere chiamato "progetto", è solo un gioco e lo ho sviluppato come tale, non ha una pianificazione finalizzata dietro.
Fatti non foste a viver come bruti ...
Avatar utente
UbuNuovo
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 4433
Iscrizione: sabato 12 dicembre 2009, 20:58
Desktop: Mate
Distribuzione: Ubuntu Mate 22.04.1 LTS
Sesso: Maschile
Contatti:

Re: [Risolto] Vedere e cancellare AVI in sequenza

Messaggio da UbuNuovo »

Non ti preoccupare, in quella sezione c'è di tutto.
A me fu consigliato dal grande Crap0101, per uno script di pura sperimentazione, sicuramente più indegno del tuo.
Non volevo codice pronto, ma solo consigli sul da farsi e così fu.
Ricevetti suggerimenti molto utili, su come procedere, che strumenti usare e, molto importante, altri punti di vista.
Salva l'Ucraina! 🇺🇦
Scrivi risposta

Ritorna a “Multimediale”

Chi c’è in linea

Visualizzano questa sezione: Google [Bot] e 14 ospiti