Moviepy error failed to read the duration of file

I'm trying to pass the video data pulled from a ModelsForm into a moviepy method, however the VideoFileClip() function is unable to read the duration of the file. I've checked the data I'm pulling...

I’m trying to pass the video data pulled from a ModelsForm into a moviepy method, however the VideoFileClip() function is unable to read the duration of the file.

I’ve checked the data I’m pulling in and it is the correct name. Currently the issue may be that I’m passing it in as a string. However, without this it returns an error : ‘Splitter’ object has no attribute ‘endswith’

Please see the error and my code below. Thanks for your help!

Code
Models.py

Error Message

OSError at /highlights/
MoviePy error: failed to read the duration of file <highlights.splitter.Splitter object at 0x000001A82CE553D0>.
Here are the file infos returned by ffmpeg:

ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181017
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
<highlights.splitter.Splitter object at 0x000001A82CE553D0>: Invalid argument
Request Method: POST
Request URL:    http://127.0.0.1:8000/highlights/
Django Version: 3.0.1
Exception Type: OSError
Exception Value:    
MoviePy error: failed to read the duration of file <highlights.splitter.Splitter object at 0x000001A82CE553D0>.
Here are the file infos returned by ffmpeg:

ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181017
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
<highlights.splitter.Splitter object at 0x000001A82CE553D0>: Invalid argument
Exception Location: C:Program FilesPython38libsite-packagesmoviepyvideoioffmpeg_reader.py in ffmpeg_parse_infos, line 289
Python Executable:  C:Program FilesPython38python.exe
Python Version: 3.8.0
Python Path:    
['C:\Users\User\Documents\Codes\highlightreel',
 'C:\Program Files\Python38\python38.zip',
 'C:\Program Files\Python38\DLLs',
 'C:\Program Files\Python38\lib',
 'C:\Program Files\Python38',
 'C:\Program Files\Python38\lib\site-packages',
 'C:\Program Files\Python38\lib\site-packages\IPython\extensions']
Server time:    Wed, 1 Apr 2020 20:04:23 +0000

Traceback

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/highlights/

Django Version: 3.0.1
Python Version: 3.8.0
Installed Applications:
['highlights.apps.HighlightsConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:Program FilesPython38libsite-packagesmoviepyvideoioffmpeg_reader.py", line 285, in ffmpeg_parse_infos
    line = [l for l in lines if keyword in l][index]

During handling of the above exception (list index out of range), another exception occurred:
  File "C:Program FilesPython38libsite-packagesdjangocorehandlersexception.py", line 34, in inner
    response = get_response(request)
  File "C:Program FilesPython38libsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:Program FilesPython38libsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:UsersUserDocumentsCodeshighlightreelhighlightsviews.py", line 17, in video_form_upload
    Splitter(val)
  File "C:UsersUserDocumentsCodeshighlightreelhighlightssplitter.py", line 18, in __init__
    clip = mp.VideoFileClip(str(file))
  File "C:Program FilesPython38libsite-packagesmoviepyvideoioVideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "C:Program FilesPython38libsite-packagesmoviepyvideoioffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "C:Program FilesPython38libsite-packagesmoviepyvideoioffmpeg_reader.py", line 289, in ffmpeg_parse_infos
    raise IOError(("MoviePy error: failed to read the duration of file %s.n"

Exception Type: OSError at /highlights/
Exception Value: MoviePy error: failed to read the duration of file <highlights.splitter.Splitter object at 0x000001A82CE553D0>.
Here are the file infos returned by ffmpeg:

ffmpeg version 4.1 Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8.2.1 (GCC) 20181017
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth
  libavutil      56. 22.100 / 56. 22.100
  libavcodec     58. 35.100 / 58. 35.100
  libavformat    58. 20.100 / 58. 20.100
  libavdevice    58.  5.100 / 58.  5.100
  libavfilter     7. 40.101 /  7. 40.101
  libswscale      5.  3.100 /  5.  3.100
  libswresample   3.  3.100 /  3.  3.100
  libpostproc    55.  3.100 / 55.  3.100
<highlights.splitter.Splitter object at 0x000001A82CE553D0>: Invalid argument

UPDATE

Code

Error

AttributeError at /highlights/
'Splitter' object has no attribute 'endswith'
Request Method: POST
Request URL:    http://127.0.0.1:8000/highlights/
Django Version: 3.0.1
Exception Type: AttributeError
Exception Value:    
'Splitter' object has no attribute 'endswith'
Exception Location: C:Program FilesPython38libsite-packagesmoviepyvideoioffmpeg_reader.py in ffmpeg_parse_infos, line 244
Python Executable:  C:Program FilesPython38python.exe
Python Version: 3.8.0
Python Path:    
['C:\Users\User\Documents\Codes\highlightreel',
 'C:\Program Files\Python38\python38.zip',
 'C:\Program Files\Python38\DLLs',
 'C:\Program Files\Python38\lib',
 'C:\Program Files\Python38',
 'C:\Program Files\Python38\lib\site-packages',
 'C:\Program Files\Python38\lib\site-packages\IPython\extensions']
Server time:    Thu, 2 Apr 2020 00:57:52 +0000

Traceback

Environment:


Request Method: POST
Request URL: http://127.0.0.1:8000/highlights/

Django Version: 3.0.1
Python Version: 3.8.0
Installed Applications:
['highlights.apps.HighlightsConfig',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:Program FilesPython38libsite-packagesdjangocorehandlersexception.py", line 34, in inner
    response = get_response(request)
  File "C:Program FilesPython38libsite-packagesdjangocorehandlersbase.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:Program FilesPython38libsite-packagesdjangocorehandlersbase.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:UsersUserDocumentsCodeshighlightreelhighlightsviews.py", line 16, in video_form_upload
    splitter = Splitter(instance.video.path)
  File "C:UsersUserDocumentsCodeshighlightreelhighlightssplitter.py", line 20, in __init__
    clip = mp.VideoFileClip(file)
  File "C:Program FilesPython38libsite-packagesmoviepyvideoioVideoFileClip.py", line 88, in __init__
    self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt,
  File "C:Program FilesPython38libsite-packagesmoviepyvideoioffmpeg_reader.py", line 35, in __init__
    infos = ffmpeg_parse_infos(filename, print_infos, check_duration,
  File "C:Program FilesPython38libsite-packagesmoviepyvideoioffmpeg_reader.py", line 244, in ffmpeg_parse_infos
    is_GIF = filename.endswith('.gif')

Exception Type: AttributeError at /highlights/
Exception Value: 'Splitter' object has no attribute 'endswith'

#python #video #ffmpeg #get #moviepy

Вопрос:

После использования moviepy было показано, что это сработало, все обновлено. Я не вижу проблем с кодом, но каким-то образом он возвращает ошибку.

 raise IOError(("MoviePy error: failed to read the duration of file %s.n"
 

Ошибка ОС: ошибка MoviePy: не удалось прочитать продолжительность файла ./Memes_APR_2021_V8/2546583872676854731-pubity-750-1333.mp4.
Вот информация о файле, возвращенная ffmpeg:

ffmpeg версия 4.2.2 Авторское право (c) 2000-2019 разработчики FFmpeg создали с помощью gcc 9.2.1 (GCC) 20200122 конфигурация: —включить-gpl —включить-version3 —включить-sdl2 —включить-fontconfig —включить-gnutls —включить-iconv —включить-libass —включить-libdav1d —включить-libbluray —включить-libfreetype —включить-libmp3lame —включить-libopencore-amrnb —включить-libopencore-amrwb —включить-libopenjpeg —включить-libopus —включить-libshine —включить-libsnappy —включить-libsoxr —включить-libtheora —включить-libtwolame —включить-libvpx —включить-libwavpack —включить-libwebp —включить-libx264 —включить-libx265 —включить-libxml2 —включить-libzimg —включить-lzma —включить-zlib —включить-gmp —включить-libvidstab —включить-libvorbis —включить-libvo-amrwbenc-включить-libmysofa-включить-libspeex-включить-libxvid-включить-libaom-включить-libmfx-включить-amf-включить-ffnvcodec-включить-cuvid-включить-d3d11va-включить-nvenc-включить-nvdec-включить-dxva2-включить-avisynth-включить-libopenmpt libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 [mov,mp4,m4a,3gp,3g2,mj2 @ 00000208f86182c0] Формат mov,mp4,m4a,3gp,3g2,mj2 обнаружен только при низком балле 1, возможно неправильное обнаружение! [mov,mp4,m4a,3gp,3g2,mj2 @ 00000208f86182c0] атом moov не найден ./Memes_APR_2021_V8/2546583872676854731-pubity-750-1333.mp4: При обработке входных данных обнаружены неверные данные.

То, что он делает, это: захват видео из моей библиотеки и создание видео с ними, вот и все…

Как мне заставить это работать?

У меня возникла проблема с этой проблемой, когда я делаю загрузчик видео.
Код ниже:

    videoclip = VideoFileClip(fr'{directory}audio{yt.title}.mp4')

    duration = videoclip.duration

    print(duration)

    audioclip = videoclip.audio
    audioclip.write_audiofile(fr"{directory}{yt.title}.mp3")
    audioclip.close()
    videoclip.close()

Выход:

145
MoviePy error: failed to read the duration of file C:UsersachutDesktopMoviesaudioWinning With Half A Heart | Minecraft Skywars.mp4.
Here are the file infos returned by ffmpeg:

ffmpeg version 4.2.2 Copyright (c) 2000-2019 the FFmpeg developers
  built with gcc 9.2.1 (GCC) 20200122
  configuration: --enable-gpl --enable-version3 --enable-sdl2 --enable-fontconfig --enable-gnutls --enable-iconv --enable-libass --enable-libdav1d --enable-libbluray --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libopus --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libtheora --enable-libtwolame --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libzimg --enable-lzma --enable-zlib --enable-gmp --enable-libvidstab --enable-libvorbis --enable-libvo-amrwbenc --enable-libmysofa --enable-libspeex --enable-libxvid --enable-libaom --enable-libmfx --enable-amf --enable-ffnvcodec --enable-cuvid --enable-d3d11va --enable-nvenc --enable-nvdec --enable-dxva2 --enable-avisynth --enable-libopenmpt
  libavutil      56. 31.100 / 56. 31.100
  libavcodec     58. 54.100 / 58. 54.100
  libavformat    58. 29.100 / 58. 29.100
  libavdevice    58.  8.100 / 58.  8.100
  libavfilter     7. 57.100 /  7. 57.100
  libswscale      5.  5.100 /  5.  5.100
  libswresample   3.  5.100 /  3.  5.100
  libpostproc    55.  5.100 / 55.  5.100
C:UsersachutDesktopMoviesaudioWinning With Half A Heart | Minecraft Skywars.mp4: Invalid argument

По какой-то странной причине он может распечатать продолжительность видео, но, по-видимому, не может ее найти, когда я пытаюсь сохранить звук из видео в виде отдельного файла.

Спасибо за помощь! Я использую последнюю версию moviepy и ее зависимостей, я только что установил ее сегодня.

We are recording videos from the browser with the following encoding
‘video/webm; codecs=»vp8, opus»‘, then we upload these videos to an AWS S3 bucket.
Our ML model works on these videos, and one of the models needs to extarct the audio and process it.
Here is a code snapit for extracting the audio

import speech_recognition as sr
import moviepy.editor as me
from denoise2 import denoise
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import math

model_name = 'bert-base-nli-mean-tokens'
model = SentenceTransformer(model_name)


class recomm:
    y = 0.0

    def __init__(self, path, keywords):
        video_clip = me.VideoFileClip(r"{}".format(path))
        path2 = "y2.wav"
        video_clip.audio.write_audiofile(r"{}".format(path2), nbytes=2)
        recognizer = sr.Recognizer()
        """a = AudioSegment.from_wav(path2)
        a = a + 5
        a.export(path2, "wav")"""
        audio_clip = sr.AudioFile("{}".format(path2))
        with audio_clip as source:
            audio_file = recognizer.record(source)
        sent = []
        result = ""
        try:
            result = recognizer.recognize_google(audio_file)
        except sr.UnknownValueError:
            print("Can not process audio ")
        if not result:
            self.y = 0
        else:
            print(result)
            sent.append(result)
            sent = sent + keywords
            sent_vec3 = model.encode(sent)
            x = cosine_similarity(
                [sent_vec3[0]],
                sent_vec3[1:]
            )
            for i in range(len(x)):
                self.y = self.y + x[0][i]
            self.y = (self.y / (len(sent) - 1)) * 1000.0

    def res(self):
        if self.y < 0:
            self.y = 0
        return self.y

And that’s the traceback,
the error occurred at this line

video_clip = me.VideoFileClip(r"{}".format(path))
Traceback (most recent call last): File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_reader.py", line 286, in ffmpeg_parse_infos match = re.findall("([0-9][0-9]:[0-9][0-9]:[0-9][0-9].[0-9][0-9])", line)[0] IndexError: list index out of range During handling of the above exception, another exception occurred: Traceback (most recent call last): File "main.py", line 90, in <module> main() File "main.py", line 85, in main interviews_channel.start_consuming() File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 1865, in start_consuming self._process_data_events(time_limit=None) File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 2026, in _process_data_events self.connection.process_data_events(time_limit=time_limit) File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 833, in process_data_events self._dispatch_channel_events() File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 567, in _dispatch_channel_events impl_channel._get_cookie()._dispatch_events() File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/pika/adapters/blocking_connection.py", line 1492, in _dispatch_events consumer_info.on_message_callback(self, evt.method, File "main.py", line 79, in callback processing(json.loads(body)) File "main.py", line 34, in processing r = recomm(path, keywords) File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/recommendation.py", line 17, in _init_ video_clip = me.VideoFileClip(r"{}".format(path)) File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/moviepy/video/io/VideoFileClip.py", line 88, in _init_ self.reader = FFMPEG_VideoReader(filename, pix_fmt=pix_fmt, File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_reader.py", line 35, in _init_ infos = ffmpeg_parse_infos(filename, print_infos, check_duration, File "/home/medo/Dev/Smart-remotely-interviewing-system/backend/Process-interview/test/lib/python3.8/site-packages/moviepy/video/io/ffmpeg_reader.py", line 289, in ffmpeg_parse_infos raise IOError(("MoviePy error: failed to read the duration of file %s.n" OSError: MoviePy error: failed to read the duration of file 74b74292-3642-486a-8319-255bb7e7da5a-1647363285285.webm. Here are the file infos returned by ffmpeg: ffmpeg version 4.2.2-static https://johnvansickle.com/ffmpeg/ Copyright (c) 2000-2019 the FFmpeg developers built with gcc 8 (Debian 8.3.0-6) configuration: --enable-gpl --enable-version3 --enable-static --disable-debug --disable-ffplay --disable-indev=sndio --disable-outdev=sndio --cc=gcc --enable-fontconfig --enable-frei0r --enable-gnutls --enable-gmp --enable-libgme --enable-gray --enable-libaom --enable-libfribidi --enable-libass --enable-libvmaf --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-librubberband --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libvorbis --enable-libopus --enable-libtheora --enable-libvidstab --enable-libvo-amrwbenc --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libdav1d --enable-libxvid --enable-libzvbi --enable-libzimg libavutil 56. 31.100 / 56. 31.100 libavcodec 58. 54.100 / 58. 54.100 libavformat 58. 29.100 / 58. 29.100 libavdevice 58. 8.100 / 58. 8.100 libavfilter 7. 57.100 / 7. 57.100 libswscale 5. 5.100 / 5. 5.100 libswresample 3. 5.100 / 3. 5.100 libpostproc 55. 5.100 / 55. 5.100 Input #0, matroska,webm, from '74b74292-3642-486a-8319-255bb7e7da5a-1647363285285.webm': Metadata: encoder : Chrome Duration: N/A, start: 0.000000, bitrate: N/A Stream #0:0(eng): Audio: opus, 48000 Hz, mono, fltp (default) Stream #0:1(eng): Video: vp8, yuv420p(progressive), 640x480, SAR 1:1 DAR 4:3, 29.42 fps, 29.42 tbr, 1k tbn, 1k tbc (default) Metadata: alpha_mode : 1 At least one output file must be specified

Specifications

  • Python Version: 3.8.10
  • Moviepy Version: 1.0.3
  • Platform Name: Ubuntu
  • Platform Version: 20.04 LTS

Понравилась статья? Поделить с друзьями: