betonme / e2openplugin-EnhancedMovieCenter

EMC is an enhanced movielist replacement for Linux based receivers.
36 stars 61 forks source link

Feature Request: Handling von wiederholenden Timern beim Löschen von laufenden Timer-Aufnahmen #221

Closed dream-alpha closed 6 years ago

dream-alpha commented 6 years ago

Beim Löschen von laufenden Timeraufnahmen werden momentan reguläre Timer mitgelöscht. Es wäre toll, wenn beim Löschen von wiederholenden Timer-Aufnahmen der dazugehörige Timer deaktiviert und wieder aktiviert würde. Momentan muss man das manuell machen, was die Sache umständlich macht. Bitte um wohlwollende Behandlung ;-) Danke.

dhwz commented 6 years ago

Nein, ich wollte dass die Abfrage für JEDEN einzelnen Timer kommt. ;) Wie gesagt lass mich mal machen. So wie es jetzt ist kannst wieder nur alle auf einmal abbrechen oder nicht.

svenh0 commented 6 years ago

Wenn ich aber mehrere markiere und beenden möchte, ist das doch korrekt. Wenn ich nur einen beenden möchte, dann muss ich den einzeln auswählen und rot drücken. Dann wird auch nur der beendet. Er macht das doch nur für die ausgewählten/markierten Aufnahmen. Versteht das Problem nicht ;)

dhwz commented 6 years ago

Hast du doch vorhin selbst schon beantwortet wenn dann einer fehlschlägt gilt das für alle.

svenh0 commented 6 years ago

ok, das stimmt. Aber dann für jeden Timer 2 Fragen beantworten, wäre ja auch doof ;) wobei ich zu 99% eh nur einen Timer beende.

dhwz commented 6 years ago

Eben, lass es mich mal abändern, dann können wir immer noch drüber reden. :)

svenh0 commented 6 years ago

Was hältst du von dieser Idee ?

Es wird versucht, alle Timer zu beenden. Wenn einer fehlschlägt, dann geht der filename in eine Liste zum Anzeigen in der späteren Messagebox. Zeitgleich wird der fehlgeschlagene Timer aus der self.deleteList entfernt, so dass diese Aufnahme später nicht gelöscht wird. Zum Schluss kommt die Meldung, dass einige Timer nicht beendet werden konnten, man solle es über den TimerEditor machen (mit Anzeige der filename-Liste). Danach kommt dann die Frage zum Löschen der übrigen Aufnahmen.

Nur die Zeile "remove filename from self.deleteList" ist noch nicht echt (nur die Idee).

def stopRecordConfirmation(self, confirmed):
    if not confirmed: return
    # send as a list?
    stoppedAll=True
    filenames = "\n"
    for e in self.recsToStop:
        stoppedResult = self["list"].recControl.stopRecording(e)
        stoppedAll = stoppedAll and stoppedResult
        if stoppedResult = False:
            filenames += "\n" + e.split("/")[-1][:-3]
            remove filename from self.deleteListe # Zeile muss noch realisiert werden
    if not stoppedAll:
        self.checkHideMiniTV_beforeFullscreen()
        self.session.open(MessageBox, _("Not stopping any timers. Modify them with the timer editor.") + filenames, MessageBox.TYPE_INFO, 10)
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)
    else:
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)
dhwz commented 6 years ago

Ähm kannst du Gedanken lesen? ;) Ja ich hab nur noch die Sache mit dem löschen des Filesnames noch nicht gelöst.

svenh0 commented 6 years ago

evtl. noch etwas umständlich ;)

def stopRecordConfirmation(self, confirmed):
    if not confirmed: return
    # send as a list?
    stoppedAll=True
    filenames = "\n"
    print "========= self.recsToStop", self.recsToStop
    print "========= self.deleteList", self.deleteList
    for e in self.recsToStop:
        stoppedResult = self["list"].recControl.stopRecording(e)
        stoppedAll = stoppedAll and stoppedResult
        if stoppedResult == False:
            filenames += "\n" + e.split("/")[-1][:-3]
            i=0
            for service in self.deleteList:
                print "===== deleteList.path ", service.getPath(), e
                if service.getPath() == e:
                    del self.deleteList[i]
                    break
                i += 1
                #       remove filname from self.deleteListe
    if not stoppedAll:
        self.checkHideMiniTV_beforeFullscreen()
        self.session.open(MessageBox, _("Not stopping any timers. Modify them with the timer editor.") + filenames, MessageBox.TYPE_INFO, 10)
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)
    else:
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)
dhwz commented 6 years ago

Ja so geht es auch ich hatte mir gedacht wir ergänzen den Index einfach direkt beim hinzufügen, also in self.recsToStop mit angeben, dann musst nicht danach umständlich danach suchen, also hier self.recsToStop.append(path) direkt den Index mit übergeben.

svenh0 commented 6 years ago

ok, da wollte ich nichts ändern, weil ich nicht weiß, ob eine geänderte Struktur von self.recstostop irgendwo Probleme macht. Hab aber gerade geschaut, das wird nirgendwo anders genutzt. Also könnte man auch bei Aufbau der Listen (delete/recstostop) einen zähler rein nehmen und dann bei recstostop den index mitgeben. Dann müsste der Code bei e... auf e[0]... geändert werden. Und der Index zum del self.deleteListe(e[1])

dhwz commented 6 years ago

ja genau

svenh0 commented 6 years ago

machst du das ?

dhwz commented 6 years ago

ja kann ich machen, dann übernehm ich erstmal deinen Code von oben

svenh0 commented 6 years ago

hab hier doch schon was, allerdings noch ungetestet:

Hab zum anschließenden Löschen noch ne Abfrage reingenommen, falls nach den Timer-Fehlern nichts mehr zum Löschen übrig ist ;)

def stopRecordConfirmation(self, confirmed):
    if not confirmed: return
    # send as a list?
    stoppedAll=True
    filenames = "\n"
    for e in self.recsToStop:
        stoppedResult = self["list"].recControl.stopRecording(e[0])
        stoppedAll = stoppedAll and stoppedResult
        if stoppedResult == False:
            filenames += "\n" + e[0].split("/")[-1][:-3]
            del self.deleteList[e[1]]
    if not stoppedAll:
        self.checkHideMiniTV_beforeFullscreen()
        self.session.open(MessageBox, _("Not stopping any timers. Modify them with the timer editor.") + filenames, MessageBox.TYPE_INFO, 10)
        if len(self.deleteList)>0:
            self.deleteMovieQ(self.deleteList, self.remRecsToStop)
    else:
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)

def stopRecordQ(self):
    try:
        filenames = ""
        for e in self.recsToStop:
            filenames += "\n" + e[0].split("/")[-1][:-3]
        self.checkHideMiniTV_beforeFullscreen()
        self.session.openWithCallback(self.stopRecordConfirmation, MessageBox, _("Stop ongoing recording?\n") + filenames, MessageBox.TYPE_YESNO)
    except Exception, e:
        emcDebugOut("[EMCMS] stopRecordQ exception:\n" + str(e))

und das hier ab Zeile 2253 oder so:

        else:
            if self["list"].serviceBusy(selectedlist[0]): return
            if selectedlist and len(selectedlist)>0:
                self.recsToStop = []
                self.remRecsToStop = False
                i=0
                for service in selectedlist:
                    path = service.getPath()
                    movieFileCache.delPathFromCache(os.path.dirname(path))
                    if self["list"].recControl.isRecording(path):
                        self.recsToStop.append([path,i])
                    i += 1
                    if config.EMC.remote_recordings.value and self["list"].recControl.isRemoteRecording(path):
                        self.remRecsToStop = True
                if len(self.recsToStop)>0:
                    self.deleteList = selectedlist
                    self.stopRecordQ()
                else:
                    self.deleteMovieQ(selectedlist, self.remRecsToStop)
dhwz commented 6 years ago

MovieSelection.zip

Ok das schaut mehr oder weniger identisch aus ;)

Edit: Die Abfrage ist aber falsch oder das müsste heißen if len(self.deleteList)>0:

Aber ich bin mir gerade nicht mehr so sicher ob das nicht ein gedanklicher Fehler von mir war, wenn wir das nach Index löschen. Verschiebt sich der Index dann nicht?

svenh0 commented 6 years ago

mmh, so läuft es durch. Wenn ich einen Timerfehler provoziere, kracht es in 2268 (out of range), vermutlich weil der Index sich verschiebt ;)

            del self.deleteList[e[1]]

Und die Sicherheit würde ich auch noch reinmachen(ach, hast du ja schon ;) )

if len(self.deleteList)>0: self.deleteMovieQ(self.deleteList, self.remRecsToStop)

svenh0 commented 6 years ago

oder man sammelt alle Indexe und löscht zum Schluss in einem Rutsch

dhwz commented 6 years ago

Hm ja glaub es müsste heißen del self.deleteList[e[1]-i], pro Löschvorgang eins mehr abziehen als davor.

def stopRecordConfirmation(self, confirmed):
    if not confirmed: return
    # send as a list?
    stoppedAll=True
    filenames = "\n"
    i=0
    for e in self.recsToStop:
        stoppedResult = self["list"].recControl.stopRecording(e[0])
        stoppedAll = stoppedAll and stoppedResult
        if stoppedResult == False:
            filenames += "\n" + e[0].split("/")[-1][:-3]
            del self.deleteList[e[1]-i]
            i+=1
    if not stoppedAll:
        self.checkHideMiniTV_beforeFullscreen()
        self.session.open(MessageBox, _("Not all timers have been stopped. Modify them with the timer editor.") + filenames, MessageBox.TYPE_INFO, 10)
        if len(self.deleteList)>0:
            self.deleteMovieQ(self.deleteList, self.remRecsToStop)
    else:
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)

Kannst das nochmal testen bitte. Oder so wie du sagst auch ok, änder einfach mal ab und probiers.

dhwz commented 6 years ago

Also bei mir haut es so hin, falls ich keinen Anwendungsfall übersehn hab.

svenh0 commented 6 years ago

klappt perfekt, auch bei fehlerhaftem Beenden eines Timers. Dabei (also mit Fehler beim Timer-Beenden) gibt es nur eine komische Sache. Man sieht zuerst die Frage zum Löschen der übriggebliebenen Aufnahme. Dahinter ist der Hinweis, das es beim Timer xxx ein Problem gab ;) Andersrum wäre schöner. Evtl nochmal mit CallBack MessageBox?

dhwz commented 6 years ago

hm ja kann, sein aber das ja egal solange der User die Info bekommt

svenh0 commented 6 years ago

Ist ja wie gesagt nur ein Schönheitsmangel. Von der Logik her müsste erst der Fehler kommen und dann die Frage zum Löschen der restlichen Aufnahmen.

Wären ja nur 3 Zeilen mehr, oder ?

dhwz commented 6 years ago

Ja kann aber sein dass er bei der MessageBox nicht wartet und den restlichen Code direkt ausführt. Mit einem Callback würde es gehen, dann wird es sicher erst danach ausgeführt.

svenh0 commented 6 years ago

ich teste gerade mal

svenh0 commented 6 years ago

so geht's ;) Ein zusätzliches CallBack (def deleteMovieQfirst) bei der Fehler-Info (nur, wenn auch noch was zu löschen ist).

def stopRecordConfirmation(self, confirmed):
    if not confirmed: return
    # send as a list?
    stoppedAll=True
    filenames = "\n"
    i=0
    for e in self.recsToStop:
        stoppedResult = self["list"].recControl.stopRecording(e[0])
        stoppedAll = stoppedAll and stoppedResult
        if stoppedResult == False:
            filenames += "\n" + e[0].split("/")[-1][:-3]
            del self.deleteList[e[1]-i]
            i+=1
    if not stoppedAll:
        self.checkHideMiniTV_beforeFullscreen()
        if len(self.deleteList)>0:
            self.session.openWithCallback(self.deleteMovieQfirst, MessageBox, _("Not all timers have been stopped. Modify them with the timer editor.") + filenames, MessageBox.TYPE_INFO, 10)
        else:
            self.session.open(MessageBox, _("Not all timers have been stopped. Modify them with the timer editor.") + filenames, MessageBox.TYPE_INFO, 10)
    else:
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)

def deleteMovieQfirst(self, confirmed):
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)
dhwz commented 6 years ago

Ok wart ich bau es mal ein ;) Was soll eigentlich das dämliche self.checkHideMiniTV_beforeFullscreen() überall im Code ich glaub ich räum da mal auf...

svenh0 commented 6 years ago

man könnte auch nur die CallBack-Info machen und das "if len(self.deleteList)>0:" erst in der CallBack-Funktion prüfen.

Das mit dem HideMiniTV sagt mir auch nichts.

def stopRecordConfirmation(self, confirmed):
    if not confirmed: return
    # send as a list?
    stoppedAll=True
    filenames = "\n"
    i=0
    for e in self.recsToStop:
        stoppedResult = self["list"].recControl.stopRecording(e[0])
        stoppedAll = stoppedAll and stoppedResult
        if stoppedResult == False:
            filenames += "\n" + e[0].split("/")[-1][:-3]
            del self.deleteList[e[1]-i]
            i+=1
    if not stoppedAll:
        self.checkHideMiniTV_beforeFullscreen()
        self.session.openWithCallback(self.deleteMovieQfirst, MessageBox, _("Not all timers have been stopped. Modify them with the timer editor.") + filenames, MessageBox.TYPE_INFO, 10)
    else:
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)

def deleteMovieQfirst(self, confirmed):
    if len(self.deleteList)>0:
        self.deleteMovieQ(self.deleteList, self.remRecsToStop)
dhwz commented 6 years ago

Ja hatte ich schon so gemacht ;)

dhwz commented 6 years ago

Danke für deinen Support zu zweit klappt halt schneller, weil ich das hier auch nicht alles testen kann an meiner DevBox.

svenh0 commented 6 years ago

Hier noch die miniTVHide... Scheint auch nur für nicht-DreamOS zu sein !?!?

def checkHideMiniTV_beforeFullscreen(self):
    if self.hide_miniTV and (config.EMC.hide_miniTV_method.value == "singlePixelMuted") and not isDreamOS:
        if not (config.EMC.movie_cover.value or config.EMC.movie_preview.value):
            self.session.nav.stopService() #even if EMC.hide_miniTV_method is singlePixelMuted
            self["Video"].hide()
dhwz commented 6 years ago

Ja aber ich finde das total gestört dass das überall im Code aufgerufen wird.

svenh0 commented 6 years ago

Vor jeder Messagebox ???

dhwz commented 6 years ago

ja scheinbar ich versteh den Sinn dahinter nicht

svenh0 commented 6 years ago

kann schon sein, dass die Messagebox sonst irgendwie hinter dem MiniTV ist oder so. Scheint bei DreamOS ja nicht zu passieren ;)

dream-alpha commented 6 years ago

danke jungs... werde das morgen mal testen.

dream-alpha commented 6 years ago

getestet und fuer gut befunden. danke nochmal.

dhwz commented 6 years ago

@svenh0 Wir haben da noch ein Problem die cuts werden nicht gelöscht wenn der Timer gestoppt und direkt die Aufnahme gelöscht wird weil die cuts erst kurz danach geschrieben wird.

svenh0 commented 6 years ago

hmm mit cuts hab ich mich noch nicht beschäftigt. Wie viel später passiert das denn?

Evtl. könnte man das Löschen ein paar Millisekunden mit delay nach hinten verlegen. Wobei zwischen Timer beenden und Antwort zur Löschfrage ja auch schon einige Zeit verstreicht.

dhwz commented 6 years ago

Ich denke das wird von hier angestoßen. DelayedFunction(3000, self.mergeCutListAfterRecording, filename)

dhwz commented 6 years ago

Also wenn man nicht 3 Sekunden wartet bevor man das Löschen bestätigt hat man dann immer diese Geister-Cuts im Verzeichnis liegen. Ich redizier mal die 3 Sekunden etwas und verzögere das Löschen dann ebenfalls.

svenh0 commented 6 years ago

Ok. Das ist ja dann schon immer passiert, wenn ich das Löschen innerhalb von 3 Sekunden bestätigt habe.

Vielleicht kann man ja ne tempVariable setzen beim Timer beenden, dass diese mergecutlistafterrecording nur ausgeführt wird, wenn der Timer nicht manuell beendet wurde.

Mir fehlt da noch die Codeübersicht ;) Am Handy eher schlecht.

dhwz commented 6 years ago

Ich hab das mal umgebastelt, ich hab diese großen Delays mal verkürzt und dann warte ich bevor ich löschen auch eine kurze Zeit bis die Cuts geschrieben sind. Eigentlich sollte das nichts kaputt machen. Kannst ja mal testen wenn du wieder dran sitzt.

svenh0 commented 6 years ago

hat man dann immer diese Geister-Cuts im Verzeichnis liegen

meinst du die 0 Byte ...ts.ts.cuts ?? (also mit doppelt ts.) Die habe ich auch bei ganz normalen Aufnahmen von gestern/heute, die ich nicht gelöscht habe. Mit der Version von gestern bleiben nach dem Löschen von laufenden Aufnahmen nur diese 0 Byte ts.ts.cuts übrig.

Hab die aktuelle Version noch nicht installiert, laufen gerade Aufnahmen ;) Aber wenn das mit dem neuen Delay passt, dann ist doch ok. Code-technisch sieht es ja gut aus. Teste dann später mal, wenn die Box frei ist.

svenh0 commented 6 years ago

Hab gerade eine freie Lücke der Box genutzt zum Update/Test. Mit der aktuellen Version bleiben keine 0 Byte .cuts übrig. :) Komischerweise sind jetzt die anderen von den gestrigen/heutigen Aufnahmen auch weg. Werden die beim GUI-Neustart irgendwo bereinigt ?

dhwz commented 6 years ago

Ich wüsste nicht von wem oder wo, aber wer weiß :) Dass diese ts.ts.cuts entstand sind war noch ein Bug, weil da irgendwer mal was geändert hatte an den Timerfilenames. Aber das ist jetzt ja auch korrekt. Aber wenn es bei dir auch klappt bin ich zufrieden, wieder ein Problem weniger :)

svenh0 commented 6 years ago

Hab gerade festgestellt, dass das installierte AutomaticCleanup auch verweiste Filmdateien löscht, deshalb hatte ich wohl nie welche ;)