ihabunek / toot

toot - Mastodon CLI & TUI

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

videos from peertube cause traceback when shown in toot timeline

lilmike opened this issue · comments

Hiya,

If you follow a peertube channel, whenever a video is posted, the status will cause toot to traceback as such:

Traceback (most recent call last):
  File "/usr/bin/toot", line 33, in <module>
    sys.exit(load_entry_point('toot==0.36.0', 'console_scripts', 'toot')())
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/toot/console.py", line 823, in main
    run_command(app, user, command_name, args)
  File "/usr/lib/python3.11/site-packages/toot/console.py", line 804, in run_command
    return fn(app, user, parsed_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/toot/commands.py", line 57, in timeline
    print_timeline(items)
  File "/usr/lib/python3.11/site-packages/toot/output.py", line 314, in print_timeline
    print_status(item, width)
  File "/usr/lib/python3.11/site-packages/toot/output.py", line 236, in print_status
    time = parse_datetime(status['created_at'])
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/site-packages/toot/tui/utils.py", line 28, in parse_datetime
    dttm = datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f%z")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

Thanks,

-Michael.

P.S. I'm using pleroma, and toot from latest git.

That stack trace looks like it was created by an older version of toot. Could you git pull the new code and try again? I'm suspecting it may crash again though. Don't have a pleroma subcription to try out.

Here you go, traceback from latest git:

Traceback (most recent call last):
  File "/home/vlilmike/.pyenv/versions/toot/bin/toot", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/console.py", line 961, in main
    run_command(app, user, command_name, args)
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/console.py", line 943, in run_command
    return fn(app, user, parsed_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/commands.py", line 60, in timeline
    statuses = [from_dict(Status, item) for item in items]
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/commands.py", line 60, in <listcomp>
    statuses = [from_dict(Status, item) for item in items]
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 394, in from_dict
    return cls(**dict(_fields()))
                 ^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 392, in _fields
    yield field.name, _convert(field_type, value)
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 415, in _convert
    return datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f%z")
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/lib/python3.11/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/lib/python3.11/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'

-Michael.

I tried to reproduce, even signed up for a pleroma instance, but without luck. I added some code which should produce a better error message. Could you pull latest from master and tell me what error you get now?

Here's the new output:

Traceback (most recent call last):
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 430, in _convert_with_error_handling
    return _convert(field_type, field_value)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 445, in _convert
    return datetime.strptime(value, "%Y-%m-%dT%H:%M:%S.%f%z").astimezone()
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/lib/python3.11/_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/lib/python3.11/_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '' does not match format '%Y-%m-%dT%H:%M:%S.%f%z'
                                                                                                                                
During handling of the above exception, another exception occurred:
                                                                                                                                
Traceback (most recent call last):
  File "/home/vlilmike/.pyenv/versions/toot/bin/toot", line 8, in <module>
    sys.exit(main())
             ^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/console.py", line 961, in main
    run_command(app, user, command_name, args)
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/console.py", line 943, in run_command
    return fn(app, user, parsed_args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/commands.py", line 60, in timeline
    statuses = [from_dict(Status, item) for item in items]
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/commands.py", line 60, in <listcomp>
    statuses = [from_dict(Status, item) for item in items]
                ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 410, in from_dict
    return cls(**dict(_fields()))
                 ^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 407, in _fields
    converted = _convert_with_error_handling(cls, field.name, field_type, value)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/vlilmike/.pyenv/versions/3.11.6/envs/toot/lib/python3.11/site-packages/toot/entities.py", line 434, in _convert_with_error_handling
    raise ConversionError(data_class, field_name, field_type, field_value)
toot.entities.ConversionError: Failed converting field `Status.created_at` of type `datetime` from value ''

For reference, the channel I am following is mwtab_main@peertube.fedihost.website

-Michael.

This is a bug in pleroma, they return an empty string for created_at (not even null) which should always be populated. I'll create a workaround for this.

Possibly related to https://git.pleroma.social/pleroma/pleroma/-/issues/2851

I added a hack for now, it will display current datetime instead. Please pull and test.