break out of for loop - with a twist!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
3000
User
Beiträge: 20
Registriert: Samstag 5. September 2015, 11:33

hi, I am using Kodi and I have my movies in different folders depending on the resolution, refresh rate and available soundtrack (like Dolby Atmos, DD+, DTS-HD)

I have a script which is giving me a notification when I switch to the movie poster in Kodi.

HOWEVER, the notification is stuck on the screen and doesn't disappear after 5 seconds as it should.
I simply can't figure out how to break out of the loop.

It should reappear once I switch to a movie which has a different sound mode/or refresh rate, etc. ...

I'd really appreciate if someone can take a look - what is likely a simple solution. Just not for me....

Thanks a lot!

Code: Alles auswählen

if __name__ == '__main__':    
    monitor = xbmc.Monitor()    
    while not monitor.abortRequested():
        if monitor.waitForAbort(.5):
            break
        for root, dirs, files in os.walk("/storage/emulated/0/DCIM/"):
            for x in dirs:
                if xbmc.getInfoLabel('ListItem.Title') in dirs:
                        xbmc.executebuiltin( 'Notification(Status,Refresh rate: 23Hz)' )
                        break
                break 
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum jetzt plötzlich auf Englisch? Eingerückt wird immer mit 4 Leerzeichen pro Ebene. `x` ist ein sehr schlechter Variablenname für ein Verzeichnis. Die Schleife über `x` ist auch ziemlich nutzlos, weil `x` gar nicht verwendet wird und die Schleife gleich nach dem ersten Durchlauf per `break` verlassen wird.
`break` bricht aber nur die aktuelle Schleife ab, ich vermute mal, Du willst bei gefundenem Verzeichnis die while-Schleife verlassen, dazu schreibt man am besten eine Funktion, die man per `return` verlassen kann.
`abortRequested` und `waitForAbort` ist doppelt; da kann eins weg.

Code: Alles auswählen

STORAGE_PATH = "/storage/emulated/0/DCIM/"

def find_directory():
    monitor = xbmc.Monitor()    
    while not monitor.waitForAbort(.5):
        title = xbmc.getInfoLabel('ListItem.Title')
        for root, dirs, files in os.walk(STORAGE_PATH):
            if title in dirs:
                xbmc.executebuiltin( 'Notification(Status,Refresh rate: 23Hz)' )
                return os.path.join(root, title)
    # return None on abort
    return None

def main():
    directory = find_directory()
    ...

if __name__ == '__main__':
    main()
3000
User
Beiträge: 20
Registriert: Samstag 5. September 2015, 11:33

hi, ich danke dir für die Rückmeldung und die ausführlichen Erklärungen! Dein Code lässt sich auch gleich viel besser lesen.

Ich hatte mein Anliegen bereits in einem englischsprachigen Forum probiert (ohne Erfolg) und war um ehrlich zu sein einfach faul alles noch mal auf deutsch abzutippen. Dachte, das bisschen wird schon verstanden :)

Hab das so von dir übernommen, die Notification bleibt zwar jetzt nicht mehr am Bildschirm "kleben" und verschwindet nach 5 Sekunden, aber das wars. Die Meldung kommt kein zweites Mal, wenn man in einem anderen Verzeichnis ist. Ich möchte, dass die Meldung bei jeder Änderung von neuem kommt. Also wenn ich auf einem Film aus Folder A bin und wenn ich auf einem Film aus Folder B bin, etc. ...

Was könnte die Lösung dazu sein? Wäre super wenn du mir dabei behilflich sein könntest.

Mille Grazie!
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das Problem ist, dass das hier kaum jemand wird loesen koennen. Denn das laeuft ja nur in einer speziellen Umgebung. Ich fuerchte, da musst du selbst ran.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann verstehe ich nicht, was Du eigentlich willst. Da kann ich nur raten.

Code: Alles auswählen

STORAGE_PATH = "/storage/emulated/0/DCIM/"

def check_directory(directory):
    for root, dirs, files in os.walk(STORAGE_PATH):
        if directory in dirs:
            return True
    return False

def main():
    current_title = None
    monitor = xbmc.Monitor()    
    while not monitor.waitForAbort(.5):
        title = xbmc.getInfoLabel('ListItem.Title')
        if current_title != title:
            if check_directory(title):
                xbmc.executebuiltin('Notification(Status,Refresh rate: 23Hz)' )
            current_title = title

if __name__ == '__main__':
    main()
3000
User
Beiträge: 20
Registriert: Samstag 5. September 2015, 11:33

Ja super! Das war genau das was ich gesucht habe. Ich danke dir recht herzlich! Sag ja, war wohl ein einfaches Problem. Nur für mich net :)
Antworten