fix messages, save tonPerStar rate
This commit is contained in:
parent
bb2180f44b
commit
ddbd004633
|
|
@ -171,7 +171,7 @@ async def s_api_v1_content_friendly_list(request):
|
||||||
with open(metadata_content.filepath, 'r') as f:
|
with open(metadata_content.filepath, 'r') as f:
|
||||||
metadata = json.loads(f.read())
|
metadata = json.loads(f.read())
|
||||||
|
|
||||||
preview_link = 'not ready'
|
preview_link = None
|
||||||
if content.meta.get('converted_content'):
|
if content.meta.get('converted_content'):
|
||||||
preview_link = f"{PROJECT_HOST}/api/v1.5/storage/{content.meta['converted_content']['low_preview']}"
|
preview_link = f"{PROJECT_HOST}/api/v1.5/storage/{content.meta['converted_content']['low_preview']}"
|
||||||
|
|
||||||
|
|
@ -180,7 +180,7 @@ async def s_api_v1_content_friendly_list(request):
|
||||||
<td>{content.cid.serialize_v2()}</td>
|
<td>{content.cid.serialize_v2()}</td>
|
||||||
<td>{metadata.get('name', "")}</td>
|
<td>{metadata.get('name', "")}</td>
|
||||||
<td>{content.meta.get('item_address')}</td>
|
<td>{content.meta.get('item_address')}</td>
|
||||||
<td><a href="{preview_link}">Preview</a></td>
|
<td>""" + (f'<a href="{preview_link}">Preview</a>' if preview_link else "not ready") + """</td>
|
||||||
</tr>
|
</tr>
|
||||||
"""
|
"""
|
||||||
result += """
|
result += """
|
||||||
|
|
@ -190,4 +190,64 @@ async def s_api_v1_content_friendly_list(request):
|
||||||
"""
|
"""
|
||||||
return response.html(result)
|
return response.html(result)
|
||||||
|
|
||||||
|
async def s_api_v1_5_content_list(request):
|
||||||
|
# Validate offset and limit parameters
|
||||||
|
offset = int(request.args.get('offset', 0))
|
||||||
|
limit = int(request.args.get('limit', 100))
|
||||||
|
if offset < 0:
|
||||||
|
return response.json({'error': 'Invalid offset'}, status=400)
|
||||||
|
|
||||||
|
if limit <= 0 or limit > 1000:
|
||||||
|
return response.json({'error': 'Invalid limit'}, status=400)
|
||||||
|
|
||||||
|
# Query onchain contents which are not disabled
|
||||||
|
contents = request.ctx.db_session.query(StoredContent).filter(
|
||||||
|
StoredContent.type == 'onchain/content',
|
||||||
|
StoredContent.disabled == False
|
||||||
|
).order_by(StoredContent.created.desc()).offset(offset).limit(limit).all()
|
||||||
|
|
||||||
|
result = []
|
||||||
|
for content in contents:
|
||||||
|
# Retrieve metadata content using metadata_cid from content.meta
|
||||||
|
metadata_cid = content.meta.get('metadata_cid')
|
||||||
|
if not metadata_cid:
|
||||||
|
continue # Skip if no metadata_cid is found
|
||||||
|
|
||||||
|
metadata_content = StoredContent.from_cid(request.ctx.db_session, metadata_cid)
|
||||||
|
try:
|
||||||
|
with open(metadata_content.filepath, 'r') as f:
|
||||||
|
metadata = json.load(f)
|
||||||
|
except Exception as e:
|
||||||
|
metadata = {}
|
||||||
|
|
||||||
|
media_type = 'audio'
|
||||||
|
|
||||||
|
# Get title from metadata (key 'name')
|
||||||
|
title = metadata.get('name', '')
|
||||||
|
|
||||||
|
# Build preview link if converted_content exists and contains 'low_preview'
|
||||||
|
preview_link = None
|
||||||
|
converted_content = content.meta.get('converted_content')
|
||||||
|
if converted_content:
|
||||||
|
converted_content = request.ctx.db_session.query(StoredContent).filter(
|
||||||
|
StoredContent.hash == converted_content['low_preview']
|
||||||
|
).first()
|
||||||
|
preview_link = converted_content.web_url
|
||||||
|
if converted_content.filename.split('.')[-1] in ('mp4', 'mov'):
|
||||||
|
media_type = 'video'
|
||||||
|
else:
|
||||||
|
preview_link = None
|
||||||
|
|
||||||
|
# Get onchain address from content.meta
|
||||||
|
onchain_address = content.meta.get('item_address', '')
|
||||||
|
|
||||||
|
result.append({
|
||||||
|
'cid': content.cid.serialize_v2(),
|
||||||
|
'onchain_address': onchain_address,
|
||||||
|
'type': media_type,
|
||||||
|
'title': title,
|
||||||
|
'preview_link': preview_link,
|
||||||
|
'created_at': content.created.isoformat() # ISO 8601 format for datetime
|
||||||
|
})
|
||||||
|
|
||||||
|
return response.json(result)
|
||||||
|
|
|
||||||
|
|
@ -14,19 +14,20 @@ main_router = Router()
|
||||||
|
|
||||||
async def send_home_menu(chat_wrap, user, wallet_connection, **kwargs):
|
async def send_home_menu(chat_wrap, user, wallet_connection, **kwargs):
|
||||||
return await tg_process_template(
|
return await tg_process_template(
|
||||||
chat_wrap, user.translated('home_menu').format(
|
chat_wrap, user.translated('clientHome_menu').format(
|
||||||
wallet_address=Address(wallet_connection.wallet_address).to_string(1, 1, 1) if wallet_connection else user.translated('p_walletNotConnected'),
|
wallet_address=Address(wallet_connection.wallet_address).to_string(1, 1, 1) if wallet_connection else user.translated('p_walletNotConnected'),
|
||||||
name=user.front_format(plain_text=True),
|
name=user.front_format(plain_text=True),
|
||||||
), keyboard=get_inline_keyboard([
|
), # keyboard=get_inline_keyboard([
|
||||||
[{
|
# [{
|
||||||
'text': user.translated('ownedContent_button'),
|
# 'text': user.translated('ownedContent_button'),
|
||||||
'callback_data': 'ownedContent'
|
# 'callback_data': 'ownedContent'
|
||||||
}],
|
# }],
|
||||||
[{
|
# [{
|
||||||
'text': user.translated('disconnectWallet_button'),
|
# 'text': user.translated('disconnectWallet_button'),
|
||||||
'callback_data': 'disconnectWallet'
|
# 'callback_data': 'disconnectWallet'
|
||||||
}] if wallet_connection else []
|
# }] if wallet_connection else []
|
||||||
]), **kwargs
|
# ]),
|
||||||
|
**kwargs
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,14 +7,17 @@ import shutil
|
||||||
from base58 import b58decode, b58encode
|
from base58 import b58decode, b58encode
|
||||||
from sqlalchemy import and_, or_
|
from sqlalchemy import and_, or_
|
||||||
from app.core.models.node_storage import StoredContent
|
from app.core.models.node_storage import StoredContent
|
||||||
|
from app.core.models._telegram import Wrapped_CBotChat
|
||||||
from app.core._utils.send_status import send_status
|
from app.core._utils.send_status import send_status
|
||||||
from app.core.logger import make_log
|
from app.core.logger import make_log
|
||||||
|
from app.core.models.user import User
|
||||||
|
from app.core.models import WalletConnection
|
||||||
from app.core.storage import db_session
|
from app.core.storage import db_session
|
||||||
from app.core._config import UPLOADS_DIR
|
from app.core._config import UPLOADS_DIR
|
||||||
from app.core.content.content_id import ContentId
|
from app.core.content.content_id import ContentId
|
||||||
|
|
||||||
|
|
||||||
async def convert_loop():
|
async def convert_loop(memory):
|
||||||
with db_session() as session:
|
with db_session() as session:
|
||||||
# Query for unprocessed encrypted content
|
# Query for unprocessed encrypted content
|
||||||
unprocessed_encrypted_content = session.query(StoredContent).filter(
|
unprocessed_encrypted_content = session.query(StoredContent).filter(
|
||||||
|
|
@ -193,8 +196,15 @@ async def convert_loop():
|
||||||
**unprocessed_encrypted_content.meta,
|
**unprocessed_encrypted_content.meta,
|
||||||
'converted_content': converted_content
|
'converted_content': converted_content
|
||||||
}
|
}
|
||||||
session.commit()
|
|
||||||
|
|
||||||
|
session.commit()
|
||||||
|
if not unprocessed_encrypted_content.meta.get('upload_notify_msg_id'):
|
||||||
|
wallet_owner_connection = session.query(WalletConnection).order_by(WalletConnection.id.desc()).first()
|
||||||
|
if wallet_owner_connection:
|
||||||
|
wallet_owner_user = wallet_owner_connection.user
|
||||||
|
wallet_owner_bot = Wrapped_CBotChat(memory._client_telegram_bot, chat_id=wallet_owner_user.telegram_id, user=wallet_owner_user, db_session=session)
|
||||||
|
unprocessed_encrypted_content.meta['upload_notify_msg_id'] = await wallet_owner_bot.send_content(session, unprocessed_encrypted_content)
|
||||||
|
session.commit()
|
||||||
|
|
||||||
async def main_fn(memory):
|
async def main_fn(memory):
|
||||||
make_log("ConvertProcess", "Service started", level="info")
|
make_log("ConvertProcess", "Service started", level="info")
|
||||||
|
|
@ -202,7 +212,7 @@ async def main_fn(memory):
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
make_log("ConvertProcess", "Service running", level="debug")
|
make_log("ConvertProcess", "Service running", level="debug")
|
||||||
await convert_loop()
|
await convert_loop(memory)
|
||||||
await asyncio.sleep(5)
|
await asyncio.sleep(5)
|
||||||
await send_status("convert_service", f"working (seqno={seqno})")
|
await send_status("convert_service", f"working (seqno={seqno})")
|
||||||
seqno += 1
|
seqno += 1
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ from app.core._blockchain.ton.platform import platform
|
||||||
from app.core._blockchain.ton.toncenter import toncenter
|
from app.core._blockchain.ton.toncenter import toncenter
|
||||||
from app.core._utils.send_status import send_status
|
from app.core._utils.send_status import send_status
|
||||||
from app.core.logger import make_log
|
from app.core.logger import make_log
|
||||||
from app.core.models import UserContent, KnownTelegramMessage
|
from app.core.models import UserContent, KnownTelegramMessage, ServiceConfig
|
||||||
from app.core.models.node_storage import StoredContent
|
from app.core.models.node_storage import StoredContent
|
||||||
from app.core._utils.resolve_content import resolve_content
|
from app.core._utils.resolve_content import resolve_content
|
||||||
from app.core.models.wallet_connection import WalletConnection
|
from app.core.models.wallet_connection import WalletConnection
|
||||||
|
|
@ -34,6 +34,18 @@ async def indexer_loop(memory, platform_found: bool, seqno: int) -> [bool, int]:
|
||||||
|
|
||||||
make_log("Indexer", "Service running", level="debug")
|
make_log("Indexer", "Service running", level="debug")
|
||||||
with db_session() as session:
|
with db_session() as session:
|
||||||
|
try:
|
||||||
|
result = await toncenter.run_get_method('EQD8TJ8xEWB1SpnRE4d89YO3jl0W0EiBnNS4IBaHaUmdfizE', 'get_pool_data')
|
||||||
|
assert result['exit_code'] == 0, f"Error in get-method: {result}"
|
||||||
|
assert result['stack'][0][0] == 'num', f"get first element is not num"
|
||||||
|
assert result['stack'][1][0] == 'num', f"get second element is not num"
|
||||||
|
usdt_per_ton = (int(result['stack'][0][1], 16) * 1e3) / int(result['stack'][1][1], 16)
|
||||||
|
ton_per_star = 0.014 / usdt_per_ton
|
||||||
|
await ServiceConfig(session).set('live_tonPerStar', [ton_per_star, datetime.utcnow().timestamp()])
|
||||||
|
make_log("TON_Daemon", f"TON per STAR price: {ton_per_star}", level="DEBUG")
|
||||||
|
except BaseException as e:
|
||||||
|
make_log("TON_Daemon", f"Error while saving TON per STAR price: {e}" + '\n' + traceback.format_exc(), level="ERROR")
|
||||||
|
|
||||||
new_licenses = session.query(UserContent).filter(
|
new_licenses = session.query(UserContent).filter(
|
||||||
and_(
|
and_(
|
||||||
~UserContent.meta.contains({'notification_sent': True}),
|
~UserContent.meta.contains({'notification_sent': True}),
|
||||||
|
|
@ -50,30 +62,31 @@ async def indexer_loop(memory, platform_found: bool, seqno: int) -> [bool, int]:
|
||||||
content_metadata = licensed_content.metadata_json(session)
|
content_metadata = licensed_content.metadata_json(session)
|
||||||
assert content_metadata, "No content metadata found"
|
assert content_metadata, "No content metadata found"
|
||||||
|
|
||||||
try:
|
if not (licensed_content.owner_address == new_license.owner_address):
|
||||||
user = new_license.user
|
try:
|
||||||
if user.telegram_id and licensed_content:
|
user = new_license.user
|
||||||
await (Wrapped_CBotChat(memory._client_telegram_bot, chat_id=user.telegram_id, user=user, db_session=session)).send_content(
|
if user.telegram_id and licensed_content:
|
||||||
session, licensed_content
|
await (Wrapped_CBotChat(memory._client_telegram_bot, chat_id=user.telegram_id, user=user, db_session=session)).send_content(
|
||||||
)
|
session, licensed_content
|
||||||
|
)
|
||||||
|
|
||||||
wallet_owner_connection = session.query(WalletConnection).filter_by(
|
wallet_owner_connection = session.query(WalletConnection).filter_by(
|
||||||
wallet_address=licensed_content.owner_address,
|
wallet_address=licensed_content.owner_address,
|
||||||
invalidated=False
|
invalidated=False
|
||||||
).order_by(desc(WalletConnection.id)).first()
|
).order_by(desc(WalletConnection.id)).first()
|
||||||
wallet_owner_user = wallet_owner_connection.user
|
wallet_owner_user = wallet_owner_connection.user
|
||||||
if wallet_owner_user.telegram_id:
|
if wallet_owner_user.telegram_id:
|
||||||
wallet_owner_bot = Wrapped_CBotChat(memory._client_telegram_bot, chat_id=wallet_owner_user.telegram_id, user=wallet_owner_user, db_session=session)
|
wallet_owner_bot = Wrapped_CBotChat(memory._client_telegram_bot, chat_id=wallet_owner_user.telegram_id, user=wallet_owner_user, db_session=session)
|
||||||
await wallet_owner_bot.send_message(
|
await wallet_owner_bot.send_message(
|
||||||
user.translated('p_licenseWasBought').format(
|
user.translated('p_licenseWasBought').format(
|
||||||
username=user.front_format(),
|
username=user.front_format(),
|
||||||
nft_address=f'"https://tonviewer.com/{new_license.onchain_address}"',
|
nft_address=f'"https://tonviewer.com/{new_license.onchain_address}"',
|
||||||
content_title=content_metadata.get('name', 'Unknown'),
|
content_title=content_metadata.get('name', 'Unknown'),
|
||||||
),
|
),
|
||||||
message_type='notification',
|
message_type='notification',
|
||||||
)
|
)
|
||||||
except BaseException as e:
|
except BaseException as e:
|
||||||
make_log("IndexerSendNewLicense", f"Error: {e}" + '\n' + traceback.format_exc(), level="error")
|
make_log("IndexerSendNewLicense", f"Error: {e}" + '\n' + traceback.format_exc(), level="error")
|
||||||
|
|
||||||
new_license.meta = {**new_license.meta, 'notification_sent': True}
|
new_license.meta = {**new_license.meta, 'notification_sent': True}
|
||||||
session.commit()
|
session.commit()
|
||||||
|
|
@ -199,7 +212,8 @@ async def indexer_loop(memory, platform_found: bool, seqno: int) -> [bool, int]:
|
||||||
encrypted_stored_content.user_id = user_wallet_connection.user_id
|
encrypted_stored_content.user_id = user_wallet_connection.user_id
|
||||||
user = user_wallet_connection.user
|
user = user_wallet_connection.user
|
||||||
|
|
||||||
await (Wrapped_CBotChat(memory._telegram_bot, chat_id=user.telegram_id)).send_message(
|
user_uploader_wrapper = Wrapped_CBotChat(memory._telegram_bot, chat_id=user.telegram_id, user=user, db_session=session)
|
||||||
|
await user_uploader_wrapper.send_message(
|
||||||
user.translated('p_contentWasIndexed').format(
|
user.translated('p_contentWasIndexed').format(
|
||||||
item_address=item_address.to_string(1, 1, 1),
|
item_address=item_address.to_string(1, 1, 1),
|
||||||
item_index=item_index,
|
item_index=item_index,
|
||||||
|
|
@ -213,7 +227,6 @@ async def indexer_loop(memory, platform_found: bool, seqno: int) -> [bool, int]:
|
||||||
])
|
])
|
||||||
)
|
)
|
||||||
|
|
||||||
user_uploader_wrapper = Wrapped_CBotChat(memory._telegram_bot, chat_id=user.telegram_id, user=user, db_session=session)
|
|
||||||
for hint_message in session.query(KnownTelegramMessage).filter(
|
for hint_message in session.query(KnownTelegramMessage).filter(
|
||||||
and_(
|
and_(
|
||||||
KnownTelegramMessage.chat_id == user.telegram_id,
|
KnownTelegramMessage.chat_id == user.telegram_id,
|
||||||
|
|
@ -222,6 +235,8 @@ async def indexer_loop(memory, platform_found: bool, seqno: int) -> [bool, int]:
|
||||||
)
|
)
|
||||||
):
|
):
|
||||||
await user_uploader_wrapper.delete_message(hint_message.message_id)
|
await user_uploader_wrapper.delete_message(hint_message.message_id)
|
||||||
|
|
||||||
|
user.client
|
||||||
elif encrypted_stored_content.type.startswith('onchain') and encrypted_stored_content.onchain_index == item_index:
|
elif encrypted_stored_content.type.startswith('onchain') and encrypted_stored_content.onchain_index == item_index:
|
||||||
encrypted_stored_content.type = "onchain/content" + ("_unknown" if (encrypted_stored_content.key_id is None) else "")
|
encrypted_stored_content.type = "onchain/content" + ("_unknown" if (encrypted_stored_content.key_id is None) else "")
|
||||||
encrypted_stored_content.owner_address = item_owner_address.to_string(1, 1, 1)
|
encrypted_stored_content.owner_address = item_owner_address.to_string(1, 1, 1)
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,6 @@ from app.core.models.wallet_connection import WalletConnection
|
||||||
from app.core.models.messages import KnownTelegramMessage
|
from app.core.models.messages import KnownTelegramMessage
|
||||||
from app.core.models.user_activity import UserActivity
|
from app.core.models.user_activity import UserActivity
|
||||||
from app.core.models.content.user_content import UserContent, UserAction
|
from app.core.models.content.user_content import UserContent, UserAction
|
||||||
from app.core.models._config import ServiceConfigValue
|
from app.core.models._config import ServiceConfigValue, ServiceConfig
|
||||||
from app.core.models.asset import Asset
|
from app.core.models.asset import Asset
|
||||||
from app.core.models.my_network import KnownNode, KnownNodeIncident, RemoteContentIndex
|
from app.core.models.my_network import KnownNode, KnownNodeIncident, RemoteContentIndex
|
||||||
|
|
|
||||||
Binary file not shown.
|
|
@ -21,160 +21,179 @@ msgstr ""
|
||||||
#: app/client_bot/routers/home.py:15 app/client_bot/routers/home.py:17
|
#: app/client_bot/routers/home.py:15 app/client_bot/routers/home.py:17
|
||||||
msgid "home_menu"
|
msgid "home_menu"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Hi, <b>{name}</b>! 😊\n"
|
"Добро пожаловать в MY! — децентрализованную систему распространения и монетизации контента!\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Here you can upload your content to the blockchain and manage it 🚀.\n"
|
"Для загрузки контента необходимо будет подключить крипто-кошелек TON. Не бойтесь.\n"
|
||||||
|
"Нажмите «загрузить контент» и действуйте дальше интуитивно.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"You're logged in as <code>{wallet_address}</code>"
|
"На всякий случай, ссылка на видеоурок по подключению кошелька здесь:\n"
|
||||||
|
"<a href=\"https://www.youtube.com/watch?v=T6AbwwSrb_M\">Обучающее видео</a>\n"
|
||||||
|
"\n"
|
||||||
|
"Удачи!"
|
||||||
|
|
||||||
|
#: Новый блок для клиента
|
||||||
|
msgid "clientHome_menu"
|
||||||
|
msgstr ""
|
||||||
|
"Добро пожаловать в плеер платформы MY!\n"
|
||||||
|
"\n"
|
||||||
|
"Здесь вы можете прослушать уже купленный контент и насладиться вашими покупками."
|
||||||
|
|
||||||
|
|
||||||
#: app/bot/routers/home.py:20 app/client_bot/routers/home.py:20
|
#: app/bot/routers/home.py:20 app/client_bot/routers/home.py:20
|
||||||
#: app/client_bot/routers/home.py:22
|
#: app/client_bot/routers/home.py:22
|
||||||
msgid "ownedContent_button"
|
msgid "ownedContent_button"
|
||||||
msgstr "📊 My Content"
|
msgstr "📊 Мой Контент"
|
||||||
|
|
||||||
#: app/bot/routers/home.py:24 app/client_bot/routers/home.py:24
|
#: app/bot/routers/home.py:24 app/client_bot/routers/home.py:24
|
||||||
#: app/client_bot/routers/home.py:26
|
#: app/client_bot/routers/home.py:26
|
||||||
msgid "disconnectWallet_button"
|
msgid "disconnectWallet_button"
|
||||||
msgstr "🔌 Disconnect Wallet"
|
msgstr "🔌 Отключить кошелек"
|
||||||
|
|
||||||
#: app/bot/routers/home.py:35 app/client_bot/routers/home.py:35
|
#: app/bot/routers/home.py:35 app/client_bot/routers/home.py:35
|
||||||
#: app/client_bot/routers/home.py:37
|
#: app/client_bot/routers/home.py:37
|
||||||
msgid "connectWalletsList_menu"
|
msgid "connectWalletsList_menu"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"<b>/</b> Welcome to MY [🔴]\n"
|
"<b>/</b> Добро пожаловать в MY [🔴]\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Please select the wallet you want to connect to the bot 😊:"
|
"Пожалуйста, выберите кошелек, который вы хотите подключить к боту 😊:"
|
||||||
|
|
||||||
#: app/bot/routers/index.py:23 app/bot/routers/index.py:22
|
#: app/bot/routers/index.py:23 app/bot/routers/index.py:22
|
||||||
#: app/client_bot/routers/index.py:18 app/client_bot/routers/index.py:23
|
#: app/client_bot/routers/index.py:18 app/client_bot/routers/index.py:23
|
||||||
msgid "error_unknownCommand"
|
msgid "error_unknownCommand"
|
||||||
msgstr "❌ Unknown command, please try again or press /start"
|
msgstr "❌ Неизвестная команда, попробуйте снова или нажмите /start"
|
||||||
|
|
||||||
#: app/bot/routers/content.py:16 app/bot/routers/content.py:12
|
#: app/bot/routers/content.py:16 app/bot/routers/content.py:12
|
||||||
#: app/bot/routers/content.py:21
|
#: app/bot/routers/content.py:21
|
||||||
msgid "ownedContent_menu"
|
msgid "ownedContent_menu"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"📊 <b>My Content</b>\n"
|
"📊 <b>Мой Контент</b>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Here you can view the list of your content 📋."
|
"Здесь вы можете просмотреть список вашего контента 📋."
|
||||||
|
|
||||||
#: app/bot/routers/content.py:21 app/bot/routers/content.py:17
|
#: app/bot/routers/content.py:21 app/bot/routers/content.py:17
|
||||||
#: app/bot/routers/content.py:47
|
#: app/bot/routers/content.py:47
|
||||||
msgid "webApp_uploadContent_button"
|
msgid "webApp_uploadContent_button"
|
||||||
msgstr "📤 Upload Content"
|
msgstr "📤 Загрузить контент"
|
||||||
|
|
||||||
#: app/bot/routers/content.py:27 app/bot/routers/content.py:23
|
#: app/bot/routers/content.py:27 app/bot/routers/content.py:23
|
||||||
#: app/bot/routers/content.py:53 app/bot/routers/content.py:68
|
#: app/bot/routers/content.py:53 app/bot/routers/content.py:68
|
||||||
msgid "back_button"
|
msgid "back_button"
|
||||||
msgstr "◀️ Back"
|
msgstr "◀️ Назад"
|
||||||
|
|
||||||
#: app/bot/routers/tonconnect.py:80 app/client_bot/routers/tonconnect.py:82
|
#: app/bot/routers/tonconnect.py:80 app/client_bot/routers/tonconnect.py:82
|
||||||
msgid "tonconnectInit_menu"
|
msgid "tonconnectInit_menu"
|
||||||
msgstr "🔌 Press the button below to connect your wallet"
|
msgstr "🔌 Нажмите кнопку ниже для подключения вашего кошелька"
|
||||||
|
|
||||||
#: app/bot/routers/tonconnect.py:101 app/bot/routers/tonconnect.py:105
|
#: app/bot/routers/tonconnect.py:101 app/bot/routers/tonconnect.py:105
|
||||||
#: app/bot/routers/tonconnect.py:107 app/client_bot/routers/tonconnect.py:109
|
#: app/bot/routers/tonconnect.py:107 app/client_bot/routers/tonconnect.py:109
|
||||||
msgid "p_successConnectWallet"
|
msgid "p_successConnectWallet"
|
||||||
msgstr "✅ Wallet connected successfully"
|
msgstr "✅ Кошелек успешно подключен"
|
||||||
|
|
||||||
#: app/api/routes/_blockchain.py:143 app/api/routes/_blockchain.py:142
|
#: app/api/routes/_blockchain.py:143 app/api/routes/_blockchain.py:142
|
||||||
msgid "p_tonconnectTransactionRequested"
|
msgid "p_tonconnectTransactionRequested"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"⏳ <b>Transaction requested</b>\n"
|
"⏳ <b>Запрос транзакции отправлен</b>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"👉 Please confirm the transaction in your wallet"
|
"👉 Пожалуйста, подтвердите транзакцию в вашем кошельке"
|
||||||
|
|
||||||
#: app/api/routes/_blockchain.py:146
|
#: app/api/routes/_blockchain.py:146
|
||||||
#: app/core/models/_telegram/templates/player.py:108
|
#: app/core/models/_telegram/templates/player.py:108
|
||||||
#: app/api/routes/_blockchain.py:145
|
#: app/api/routes/_blockchain.py:145
|
||||||
msgid "gotoWallet_button"
|
msgid "gotoWallet_button"
|
||||||
msgstr "🔓 Open Wallet"
|
msgstr "🔓 Открыть кошелек"
|
||||||
|
|
||||||
#: app/api/routes/_blockchain.py:150 app/bot/routers/tonconnect.py:90
|
#: app/api/routes/_blockchain.py:150 app/bot/routers/tonconnect.py:90
|
||||||
#: app/core/background/indexer_service.py:141 app/bot/routers/tonconnect.py:92
|
#: app/core/background/indexer_service.py:141 app/bot/routers/tonconnect.py:92
|
||||||
#: app/core/background/indexer_service.py:156 app/api/routes/_blockchain.py:149
|
#: app/core/background/indexer_service.py:156 app/api/routes/_blockchain.py:149
|
||||||
#: app/client_bot/routers/tonconnect.py:94
|
#: app/client_bot/routers/tonconnect.py:94
|
||||||
msgid "home_button"
|
msgid "home_button"
|
||||||
msgstr "◀️ Back"
|
msgstr "◀️ Назад"
|
||||||
|
|
||||||
#: app/bot/routers/tonconnect.py:86 app/client_bot/routers/tonconnect.py:88
|
#: app/bot/routers/tonconnect.py:86 app/client_bot/routers/tonconnect.py:88
|
||||||
msgid "tonconnectOpenWallet_button"
|
msgid "tonconnectOpenWallet_button"
|
||||||
msgstr "[Connect Wallet]"
|
msgstr "[Подключить кошелек]"
|
||||||
|
|
||||||
#: app/core/background/indexer_service.py:134
|
#: app/core/background/indexer_service.py:134
|
||||||
#: app/core/background/indexer_service.py:149
|
#: app/core/background/indexer_service.py:149
|
||||||
msgid "p_contentWasIndexed"
|
msgid "p_contentWasIndexed"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"🎉 <b>Your new content has been uploaded successfully!</b>\n"
|
"🎉 <b>Ваш новый контент успешно загружен!</b>\n"
|
||||||
"\n"
|
"\n"
|
||||||
"🔗 <a href=\"https://tonviewer.com/{item_address}\">{item_address}</a> on the blockchain\n"
|
"🔗 <a href=\"https://tonviewer.com/{item_address}\">{item_address}</a> в блокчейне\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Now you can manage it in the <b>My Content</b> section"
|
"Теперь вы можете управлять им в разделе <b>Мой Контент</b>"
|
||||||
|
|
||||||
#: app/core/models/_telegram/templates/player.py:74
|
#: app/core/models/_telegram/templates/player.py:74
|
||||||
#: app/client_bot/routers/content.py:129
|
#: app/client_bot/routers/content.py:129
|
||||||
msgid "shareTrack_button"
|
msgid "shareTrack_button"
|
||||||
msgstr "🎶 Share Track"
|
msgstr "🎶 Поделиться треком"
|
||||||
|
|
||||||
msgid "shareVideo_button"
|
msgid "shareVideo_button"
|
||||||
msgstr "🎬 Share Video"
|
msgstr "🎬 Поделиться видео"
|
||||||
|
|
||||||
#: app/core/models/_telegram/templates/player.py:79
|
#: app/core/models/_telegram/templates/player.py:79
|
||||||
msgid "viewTrackAsClient_button"
|
msgid "viewTrackAsClient_button"
|
||||||
msgstr "▶️ Open in Player"
|
msgstr "▶️ Открыть в плеере"
|
||||||
|
|
||||||
#: app/core/models/_telegram/templates/player.py:86
|
#: app/core/models/_telegram/templates/player.py:86
|
||||||
msgid "p_playerContext_unsupportedContent"
|
msgid "p_playerContext_unsupportedContent"
|
||||||
msgstr "⚠️ <b>Unsupported Content</b>"
|
msgstr "⚠️ <b>Неподдерживаемый контент</b>"
|
||||||
|
|
||||||
#: app/core/models/_telegram/templates/player.py:111
|
#: app/core/models/_telegram/templates/player.py:111
|
||||||
msgid "p_playerContext_purchaseRequested"
|
msgid "p_playerContext_purchaseRequested"
|
||||||
msgstr "💳 Please confirm the purchase in your wallet. After that, you'll be able to listen to the full version of the track.\n\n"
|
msgstr "💳 Пожалуйста, подтвердите покупку в вашем кошельке. После этого вы сможете прослушать полную версию трека.\n\n<b>Это может занять несколько минут ⏳</b>"
|
||||||
"<b>This may take a few minutes ⏳</b>"
|
|
||||||
|
|
||||||
#: app/core/models/_telegram/templates/player.py:114
|
#: app/core/models/_telegram/templates/player.py:114
|
||||||
msgid "buyTrackListenLicense_button"
|
msgid "buyTrackListenLicense_button"
|
||||||
msgstr "💶 Buy License ({price} TON)"
|
msgstr "💶 Купить лицензию ({price} TON)"
|
||||||
|
|
||||||
#: app/core/models/_telegram/templates/player.py:117
|
#: app/core/models/_telegram/templates/player.py:117
|
||||||
msgid "p_playerContext_preview"
|
msgid "p_playerContext_preview"
|
||||||
msgstr "<i>This is a preview version of the track. To listen to the full version, you need to buy a license 🎧.</i>"
|
msgstr "<i>Это демонстрационная версия трека. Чтобы прослушать полную версию, необходимо приобрести лицензию 🎧.</i>"
|
||||||
|
|
||||||
#: app/client_bot/routers/content.py:32
|
#: app/client_bot/routers/content.py:32
|
||||||
msgid "error_contentNotFound"
|
msgid "error_contentNotFound"
|
||||||
msgstr "❗ Error: Content not found"
|
msgstr "❗ Ошибка: Контент не найден"
|
||||||
|
|
||||||
#: app/client_bot/routers/content.py:37
|
#: app/client_bot/routers/content.py:37
|
||||||
msgid "error_contentPrice"
|
msgid "error_contentPrice"
|
||||||
msgstr "❗ Error: Content price is not set"
|
msgstr "❗ Ошибка: Цена контента не установлена"
|
||||||
|
|
||||||
#: app/client_bot/routers/content.py:133
|
#: app/client_bot/routers/content.py:133
|
||||||
msgid "viewTrack_button"
|
msgid "viewTrack_button"
|
||||||
msgstr "▶️ Open in Mini-App"
|
msgstr "▶️ Открыть в мини-приложении"
|
||||||
|
|
||||||
#: app/client_bot/routers/content.py:138
|
#: app/client_bot/routers/content.py:138
|
||||||
msgid "cancelPurchase_button"
|
msgid "cancelPurchase_button"
|
||||||
msgstr "❌ Cancel Purchase"
|
msgstr "❌ Отменить покупку"
|
||||||
|
|
||||||
msgid "openContractPage_button"
|
msgid "openContractPage_button"
|
||||||
msgstr "🔗 Open Smart Contract"
|
msgstr "🔗 Открыть смарт-контракт"
|
||||||
|
|
||||||
msgid "noWalletConnected"
|
msgid "noWalletConnected"
|
||||||
msgstr "❗ No wallet connected"
|
msgstr "❗ Кошелек не подключен"
|
||||||
|
|
||||||
msgid "openTrackInApp_button"
|
msgid "openTrackInApp_button"
|
||||||
msgstr "📱 Open in App"
|
msgstr "📱 Открыть в приложении"
|
||||||
|
|
||||||
msgid "p_licenseWasBought"
|
msgid "p_licenseWasBought"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"💶 {username} just purchased a <a href={nft_address}>license</a> for <b>{content_title}</b>. 👏\n"
|
"💶 {username} только что приобрёл <a href={nft_address}>лицензию</a> на <b>{content_title}</b>. 👏\n"
|
||||||
"Your content is gaining popularity! Keep creating and inspiring 🚀."
|
"Ваш контент набирает популярность! Продолжайте творить и вдохновлять 🚀."
|
||||||
|
|
||||||
|
#: app/api/routes/_blockchain.py:150 app/bot/routers/tonconnect.py:90
|
||||||
|
#: app/core/background/indexer_service.py:141 app/bot/routers/tonconnect.py:92
|
||||||
|
#: app/core/background/indexer_service.py:156 app/api/routes/_blockchain.py:149
|
||||||
|
#: app/client_bot/routers/tonconnect.py:94
|
||||||
msgid "p_uploadContentTxRequested"
|
msgid "p_uploadContentTxRequested"
|
||||||
msgstr "⏳ Transaction for uploading {title} has been requested. Please confirm the transaction and wait for the notification. Content conversion may take up to 20 minutes."
|
msgstr ""
|
||||||
|
"Поздравляем! Вы успешно загрузили свой контент!\n"
|
||||||
|
"Доступ к нему появится в течение нескольких минут.\n"
|
||||||
|
"Увeдомление c загруженным контентом придет к вам в чат <a href=\"https://t.me/MY_Web3Bot\">MY Player</a>\n"
|
||||||
|
"Успешных продаж!"
|
||||||
|
|
||||||
msgid "shareLink_button"
|
msgid "shareLink_button"
|
||||||
msgstr "🔗 Share Link"
|
msgstr "🔗 Поделиться ссылкой"
|
||||||
|
|
||||||
msgid "p_shareLinkContext"
|
msgid "p_shareLinkContext"
|
||||||
msgstr "🎉 Enjoy {title} on MY!"
|
msgstr "🎉 Наслаждайтесь {title} на MY!"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue