LINUX.ORG.RU

python+youtube-dl+кириллица = абракадабра

 , ,


0

1

Добрый день. Пишу небольшой скрипт для скачивания видео с ютуба. задача: получить строку с именем сохраняемого файла. Столкнулся с такой проблемой:

import subprocess

comand = " youtube-dl --get-title " + message.text
save_file = check_output(comand, shell = True)
save_file = str(save_file)

если заголовок на латинице - всё норм. если на русском, то получаю какую-то абракадабру вроде bxd0x9cxd0x95xd0xa2xd0x95xd0x9bxd0xacn

Подскажите как починить?

p.s. еще youtube-dl --get-title добавляет в начало и конец строки символы b' и \n'. Можно же конечно убрать средствами python, но можно это как-то получить используя youtube-dl или yt-dlp?


Ответ на: комментарий от eternal_sorrow

Сразу три коммента, и ни одного по делу.

не делай так без необходимости

Почему?

Ну и вообще, youtube-dl можно подключить как модуль на питоне, не нужно запускать его через subprocess.

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

то может лучше подучишь язык прежде чем на нём писать?

Как я могу подучить язык не писав на нем программы?

ofp
() автор топика
Ответ на: комментарий от t184256

Забавно, вчера не гуглилось, поэтому

но я там не нашел как получить заголовок, только как указать имя сохраняемого файла

Сейчас нашел решение

ydl_opts = {}
     with youtube_dl.YoutubeDL(ydl_opts) as ydl:
      meta = ydl.extract_info(message.text, download = False)
     save_file=(meta['artist'])+"-"+(meta['title'])
все легко и просто и проблема с кодировкой ушла.

.decode не пригодился.

ofp
() автор топика
Ответ на: комментарий от ofp

Почему?

Потому что с shell = True нужно внимательно следить что ты экранируешь все спецсимволы шелла. Иначе можно патч бармина запустить (или что похуже).

знаю, но я там не нашел

Так ищи дальше, пока не найдёшь. Мог бы даже прийти сюда и спросить, как это сделать. Может кто нибудь добрый поискал бы за тебя. По крайней мере это было бы полезнее для тебя как для начинающего программиста - умение работать с документацией.

Как я могу подучить язык не писав на нем программы?

Так ты это делаешь для обучения? Ну тогда иди и читай документацию до просветления, зачем ты сюда то пришёл? Ну или по крайней мере задавай более продуктивные вопросы, например «откуда у моей программы в выводе берутся эти символы?».

Ну и да, давай код целиком а не вот эти кусочки.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от ofp

не гуглилось

А ты не гугли. Открывай официальную документацию и ищи там нужную тебе функцию. Если ты говоришь, что учишься программировать, учись делать так как это делает программист а не макака.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Ну тогда иди и читай документацию до просветления, зачем ты сюда то пришёл?

ну ты умный. а зачем тогда нужен форум, как не в помощи при освоении информации. А то так на каждый вопрос можно отвечать «rtfm!».

Ну тогда иди и читай документацию до просветления

https://github.com/yt-dlp/yt-dlp/blob/master/README.md 113 совпадений по слову title. но нужного я не нашел. поэтому и обратился за помощью.

Ну и да, давай код целиком а не вот эти кусочки.

специально не стал выкладывать всё, чтобы никого не травмировать. Вроде задал конкретный вопрос, обозначил конкретную задачу, чего еще надо?

ofp
() автор топика
Ответ на: комментарий от ofp

113 совпадений по слову title. но нужного я не нашел

Первый попавшийся пример из Readme, возможно есть и более компактный подход распечатать title:

$ yt-dlp --print filename -o "%(title)s" 9ELC941rjm0
Прикольные моменты из «Винни-Пуха»


p.s. Обычно не хватает практических примеров, да, чтобы подсмотреть решение. И гугл часто не выдает нужного рецепта…, может запрос сформирован не корректно, как говорится «правильно заданный вопрос - половина ответа (c)». :)

UPD.


$ yt-dlp --get-title 9ELC941rjm0
Прикольные моменты из «Винни-Пуха»

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от ofp

А то так на каждый вопрос можно отвечать «rtfm!».

На тупой вопрос - не только можно, но и нужно.

https://github.com/yt-dlp/yt-dlp/blob/master/README.md

Ключевая строчка вот:

Most likely, you’ll want to use various options. For a list of options available, have a look at yt_dlp/YoutubeDL.py.

Апи не докуметировано как следует и предлагается за более подробной документацией смотреть код. Код кстати прокомментирован довольно подробно.

Вроде задал конкретный вопрос

Глупый вопрос, отвечать на который не только не нужно, но и вредно.

eternal_sorrow ★★★★★
()
Ответ на: комментарий от eternal_sorrow

На тупой вопрос - не только можно, но и нужно.

рука-лицо... так на каждый вопрос появится «мудрец» который скажет что вопрос - говно.

Апи не докуметировано как следует и предлагается за более подробной документацией смотреть код.

мой уровень позволяет читать документацию, но до уровня чтения исходников мне еще далеко. И мне теперь нельзя попросить о помощи более опытных?

Дядь Петь, ты дурак? (с)

ofp
() автор топика

Указывай кодировку в начале py-файла,
используй функции преобразования:

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

import os, sys, ...

#Включение UTF-8 для второго питона
if sys.version_info.major == 2:
  reload(sys)
  sys.setdefaultencoding('utf-8')

#Что угодно в UTF-8
def to_utf8(val, depth=10):
  res = val
  if depth>0:
    if isinstance(val, str):
      res = val.decode('utf-8', 'ignore')
      #res = unicode(val, 'utf-8')
      #print(res)
    elif isinstance(val, list):
      i = 0
      for v in val:
        val[i] = to_utf8(v, depth-1)
        i += 1
    elif isinstance(val, tuple):
      val = list(val)
      i = 0
      for v in val:
        val[i] = to_utf8(v, depth-1)
        i += 1
    elif isinstance(val, dict):
      for key in val:
        val[key] = to_utf8(val[key], depth-1)
  return res

Часто это влияет на поведение с кодировкой.

Novator ★★★★★
()
Ответ на: комментарий от eternal_sorrow

Код там так же «прекрасен», как и «документация», когда пытаешься что-то серьёзное сделать, в себя приходишь уже по колено в коде. Хвала богам, ТСу не так много от него нужно было.

t184256 ★★★★★
()
Ответ на: комментарий от ofp

Там вроде между 2ым и 3им есть большая разница. Я взялся за третий. не критично?

Нет, я привёл пример по кодировке.
Замени «python2» на «python3».

Вот ключевая строка:
# -*- coding: utf-8 -*-

Novator ★★★★★
()
Последнее исправление: Novator (всего исправлений: 1)

Питон язык поверхностного уровня и в этом в том числе его сила

import os

os.system(...

os.popen(...


выше указали как youtube-dl с какими ключами

основной посыл питона - не нужно писать уже написаное - если тока не какая то оптимизация али фича - т/е запускай команды парсь ответы

qulinxao3
()