notionary 0.2.27__py3-none-any.whl → 0.2.28__py3-none-any.whl
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.
- notionary/__init__.py +5 -20
- notionary/blocks/client.py +87 -215
- notionary/blocks/enums.py +167 -0
- notionary/blocks/rich_text/markdown_rich_text_converter.py +266 -0
- notionary/blocks/rich_text/models.py +164 -0
- notionary/blocks/rich_text/name_id_resolver/__init__.py +11 -0
- notionary/blocks/rich_text/name_id_resolver/database.py +31 -0
- notionary/blocks/rich_text/name_id_resolver/page.py +34 -0
- notionary/blocks/rich_text/name_id_resolver/person.py +37 -0
- notionary/blocks/rich_text/name_id_resolver/port.py +11 -0
- notionary/blocks/rich_text/rich_text_markdown_converter.py +132 -0
- notionary/blocks/rich_text/rich_text_patterns.py +39 -0
- notionary/blocks/schemas.py +746 -0
- notionary/comments/client.py +52 -187
- notionary/comments/factory.py +40 -0
- notionary/comments/models.py +5 -127
- notionary/comments/schemas.py +240 -0
- notionary/comments/service.py +34 -0
- notionary/data_source/http/client.py +11 -0
- notionary/data_source/http/data_source_instance_client.py +94 -0
- notionary/data_source/properties/models.py +406 -0
- notionary/data_source/query/builder.py +429 -0
- notionary/data_source/query/resolver.py +114 -0
- notionary/data_source/query/schema.py +304 -0
- notionary/data_source/query/validator.py +73 -0
- notionary/data_source/schemas.py +27 -0
- notionary/data_source/service.py +353 -0
- notionary/database/client.py +30 -135
- notionary/database/database_metadata_update_client.py +19 -0
- notionary/database/schemas.py +29 -0
- notionary/database/service.py +169 -0
- notionary/exceptions/__init__.py +33 -0
- notionary/exceptions/api.py +41 -0
- notionary/exceptions/base.py +2 -0
- notionary/exceptions/block_parsing.py +16 -0
- notionary/exceptions/data_source/__init__.py +6 -0
- notionary/exceptions/data_source/builder.py +182 -0
- notionary/exceptions/data_source/properties.py +34 -0
- notionary/exceptions/properties.py +58 -0
- notionary/exceptions/search.py +33 -0
- notionary/file_upload/client.py +18 -30
- notionary/file_upload/models.py +7 -8
- notionary/file_upload/{notion_file_upload.py → service.py} +29 -64
- notionary/http/client.py +205 -0
- notionary/http/models.py +49 -0
- notionary/page/blocks/client.py +1 -0
- notionary/page/content/factory.py +68 -0
- notionary/page/content/markdown/__init__.py +5 -0
- notionary/page/content/markdown/builder.py +304 -0
- notionary/page/content/markdown/nodes/__init__.py +54 -0
- notionary/page/content/markdown/nodes/audio.py +23 -0
- notionary/page/content/markdown/nodes/base.py +12 -0
- notionary/page/content/markdown/nodes/bookmark.py +25 -0
- notionary/page/content/markdown/nodes/breadcrumb.py +14 -0
- notionary/page/content/markdown/nodes/bulleted_list.py +18 -0
- notionary/page/content/markdown/nodes/callout.py +32 -0
- notionary/page/content/markdown/nodes/code.py +30 -0
- notionary/page/content/markdown/nodes/columns.py +51 -0
- notionary/page/content/markdown/nodes/divider.py +14 -0
- notionary/page/content/markdown/nodes/embed.py +23 -0
- notionary/page/content/markdown/nodes/equation.py +19 -0
- notionary/page/content/markdown/nodes/file.py +23 -0
- notionary/page/content/markdown/nodes/heading.py +16 -0
- notionary/page/content/markdown/nodes/image.py +23 -0
- notionary/page/content/markdown/nodes/mixins/caption.py +12 -0
- notionary/page/content/markdown/nodes/numbered_list.py +15 -0
- notionary/page/content/markdown/nodes/paragraph.py +14 -0
- notionary/page/content/markdown/nodes/pdf.py +23 -0
- notionary/page/content/markdown/nodes/quote.py +15 -0
- notionary/page/content/markdown/nodes/space.py +14 -0
- notionary/page/content/markdown/nodes/table.py +45 -0
- notionary/page/content/markdown/nodes/table_of_contents.py +14 -0
- notionary/page/content/markdown/nodes/todo.py +22 -0
- notionary/page/content/markdown/nodes/toggle.py +28 -0
- notionary/page/content/markdown/nodes/toggleable_heading.py +35 -0
- notionary/page/content/markdown/nodes/video.py +23 -0
- notionary/page/content/parser/context.py +49 -0
- notionary/page/content/parser/factory.py +219 -0
- notionary/page/content/parser/parsers/__init__.py +60 -0
- notionary/page/content/parser/parsers/audio.py +40 -0
- notionary/page/content/parser/parsers/base.py +30 -0
- notionary/page/content/parser/parsers/bookmark.py +33 -0
- notionary/page/content/parser/parsers/breadcrumb.py +33 -0
- notionary/page/content/parser/parsers/bulleted_list.py +41 -0
- notionary/page/content/parser/parsers/callout.py +129 -0
- notionary/page/content/parser/parsers/caption.py +55 -0
- notionary/page/content/parser/parsers/code.py +81 -0
- notionary/page/content/parser/parsers/column.py +117 -0
- notionary/page/content/parser/parsers/column_list.py +81 -0
- notionary/page/content/parser/parsers/divider.py +33 -0
- notionary/page/content/parser/parsers/embed.py +33 -0
- notionary/page/content/parser/parsers/equation.py +65 -0
- notionary/page/content/parser/parsers/file.py +42 -0
- notionary/page/content/parser/parsers/heading.py +58 -0
- notionary/page/content/parser/parsers/image.py +42 -0
- notionary/page/content/parser/parsers/numbered_list.py +45 -0
- notionary/page/content/parser/parsers/paragraph.py +36 -0
- notionary/page/content/parser/parsers/pdf.py +42 -0
- notionary/page/content/parser/parsers/quote.py +65 -0
- notionary/page/content/parser/parsers/space.py +35 -0
- notionary/page/content/parser/parsers/table.py +144 -0
- notionary/page/content/parser/parsers/table_of_contents.py +32 -0
- notionary/page/content/parser/parsers/todo.py +58 -0
- notionary/page/content/parser/parsers/toggle.py +127 -0
- notionary/page/content/parser/parsers/toggleable_heading.py +150 -0
- notionary/page/content/parser/parsers/video.py +42 -0
- notionary/page/content/parser/post_processing/handlers/__init__.py +5 -0
- notionary/page/content/parser/post_processing/handlers/rich_text_length.py +93 -0
- notionary/page/content/parser/post_processing/handlers/rich_text_length_truncation.py +93 -0
- notionary/page/content/parser/post_processing/port.py +9 -0
- notionary/page/content/parser/post_processing/service.py +16 -0
- notionary/page/content/parser/pre_processsing/handlers/__init__.py +9 -0
- notionary/page/content/parser/pre_processsing/handlers/column_syntax.py +80 -0
- notionary/page/content/parser/pre_processsing/handlers/port.py +7 -0
- notionary/page/content/parser/pre_processsing/handlers/whitespace.py +68 -0
- notionary/page/content/parser/pre_processsing/service.py +15 -0
- notionary/page/content/parser/service.py +69 -0
- notionary/page/content/renderer/context.py +48 -0
- notionary/page/content/renderer/factory.py +240 -0
- notionary/page/content/renderer/post_processing/handlers/__init__.py +5 -0
- notionary/page/content/renderer/post_processing/handlers/numbered_list_placeholdere.py +62 -0
- notionary/page/content/renderer/post_processing/port.py +7 -0
- notionary/page/content/renderer/post_processing/service.py +15 -0
- notionary/page/content/renderer/renderers/__init__.py +57 -0
- notionary/page/content/renderer/renderers/audio.py +31 -0
- notionary/page/content/renderer/renderers/base.py +31 -0
- notionary/page/content/renderer/renderers/bookmark.py +25 -0
- notionary/page/content/renderer/renderers/breadcrumb.py +21 -0
- notionary/page/content/renderer/renderers/bulleted_list.py +48 -0
- notionary/page/content/renderer/renderers/callout.py +65 -0
- notionary/page/content/renderer/renderers/captioned_block.py +58 -0
- notionary/page/content/renderer/renderers/code.py +34 -0
- notionary/page/content/renderer/renderers/column.py +44 -0
- notionary/page/content/renderer/renderers/column_list.py +31 -0
- notionary/page/content/renderer/renderers/divider.py +22 -0
- notionary/page/content/renderer/renderers/embed.py +25 -0
- notionary/page/content/renderer/renderers/equation.py +37 -0
- notionary/page/content/renderer/renderers/fallback.py +24 -0
- notionary/page/content/renderer/renderers/file.py +40 -0
- notionary/page/content/renderer/renderers/heading.py +69 -0
- notionary/page/content/renderer/renderers/image.py +31 -0
- notionary/page/content/renderer/renderers/numbered_list.py +41 -0
- notionary/page/content/renderer/renderers/paragraph.py +40 -0
- notionary/page/content/renderer/renderers/pdf.py +31 -0
- notionary/page/content/renderer/renderers/quote.py +49 -0
- notionary/page/content/renderer/renderers/table.py +115 -0
- notionary/page/content/renderer/renderers/table_of_contents.py +26 -0
- notionary/page/content/renderer/renderers/table_row.py +17 -0
- notionary/page/content/renderer/renderers/todo.py +56 -0
- notionary/page/content/renderer/renderers/toggle.py +53 -0
- notionary/page/content/renderer/renderers/toggleable_heading.py +78 -0
- notionary/page/content/renderer/renderers/video.py +31 -0
- notionary/page/content/renderer/service.py +50 -0
- notionary/page/content/service.py +65 -0
- notionary/page/content/syntax/models.py +68 -0
- notionary/page/content/syntax/service.py +453 -0
- notionary/page/page_context.py +7 -16
- notionary/page/page_http_client.py +15 -0
- notionary/page/page_metadata_update_client.py +19 -0
- notionary/page/properties/client.py +144 -0
- notionary/page/properties/factory.py +26 -0
- notionary/page/properties/models.py +307 -0
- notionary/page/properties/service.py +257 -0
- notionary/page/schemas.py +13 -0
- notionary/page/service.py +222 -0
- notionary/shared/entity/client.py +29 -0
- notionary/shared/entity/dto_parsers.py +53 -0
- notionary/shared/entity/entity_metadata_update_client.py +41 -0
- notionary/shared/entity/schemas.py +45 -0
- notionary/shared/entity/service.py +171 -0
- notionary/shared/models/cover.py +20 -0
- notionary/shared/models/file.py +21 -0
- notionary/shared/models/icon.py +28 -0
- notionary/shared/models/parent.py +41 -0
- notionary/shared/properties/type.py +30 -0
- notionary/user/__init__.py +4 -8
- notionary/user/base.py +89 -0
- notionary/user/bot.py +70 -0
- notionary/user/client.py +22 -111
- notionary/user/person.py +41 -0
- notionary/user/schemas.py +67 -0
- notionary/user/service.py +65 -0
- notionary/utils/async_retry.py +39 -0
- notionary/utils/date.py +51 -0
- notionary/utils/fuzzy.py +56 -0
- notionary/{util/logging_mixin.py → utils/mixins/logging.py} +4 -16
- notionary/utils/pagination.py +50 -0
- notionary/utils/singleton.py +13 -0
- notionary/utils/uuid_utils.py +20 -0
- notionary/workspace/__init__.py +3 -0
- notionary/workspace/client.py +62 -0
- notionary/workspace/query/builder.py +60 -0
- notionary/workspace/query/models.py +60 -0
- notionary/workspace/query/service.py +93 -0
- notionary/workspace/schemas.py +21 -0
- notionary/workspace/service.py +116 -0
- {notionary-0.2.27.dist-info → notionary-0.2.28.dist-info}/METADATA +54 -49
- notionary-0.2.28.dist-info/RECORD +200 -0
- {notionary-0.2.27.dist-info → notionary-0.2.28.dist-info}/WHEEL +1 -1
- {notionary-0.2.27.dist-info → notionary-0.2.28.dist-info/licenses}/LICENSE +9 -9
- notionary/base_notion_client.py +0 -219
- notionary/blocks/__init__.py +0 -5
- notionary/blocks/_bootstrap.py +0 -271
- notionary/blocks/audio/__init__.py +0 -11
- notionary/blocks/audio/audio_element.py +0 -158
- notionary/blocks/audio/audio_markdown_node.py +0 -24
- notionary/blocks/audio/audio_models.py +0 -10
- notionary/blocks/base_block_element.py +0 -42
- notionary/blocks/bookmark/__init__.py +0 -12
- notionary/blocks/bookmark/bookmark_element.py +0 -83
- notionary/blocks/bookmark/bookmark_markdown_node.py +0 -28
- notionary/blocks/bookmark/bookmark_models.py +0 -15
- notionary/blocks/breadcrumbs/__init__.py +0 -15
- notionary/blocks/breadcrumbs/breadcrumb_element.py +0 -39
- notionary/blocks/breadcrumbs/breadcrumb_markdown_node.py +0 -13
- notionary/blocks/breadcrumbs/breadcrumb_models.py +0 -12
- notionary/blocks/bulleted_list/__init__.py +0 -15
- notionary/blocks/bulleted_list/bulleted_list_element.py +0 -74
- notionary/blocks/bulleted_list/bulleted_list_markdown_node.py +0 -20
- notionary/blocks/bulleted_list/bulleted_list_models.py +0 -17
- notionary/blocks/callout/__init__.py +0 -12
- notionary/blocks/callout/callout_element.py +0 -99
- notionary/blocks/callout/callout_markdown_node.py +0 -19
- notionary/blocks/callout/callout_models.py +0 -33
- notionary/blocks/child_database/__init__.py +0 -14
- notionary/blocks/child_database/child_database_element.py +0 -59
- notionary/blocks/child_database/child_database_models.py +0 -12
- notionary/blocks/child_page/__init__.py +0 -9
- notionary/blocks/child_page/child_page_element.py +0 -94
- notionary/blocks/child_page/child_page_models.py +0 -12
- notionary/blocks/code/__init__.py +0 -11
- notionary/blocks/code/code_element.py +0 -149
- notionary/blocks/code/code_markdown_node.py +0 -80
- notionary/blocks/code/code_models.py +0 -94
- notionary/blocks/column/__init__.py +0 -25
- notionary/blocks/column/column_element.py +0 -65
- notionary/blocks/column/column_list_element.py +0 -52
- notionary/blocks/column/column_list_markdown_node.py +0 -34
- notionary/blocks/column/column_markdown_node.py +0 -42
- notionary/blocks/column/column_models.py +0 -26
- notionary/blocks/divider/__init__.py +0 -12
- notionary/blocks/divider/divider_element.py +0 -41
- notionary/blocks/divider/divider_markdown_node.py +0 -11
- notionary/blocks/divider/divider_models.py +0 -12
- notionary/blocks/embed/__init__.py +0 -12
- notionary/blocks/embed/embed_element.py +0 -98
- notionary/blocks/embed/embed_markdown_node.py +0 -19
- notionary/blocks/embed/embed_models.py +0 -14
- notionary/blocks/equation/__init__.py +0 -13
- notionary/blocks/equation/equation_element.py +0 -133
- notionary/blocks/equation/equation_element_markdown_node.py +0 -23
- notionary/blocks/equation/equation_models.py +0 -11
- notionary/blocks/file/__init__.py +0 -23
- notionary/blocks/file/file_element.py +0 -133
- notionary/blocks/file/file_element_markdown_node.py +0 -24
- notionary/blocks/file/file_element_models.py +0 -39
- notionary/blocks/heading/__init__.py +0 -19
- notionary/blocks/heading/heading_element.py +0 -112
- notionary/blocks/heading/heading_markdown_node.py +0 -16
- notionary/blocks/heading/heading_models.py +0 -29
- notionary/blocks/image_block/__init__.py +0 -11
- notionary/blocks/image_block/image_element.py +0 -130
- notionary/blocks/image_block/image_markdown_node.py +0 -25
- notionary/blocks/image_block/image_models.py +0 -10
- notionary/blocks/markdown/markdown_builder.py +0 -525
- notionary/blocks/markdown/markdown_document_model.py +0 -0
- notionary/blocks/markdown/markdown_node.py +0 -25
- notionary/blocks/mixins/captions/__init__.py +0 -4
- notionary/blocks/mixins/captions/caption_markdown_node_mixin.py +0 -31
- notionary/blocks/mixins/captions/caption_mixin.py +0 -92
- notionary/blocks/mixins/file_upload/__init__.py +0 -3
- notionary/blocks/mixins/file_upload/file_upload_mixin.py +0 -320
- notionary/blocks/models.py +0 -174
- notionary/blocks/numbered_list/__init__.py +0 -16
- notionary/blocks/numbered_list/numbered_list_element.py +0 -65
- notionary/blocks/numbered_list/numbered_list_markdown_node.py +0 -17
- notionary/blocks/numbered_list/numbered_list_models.py +0 -17
- notionary/blocks/paragraph/__init__.py +0 -15
- notionary/blocks/paragraph/paragraph_element.py +0 -58
- notionary/blocks/paragraph/paragraph_markdown_node.py +0 -16
- notionary/blocks/paragraph/paragraph_models.py +0 -16
- notionary/blocks/pdf/__init__.py +0 -11
- notionary/blocks/pdf/pdf_element.py +0 -146
- notionary/blocks/pdf/pdf_markdown_node.py +0 -24
- notionary/blocks/pdf/pdf_models.py +0 -11
- notionary/blocks/quote/__init__.py +0 -14
- notionary/blocks/quote/quote_element.py +0 -75
- notionary/blocks/quote/quote_markdown_node.py +0 -16
- notionary/blocks/quote/quote_models.py +0 -18
- notionary/blocks/registry/__init__.py +0 -3
- notionary/blocks/registry/block_registry.py +0 -150
- notionary/blocks/rich_text/__init__.py +0 -33
- notionary/blocks/rich_text/rich_text_models.py +0 -221
- notionary/blocks/rich_text/text_inline_formatter.py +0 -456
- notionary/blocks/syntax_prompt_builder.py +0 -137
- notionary/blocks/table/__init__.py +0 -19
- notionary/blocks/table/table_element.py +0 -225
- notionary/blocks/table/table_markdown_node.py +0 -42
- notionary/blocks/table/table_models.py +0 -28
- notionary/blocks/table_of_contents/__init__.py +0 -17
- notionary/blocks/table_of_contents/table_of_contents_element.py +0 -80
- notionary/blocks/table_of_contents/table_of_contents_markdown_node.py +0 -21
- notionary/blocks/table_of_contents/table_of_contents_models.py +0 -18
- notionary/blocks/todo/__init__.py +0 -12
- notionary/blocks/todo/todo_element.py +0 -81
- notionary/blocks/todo/todo_markdown_node.py +0 -21
- notionary/blocks/todo/todo_models.py +0 -18
- notionary/blocks/toggle/__init__.py +0 -12
- notionary/blocks/toggle/toggle_element.py +0 -112
- notionary/blocks/toggle/toggle_markdown_node.py +0 -31
- notionary/blocks/toggle/toggle_models.py +0 -17
- notionary/blocks/toggleable_heading/__init__.py +0 -11
- notionary/blocks/toggleable_heading/toggleable_heading_element.py +0 -115
- notionary/blocks/toggleable_heading/toggleable_heading_markdown_node.py +0 -34
- notionary/blocks/types.py +0 -130
- notionary/blocks/video/__init__.py +0 -11
- notionary/blocks/video/video_element.py +0 -187
- notionary/blocks/video/video_element_models.py +0 -10
- notionary/blocks/video/video_markdown_node.py +0 -26
- notionary/comments/__init__.py +0 -26
- notionary/database/__init__.py +0 -4
- notionary/database/database.py +0 -480
- notionary/database/database_filter_builder.py +0 -173
- notionary/database/database_provider.py +0 -227
- notionary/database/exceptions.py +0 -13
- notionary/database/factory.py +0 -0
- notionary/database/models.py +0 -337
- notionary/database/notion_database.py +0 -487
- notionary/file_upload/__init__.py +0 -7
- notionary/page/client.py +0 -124
- notionary/page/markdown_whitespace_processor.py +0 -129
- notionary/page/models.py +0 -322
- notionary/page/notion_page.py +0 -712
- notionary/page/page_content_deleting_service.py +0 -117
- notionary/page/page_content_writer.py +0 -80
- notionary/page/property_formatter.py +0 -99
- notionary/page/reader/handler/__init__.py +0 -19
- notionary/page/reader/handler/base_block_renderer.py +0 -44
- notionary/page/reader/handler/block_processing_context.py +0 -35
- notionary/page/reader/handler/block_rendering_context.py +0 -48
- notionary/page/reader/handler/column_list_renderer.py +0 -51
- notionary/page/reader/handler/column_renderer.py +0 -60
- notionary/page/reader/handler/equation_renderer.py +0 -0
- notionary/page/reader/handler/line_renderer.py +0 -73
- notionary/page/reader/handler/numbered_list_renderer.py +0 -85
- notionary/page/reader/handler/toggle_renderer.py +0 -69
- notionary/page/reader/handler/toggleable_heading_renderer.py +0 -89
- notionary/page/reader/page_content_retriever.py +0 -81
- notionary/page/search_filter_builder.py +0 -132
- notionary/page/utils.py +0 -60
- notionary/page/writer/handler/__init__.py +0 -24
- notionary/page/writer/handler/code_handler.py +0 -72
- notionary/page/writer/handler/column_handler.py +0 -141
- notionary/page/writer/handler/column_list_handler.py +0 -139
- notionary/page/writer/handler/equation_handler.py +0 -74
- notionary/page/writer/handler/line_handler.py +0 -35
- notionary/page/writer/handler/line_processing_context.py +0 -54
- notionary/page/writer/handler/regular_line_handler.py +0 -86
- notionary/page/writer/handler/table_handler.py +0 -66
- notionary/page/writer/handler/toggle_handler.py +0 -159
- notionary/page/writer/handler/toggleable_heading_handler.py +0 -174
- notionary/page/writer/markdown_to_notion_converter.py +0 -139
- notionary/page/writer/markdown_to_notion_converter_context.py +0 -30
- notionary/page/writer/markdown_to_notion_text_length_post_processor.py +0 -0
- notionary/page/writer/notion_text_length_processor.py +0 -150
- notionary/schemas/__init__.py +0 -3
- notionary/schemas/base.py +0 -73
- notionary/shared/__init__.py +0 -3
- notionary/shared/name_to_id_resolver.py +0 -203
- notionary/telemetry/__init__.py +0 -19
- notionary/telemetry/service.py +0 -136
- notionary/telemetry/views.py +0 -73
- notionary/user/base_notion_user.py +0 -53
- notionary/user/models.py +0 -84
- notionary/user/notion_bot_user.py +0 -226
- notionary/user/notion_user.py +0 -255
- notionary/user/notion_user_manager.py +0 -101
- notionary/util/__init__.py +0 -15
- notionary/util/concurrency_limiter.py +0 -0
- notionary/util/factory_decorator.py +0 -0
- notionary/util/factory_only.py +0 -37
- notionary/util/fuzzy.py +0 -75
- notionary/util/page_id_utils.py +0 -27
- notionary/util/singleton.py +0 -18
- notionary/util/singleton_metaclass.py +0 -22
- notionary/workspace.py +0 -105
- notionary-0.2.27.dist-info/RECORD +0 -202
@@ -1,187 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
import re
|
4
|
-
from pathlib import Path
|
5
|
-
from typing import Optional
|
6
|
-
|
7
|
-
from notionary.blocks.base_block_element import BaseBlockElement
|
8
|
-
from notionary.blocks.file.file_element_models import (
|
9
|
-
ExternalFile,
|
10
|
-
FileBlock,
|
11
|
-
FileType,
|
12
|
-
FileUploadFile,
|
13
|
-
)
|
14
|
-
from notionary.blocks.mixins.captions import CaptionMixin
|
15
|
-
from notionary.blocks.mixins.file_upload.file_upload_mixin import FileUploadMixin
|
16
|
-
from notionary.blocks.syntax_prompt_builder import BlockElementMarkdownInformation
|
17
|
-
from notionary.blocks.models import Block, BlockCreateResult
|
18
|
-
from notionary.blocks.types import BlockType
|
19
|
-
from notionary.blocks.video.video_element_models import CreateVideoBlock
|
20
|
-
|
21
|
-
|
22
|
-
class VideoElement(BaseBlockElement, CaptionMixin, FileUploadMixin):
|
23
|
-
r"""
|
24
|
-
Handles conversion between Markdown video embeds and Notion video blocks.
|
25
|
-
|
26
|
-
Supports external URLs (YouTube, Vimeo, direct links) and local video file uploads.
|
27
|
-
|
28
|
-
Markdown video syntax:
|
29
|
-
- [video](https://example.com/video.mp4) - External URL
|
30
|
-
- [video](./local/movie.mp4) - Local video file (will be uploaded)
|
31
|
-
- [video](C:\Videos\tutorial.mov) - Absolute local path (will be uploaded)
|
32
|
-
- [video](https://youtube.com/watch?v=abc123)(caption:Demo Video) - URL with caption
|
33
|
-
- (caption:Tutorial video)[video](./local.mp4) - Caption before URL
|
34
|
-
"""
|
35
|
-
|
36
|
-
# Pattern matches both URLs and file paths
|
37
|
-
VIDEO_PATTERN = re.compile(r"\[video\]\(([^)]+)\)")
|
38
|
-
|
39
|
-
YOUTUBE_PATTERNS = [
|
40
|
-
re.compile(r"(?:https?://)?(?:www\.)?youtube\.com/watch\?v=([\w-]{11})"),
|
41
|
-
re.compile(r"(?:https?://)?(?:www\.)?youtu\.be/([\w-]{11})"),
|
42
|
-
]
|
43
|
-
|
44
|
-
SUPPORTED_EXTENSIONS = {
|
45
|
-
".mp4",
|
46
|
-
".avi",
|
47
|
-
".mov",
|
48
|
-
".wmv",
|
49
|
-
".flv",
|
50
|
-
".webm",
|
51
|
-
".mkv",
|
52
|
-
".m4v",
|
53
|
-
".3gp",
|
54
|
-
}
|
55
|
-
|
56
|
-
@classmethod
|
57
|
-
def match_notion(cls, block: Block) -> bool:
|
58
|
-
return block.type == BlockType.VIDEO and block.video
|
59
|
-
|
60
|
-
@classmethod
|
61
|
-
async def markdown_to_notion(cls, text: str) -> Optional[BlockCreateResult]:
|
62
|
-
"""Convert markdown video syntax to a Notion VideoBlock."""
|
63
|
-
# Extract the path/URL
|
64
|
-
path = cls._extract_video_path(text.strip())
|
65
|
-
if not path:
|
66
|
-
return None
|
67
|
-
|
68
|
-
# Check if it's a local file path
|
69
|
-
if cls._is_local_file_path(path):
|
70
|
-
# Verify file exists and has supported extension
|
71
|
-
video_path = Path(path)
|
72
|
-
if not video_path.exists():
|
73
|
-
cls.logger.warning(f"Video file not found: {path}")
|
74
|
-
return None
|
75
|
-
|
76
|
-
if video_path.suffix.lower() not in cls.SUPPORTED_EXTENSIONS:
|
77
|
-
cls.logger.warning(f"Unsupported video format: {video_path.suffix}")
|
78
|
-
return None
|
79
|
-
|
80
|
-
cls.logger.info(f"Uploading local video file: {path}")
|
81
|
-
|
82
|
-
# Upload the local video file
|
83
|
-
file_upload_id = await cls._upload_local_file(path, "video")
|
84
|
-
if not file_upload_id:
|
85
|
-
cls.logger.error(f"Failed to upload video file: {path}")
|
86
|
-
return None
|
87
|
-
|
88
|
-
cls.logger.info(
|
89
|
-
f"Successfully uploaded video file with ID: {file_upload_id}"
|
90
|
-
)
|
91
|
-
|
92
|
-
# Use mixin to extract caption (if present anywhere in text)
|
93
|
-
caption_text = cls.extract_caption(text.strip())
|
94
|
-
caption_rich_text = cls.build_caption_rich_text(caption_text or "")
|
95
|
-
|
96
|
-
video_block = FileBlock(
|
97
|
-
type=FileType.FILE_UPLOAD,
|
98
|
-
file_upload=FileUploadFile(id=file_upload_id),
|
99
|
-
caption=caption_rich_text,
|
100
|
-
)
|
101
|
-
|
102
|
-
return CreateVideoBlock(video=video_block)
|
103
|
-
|
104
|
-
else:
|
105
|
-
# Handle external URL (YouTube, Vimeo, direct links)
|
106
|
-
url = path
|
107
|
-
|
108
|
-
# Check for YouTube and normalize URL
|
109
|
-
vid_id = cls._get_youtube_id(url)
|
110
|
-
if vid_id:
|
111
|
-
url = f"https://www.youtube.com/watch?v={vid_id}"
|
112
|
-
|
113
|
-
# Use mixin to extract caption (if present anywhere in text)
|
114
|
-
caption_text = cls.extract_caption(text.strip())
|
115
|
-
caption_rich_text = cls.build_caption_rich_text(caption_text or "")
|
116
|
-
|
117
|
-
video_block = FileBlock(
|
118
|
-
type=FileType.EXTERNAL,
|
119
|
-
external=ExternalFile(url=url),
|
120
|
-
caption=caption_rich_text,
|
121
|
-
)
|
122
|
-
|
123
|
-
return CreateVideoBlock(video=video_block)
|
124
|
-
|
125
|
-
@classmethod
|
126
|
-
async def notion_to_markdown(cls, block: Block) -> Optional[str]:
|
127
|
-
if block.type != BlockType.VIDEO or not block.video:
|
128
|
-
return None
|
129
|
-
|
130
|
-
fo = block.video
|
131
|
-
url = None
|
132
|
-
|
133
|
-
# Handle both external URLs and uploaded files
|
134
|
-
if fo.type == FileType.EXTERNAL and fo.external:
|
135
|
-
url = fo.external.url
|
136
|
-
elif fo.type == FileType.FILE and fo.file:
|
137
|
-
url = fo.file.url
|
138
|
-
|
139
|
-
if not url:
|
140
|
-
return None
|
141
|
-
|
142
|
-
result = f"[video]({url})"
|
143
|
-
|
144
|
-
# Add caption if present
|
145
|
-
caption_markdown = await cls.format_caption_for_markdown(fo.caption or [])
|
146
|
-
if caption_markdown:
|
147
|
-
result += caption_markdown
|
148
|
-
|
149
|
-
return result
|
150
|
-
|
151
|
-
@classmethod
|
152
|
-
def _get_youtube_id(cls, url: str) -> Optional[str]:
|
153
|
-
for pat in cls.YOUTUBE_PATTERNS:
|
154
|
-
m = pat.match(url)
|
155
|
-
if m:
|
156
|
-
return m.group(1)
|
157
|
-
return None
|
158
|
-
|
159
|
-
@classmethod
|
160
|
-
def get_system_prompt_information(cls) -> Optional[BlockElementMarkdownInformation]:
|
161
|
-
"""Get system prompt information for video blocks."""
|
162
|
-
return BlockElementMarkdownInformation(
|
163
|
-
block_type=cls.__name__,
|
164
|
-
description="Video blocks embed videos from external URLs (YouTube, Vimeo, direct links) or upload local video files with optional captions",
|
165
|
-
syntax_examples=[
|
166
|
-
"[video](https://youtube.com/watch?v=abc123)",
|
167
|
-
"[video](https://vimeo.com/123456789)",
|
168
|
-
"[video](./local/tutorial.mp4)",
|
169
|
-
"[video](C:\\Videos\\presentation.mov)",
|
170
|
-
"[video](https://example.com/video.mp4)(caption:Demo Video)",
|
171
|
-
"(caption:Tutorial)[video](./demo.mp4)",
|
172
|
-
"[video](./training.mp4)(caption:**Important** tutorial)",
|
173
|
-
],
|
174
|
-
usage_guidelines="Use for embedding videos from supported platforms or local video files. Supports YouTube, Vimeo, direct video URLs, and local file uploads. Supports common video formats (mp4, avi, mov, wmv, flv, webm, mkv, m4v, 3gp). Caption supports rich text formatting and describes the video content.",
|
175
|
-
)
|
176
|
-
|
177
|
-
@classmethod
|
178
|
-
def _extract_video_path(cls, text: str) -> Optional[str]:
|
179
|
-
"""Extract video path/URL from text, handling caption patterns."""
|
180
|
-
clean_text = cls.remove_caption(text)
|
181
|
-
|
182
|
-
# Now extract the path/URL from clean text
|
183
|
-
match = cls.VIDEO_PATTERN.search(clean_text)
|
184
|
-
if match:
|
185
|
-
return match.group(1).strip()
|
186
|
-
|
187
|
-
return None
|
@@ -1,26 +0,0 @@
|
|
1
|
-
from __future__ import annotations
|
2
|
-
|
3
|
-
from typing import Optional
|
4
|
-
|
5
|
-
from notionary.blocks.markdown.markdown_node import MarkdownNode
|
6
|
-
from notionary.blocks.mixins.captions import CaptionMarkdownNodeMixin
|
7
|
-
|
8
|
-
|
9
|
-
class VideoMarkdownNode(MarkdownNode, CaptionMarkdownNodeMixin):
|
10
|
-
"""
|
11
|
-
Enhanced Video node with Pydantic integration.
|
12
|
-
Programmatic interface for creating Notion-style video blocks.
|
13
|
-
"""
|
14
|
-
|
15
|
-
url: str
|
16
|
-
caption: Optional[str] = None
|
17
|
-
|
18
|
-
def to_markdown(self) -> str:
|
19
|
-
"""Return the Markdown representation.
|
20
|
-
|
21
|
-
Examples:
|
22
|
-
- [video](https://example.com/movie.mp4)
|
23
|
-
- [video](https://www.youtube.com/watch?v=dQw4w9WgXcQ)(caption:Music Video)
|
24
|
-
"""
|
25
|
-
base_markdown = f"[video]({self.url})"
|
26
|
-
return self.append_caption_to_markdown(base_markdown, self.caption)
|
notionary/comments/__init__.py
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
from .client import CommentClient
|
2
|
-
from .models import (
|
3
|
-
Comment,
|
4
|
-
CommentAttachment,
|
5
|
-
CommentAttachmentExternal,
|
6
|
-
CommentAttachmentFile,
|
7
|
-
CommentDisplayName,
|
8
|
-
CommentListResponse,
|
9
|
-
CommentParent,
|
10
|
-
FileWithExpiry,
|
11
|
-
UserRef,
|
12
|
-
)
|
13
|
-
|
14
|
-
|
15
|
-
__all__ = [
|
16
|
-
"CommentClient",
|
17
|
-
"Comment",
|
18
|
-
"CommentAttachment",
|
19
|
-
"CommentAttachmentExternal",
|
20
|
-
"CommentAttachmentFile",
|
21
|
-
"CommentDisplayName",
|
22
|
-
"CommentListResponse",
|
23
|
-
"CommentParent",
|
24
|
-
"FileWithExpiry",
|
25
|
-
"UserRef",
|
26
|
-
]
|
notionary/database/__init__.py
DELETED