rp 0.1.1385__tar.gz → 0.1.1387__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rp-0.1.1385 → rp-0.1.1387}/PKG-INFO +1 -1
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint/media_to_slides.py +85 -47
- {rp-0.1.1385 → rp-0.1.1387}/rp/r.py +109 -3
- rp-0.1.1387/rp/version.py +1 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp.egg-info/PKG-INFO +1 -1
- rp-0.1.1387/version.py +1 -0
- rp-0.1.1385/rp/version.py +0 -1
- rp-0.1.1385/version.py +0 -1
- {rp-0.1.1385 → rp-0.1.1387}/.gitignore +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/QuickPython.iml +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/QuickPython.time +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/encodings.xml +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/inspectionProfiles/Project_Default.xml +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/misc.xml +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/modules.xml +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/vcs.xml +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.idea/workspace.xml +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.publish.sh.un~ +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.setup.py.un~ +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/.update_module_paths.py.un~ +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/LICENSE.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/README +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/Scrap +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/aoisdasd +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/increment_version.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/oijio +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/publish.sh +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/pyqtconsoletest.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/__main__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/documentation.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/Pyperclip.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/debug_comment.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/draw_code_minimap.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/graveyard.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/_compatibility.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/cache.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/file_io.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/grammar.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/normalizer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/parser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/pgen2/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/pgen2/generator.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/pgen2/grammar_parser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/diff.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/errors.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar26.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar27.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar310.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar311.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar312.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar33.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar34.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar35.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar36.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar37.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar38.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/grammar39.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/parser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/pep8.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/prefix.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/token.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/tokenize.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/python/tree.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/tree.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/parso/utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/peepdis/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/peepdis/core.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/peepdis/datastructures.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/peepdis/legacy.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/peepdis/preferences.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint/__main__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint/convert_pptx_videos_to_gifs.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint/convert_tmux.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint/google_slides_upload.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint/pptx_utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/powerpoint_converter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/profile_vim_plugins.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pw_crypt.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/bindings/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/bindings/flann_ctypes.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/exceptions.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/index.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/io/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/io/binary_dataset.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/io/dat_dataset.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/io/dataset.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/io/hdf5_dataset.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/io/npy_dataset.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/util/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyflann/util/weave_tools.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/__version__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/app.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/cli.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/cli_utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/config/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/config/config.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/config/config_error.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/config/config_parser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/config/config_transformer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/config/validators/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/config/validators/options.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/logging.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/autocomplete/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/autocomplete/autocomplete_listener.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/common/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/common/jsonpath/JSONPathLexer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/common/jsonpath/JSONPathListener.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/common/jsonpath/JSONPathParser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/common/jsonpath/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/io/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/io/datasource.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/model/model.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/service/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/service/client.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/service/dispatcher.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/common/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/common/popup.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/common/selectable_text.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/autocomplete_popup/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/autocomplete_popup/autocomplete_popup.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/autocomplete_popup/autocomplete_popup_keymapper.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/help_bar/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/help_bar/help_bar.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/help_page/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/help_page/detailed_help_page.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/json_browser/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/json_browser/json_browser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/json_browser/json_browser_keymapper.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/query_bar/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/query_bar/query_bar.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/components/query_bar/query_bar_keymapper.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/array/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/array/array_end_node.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/array/array_end_widget.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/array/array_node.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/array/array_start_widget.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/array/array_unexpanded_widget.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/json_composite_end_node.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/json_composite_node.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/json_listbox.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/json_listwalker.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/json_simple_node.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/json_widget.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/node_factory.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/object/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/object/object_end_node.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/object/object_end_widget.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/object/object_node.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/object/object_start_widget.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/object/object_unexpanded_widget.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/boolean.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/generic.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/integer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/null.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/numeric.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/primitive/string.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/json_lib/selector/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/keymapper/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/keymapper/abstract_component_keymapper.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/keymapper/keymapper.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/keymapper/keymapper_config.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/keymapper/keymapper_config_parser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/theme/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/theme/theme.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/theme/theme_config.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/theme/theme_config_parser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/view_config.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/view_frame.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pyfx/view/view_manager.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pynput_recorder.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pypi_inspection.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/pytorch_module_explorer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/refactor/string_format/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/refactor/string_format/format_to_fstring_converter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/refactor/string_format/fstring_converter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/refactor/string_format/test_format_to_fstring_converter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/refactor/string_format/test_fstring_converter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/rp_black_macchiato.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/stamp_tensor.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/stdin_python_highlighter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/__main__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/canvas.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/colors.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/console.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/funcs.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/nbinput.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/shapes.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/graphics/graphics/sprite.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/letters.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tetris/tetrisShapes.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/__main__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/argparser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/meta.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/methods/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/methods/ansi.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/methods/ansi_methods.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/methods/ascii.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/methods/method.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/methods/sixel.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/timg/renderer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/torch_hooks.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/torch_tools.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tracetraptest.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/tweenline.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/libs/webeval_dataset.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/list_of_modules.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/Todo +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/blm.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/chainsaw.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/claude_bash.sh +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/claude_panel.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/death_of_the_mind.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/flappy.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/mario.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/matrix.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/mpi_untitled.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/py2048.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/pychess.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/rp_logo.svg +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/rp_mpi.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/ryan_zshrc.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/shotgun.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/skia_trail_interactive_paint_demo.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/snake.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/sudoku.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/tetris.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/misc/trans.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/application.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/auto_suggest.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/buffer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/buffer_mapping.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/cache.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/clipboard/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/clipboard/base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/clipboard/in_memory.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/clipboard/pyperclip.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/completion.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/completers/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/completers/base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/completers/filesystem.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/completers/system.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/regular_languages/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/regular_languages/compiler.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/regular_languages/completion.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/regular_languages/lexer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/regular_languages/regex_parser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/regular_languages/validation.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/telnet/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/telnet/application.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/telnet/log.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/telnet/protocol.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/telnet/server.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/validators/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/contrib/validators/base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/document.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/enums.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/asyncio_base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/asyncio_posix.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/asyncio_win32.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/callbacks.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/inputhook.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/posix.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/posix_utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/select.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/eventloop/win32.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/filters/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/filters/base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/filters/cli.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/filters/types.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/filters/utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/history.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/input.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/interface.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/bindings/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/bindings/basic.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/bindings/completion.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/bindings/emacs.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/bindings/named_commands.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/bindings/scroll.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/bindings/vi.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/defaults.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/digraphs.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/input_processor.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/manager.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/registry.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/key_binding/vi_state.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/keys.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/containers.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/controls.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/dimension.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/lexers.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/margins.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/menus.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/mouse_handlers.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/processors.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/prompt.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/screen.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/toolbars.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/untitled.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/layout/utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/mouse_events.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/output.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/reactive.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/renderer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/search_state.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/selection.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/shortcuts.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/styles/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/styles/base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/styles/defaults.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/styles/from_dict.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/styles/from_pygments.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/styles/utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/terminal/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/terminal/conemu_output.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/terminal/vt100_input.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/terminal/vt100_output.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/terminal/win32_input.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/terminal/win32_output.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/token.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/validation.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/prompt_toolkit/win32_types.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/__main__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/ast_selection.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/async_analyzer_base.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/async_jedi_highlighter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/backslash_commands.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/bash_completer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/bash_extract.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/bash_inline.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/bash_rename.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/bash_selection.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/completer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/completer_old.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/completion_ranker.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/completion_schema.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/completion_types.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/eventloop.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/filters.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/history_browser.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/ipython.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/jedi_highlighter.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/jedi_lexer.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/jedi_utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/key_bindings.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/layout.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/patch_linecache.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/path_completer_utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/prompt_style.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/python_input.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/r_iterm_comm.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/refactor_extract.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/refactor_inline.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/refactor_move.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/refactor_move_bash.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/refactor_rename.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/repl.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/__init__.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/commands.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/completers.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/completion_hints.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/grammar.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/key_bindings.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/layout.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/style.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/rp_ptpdb/toolbars.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/selection_utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/style.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/testable_keybindings.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/treesitter_selection.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/treesitter_semantic.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/unreachable_detector.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/utils.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/rp_ptpython/validator.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/ryan_vimrc.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp/web_evaluator.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp.egg-info/SOURCES.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp.egg-info/dependency_links.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp.egg-info/entry_points.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp.egg-info/requires.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/rp.egg-info/top_level.txt +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/setup.cfg +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/setup.py +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/untitled.c +0 -0
- {rp-0.1.1385 → rp-0.1.1387}/update_module_paths.py +0 -0
|
@@ -140,6 +140,39 @@ def is_media_path(x) -> bool:
|
|
|
140
140
|
return ext in IMAGE_EXTENSIONS or ext in VIDEO_EXTENSIONS
|
|
141
141
|
|
|
142
142
|
|
|
143
|
+
def _parse_labeled_dict(d: dict) -> tuple[list, list]:
|
|
144
|
+
"""Parse {label: path} dict. Returns (paths, labels) or raises if backwards."""
|
|
145
|
+
labels = []
|
|
146
|
+
paths = []
|
|
147
|
+
for label, path in d.items():
|
|
148
|
+
if is_media_path(path):
|
|
149
|
+
labels.append(label)
|
|
150
|
+
paths.append(path)
|
|
151
|
+
if not paths and d:
|
|
152
|
+
first_key = next(iter(d.keys()))
|
|
153
|
+
if is_media_path(first_key):
|
|
154
|
+
raise ValueError(
|
|
155
|
+
f"Dict has paths as keys, but expected {{label: path}}. "
|
|
156
|
+
f"Got {{{repr(first_key)}: ...}}. Flip your dict."
|
|
157
|
+
)
|
|
158
|
+
return paths, labels
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
def _parse_content(content, title=None) -> dict | None:
|
|
162
|
+
"""Parse content into a slide dict, or None if no valid paths."""
|
|
163
|
+
if is_media_path(content):
|
|
164
|
+
return {"paths": [content], "title": title, "labels": None}
|
|
165
|
+
if isinstance(content, dict):
|
|
166
|
+
paths, labels = _parse_labeled_dict(content)
|
|
167
|
+
if paths:
|
|
168
|
+
return {"paths": paths, "title": title, "labels": labels}
|
|
169
|
+
elif rp.is_non_str_iterable(content):
|
|
170
|
+
paths = [p for p in content if is_media_path(p)]
|
|
171
|
+
if paths:
|
|
172
|
+
return {"paths": paths, "title": title, "labels": None}
|
|
173
|
+
return None
|
|
174
|
+
|
|
175
|
+
|
|
143
176
|
def normalize_slides_input(layout) -> list[dict]:
|
|
144
177
|
"""
|
|
145
178
|
Normalize flexible input formats into list of slide dicts.
|
|
@@ -153,58 +186,22 @@ def normalize_slides_input(layout) -> list[dict]:
|
|
|
153
186
|
- Dict with nested labels: {'Slide 1': {'vid': 'a.mp4', 'img': 'b.png'}}
|
|
154
187
|
- Single path: 'a.mp4'
|
|
155
188
|
"""
|
|
156
|
-
# Single path
|
|
157
189
|
if is_media_path(layout):
|
|
158
190
|
return [{"paths": [layout], "title": None, "labels": None}]
|
|
159
191
|
|
|
160
|
-
# Dict with slide titles
|
|
161
192
|
if isinstance(layout, dict):
|
|
162
193
|
result = []
|
|
163
194
|
for title, content in layout.items():
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
)
|
|
168
|
-
elif isinstance(content, dict):
|
|
169
|
-
# {'label1': 'path1', 'label2': 'path2'}
|
|
170
|
-
labels = []
|
|
171
|
-
paths = []
|
|
172
|
-
for label, path in content.items():
|
|
173
|
-
if is_media_path(path):
|
|
174
|
-
labels.append(label)
|
|
175
|
-
paths.append(path)
|
|
176
|
-
if paths:
|
|
177
|
-
result.append(
|
|
178
|
-
{"paths": paths, "title": title, "labels": labels}
|
|
179
|
-
)
|
|
180
|
-
elif rp.is_non_str_iterable(content):
|
|
181
|
-
paths = [p for p in content if is_media_path(p)]
|
|
182
|
-
if paths:
|
|
183
|
-
result.append(
|
|
184
|
-
{"paths": paths, "title": title, "labels": None}
|
|
185
|
-
)
|
|
195
|
+
slide = _parse_content(content, title)
|
|
196
|
+
if slide:
|
|
197
|
+
result.append(slide)
|
|
186
198
|
return result
|
|
187
199
|
|
|
188
|
-
# List input
|
|
189
200
|
result = []
|
|
190
201
|
for item in layout:
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
paths = []
|
|
195
|
-
for label, path in item.items():
|
|
196
|
-
if is_media_path(path):
|
|
197
|
-
labels.append(label)
|
|
198
|
-
paths.append(path)
|
|
199
|
-
if paths:
|
|
200
|
-
result.append({"paths": paths, "title": None, "labels": labels})
|
|
201
|
-
elif rp.is_non_str_iterable(item):
|
|
202
|
-
paths = [p for p in item if is_media_path(p)]
|
|
203
|
-
if paths:
|
|
204
|
-
result.append({"paths": paths, "title": None, "labels": None})
|
|
205
|
-
elif is_media_path(item):
|
|
206
|
-
result.append({"paths": [item], "title": None, "labels": None})
|
|
207
|
-
|
|
202
|
+
slide = _parse_content(item)
|
|
203
|
+
if slide:
|
|
204
|
+
result.append(slide)
|
|
208
205
|
return result
|
|
209
206
|
|
|
210
207
|
|
|
@@ -278,6 +275,26 @@ def make_file_public(service, file_id: str) -> str:
|
|
|
278
275
|
return DRIVE_FILE_URL.format(file_id)
|
|
279
276
|
|
|
280
277
|
|
|
278
|
+
def _format_eta(done: int, total: int, elapsed: float) -> str:
|
|
279
|
+
"""Format ETA string based on progress and elapsed time."""
|
|
280
|
+
if done <= 0 or elapsed <= 0:
|
|
281
|
+
return ""
|
|
282
|
+
rate = done / elapsed
|
|
283
|
+
remaining = total - done
|
|
284
|
+
eta_seconds = remaining / rate
|
|
285
|
+
return f", ETA: {int(eta_seconds // 60)}m{int(eta_seconds % 60):02d}s"
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
def _format_progress(index: int, total: int, done: int, total_size: int, elapsed: float, use_bytes: bool = True) -> str:
|
|
289
|
+
"""Format overall progress string."""
|
|
290
|
+
eta = _format_eta(done, total_size, elapsed)
|
|
291
|
+
if use_bytes:
|
|
292
|
+
done_str = rp.human_readable_file_size(done)
|
|
293
|
+
total_str = rp.human_readable_file_size(total_size)
|
|
294
|
+
return f"[{index}/{total}] {done_str} / {total_str}{eta}"
|
|
295
|
+
return f"[{index}/{total}]{eta}"
|
|
296
|
+
|
|
297
|
+
|
|
281
298
|
def upload_media_sequential(
|
|
282
299
|
service,
|
|
283
300
|
file_paths: list[str],
|
|
@@ -285,14 +302,22 @@ def upload_media_sequential(
|
|
|
285
302
|
) -> list[dict]:
|
|
286
303
|
"""Upload multiple media files sequentially with progress bars."""
|
|
287
304
|
results = []
|
|
305
|
+
total_bytes = sum(rp.get_file_size(fp) for fp in file_paths)
|
|
306
|
+
uploaded_bytes = 0
|
|
307
|
+
start_time = time.time()
|
|
288
308
|
|
|
289
|
-
for fp in file_paths:
|
|
309
|
+
for i, fp in enumerate(file_paths):
|
|
290
310
|
size = rp.get_file_size(fp)
|
|
311
|
+
elapsed = time.time() - start_time
|
|
312
|
+
progress_str = _format_progress(i + 1, len(file_paths), uploaded_bytes, total_bytes, elapsed)
|
|
313
|
+
rp.fansi_print(f" {progress_str}", "cyan")
|
|
314
|
+
|
|
291
315
|
pbar = tqdm(
|
|
292
316
|
total=size,
|
|
293
317
|
desc=rp.get_file_name(fp),
|
|
294
318
|
unit="B",
|
|
295
319
|
unit_scale=True,
|
|
320
|
+
leave=False,
|
|
296
321
|
)
|
|
297
322
|
last_progress = [0]
|
|
298
323
|
|
|
@@ -302,7 +327,9 @@ def upload_media_sequential(
|
|
|
302
327
|
last_progress[0] = current
|
|
303
328
|
|
|
304
329
|
result = upload_media(service, fp, folder_id, progress_cb)
|
|
330
|
+
pbar.update(size - last_progress[0]) # Ensure 100%
|
|
305
331
|
pbar.close()
|
|
332
|
+
uploaded_bytes += size
|
|
306
333
|
rp.fansi_print(f" Uploaded: {result['webViewLink']}", "green")
|
|
307
334
|
results.append(result)
|
|
308
335
|
|
|
@@ -687,7 +714,12 @@ def media_to_slides(
|
|
|
687
714
|
all_paths.append(path)
|
|
688
715
|
|
|
689
716
|
if not all_paths:
|
|
690
|
-
raise ValueError(
|
|
717
|
+
raise ValueError(
|
|
718
|
+
f"No media files found in layout. "
|
|
719
|
+
f"Got {len(slides)} slides but no valid paths. "
|
|
720
|
+
f"Layout type: {type(layout).__name__}, "
|
|
721
|
+
f"Input: {repr(layout)[:500]}"
|
|
722
|
+
)
|
|
691
723
|
|
|
692
724
|
if folder_name is None:
|
|
693
725
|
folder_name = f"Media_{time.strftime('%Y%m%d_%H%M%S')}"
|
|
@@ -718,9 +750,12 @@ def media_to_slides(
|
|
|
718
750
|
path_to_media = dict(zip(all_paths, media))
|
|
719
751
|
|
|
720
752
|
rp.fansi_print("\nMaking files publicly accessible...", "cyan")
|
|
721
|
-
|
|
753
|
+
start_time = time.time()
|
|
754
|
+
for i, m in enumerate(media):
|
|
755
|
+
elapsed = time.time() - start_time
|
|
756
|
+
progress_str = _format_progress(i + 1, len(media), i, len(media), elapsed, use_bytes=False)
|
|
757
|
+
rp.fansi_print(f" {progress_str} {m['name']}", "cyan")
|
|
722
758
|
make_file_public(drive_service, m["id"])
|
|
723
|
-
rp.fansi_print(f" {m['name']}: public", "green")
|
|
724
759
|
|
|
725
760
|
# Build slides_data for create_slides_with_media_grid
|
|
726
761
|
slides_data = []
|
|
@@ -868,7 +903,10 @@ def cli(
|
|
|
868
903
|
media_paths.append(p)
|
|
869
904
|
|
|
870
905
|
if not media_paths:
|
|
871
|
-
raise ValueError(
|
|
906
|
+
raise ValueError(
|
|
907
|
+
f"No media files found. Searched {len(paths)} paths. "
|
|
908
|
+
f"Supported formats: {', '.join(MEDIA_EXTENSIONS)}"
|
|
909
|
+
)
|
|
872
910
|
|
|
873
911
|
# Split into grids if requested
|
|
874
912
|
if per_slide is not None:
|
|
@@ -13748,7 +13748,7 @@ def invert_dict(d: dict, bijection=True, precedence='last') -> dict:
|
|
|
13748
13748
|
items = list(d.items())
|
|
13749
13749
|
if precedence=='first':
|
|
13750
13750
|
items = items[::-1]
|
|
13751
|
-
return {v:k for v
|
|
13751
|
+
return {v:k for k,v in items}
|
|
13752
13752
|
else:
|
|
13753
13753
|
# {0: 'a', 1: 'a', 2: 'b'} ⟶ {'a': (0,1), 'b': (2,)}
|
|
13754
13754
|
out={}
|
|
@@ -42789,9 +42789,10 @@ def _get_video_file_framerate_via_ffprobe(path, use_cache=True):
|
|
|
42789
42789
|
import subprocess
|
|
42790
42790
|
import json
|
|
42791
42791
|
|
|
42792
|
-
if not 'ffprobe' in get_system_commands():
|
|
42792
|
+
if not 'ffprobe' in get_system_commands():
|
|
42793
42793
|
_ensure_ffmpeg_installed()
|
|
42794
|
-
|
|
42794
|
+
if not 'ffprobe' in get_system_commands():
|
|
42795
|
+
raise RuntimeError('rp.get_video_file_framerate: Please install ffmpeg! Unable to find the ffprobe command')
|
|
42795
42796
|
|
|
42796
42797
|
path = get_absolute_path(path) # Important for caching
|
|
42797
42798
|
if use_cache and path in _get_video_file_framerate_cache:
|
|
@@ -42828,6 +42829,111 @@ def get_video_file_framerate(path, use_cache=True):
|
|
|
42828
42829
|
except Exception:
|
|
42829
42830
|
return _get_video_file_framerate_via_ffprobe(path, use_cache)
|
|
42830
42831
|
|
|
42832
|
+
_video_has_audio_cache = {}
|
|
42833
|
+
|
|
42834
|
+
def video_has_audio(path, use_cache=True, strict=False, include_silent=True):
|
|
42835
|
+
"""
|
|
42836
|
+
Check if a video file contains an audio track.
|
|
42837
|
+
|
|
42838
|
+
Uses ffprobe (part of ffmpeg) to detect audio streams. This is fast (~60ms)
|
|
42839
|
+
and does not require loading the entire video into memory. Time is O(1)
|
|
42840
|
+
regardless of video length.
|
|
42841
|
+
|
|
42842
|
+
Args:
|
|
42843
|
+
path (str): Path to the video file
|
|
42844
|
+
use_cache (bool): If True, caches results to avoid repeated ffprobe calls.
|
|
42845
|
+
Defaults to True.
|
|
42846
|
+
strict (bool): If False, corrupted or invalid video files return False.
|
|
42847
|
+
If True, raises RuntimeError on ffprobe failure.
|
|
42848
|
+
Defaults to False.
|
|
42849
|
+
include_silent (bool): If True, returns True even if the video has an audio track
|
|
42850
|
+
but that audio track has no audible audio.
|
|
42851
|
+
If False, returns True only if there is audible audio.
|
|
42852
|
+
Defaults to True.
|
|
42853
|
+
|
|
42854
|
+
Returns:
|
|
42855
|
+
bool: True if the video has an audio stream (or non-silent audio if include_silent=False)
|
|
42856
|
+
|
|
42857
|
+
Raises:
|
|
42858
|
+
FileNotFoundError: If the video file does not exist
|
|
42859
|
+
RuntimeError: If ffprobe fails or ffmpeg is not installed (only when strict=True)
|
|
42860
|
+
|
|
42861
|
+
EXAMPLE:
|
|
42862
|
+
>>> video_has_audio('/Users/ryan/Downloads/12071694.mp4')
|
|
42863
|
+
True
|
|
42864
|
+
>>> video_has_audio('/Users/ryan/Downloads/000000.mp4')
|
|
42865
|
+
False
|
|
42866
|
+
|
|
42867
|
+
See Also:
|
|
42868
|
+
- is_video_file: Check if a file is a video
|
|
42869
|
+
- is_sound_file: Check if a file is an audio file
|
|
42870
|
+
- get_video_file_framerate: Get framerate of a video
|
|
42871
|
+
"""
|
|
42872
|
+
import subprocess
|
|
42873
|
+
|
|
42874
|
+
if not 'ffprobe' in get_system_commands():
|
|
42875
|
+
_ensure_ffmpeg_installed()
|
|
42876
|
+
if not 'ffprobe' in get_system_commands():
|
|
42877
|
+
raise RuntimeError('rp.video_has_audio: Please install ffmpeg! Unable to find the ffprobe command')
|
|
42878
|
+
|
|
42879
|
+
path = get_absolute_path(path)
|
|
42880
|
+
|
|
42881
|
+
if not file_exists(path):
|
|
42882
|
+
raise FileNotFoundError("Video file not found: " + path)
|
|
42883
|
+
|
|
42884
|
+
# Cache key includes include_silent flag
|
|
42885
|
+
cache_key = (path, include_silent)
|
|
42886
|
+
if use_cache and cache_key in _video_has_audio_cache:
|
|
42887
|
+
return _video_has_audio_cache[cache_key]
|
|
42888
|
+
|
|
42889
|
+
# When include_silent=True, check for stream existence (index)
|
|
42890
|
+
# When include_silent=False, check bitrate to detect silent tracks (<5kbps = silent)
|
|
42891
|
+
if include_silent:
|
|
42892
|
+
select_streams = "a"
|
|
42893
|
+
show_entries = "stream=index"
|
|
42894
|
+
output_format = "csv=p=0"
|
|
42895
|
+
else:
|
|
42896
|
+
select_streams = "a:0"
|
|
42897
|
+
show_entries = "stream=bit_rate"
|
|
42898
|
+
output_format = "default=noprint_wrappers=1:nokey=1"
|
|
42899
|
+
|
|
42900
|
+
result = subprocess.run(
|
|
42901
|
+
["ffprobe", "-v", "error", "-select_streams", select_streams,
|
|
42902
|
+
"-show_entries", show_entries, "-of", output_format, path],
|
|
42903
|
+
capture_output=True,
|
|
42904
|
+
text=True,
|
|
42905
|
+
)
|
|
42906
|
+
|
|
42907
|
+
if result.returncode != 0:
|
|
42908
|
+
if strict:
|
|
42909
|
+
raise RuntimeError("ffprobe failed on " + path + ": " + result.stderr)
|
|
42910
|
+
has_audio = False
|
|
42911
|
+
elif not result.stdout.strip():
|
|
42912
|
+
has_audio = False
|
|
42913
|
+
elif include_silent:
|
|
42914
|
+
has_audio = True
|
|
42915
|
+
else:
|
|
42916
|
+
try:
|
|
42917
|
+
# >5kbps = real audio, <5kbps = silent (silent AAC compresses to ~3.7kbps)
|
|
42918
|
+
has_audio = int(result.stdout.strip()) > 5000
|
|
42919
|
+
except ValueError:
|
|
42920
|
+
# Bitrate metadata unavailable (e.g. VBR without stored bitrate, rare edge case)
|
|
42921
|
+
# Fallback methods in order of speed:
|
|
42922
|
+
# 1. packet_size (~59ms, O(1)): avg packet size >50 bytes = real audio (silent AAC ~10 bytes)
|
|
42923
|
+
# ffprobe -select_streams a:0 -show_entries packet=size -read_intervals %+#20
|
|
42924
|
+
# 2. pcm_pipe (~58ms, O(1)): pipe 0.5s of PCM, check for samples >100 amplitude
|
|
42925
|
+
# ffmpeg -i FILE -t 0.5 -f s16le -ac 1 -ar 8000 - | check for non-zero
|
|
42926
|
+
# 3. volumedetect (~104ms, O(1) with -t): check max_volume > -80dB
|
|
42927
|
+
# ffmpeg -i FILE -t 0.5 -af volumedetect -f null /dev/null
|
|
42928
|
+
# NOTE: without -t flag this would be O(n) - must decode entire audio
|
|
42929
|
+
fansi_print("WARNING: video_has_audio: bitrate unavailable for " + path + ", assuming has audio", "yellow")
|
|
42930
|
+
has_audio = True
|
|
42931
|
+
|
|
42932
|
+
if use_cache:
|
|
42933
|
+
_video_has_audio_cache[cache_key] = has_audio
|
|
42934
|
+
|
|
42935
|
+
return has_audio
|
|
42936
|
+
|
|
42831
42937
|
|
|
42832
42938
|
#UNCOMMENT ONCE I USE SMART_OPEN SOMEWHERE
|
|
42833
42939
|
# def _smart_open(path, mode="rb"):
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1387
|
rp-0.1.1387/version.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
1387
|
rp-0.1.1385/rp/version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1385
|
rp-0.1.1385/version.py
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
1385
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|