. ├── core │   ├── bootstrap.php │   ├── cli │   │   ├── add-new-features.php │   │   ├── clear-cache.php │   │   ├── clear-garbage.php │   │   ├── cron.php │   │   ├── prepare-videos.php │   │   ├── publish-topics.php │   │   ├── readonly-users.php │   │   ├── search-index.php │   │   ├── send-notifications.php │   │   └── subscriptions.php │   ├── composer.json │   ├── composer.lock │   ├── db │   │   ├── migrations │   │   │   ├── 20230918040703_files.php │   │   │   ├── 20230918040815_users.php │   │   │   ├── 20231001055639_videos.php │   │   │   ├── 20231018014050_settings.php │   │   │   ├── 20231025210112_levels.php │   │   │   ├── 20231025224114_topics.php │   │   │   ├── 20231114045003_comments.php │   │   │   ├── 20231114045856_user_notifications.php │   │   │   ├── 20231120031943_pages.php │   │   │   ├── 20231121045558_subscriptions.php │   │   │   ├── 20231121054352_payments.php │   │   │   ├── 20231212014555_user_notifications_2.php │   │   │   ├── 20231214072437_topic_tags.php │   │   │   ├── 20231221061910_notify_user.php │   │   │   ├── 20240204030650_reactions.php │   │   │   ├── 20240617015550_redirects.php │   │   │   ├── 20240705014721_external_pages.php │   │   │   ├── 20240706145148_delayed_publishing.php │   │   │   ├── 20240710125709_search.php │   │   │   ├── 20240809075207_audio_tracks.php │   │   │   ├── 20240816055840_video_thumbnails.php │   │   │   ├── 20240825074549_default_cover.php │   │   │   ├── 20240826135213_user_connections.php │   │   │   ├── 20241105040214_subscription_warning.php │   │   │   ├── 20241114075023_user_colors.php │   │   │   ├── 20250108043305_categories.php │   │   │   ├── 20250414023612_topic_types.php │   │   │   ├── 20250415083319_hide_views_reactions.php │   │   │   ├── 20250602105422_remove_phone.php │   │   │   └── 20250616025217_user_read_only.php │   │   └── seeds │   │   ├── SeedReactions.php │   │   ├── SeedUserRoles.php │   │   └── SeedUsers.php │   ├── phinx.php │   ├── routes.php │   ├── src │   │   ├── Controllers │   │   │   ├── Admin │   │   │   │   ├── Categories.php │   │   │   │   ├── Levels.php │   │   │   │   ├── Notifications.php │   │   │   │   ├── Pages.php │   │   │   │   ├── Payments │   │   │   │   ├── Payments.php │   │   │   │   ├── Reactions.php │   │   │   │   ├── Redirects.php │   │   │   │   ├── Settings.php │   │   │   │   ├── Subscriptions │   │   │   │   ├── Tags.php │   │   │   │   ├── Topics │   │   │   │   ├── Topics.php │   │   │   │   ├── UserRoles.php │   │   │   │   ├── Users │   │   │   │   ├── Users.php │   │   │   │   ├── Videos │   │   │   │   └── Videos.php │   │   │   ├── Audio.php │   │   │   ├── File.php │   │   │   ├── Image.php │   │   │   ├── Poster.php │   │   │   ├── Security │   │   │   │   ├── Activate.php │   │   │   │   ├── Login.php │   │   │   │   ├── Logout.php │   │   │   │   ├── Register.php │   │   │   │   └── Reset.php │   │   │   ├── Traits │   │   │   │   ├── FileModelController.php │   │   │   │   ├── RankedModelController.php │   │   │   │   ├── ReactionModelController.php │   │   │   │   ├── StatModelController.php │   │   │   │   └── UploadController.php │   │   │   ├── User │   │   │   │   ├── Avatar.php │   │   │   │   ├── Connections.php │   │   │   │   ├── Payments.php │   │   │   │   ├── Profile.php │   │   │   │   ├── Subscription.php │   │   │   │   └── Videos.php │   │   │   ├── Video.php │   │   │   └── Web │   │   │   ├── Categories.php │   │   │   ├── Comments │   │   │   ├── Comments.php │   │   │   ├── Connections │   │   │   ├── Levels.php │   │   │   ├── Pages.php │   │   │   ├── Reactions.php │   │   │   ├── Redirects.php │   │   │   ├── Rss.php │   │   │   ├── Search.php │   │   │   ├── Settings.php │   │   │   ├── Sitemap.php │   │   │   ├── Tags.php │   │   │   ├── Topics │   │   │   └── Topics.php │   │   ├── Middlewares │   │   │   ├── Auth.php │   │   │   └── Cache.php │   │   ├── Models │   │   │   ├── Category.php │   │   │   ├── CommentFile.php │   │   │   ├── Comment.php │   │   │   ├── CommentReaction.php │   │   │   ├── File.php │   │   │   ├── Level.php │   │   │   ├── PageFile.php │   │   │   ├── Page.php │   │   │   ├── Payment.php │   │   │   ├── Reaction.php │   │   │   ├── Redirect.php │   │   │   ├── Setting.php │   │   │   ├── Subscription.php │   │   │   ├── Tag.php │   │   │   ├── TopicFile.php │   │   │   ├── Topic.php │   │   │   ├── TopicReaction.php │   │   │   ├── TopicTag.php │   │   │   ├── TopicView.php │   │   │   ├── Traits │   │   │   │   ├── ContentFilesTrait.php │   │   │   │   └── RankedModel.php │   │   │   ├── UserConnection.php │   │   │   ├── UserNotification.php │   │   │   ├── User.php │   │   │   ├── UserRole.php │   │   │   ├── UserToken.php │   │   │   ├── Video.php │   │   │   ├── VideoQuality.php │   │   │   └── VideoUser.php │   │   └── Services │   │   ├── CloudStorage.php │   │   ├── Connections │   │   │   └── Telegram.php │   │   ├── ConnectionService.php │   │   ├── Fenom.php │   │   ├── Log.php │   │   ├── Mail.php │   │   ├── Manticore.php │   │   ├── Payments │   │   │   ├── Internal.php │   │   │   ├── Payrexx.php │   │   │   ├── RaiffeisenSbp.php │   │   │   ├── Tbank.php │   │   │   └── Yookassa.php │   │   ├── PaymentService.php │   │   ├── Redis.php │   │   ├── Socket.php │   │   ├── TempStorage.php │   │   ├── ThumbStorage.php │   │   ├── Utils.php │   │   └── VideoCache.php │   └── templates │   ├── comment-new.tpl │   ├── comment-reply.tpl │   ├── email.tpl │   ├── subscription-cancelled.tpl │   ├── subscription-paid.tpl │   ├── subscription-warn.tpl │   ├── topic-new.tpl │   ├── user-register.tpl │   └── user-reset.tpl ├── docker │   ├── nginx │   │   ├── development │   │   │   └── default.conf.template │   │   └── production │   │   └── default.conf.template │   └── php-fpm │   └── Dockerfile ├── docker-compose.override.yml.dist ├── docker-compose.yml ├── frontend │   ├── eslint.config.mjs │   ├── i18n │   │   ├── i18n.config.ts │   │   └── lexicons │   │   ├── de.js │   │   ├── en.js │   │   └── ru.js │   ├── nuxt.config.ts │   ├── package.json │   ├── package-lock.json │   ├── public │   │   ├── connections │   │   │   └── telegram.svg │   │   ├── email │   │   │   ├── logo@2x.png │   │   │   └── logo.png │   │   ├── favicon.ico │   │   ├── favicons │   │   │   ├── android-chrome-192x192.png │   │   │   ├── android-chrome-512x512.png │   │   │   ├── apple-touch-icon.png │   │   │   ├── browserconfig.xml │   │   │   ├── favicon-16x16.png │   │   │   ├── favicon-32x32.png │   │   │   ├── favicon.ico │   │   │   ├── mstile-144x144.png │   │   │   ├── mstile-150x150.png │   │   │   ├── mstile-310x150.png │   │   │   ├── mstile-310x310.png │   │   │   ├── mstile-70x70.png │   │   │   ├── safari-pinned-tab.svg │   │   │   └── site.webmanifest │   │   ├── payments │   │   │   ├── internal.svg │   │   │   ├── payrexx.svg │   │   │   ├── raiffeisen-sbp.svg │   │   │   ├── tbank.svg │   │   │   └── yookassa.svg │   │   └── project │   │   └── logo.svg │   ├── server │   │   ├── middleware │   │   │   └── cache.ts │   │   ├── plugins │   │   │   ├── cache.ts │   │   │   └── socket.ts │   │   └── routes │   │   ├── atom.xml.ts │   │   ├── robots.txt.ts │   │   ├── rss.xml.ts │   │   ├── sitemap.xml.ts │   │   └── turbo.xml.ts │   ├── src │   │   ├── app.vue │   │   ├── assets │   │   │   ├── icons │   │   │   │   ├── de.svg │   │   │   │   ├── gb.svg │   │   │   │   ├── ru.svg │   │   │   │   └── upload.svg │   │   │   └── scss │   │   │   ├── _additional.scss │   │   │   ├── _code.scss │   │   │   ├── _comments.scss │   │   │   ├── _cropper.scss │   │   │   ├── _dark-mode.scss │   │   │   ├── _editor.scss │   │   │   ├── index.scss │   │   │   ├── _payments.scss │   │   │   ├── _player.scss │   │   │   ├── _reactions.scss │   │   │   ├── _toast.scss │   │   │   ├── _topic.scss │   │   │   ├── _transitions.scss │   │   │   ├── _variables.scss │   │   │   ├── _vesp.scss │   │   │   └── _widgets.scss │   │   ├── components │   │   │   ├── app │   │   │   │   ├── footer.vue │   │   │   │   ├── language.vue │   │   │   │   ├── login.vue │   │   │   │   ├── navbar.vue │   │   │   │   ├── pages.vue │   │   │   │   ├── payment.vue │   │   │   │   └── sidebar.vue │   │   │   ├── chart │   │   │   │   └── common.vue │   │   │   ├── comments │   │   │   │   ├── form.vue │   │   │   │   ├── thread.vue │   │   │   │   └── tree.vue │   │   │   ├── editor │   │   │   │   ├── blocks │   │   │   │   ├── content.vue │   │   │   │   ├── js.client.vue │   │   │   │   ├── lexicons │   │   │   │   └── pick-video.vue │   │   │   ├── file │   │   │   │   ├── queue.vue │   │   │   │   └── upload.vue │   │   │   ├── forms │   │   │   │   ├── category.vue │   │   │   │   ├── level.vue │   │   │   │   ├── login.vue │   │   │   │   ├── page.vue │   │   │   │   ├── payment.vue │   │   │   │   ├── reactions.vue │   │   │   │   ├── redirect.vue │   │   │   │   ├── register.vue │   │   │   │   ├── reset.vue │   │   │   │   ├── setting.vue │   │   │   │   ├── topic.vue │   │   │   │   ├── user-role.vue │   │   │   │   ├── user.vue │   │   │   │   └── video.vue │   │   │   ├── payment │   │   │   │   ├── subscription.vue │   │   │   │   ├── topic.vue │   │   │   │   └── variants.vue │   │   │   ├── player │   │   │   │   ├── audio.vue │   │   │   │   ├── embed.vue │   │   │   │   ├── lexicons │   │   │   │   └── video.vue │   │   │   ├── topic │   │   │   │   ├── block │   │   │   │   ├── content.vue │   │   │   │   ├── footer.vue │   │   │   │   ├── intro.vue │   │   │   │   ├── sort.vue │   │   │   │   └── tags.vue │   │   │   ├── user │   │   │   │   ├── avatar-crop.vue │   │   │   │   ├── avatar.vue │   │   │   │   ├── connections.vue │   │   │   │   ├── reactions.vue │   │   │   │   └── subscription.vue │   │   │   └── widgets │   │   │   ├── author.vue │   │   │   ├── categories.vue │   │   │   ├── levels.vue │   │   │   ├── online.vue │   │   │   ├── scroll-top.vue │   │   │   ├── search.vue │   │   │   └── tags.vue │   │   ├── error.vue │   │   ├── pages │   │   │   ├── admin │   │   │   │   ├── levels │   │   │   │   ├── levels.vue │   │   │   │   ├── notifications.vue │   │   │   │   ├── pages │   │   │   │   ├── pages.vue │   │   │   │   ├── payments │   │   │   │   ├── payments.vue │   │   │   │   ├── redirects │   │   │   │   ├── redirects.vue │   │   │   │   ├── settings.vue │   │   │   │   ├── topics │   │   │   │   ├── topics.vue │   │   │   │   ├── user-roles │   │   │   │   ├── user-roles.vue │   │   │   │   ├── users │   │   │   │   ├── users.vue │   │   │   │   ├── videos │   │   │   │   └── videos.vue │   │   │   ├── admin.vue │   │   │   ├── index.vue │   │   │   ├── pages │   │   │   │   ├── [alias].vue │   │   │   │   └── index.vue │   │   │   ├── search.vue │   │   │   ├── [topics] │   │   │   │   ├── create.vue │   │   │   │   ├── index.vue │   │   │   │   └── [uuid].vue │   │   │   ├── user │   │   │   │   ├── confirm │   │   │   │   ├── payments │   │   │   │   ├── payments.vue │   │   │   │   ├── profile.vue │   │   │   │   └── subscription.vue │   │   │   └── user.vue │   │   ├── plugins │   │   │   ├── lightbox.client.ts │   │   │   ├── prism.ts │   │   │   ├── socket.client.ts │   │   │   └── vesp.ts │   │   ├── router.options.ts │   │   ├── stores │   │   │   ├── topics.ts │   │   │   └── vesp.ts │   │   ├── utils │   │   │   ├── get-feed.ts │   │   │   ├── players.ts │   │   │   ├── use-global-hotkeys.ts │   │   │   └── vesp.ts │   │   └── vesp.d.ts │   └── tsconfig.json ├── LICENSE.md ├── README.md └── www └── api.php 85 directories, 311 files