Uploaded image for project: 'Picard'
  1. Picard
  2. PICARD-3008

Poorly formatted "Date" tags crash Picard with uncaught Overflow Exception

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Normal Normal
    • 2.13
    • 3.0
    • Tags & Metadata
    • None
    • Docker

      If a file has a poorly formatted DATE tag (in this case, from a FLAC file):

      $ ffprobe 03\ -\ Everyday\ People\ \[FLAC\ 24bit\]\[FLAC\ 2.0\].flac
      ffprobe version 6.1.1-3ubuntu5 Copyright (c) 2007-2023 the FFmpeg developers
        
      # ...
      
      Input #0, flac, from '03 - Everyday People [FLAC 24bit][FLAC 2.0].flac':
        Metadata:
          DATE            : 20190303201903032019030320190303
      
      # ...

      When importing in Picard, an Overflow exception causes the application to crash, as it is not caught:

      [app         ] Traceback (most recent call last):
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/webservice/__init__.py", line 593, in _process_reply
      [app         ]     self._handle_reply(reply, request)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/webservice/__init__.py", line 578, in _handle_reply
      [app         ]     handler(document, reply, error)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/acoustid/__init__.py", line 125, in _on_lookup_finished
      [app         ]     resolver.resolve()
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/acoustid/recordings.py", line 110, in resolve
      [app         ]     self._load_recordings()
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/acoustid/recordings.py", line 114, in _load_recordings
      [app         ]     self._send_results()
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/acoustid/recordings.py", line 156, in _send_results
      [app         ]     self._callback(list(parse_recording_map(self._recording_map)), error)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/acoustid/__init__.py", line 164, in _on_recording_resolve_finish
      [app         ]     task.next_func({'recordings': recording_list}, http, error)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/file.py", line 851, in _lookup_finished
      [app         ]     trackmatch = self._match_to_track(tracks, threshold=threshold)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/file.py", line 878, in _match_to_track
      [app         ]     best_match = find_best_match(candidates, no_match)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/util/__init__.py", line 909, in find_best_match
      [app         ]     best_match = max(candidates, key=attrgetter('similarity'), default=no_match)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/file.py", line 874, in <genexpr>
      [app         ]     self.metadata.compare_to_track(track, self.comparison_weights)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/metadata.py", line 396, in compare_to_track
      [app         ]     release_parts = self.compare_to_release_parts(release, weights)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/metadata.py", line 308, in compare_to_release_parts
      [app         ]     metadata_year = extract_year_from_date(metadata_date)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/picard/util/__init__.py", line 978, in extract_year_from_date
      [app         ]     return parse(dt).year
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/dateutil/parser/_parser.py", line 1368, in parse
      [app         ]     return DEFAULTPARSER.parse(timestr, **kwargs)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/dateutil/parser/_parser.py", line 649, in parse
      [app         ]     ret = self._build_naive(res, default)
      [app         ]   File "/usr/local/lib/python3.10/dist-packages/dateutil/parser/_parser.py", line 1235, in _build_naive
      [app         ]     naive = default.replace(**repl)
      [app         ] OverflowError: Python int too large to convert to C long
      [app         ] Aborted (core dumped)
      [supervisor  ] service 'app' exited (with status 134).
      [supervisor  ] service 'app' exited, shutting down... 

            outsidecontext Philipp Wolfer
            Chiberia Chiberia
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:

                Version Package
                2.13