eichblatt / deadstream

A time machine to play GD tapes from archive.org
GNU General Public License v3.0
51 stars 14 forks source link

Unable to select after changing date with knobs. #317

Closed eichblatt closed 2 years ago

eichblatt commented 2 years ago

When I change the date with the knobs, I can't select a new date. But if I use the "next show" button, I can.

eichblatt commented 2 years ago

Log output extract:

Sep 10 17:50:28 deadstreamv3 bash[8380]: Traceback (most recent call last):
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/pins/rpigpio.py", line 223, in _call_when_changed
Sep 10 17:50:28 deadstreamv3 bash[8380]:     super(RPiGPIOPin, self)._call_when_changed()
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/pins/local.py", line 128, in _call_when_changed
Sep 10 17:50:28 deadstreamv3 bash[8380]:     super(LocalPiPin, self)._call_when_changed(
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/pins/pi.py", line 298, in _call_when_changed
Sep 10 17:50:28 deadstreamv3 bash[8380]:     method(ticks, state)
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/input_devices.py", line 182, in _pin_changed
Sep 10 17:50:28 deadstreamv3 bash[8380]:     self._fire_events(ticks, bool(self._state_to_value(state)))
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/mixins.py", line 401, in _fire_events
Sep 10 17:50:28 deadstreamv3 bash[8380]:     self._fire_activated()
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/mixins.py", line 447, in _fire_activated
Sep 10 17:50:28 deadstreamv3 bash[8380]:     super(HoldMixin, self)._fire_activated()
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/mixins.py", line 364, in _fire_activated
Sep 10 17:50:28 deadstreamv3 bash[8380]:     self.when_activated()
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/gpiozero/mixins.py", line 354, in wrapper
Sep 10 17:50:28 deadstreamv3 bash[8380]:     return fn(self)
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/timemachine/livemusic.py", line 995, in <lambda>
Sep 10 17:50:28 deadstreamv3 bash[8380]:     TMB.select.when_pressed = lambda button: select_button(button, state)
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/timemachine/livemusic.py", line 77, in inner
Sep 10 17:50:28 deadstreamv3 bash[8380]:     func(*args, **kwargs)
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/timemachine/livemusic.py", line 236, in select_button
Sep 10 17:50:28 deadstreamv3 bash[8380]:     select_current_date(state, autoplay=autoplay)
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/timemachine/livemusic.py", line 207, in select_current_date
Sep 10 17:50:28 deadstreamv3 bash[8380]:     tapes = date_reader.archive.resort_tape_date(date_reader.fmtdate())
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/timemachine/Archivary.py", line 223, in resort_tape_date
Sep 10 17:50:28 deadstreamv3 bash[8380]:     bt = [remove_none(a.resort_tape_date(date)) for a in self.archives]
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/timemachine/Archivary.py", line 223, in <listcomp>
Sep 10 17:50:28 deadstreamv3 bash[8380]:     bt = [remove_none(a.resort_tape_date(date)) for a in self.archives]
Sep 10 17:50:28 deadstreamv3 bash[8380]:   File "/home/deadhead/env_20220821.a4de6099/lib/python3.9/site-packages/timemachine/Archivary.py", line 956, in resort_tape_date
Sep 10 17:50:28 deadstreamv3 bash[8380]:     tapes = self.tape_dates[date]
Sep 10 17:50:28 deadstreamv3 bash[8380]: KeyError: '1983-09-02'
Sep 10 17:52:30 deadstreamv3 bash[8380]: 2022-09-10 17:52:30.061 INFO: timemachine.livemusic in track event callback playlist-pos, 1

Note: there is a show on 9/2/83, but in the function "resort_tape_date", it doesn't appear to recognize it.

eichblatt commented 2 years ago

This may be due to the re-order tapes fix, somehow. Hopefully it is, because otherwise it may be widespread. Thinking a bit more, I believe this is due to issue #313 which added the archive updates when they are loaded.

See https://github.com/eichblatt/deadstream/commit/a2544004add7bd84f43926609893c47c72d63a57

Note: the most recently-added tape for 1983-09-02 was added in 2020.

eichblatt commented 2 years ago

In the log, I noticed that there was an archive update occuring every hour, instead of every 5 hours. The reason was that the updates were failing for a stupid reason: Some of the titles were None, which failed when .lower() was attempted (in the compute_score function.

So, the Archives were being updated, but the _tapedates variable was not being updated. And the update was running every hour!

I put in a couple of protections here:

First, I modified title_fraction to check for NoneType before asking for the .lower()

    def title_fraction(self):
        n_tracks = len(self._tracks)
        lc = string.ascii_lowercase
        n_known = len([t for t in self._tracks if t.title is not None and t.title != 'unknown' and sum([x in lc for x in t.title.lower()]) > 4])
        return (1 + n_known) / (1 + n_tracks)

And I protected the entire call with a try/except around the compute_score function:

    def get_tape_dates(self, sort_within=True):   # BaseArchive
        tape_dates = {}
        for tape in self.tapes:
            k = tape.date
            if k not in tape_dates.keys():
                tape_dates[k] = [tape]
            else:
                tape_dates[k].append(tape)
        # Now that we have all tape for a date, put them in the right order
        if not sort_within:
            self.tape_dates = tape_dates
        else:
            self.tape_dates = {}
            for k, v in tape_dates.items():
                try:
                    self.tape_dates[k] = sorted(v, key=methodcaller('compute_score'), reverse=True)
                except:
                    self.tape_dates[k] = v
                    logger.warning(f"Failed to sort tapes on {k}")
        return self.tape_dates