Как устранить ошибку при скачивании файла с помощью pytube?

Добрый день! Я решил написать мини-программу для скачивания видео или аудио-дорожки с YouTube. При запуске кода возникает ошибка "путь не найден", когда я пытаюсь скачать аудиодорожку с названием "VIDEOCLUB - Amour plastique (Lyrics / Paroles)". Я предполагаю, что это происходит из-за символа '/' в названии. Как грамотно обработать эту ошибку, чтобы видео можно было успешно скачать и наслаждаться просмотром?
  • 3 января 2025 г. 10:23
Ответы на вопрос 2
Добрый день!

При скачивании файлов с помощью `pytube`, как вы правильно заметили, наличие недопустимых символов в названии файла, таких как `/`, может привести к ошибке "путь не найден". Чтобы избежать этой проблемы, можно воспользоваться заменой недопустимых символов на допустимые или удалением их.

Вот пример того, как можно обработать название файла перед его сохранением:

```python
from pytube import YouTube
import os
import re

def sanitize_filename(filename):
    # Удалим недопустимые символы
    return re.sub(r'[<>:"/\\|?*\']', '_', filename)

def download_audio(video_url):
    try:
        # Создает объект YouTube
        yt = YouTube(video_url)
        
        # Получаем аудиодорожку
        audio_stream = yt.streams.filter(only_audio=True).first()
        
        # Санируем имя файла
        filename = sanitize_filename(yt.title)
        
        # Скачиваем аудиофайл
        audio_stream.download(filename=filename + ".mp3")
        print(f"Файл '{filename}.mp3' успешно скачан!")
    except Exception as e:
        print(f"Произошла ошибка: {e}")

# Пример использования
video_url = "https://www.youtube.com/watch?v=ваш_идентификатор_видео"
download_audio(video_url)
```

### Объяснение кода:
1. **Функция `sanitize_filename(filename)`**: Заменяет все недопустимые символы на нижнее подчеркивание (`_`). Вы можете изменить символ замены по вашему усмотрению.
2. **Функция `download_audio(video_url)`**: 
    - Создает объект `YouTube` по заданной ссылке.
    - Получает первую доступную аудиодорожку.
    - Вызывает функцию `sanitize_filename` для обработки названия видео.
    - Скачивает аудиофайл с санированным именем в формате `.mp3`.

### Дополнительные рекомендации:
- Вы можете расширить `sanitize_filename`, если хотите обрабатывать другие символы или добавлять дополнительные правила.
- Убедитесь, что у вас установлена последняя версия `pytube`, так как в старых версиях могут быть проблемы с доступом к потокам. 

Теперь, при запуске данной программы, вы сможете скачать файлы с допустимыми именами, избегая ошибок из-за недопустимых символов.
У вас ошибка в os.rename(file, f"{path}/{file_name}.mp3") 
video.download(f'{path}') очищает имя скачиваемого файла от недопустимых символов, но в file_name они остаются, поэтому он и не находит f"{path}/{file_name}.mp3

Этот код должен отрабатывать правильно:
# Функция для очистки имени файла от недопустимых символов
def clean_filename(filename):
    # Заменяем все недопустимые символы на подчеркивания
    return re.sub(r'[\\/*?:"<>|]', '_', filename)

async def install_data(link: str, file_name: str, _type: str, path: str, _lang: str):
    language = lang[_lang]
    try:
        video = YouTube(link)

        if _type == 'audio':
            video = video.streams.get_audio_only()

        if _type == 'video':
            video = video.streams.get_highest_resolution()

        # Очищаем имя файла от недопустимых символов
        clean_file_name = clean_filename(file_name)

        file = video.download(path)
        extension = 'mp3' if _type == 'audio' else 'mp4'
        os.rename(file, f"{path}/{clean_file_name}.{extension}")

        return language['success']

    except Exception as e:
        print(e)
        return f"{language['err']} + \n {e}"
Похожие вопросы