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?


shell = True

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

eternal_sorrow ★★★★★
()

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

eternal_sorrow ★★★★★
()

добавляет в начало и конец строки символы b’ и \n’.

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

eternal_sorrow ★★★★★
()

Кодирование URL, нужно брать данные в hex значениях и склеить как сырые байты в строку. Хотя там должно быть через % а у тебя… Лень проверять.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

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

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

Почему?

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

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

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

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

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

можно это как-то получить используя youtube-dl или yt-dlp?

Да. Они написаны на питоне, и никакой subprocess для их использования не нужен => и твоей проблемы с забытым .decode() не будет.

t184256 ★★★★★
()
Ответ на: комментарий от 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
() автор топика
Ответ на: комментарий от krasnh

Спасибо, но я лучше останусь на своем решении. оно более развернуто.

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 ★★★★★
()
Ответ на: комментарий от ofp

И мне теперь нельзя попросить о помощи более опытных?

Можно, но сперва научись задавать вопросы. Почитай, что такое XY проблема что ли.

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

омг.. какая махина. Постараюсь разобраться, спасибо :)

#!/usr/bin/env python2

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

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

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

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

Не старайся, к твоей задаче это прямое включение из прошлого века относится приблизительно никак.

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

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

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

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

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

Порошок, уходи, не смущай, нет больше проблем с кодировкой.

t184256 ★★★★★
()

Ого, сколько обсуждения вокруг говна, но ни одного вепроса вокруг comand.

Anoxemian ★★★★★
()

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

import os

os.system(...

os.popen(...


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

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

qulinxao3 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.