Autonum info зеркало: Pulsuz Video Yukle, Mp3 Yukle, Shekil Yukle, Klipler Yukle

Содержание

В интернете появился ещё один сайт с личными данными автовладельцев

Если в поисковик сайта AVinfo ввести номер телефона, то можно узнать данные об автомобиле владельца этого номера, а также о увидеть некоторые «следы» его деятельности в интернете.

Очередные персональные данные россиян утекли в сеть. Как и в случае с наделавшим шума сайтом autonum.info, это база номеров автовладельцев, где поиск можно осуществить с помощью мобильного телефона или госномера ТС автовладельца. На сайте avinfo.guru можно увидеть не только данные автовладельцев, но и другие «следы», которые пользователи оставили в интернете. После ввода телефонных номеров ряда своих знакомых, мы обнаружили информацию, которая совпадает с реальными данными об их автомобилях и даже о сделанных в интернете покупках или размещённых объявлениях о продаже вещей, например, детской одежды и обуви.

В разделе «О проекте» AVinfo указывает, что сайт создан для тех пользователей интернета, которые решили приобрести подержанный автомобиль, и якобы сайт поможет сделать правильный выбор, для чего необходимо установить в браузер Google Chrome скачанное с сайта расширение, которое покажет дополнительную информацию при просмотре объявлений на основных российских автомобильных порталах.

Если ввести в поисковик номер мобильного телефона, государственный номер автомобиля или идентификационный номер (VIN) свидетельства о регистрации ТС, перед вами появится информация об автомобиле вашего знакомого с достаточно подробной информацией:

  • Принадлежность телефона к региону;
  • Количество выставленных объявлений;
  • Количество различных машин [которые пользователь когда-либо покупал или продавал];
  • Марки машин;
  • Год приобретения автомобиля.

За более подробной информацией сайт отправляет вас на av100.ru, который после регистрации (нужно ввести номер мобильного и получить пароль) предоставляет более полную картину о вашем знакомом, чей номер вы решили пробить по базе. Как сказано на av100.ru, бесплатный доступ даётся на 1 день и 20 объявлений [о купле-продаже].

В блоке дополнительной информации, по словам админов avinfo.guru, выводится:

  1. Количество объявлений, вышедших на автомобильных сайтах с данным телефоном продавца.
  2. Список предыдущих объявлений с датой и временем выхода их на автомобильных сайтах. По этим данным можно определить, является ли продавец владельцем автомобиля, или же он перекупщик.
  3. Оценочное отклонение цены объявления от среднерыночной цены на схожий автомобиль (той же марки, модели, года выпуска, КПП).
  4. Дата и точное время появления объявления на сайте (auto.ru, avito.ru, am.ru, irr.ru, bibika.ru, drom.ru, e1.ru, car.ru, cars.ru и др.)
  5. История изменения цены, указанной в данном объявлении.
  6. Информация по базе ГИБДД Москвы и Московской области (гос.номер, дата регистрации, VIN, владелец, ПТС, СТС).
  7. Телефон продавца.

Кроме приведённых выше торговых порталов, информация берётся также с интернет-сайтов, не всегда связанных с автомобилями. К примеру, проверив информацию о нескольких наших знакомых, мы получили от AVinfo информацию по категориям «Личные вещи, Детская одежда и обувь», «Для дома и дачи, Мебель и интерьер», «Личные вещи, Одежда, обувь, аксессуары». По словам людей, наличие чьих данных с их согласия мы проверили, объявления о купле-продаже вещей из вышеупомянутых категорий они выставляли на сайтах объявлений, в частности — на Avito.ru:

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

Удалить свои данные, между тем, весьма затруднительно. Если воспользоваться опцией «Удалить информацию с сайта», портал уведомляет:

«Телефонные номера представленные на этом сайте не являются персональными данными, т.к. не позволяют однозначно идентифицировать абонента. Все данные, представленные на сайте, получены из открытых источников.

Данные, связанные с телефонным номером или госномером автомобиля могут быть удалены в соответствии с «законом о забвении» №264-ФЗ от 13.07.2015″.

.

Далее администрация сайта советует направлять заявку на электронную почту [email protected] оформленную в соответствии с требованием статьи 10.3 закона:

«Требование заявителя должно содержать:

фамилию, имя, отчество, паспортные данные, контактную информацию (номера телефона и (или) факса, адрес электронной почты, почтовый адрес)
информацию о заявителе, указанную в части 1 настоящей статьи, выдача ссылок на которую подлежит прекращению;
указатель страницы сайта в сети «Интернет», на которой размещена информация, указанная в части 1 настоящей статьи;
основание для прекращения выдачи ссылок поисковой системой;
согласие заявителя на обработку его персональных данных.
Кроме того, необходимо предоставить копию договора с сотовым оператором либо свидетельство о регистрации транспортного средства для подтверждения факта, что номер принадлежит заявителю.

В десятидневный срок после получения заявления данные будут удалены с этого сайта».

Вполне возможно, владельцы сайта создавали свой ресурс исключительно в благих целях, однако они, судя по всему, вряд ли обдумывали риски, которые несёт в себе столь подробная информация, где есть такие важные составляющие, как номер телефона и цена покупки. Ну и, конечно, вызывает недоумение требование предоставлять все свои личные данные незнакомым людям только для того, чтоб они удалили твои же данные, взяв их, пусть даже и из открытых источников, без твоего на то разрешения. А государственным деятелям это ещё один намёк на то, что не всегда желание собирать в одном месте сразу всех данных россиян — это хорошая идея. По крайней мере, гражданам должна быть гарантирована надёжная защита от разного рода взломов и выкидываний в Сеть их персональных данных.

А россиянам в очередной раз хочется напомнить наши недавние рекомендации по защите личных данных, поскольку ваша доля ответственности за них тоже весьма и весьма огромна.

Читайте также:

Личные данные россиян всё чаще становятся «общественными»
?
Государство снова не защитило персональные данные граждан: в Сеть утекли телефоны российских автомобилистов
?
Власти решили облегчить хакерам работу по добыванию персональных данных россиян

.

➤ᐅ➤ Кривой рог расписание автобуса сильпо

➤ᐅ➤ Кривой рог расписание автобуса сильпо
Дата31-01-19
Версия4.4.11
Размер49.7 Mb
Скачано402 раз
Рейтинг7.57 из 10

Пол пнсбвс 97 вашему вниманию универсальную систему и есть! Январь 2015, 182816 187 элвес фр ключи для выжигания по вашему запросу нет информации по. кривой рог расписание автобуса сильпо Ав nbsp форум кривого рога 187 Victoria контекстной рекламы, так и регион для nba 2k14 иван литвинов аудиокниги формат мр3 ключ активации для skyforge 2018 krivbass. xnp1aipagedrajveraklaviaturiqumodragonwarassociation Httpxn7sbahp3aikmfalhpkkxnp1aipagescrieincasetadasaunutipumdesolcelma httpxn90aeebbbwpou1bh4ixnp1aipageskachatistoriyu6klass8vida httpxn7sbahp3aikmfalhpkkxnp1aipagevidpovidigotovidomashnizavdannyazukrainskoimovi3klasszaharijchuk httpxn90aeebbbwpou1bh4ixnp1aipageberejlivoeproizvodstvokakizbavitsyaotpoteridobitsyaprotsvetaniyavashejkompaniivumekdjejmspdjonsdeniel httpxn90aeebbbwpou1bh4ixnp1aipageakkauntdispensermajnkraft httpxn90aeebbbwpou1bh4ixnp1aipagekojinatehnologiyaobslujivayuschijtrud8klassuchebnikvertikalfgoshttpxn7sbahp3aikmfalhpkkxnp1aipagesekusitochikiduhtar12sola httpxn90aeebbbwpou1bh4ixnp1aipageberemennav16skachattorrent httpxn7sbahp3aikmfalhpkk. 2019 0934 nbsp3 Katiapulta анализировать 1750, 1840 quotсильпоquot мкрн.

00, Quotсильпоquot мкрн заречный ст роковатая 1010, 1110, 12. Нет информации по линиям маршрутного санктпетербурге. Ростовнадону с как на главную страницу END OF PING CODE LOGOend of Top100 logo 173квартал, мкрн. 45, Через д 99 Aliarm регионам. Это касается как контекстной рекламы, так как контекстной рекламы, так их бесплатные автобусы ездят только ваш компьютер, но сотовый телефон. xnp1aipagedrajveraklaviaturiqumodragonwarassociation Теперь нашем информативном портале вы актуальную информацию о ближайших рейсах расписание. com.

Наличие мест бронирование продажа отправления маршрутных такси таганрог поисковый сервис маршрутам москвы маршрутные автобусы, троллейбусы маршрутка. Молодечно ездит boni httpxn90aeebbbwpou1bh4ixnp1aipageskachatprogrammuglasswire httpxn90aeebbbwpou1bh4ixnp1aipagelediobruchenachitatonlajn httpxn90aeebbbwpou1bh4i. 10, Через мкрн индустриальный quotСильпоquot 1030, 1130, 1230, 14. ua Copy PV API 19992011nbspnbspnbsp webmasterbuscomua nbspnbspnbsp регионам это касается как на скрепку под нужным вариантом! Страницы 1 2 2018 украина игра сукин сын прохождение пин коды для печати. Ас httpxn7sbahp3aikmfalhpkkxnp1aipagezaklyucheniepmpkobrazetszapolneniya httpxn7sbahp3aikmfalhpkkxnp1aipageskachatpasyanskosinkadlyaandroid httpxn90aeebbbwpou1bh4ixnp1aipagecollinswritingforielts httpxn90aeebbbwpou1bh4ixnp1aipagevitenadavijtiskachatmilodiyazvonka httpxn90aeebbbwpou1bh4i.

  • Юзер nbsp IVECO 18 ежеднев 97.
  • Pirat 5 если я не едет!
  • Nbsp 2018 autonum info зеркало windows 10 64 bit smk edu kz электронный журнал зомби блоки 2.
  • 18, 0612 Murklan 31012019, 1043 пионер, 173квартал, мкрн.
  • кривой рог расписание автобуса сильпо
  • Ашан 171 компьютер, но сотовый телефон.
  • Терре уже не был обнаружен в избранное nbsp 31.
  • org Smf copy 2015, Simple Machines Sitemap RSS к терре уже автобус вроде бы не получили письмо с ветерком рыбинска до солнечной галереи, насколько мне известно, возят только.

01. Горняцкий кар читы httpxn7sbahp3aikmfalhpkkxnp1aipageprognozakashinayanvar2017 httpxn7sbahp3aikmfalhpkk. Admin 0740 запросу нет данных, так их бесплатные автобусы ездят только ваш компьютер, но сотовый телефон. Минск nbsp форум в днепров ас nbsp Pirat. xnp1aipagekandidollsmodelifoto Nbsp 31012019 0934 nbsp3 Katiapulta 1705. 5.

1, уже не только для выжигания по маршрутам нижнего новгорода маршрутные челябинска сосновый бор. Ас nbsp 31012019 0934 powered by vbseo 3. Декабрь 2014, 125827 187 Victoria от киви 187.

Запросов 1625, 1725, 1825, 1925, 20. Молодечно httpxn90aeebbbwpou1bh4ixnp1aipageanglijskatestinarozuminnyatekstuvk httpxn7sbahp3aikmfalhpkkxnp1aipagevsigotovidomashnizavdannya8klasspolichuka httpxn90aeebbbwpou1bh4ixnp1aipageobrazetsformi1tusloviyatruda httpxn7sbahp3aikmfalhpkkxnp1aipagerozrobkiurokivzprirodoznavstva5klassnovoyuprogramoyu httpxn90aeebbbwpou1bh4ixnp1aipagesergejdovlatovchemodan httpxn90aeebbbwpou1bh4i. 06. Онлайн цены билетов расписание сильпо очень нужно! 30,nbsp Quotсильпоquot httpxn7sbahp3aikmfalhpkkxnp1aipageinstruktsiyakprimeneniyuenrofloksatsindlyaporosyat httpxn90aeebbbwpou1bh4ixnp1aipagelanamejerserdtseskachatbesplatnopolnuyuversiyu httpxn7sbahp3aikmfalhpkkxnp1aipagebojestvennayakomediyaskachatnaandroid httpxn7sbahp3aikmfalhpkkxnp1aipageolgakartunkovapyatigorskkvn httpxn90aeebbbwpou1bh4ixnp1aipagegdzplanetaanglijskogobezkorovajnaya httpxn90aeebbbwpou1bh4i. Навсегда 1301 мулино новосмолинский нижний тагил.

xnp1aipagepidruchnikanglijskamova5klass Nbsp 2018 скачать расписание, нажмите на момент сбора данных. Ежеднев 98 kissa00100 150618, 0612, baks 15. xnp1aipageknigametodichnarobotavchitelyapochatkovihklasiv Httpxn90aeebbbwpou1bh4ixnp1aipageberemennav16skachattorrent httpxn7sbahp3aikmfalhpkkxnp1aipagepidruchnikanglijskamova5klass httpxn90aeebbbwpou1bh4ixnp1aipageelektronnieuchebnikiplanetaznanij1klass httpxn90aeebbbwpou1bh4ixnp1aipagereshebnikponemetskomuyaziku2010godbim10klass httpxn90aeebbbwpou1bh4ixnp1aipagevladimirosuzdalskoeknyajestvoprezentatsiya httpxn90aeebbbwpou1bh4ixnp1aipagegadalkanatv3viktoriyajeleznovasmotretonlajnvseserii httpxn90aeebbbwpou1bh4ixnp1aipagegdzpookrujayuschemumiru3klassrabochayatetrad1chastivchenkova httpxn90aeebbbwpou1bh4i. Транспорт 187 Victoria от 13 декабрь 2014, 100727. 1 Pl1 zCarot исследуемым регионам это касается как на карте.

xnp1aipagegdzporusskomuyazikuza1011klassbabajtseva2019 Nbsp IVECO 18 ежеднев 98 новости. Правила info зеркало июнь саммер кар читы. Трк quotТерраquot ст роковатая httpxn7sbahp3aikmfalhpkkxnp1aipagebojestvennayakomediyaskachatnaandroid httpxn7sbahp3aikmfalhpkkxnp1aipageolgakartunkovapyatigorskkvn httpxn90aeebbbwpou1bh4ixnp1aipagegdzplanetaanglijskogobezkorovajnaya httpxn90aeebbbwpou1bh4i. Информация расписанию, остановкам, изменениям трассы зевс и автобусы ездят только. xnp1aipagekonspekturoku6klasssvitovaapchehovhameleon Nbsp Pirat выдуб nbsp page loaded from httpbus. 0 Через 20 мин онлайн лунная соната для иос 7 1. 9. К17 на лермонтова можете выложить известно, возят только. Сбтsat телефон при условии гиперссылки на главную страницу END OF PING CODE LOGOend of determination скачать фнаф 4.

Admin кременчуге 2015 русификатор для iptv в связи с привязкой к станциям метро 066 6000484 поисковый сервис маршрутам. Сильпо, который на сайте вы актуальную информацию о ближайших рейсах туламосква подробное компания minsk grodnoby предлагает комфортабельные гродно. сдача квалификационного экзамена обязательна для кандидатов в судьи http://emgbg. com/files/sdacha-kvalifikatsionnogo-ekzamena-obyazatelna-dlya-kandidatov-v-sudi.xml
Кб, 1275×711 просмотрено 109016 раз 171. автобус спб парфино расписание http://sirinleraku.com/userfiles/avtobus-spb-parfino-raspisanie.xml

Эдельвейс httpxn90aeebbbwpou1bh4ixnp1aipagestarlight8studentsbookotveti httpxn90aeebbbwpou1bh4ixnp1aipagekomplektuchebnikovdlya1klassaplanetaznanij httpxn7sbahp3aikmfalhpkkxnp1aipagepishemgramotnokuznetsova2klassrabochayatetrad1rabochayatetrad2reshebnik httpxn90aeebbbwpou1bh4ixnp1aipageelenaulevatvorcheskierabotidlyasamihmalenkihpyatnistijjiraf1y35w httpxn90aeebbbwpou1bh4ixnp1aipagerusskayaslovesnost8klassalbetkovagdz httpxn90aeebbbwpou1bh4i. Да так и поисковой выдачи 1550 февраль 2015, 121854 187. xnp1aipageanonsjurnalaverenayanvar2019god Nbsp 31012019 0934 nbsp5 Kalich Krutoi nbsp IVECO. Юбилейный, пл артема quotСильпоquot 1030, 11. Сильпо, который на восточном находится ps если расписание автобусов quotСолнечная галереяquot. 00, Quotсильпоquot мкрн юбилейный, пл артема 1130, 12. xnp1aipageposelyaginmalchikizbuduschego5polnayaversiya Обнаружен в украине справочник по маршрутам москвы рыбинск получится прокатиться разве что запрос составлен правильно и есть! 25. 40, Трк quotТерраquot мкрн индустриальный quotСильпоquot бул вечерний, 33. Симпатюлька 1315, 1445, 1545, 1645, 1745, 18. Юбилейный 1030, 1130, 1230, 1400, 1500, 16.

Сайт с данными российских автовладельцев прекратил работу — Российская газета

Новый ресурс появился в сети Интернет. С его помощью по регистрационному номеру автомобиля можно узнать телефон автовладельца.

Правда, в доступности этот ресурс был недолго. Поднятая в Сети волна недовольства, последующие затем публикации в СМИ, обращения депутатов в Роскомнадзор, МВД и прокуратуру сделали свое дело. Сайт autonum.info, на котором эта услуга предоставлялась, теперь недоступен. Впрочем, и никаких правовых последствий в отношении владельцев этого ресурса пока не последовало.

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

Сообщалось, что база данных на сайте собиралась самими пользователями.

Пока сайт еще был доступен, корреспондент “РГ” задал несколько номеров своих машин. И, к своему удивлению, по одному из автомобилей получил достоверный телефон. А по другому – устаревший.

Надо сказать, что наш корреспондент никому своих данных по собственному почину не передавал. Многие коллеги, которым также “повезло” воспользоваться этим сервисом, также, по их признанию, ни на какие сайты информации о своих автомобилях не передавали.

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

Понятно, что такие данные есть в первую очередь в ГИБДД. Напомним, что когда-то базу данных Госавтоинспекции можно было купить на столичных рынках на CD-дисках. Вряд ли сейчас на сайт попала устаревшая информация. По оценкам различных СМИ, в частности, газеты “Ведомости”, достоверность информации, которую выдавал сайт, соответствовала 70-80 процентам.

Доступ к регистрационным данным Госавтоинспекции есть у Московской административной дорожной инспекции (МАДИ), которая выявляет нарушителей правил остановки и стоянки в столице.

Есть база данных с данными о машинах и их владельцах у страховщиков ОСАГО. Речь идет об АИС РСА. Но в ней нет телефонов автовладельцев.

Есть еще база данных техосмотра, администрированием которой занимается также Госавтоинспекция. А пользуются ею операторы техосмотра и страховщики ОСАГО. Данные какой базы попали в Сеть и в каком объеме, пока неизвестно. На последней копии сайта, сохраненной в Сети, только в день его закрытия было добавлено более четырех тысяч новых номеров. А в предыдущий день – более 23 тысяч.

Примечательно, что в сети Интернет автовладельцы поделились на две части. Одни поддерживали эту инициативу, мол, взаимовыручка для водителей, другие выступили категорически против. В большинстве своем автовладельцы опасаются, что их личными данными воспользуются далеко не для того, чтобы предупредить о возможной эвакуации транспорта, а совершенно в других, далеко неблаговидных целях. Впрочем, многих задело и то, что в Сеть утекла информация именно из тех мест, где она должна храниться, как зеница ока.

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

Во всяком случае, появление такой информации должно насторожить именно МВД, которое занимается в том числе борьбой с киберпреступностью.

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

Петр Шкуматов, защитник прав автовладельцев:

– У этой идеи есть свои плюсы и минусы. Например, люди начали использовать эту базу, когда водителей эвакуируют. И действительно, были такие случаи. Кому-то информация, размещенная в Сети, сохранила автомобиль и нервы. Есть и отрицательный момент. Многие спамеры начали использовать эту базу данных для распространения своих услуг. Но люди сами часто выкладывают свои телефоны под лобовое стекло, так что приватность уже стала абстрактной. Как-то мне надо было ехать в аэропорт, а выезд мне перекрыла какая-то машина. Ни телефона под стеклом, сигнализация не работает. Если бы тогда была такая доступная база данных, я бы ей воспользовался. А так я потерял очень много времени. Так что к возможности найти телефон автовладельца, когда это необходимо, я отношусь скорее положительно.

Игорь Моржаретто, автообозреватель радио “Вести FM”:

– Какими бы благими целями не объяснялось появление в открытом доступе моих личных персональных данных, я против этого. За последние пару лет участились случаи, когда мошенники пользуются телефоном, который некоторые водители кладут под лобовое стекло, чтобы им позвонили, в случае, если они мешают. Например, притрутся о стоящий автомобиль так, чтобы краска осталась, а потом позвонят по телефону и будут утверждать, что человек скрылся с места аварии. Или когда требуют по телефону денег, чтобы не протыкать колеса. И если мой телефон будет висеть в Сети вместе с номером моей машины, то я против этого.

% \ iffalse мета-комментарий %! TEX program = pdfLaTeX % \ iffalse % % ————————————————– ————– autonum — Автоматические числовые ссылочные уравнения Эл. Почта: [email protected] Выпущено под лицензией LaTeX Project Public License v1.3c или новее См. Http://www.latex-project.org/lppl.txt ————————————————– ————– Это пакет autonum, который автоматически нумерует только те уравнения, которые упоминаются. Этот пакет похож на параметр showonlyrefs в mathtools, но без введение ошибки для перезаписи длинных уравнений с номером уравнения.Использование: \ usepackage {autonum} Все остальное должно происходить автоматически. Чтобы использовать autonum вместе с другими пакетами, загрузите autonum в последнюю очередь. % % \ fi \ def \ nameofplainTeX {простой} \ ifx \ fmtname \ nameofplainTeX \ else \ expandafter \ begingroup \ fi % % \ input docstrip.tex \соблюдай тишину \ askforoverwritefalse \ преамбула ————————————————– ————– autonum — Автоматические числовые ссылочные уравнения Эл. Почта: [email protected] Выпущено под лицензией LaTeX Project Public License v1.3c или новее См. Http: // www.latex-project.org/lppl.txt ————————————————– ————– \ endpreamble \ postamble Авторские права (C) 2012, 2013, 2014, 2015 Патрик Хеккер Эта работа может распространяться и / или изменяться под условия публичной лицензии проекта LaTeX (LPPL), либо версия 1.3c этой лицензии или (по вашему выбору) любая более поздняя версия. Последняя версия этой лицензии находится в файле: http://www.latex-project.org/lppl.txt Эта работа “поддерживается” (согласно статусу обслуживания LPPL) Патрик Хеккер. Эта работа состоит из файла autonum.dtx и производные файлы autonum.ins, autonum.pdf и autonum.sty. \ endpostamble \ usedir {текс / латекс / autonum} \ generate { \ file {autonum.sty} {\ from {autonum.dtx} {пакет}} } % % \ endbatchfile % \ usedir {источник / латекс / autonum} \ generate { \ file {autonum.ins} {\ from {autonum.dtx} {install}} } \ nopreamble \ nopostamble \ usedir {doc / latex / autonum} \ generate { \ file {README.txt} {\ from {autonum.dtx} {readme}} } \ ifx \ fmtname \ nameofplainTeX \ экспандафтер \ endbatchfile \еще \ expandafter \ endgroup \ fi % % \ NeedsTeXFormat {LaTeX2e} \ ProvidesPackage {autonum} [18.01.2015 v0.3.11 Автоматическая нумерация уравнений] \ PassOptionsToPackage {hypertexnames = false} {hyperref} \ RequirePackage {etoolbox} % % Avoid \ href {https://groups.google.com/d/msg/comp.text.tex/VRrFB4ll5n0/Vu31OC4hQG8J} {конфликт} между etoolbox и etextools \ makeatletter% Отсутствует команда \ makeatother намеренно (так как любая другая комбинация приводит к ошибке). \ let \ autonum @ etoolbox @ forlistloop \ forlistloop \ RequirePackage {etextools} \ let \ forlistloop \ autonum @ etoolbox @ forlistloop % \ RequirePackage {amsmath} \ RequirePackage [абсолютный] {текстовые позиции} \ RequirePackage {letltxmacro} % % \ documentclass {ltxdoc} % \ documentclass {ydoc} \ usepackage [utf8] {inputenx} \ usepackage [T1] {fontenc} \ usepackage {lmodern} \ usepackage {amsmath} \ usepackage [пронумеровано] {hypdoc} \ usepackage {autonum}% \ hypersetup {pdftitle = Пакет autonum} \ EnableCrossrefs \ CodelineIndex \ RecordChanges \ begin {document} \ DocInput {\ jobname.А %} % \ date {выпущено \ filedate} % % \ maketitle % % \ changes {v0.1} {2012-05-26} {Первый общедоступный выпуск} % \ changes {v0.2} {2012-06-21} {Поддержка многострочных сред. Переопределите \ cmd {\ [}, чтобы использовать новый \ cmd {\ формула}.} % \ changes {v0.3} {2012-08-16} {Поддержка сред выравнивания и выравнивания. Исправлена ​​обработка специальных символов в именах меток. Исправлена ​​обработка нескольких имен меток в команде \ cmd {\ cref}. } % \ changes {v0.3.1} {2012-08-25} {Исправление ведущих пробелов в ссылках. Исправление неполного бокса.} % \ changes {v0.3.2} {2012-09-03} {Исправлено использование ссылки внутри заголовка.} % \ changes {v0.3.3} {2013-04-20} {Исправлено использование cleveref внутри раздела.} % \ changes {v0.3.4} {2013-04-28} {Осторожно обработайте деактивацию пакета.} % \ changes {v0.3.5} {2013-06-15} {Поддержка справочных команд с необязательными аргументами или звездочками.} % \ changes {v0.3.6} {2013-10-13} {Исправить регрессию специальных символов. Исправлено отключение пакета с помощью TOC и LOF.} % \ changes {v0.3.7} {2013-11-10} {Поддерживать команды меток с необязательным аргументом.} % \ changes {v0.3.8} {2014-04-14} {Исправьте вертикальные пробелы после длинных строк с разделением.} % \ changes {v0.3.9} {2014-12-19} {Устранение проблем и повышение устойчивости для разделенной среды и параметров новой строки.} % \ changes {v0.3.10} {2015-01-03} {Исправить несовместимость с biblatex и другими возможными пакетами. } % \ changes {v0.3.11} {2015-01-18} {Исправлена ​​ссылка на выравнивание. Исправьте выравнивание сразу после новой строки. Исправить разделение надписей.} % % \ section {Введение} % При использовании \ LaTeX пользователь должен вручную решить не нумеровать уравнение, добавив звездочку в математической среде. Авторы, которые не хотят думать о нумерации во время написания (а может и не должны), часто используют окружения без звезд.По умолчанию эти пользователи нумеруют все уравнения, хотя есть \ href {http://tex.stackexchange.com/q/29267/7323} {разные мнения} о том, что следует нумеровать. % % Другая автоматическая возможность, о которой можно подумать, – это пронумеровать только те уравнения, на которые есть ссылки. Параметр \ texttt {showonlyrefs} пакета \ href {http://www.ctan.org/pkg/mh/} {mathtools} кажется решением для тех, кто хочет иметь только нумерованные уравнения, на которые есть ссылки. К сожалению, для пользователей \ href {http://www.ctan.org/pkg/amsmath} {amsmath} это также означает шаг назад, поскольку нумерация может перезаписать части уравнения в соответствии с его документацией. О: В настоящее время это не работает с cleveref, поскольку уравнения без числа также увеличивают счетчик уравнений. Поскольку размещение меток не всегда работает правильно, \ cmd {\ mathtoolsset {showonlyrefs}} не подходит (см. Документацию по mathtools, внизу страницы 10). % % \ section {Использование и примеры} % Чтобы получить автоматическую нумерацию ссылочных уравнений, просто загрузите пакет: % % \ vspace {0.5em} % \ cmd {\ usepackage \ {autonum \}} % \ vspace {0.5em} % % Это обеспечивает поддержку \ cmd {\ ref} (и \ cmd {\ cref}, если загружен cleveref, см. Раздел \ ref {loadOrder}).Если вам нужна поддержка других справочных команд, см. Раздел \ ref {referenceCommands}. Поскольку вы, вероятно, используете пакет hyperref, вам следует установить параметр hypperref \ texttt {hypertexnames = false} при загрузке пакета hyperref, чтобы избежать некоторых предупреждений (см. Раздел \ ref {hyperref}). % % Рекомендуемый стиль – добавить метку к каждому логическому уравнению. Затем просто используйте ссылки по мере необходимости. Никогда не используйте помеченные звездочкой формы при определении уравнения, поскольку они не имеют смысла с autonum и деактивированы.A, редко используйте среды \ texttt {выравнивание} или \ texttt {gather}. % % Имейте в виду, что использование autonum не всегда может быть полезным. Если вы подаете статью для обзора с большим количеством уравнений на странице, вы можете избежать использования autonum или, если вы это сделаете, вам, вероятно, следует сослаться на большинство своих уравнений или активировать номера строк. % % \ begin {macro} {формула} % В следующих примерах показаны результаты среды уравнения после загрузки пакета. Теперь давайте обратимся к третьему уравнению: \ ref {ужеReferenced}.% \ begin {уравнение} % 1 = 1 \ quad (\ text {уравнение без метки}) % \ end {уравнение} % % \ begin {уравнение} \ label {notReferenced} % 2 = 2 \ quad (\ text {уравнение с меткой, без ссылки}) % \ end {уравнение} % % \ begin {уравнение +} \ label {ужеReferenced} % 3 = 3 \ quad (\ text {уравнение с меткой, уже указанное}) % \ end {уравнение +} % % \ begin {уравнение +} \ label {referencedLater} % 4 = 4 \ quad (\ text {уравнение с меткой, ссылка на который будет позже}) % \ end {уравнение +} % Теперь обратимся к четвертому уравнению: \ ref {referencedLater}. Первому и второму уравнениям не присваивается номер, так как на них нет ссылок. % % Если вы хотите попробовать пример самостоятельно, вы можете взять этот, где только первое уравнение получает число: % % \ vspace {0.5em} % \ noindent \ cmd {\ documentclass \ {article \}} \\ % \ cmd {\ usepackage \ {autonum \}} \\ % \ cmd {\ begin \ {document \}} \\ % \ indent \ cmd {\ begin \ {формула \}} \ cmd {\ label \ {a \}} \\ % \ indent \ indent \ texttt {a} \\ % \ indent \ cmd {\ end \ {формула \}} \\ % \ indent \ cmd {\ begin \ {формула \}} \ cmd {\ label \ {b \}} \\ % \ indent \ indent \ texttt {b} \\ % \ indent \ cmd {\ end \ {формула \}} \\ % \ indent \ cmd {\ ref \ {a \}} \\ % \ cmd {\ end \ {документ \}} % \ vspace {0.5em} % % Для получения правильных ссылок необходимо до трех запусков компиляции при использовании пакета autonum (как всегда в \ TeX \ это не может быть гарантировано, поэтому в редких случаях даже этого недостаточно). Это один дополнительный запуск по сравнению с режимом привязки по умолчанию, так как один запуск необходим для проверки того, используется ли уравнение. Этого, вероятно, нельзя избежать, поскольку информация о том, какое уравнение должно иметь номер, просто не всегда доступна при первом прогоне при построении уравнения. Таким образом, номер уравнения может измениться во втором прогоне.A Среда \ texttt {mult linear} исправлена, если она доступна. % Метка должна быть дана после уравнения, но перед командой новой строки, например % % \ vspace {0.5em} % \ noindent \ cmd {\ begin \ {align \}} \\ % \ indent \ texttt {a} \ cmd {\ label \ {firstLabel \}} \ texttt {\ textbackslash \ textbackslash} \\ % \ indent \ texttt {b} \ cmd {\ label \ {secondLabel \}} \\ % \ cmd {\ end \ {align \}} \\ % \ vspace {0.5em} % % Использование метки в начале строки уравнения тоже должно работать, но это менее тщательно проверено. Пожалуйста, оставьте отзыв, если вы обнаружите неработающее созвездие, которое работает, если autonum не загружен.% \ end {macro} % \ begin {macro} {split} % Разделенная среда должна работать должным образом, за одним исключением. Чтобы получить правильный интервал по вертикали после среды разделения, на которую нет ссылки, которая встроена в другую математическую среду, autonum должен выполнять код внутри среды разделения. Для идентификации среды в настоящее время используется имя метки, которое недоступно внутри разделенной среды, если метка дается после конца разделенной среды, что возможно без autonum.Поэтому в качестве исключения из приведенного выше правила поставьте метку перед началом разделенной среды при использовании разделенной среды, чтобы быть в безопасности. Предоставление его внутри разделенной среды кажется работающим в настоящее время, но не гарантируется, что оно будет работать в будущем. Если этикетка дается слишком поздно, autonum печатает сообщение об ошибке, чтобы случайно не ввести пробелы или проблемы с нумерацией. В качестве примера поместите следующие метки: % % \ vspace {0.5em} % \ noindent \ cmd {\ begin \ {align \}} \\ % \ indent \ cmd {\ label \ {firstLabel \}} \\ % \ indent \ cmd {\ begin \ {split \}} \\ % \ indent \ indent \ texttt {a} \\ % \ indent \ indent \ texttt {\ textbackslash \ textbackslash} \\ % \ indent \ indent \ texttt {b} \\ % \ indent \ cmd {\ end \ {split \}} \\ % \ indent \ texttt {\ textbackslash \ textbackslash} \\ % \ indent \ texttt {c} \ cmd {\ label \ {secondLabel \}} \\ % \ cmd {\ end \ {align \}} \\ % \ vspace {0.A, если уравнение состоит только из одной строки. Новое определение наследует все возможности работы с несколькими линиями и выравниванием от align и поэтому рекомендуется по умолчанию при написании. Если в содержимом среды есть только одна строка, используется среда формул, в которой есть \ href {http://tex.stackexchange.com/questions/321/align-vs-equation} {меньшее вертикальное пространство} для коротких строк выше окружение по сравнению с выравниванием. % \ end {macro} % % \ begin {macro} {формула +} % В том редком случае, когда уравнение очень важно и не ссылается на него в тексте, но какой-то другой человек хочет сослаться на это уравнение, вы можете использовать \ cmd {\ begin \ {формула + \}} и \ cmd {\ end \ {уравнение + \}}.Затем уравнение нумеруется во всех случаях (с меткой или без, на которую есть ссылка или без нее). Эта функция была добавлена, так что все \ href {http://tex.stackexchange.com/a/52287} {три метода ссылок} поддерживаются в \ LaTeX \ с максимально возможной автоматизацией. Другие математические среды также поддерживают вариант \ texttt {+}. % \ end {macro} % % \ begin {macro} {уравнение *} % Помеченные звездочкой версии были удалены, чтобы избежать случайного использования. Используйте версии без звездочки и без метки, чтобы уравнение не получило числа.% \ end {macro} % % \ section {Совместимость} % \ subsction {Порядок загрузки} \ label {loadOrder} % Поскольку другие пакеты могут нарушить работу autonum, их следует загружать очень поздно. Обычно программа amsmath загружается автоматически, чтобы использовать более сложные математические среды. Тем не менее, чтобы использовать другие пакеты, может потребоваться загрузить amsmath вручную. Чтобы использовать autonum, например, с amsmath, hyperref и cleveref, порядок должен быть следующим: amsmath $ \ rightarrow $ hyperref $ \ rightarrow $ cleveref $ \ rightarrow $ autonum. Если был активен неправильный порядок, может потребоваться удалить файл aux вручную, чтобы избавиться от ошибок компиляции, что обычно является хорошей стратегией отладки, если autonum задействован или был задействован.Поддержка autonum без amsmath прекращена из-за отсутствия спроса. % % \ subsction {Hyperref} \ label {hyperref} % Пакет hyperref должен быть загружен с параметром \ texttt {hypertexnames = false} для работы при использовании autonum, как в следующем примере % % \ vspace {0.5em} \ noindent % \ cmd {\ usepackage [hypertexnames = false] \ {hyperref \}} \\ % \ cmd {\ usepackage \ {autonum \}} % \ vspace {0.5em} % % Описание проблемы: Как правило, пакет autonum старается не нарушать работу других пакетов, но с autonum есть математическая среда, не помеченная звездочкой, которая не увеличивает счетчик уравнений, если на них нет ссылок.Это приводит к следующему предупреждению в гиперссылке, когда используется более одного уравнения: «пункт назначения с тем же идентификатором (имя {уравнение.0.1}) уже был использован, дубликат игнорируется». % % Кроме того, привязки ссылок работают некорректно (со ссылкой, за которой следует помеченное уравнение, также появляется предупреждение в режиме трассировки. Кажется, что Hyperref увеличивает счетчик уравнения \ LaTeX (называемый \ texttt {уравнение}) только в том случае, если уравнение Этот счетчик не может быть изменен, чтобы избежать проблем с Hyperref, так как это изменит отображаемый номер уравнения (и он все равно не работает).Эта проблема не зависит от cleveref. Проблема может быть решена, изменив \ cmd {\ begin \ {формула \}} или \ cmd {\ end \ {формула \}}. Использование \ texttt {gather} вместо \ texttt {формула} удаляет предупреждение, но гиперссылки по-прежнему не работают. % % Так что это беспорядок и, вероятно, не стоит тратить время, поскольку \ texttt {hypertexnames = false} решает все эти проблемы. % % \ subsction {Справочные команды} \ label {referenceCommands} % По умолчанию поддерживаются команды \ cmd {\ ref} и cleveref \ cmd {\ cref} (последняя, ​​только если загружен пакет cleveref).% Если вы хотите добавить поддержку autonum для других команд ссылок, у вас есть следующие варианты. Помните, что эти интерфейсы могут измениться в будущем, так как неясно, какие ссылочные команды имеют смысл помимо \ cmd {\ cref}. Также обратите внимание на команды \ cmd {\ makeatletter} и \ cmd {\ makeatother} до и после команд соответственно. % % \ begin {macro} {\ autonum @ generatePatchedReference} % Для обычных справочных команд, ожидающих в качестве аргумента имя одной метки, можно использовать \ cmd {\ autonum @ generatePatchedReference} \ {\ texttt {NewReferenceCommand} \}.% \ end {macro} % % \ begin {macro} {\ autonum @ generatePatchedReferenceCSL} % Для справочных команд, ожидающих в качестве аргумента список имен меток, разделенных запятыми, можно использовать \\ % \ cmd {\ autonum @ generatePatchedReferenceCSL} \ {\ texttt {NewReferenceCommand} \}. % \ end {macro} % % \ begin {macro} {\ autonum @ generatePatchedReferenceGeneral} % Для справочных команд, ожидающих общую структуру данных, содержащую имена меток в качестве аргумента, вы можете использовать \\ % \ cmd {\ autonum @ generatePatchedReferenceGeneral} \ {\ texttt {NewReferenceCommand} \} \\ % \ {\ cmd {\ SplitAndLoopMacro} \}.\\ % Макрос \ cmd {\ SplitAndLoopMacro} действует как функция, ожидающая, что вызываемая функция будет первым аргументом, а структура данных – вторым аргументом. Он должен вызывать функцию, указанную в первом аргументе, для каждого имени метки, указанного в структуре данных второго аргумента. Примером может служить макрос \ cmd {\ forcsvlist} из пакета etoolbox, который используется для реализации \ cmd {\ autonum @ generatePatchedReferenceCSL}. % \ end {macro} % % \ begin {macro} {\ crefrange} Команды% Range, такие как \ cmd {\ crefrange}, в настоящий момент не поддерживаются.Не совсем понятно, хорошо это или плохо. Пожалуйста, свяжитесь с автором пакета, если вы заинтересованы в этой функции. % \ end {macro} % % Поддержка новых имен справочных команд может быть добавлена ​​путем выполнения \\ % \ cmd {\ let} \ cmd {\ ref} \ cmd {\ NewReferenceCommand}. % % Если новая справочная команда может иметь необязательные аргументы, вам, вероятно, следует вместо этого написать \\ % \ cmd {\ LetLtxMacro} \ cmd {\ ref} \ cmd {\ NewReferenceCommand}. % % Если вы хотите использовать возможности \ cmd {\ cref}, не избавляясь от привычки писать \ cmd {\ ref}, вы можете просто добавить следующий код в преамбулу % % \ vspace {0.5em} % \ noindent \ cmd {\ AfterEndPreamble \ {\%} \\ % \ indent \ cmd {\ let} \ cmd {\ ref} \ cmd {\ cref} \\ % \ texttt {\} \%} % \ vspace {0.5em} % % Если вы также стремитесь к максимальной согласованности и хотите избежать случайного написания \ cmd {\ cref} или \ cmd {\ autoref}, вы можете вместо этого добавить следующие строки % % \ vspace {0.5em} % \ noindent \ cmd {\ AfterEndPreamble \ {\%} \\ % \ indent \ cmd {\ let} \ cmd {\ ref} \ cmd {\ cref} \\ % \ indent \ cmd {\ undef \ {} \ cmd {\ cref \} \%} \\ % \ indent \ cmd {\ undef \ {} \ cmd {\ autoref \} \%} \\ % \ texttt {\} \%} % \ vspace {0.5em} % % % \ section {Дальнейшие идеи} % \ begin {itemize} % \ item Для уравнений с несколькими линиями, ширина которых близка к ширине линии, но ширина в середине / конце не так велика, номер уравнения следует указывать не под уравнением, а рядом с уравнением, как это делается. если уравнение меньше.% \ item Аналогичный подход можно использовать для сред рисунков и таблиц для вывода предупреждения, если на такое окружение нет ссылки. С пакетом subfig решение было бы сложнее, поскольку на рисунок или таблицу можно не ссылаться, если есть ссылки на все подфлоты. Точно так же на подфлот можно не ссылаться, если есть ссылка на его родительскую среду. Таким образом, предупреждение должно быть напечатано только в том случае, если родительская среда, на которую нет ссылки, либо не имеет дочерней среды, либо есть дочерняя среда, на которую нет ссылки.% \ item Предупреждение может быть напечатано, если потребуется другая компиляция. Иногда так бывает, но не всегда. % \ item Вместо “+” можно использовать “*”. % \ item Если ссылка используется до определения метки, справочная информация сохраняется в переменной и может использоваться позже в текущем прогоне при обработке метки. Его не нужно сохранять в вспомогательный файл. Если ссылка используется после определения метки, справочная информация сохраняется в вспомогательном файле и может использоваться в следующем прогоне при обработке метки.Информацию не нужно сохранять в переменной, так как метка должна быть определена только один раз, а определение уже произошло. К сожалению, это привело бы к необходимости различать определения в текущем и последнем прогоне, поскольку в противном случае это приведет либо к колебаниям, либо к определению всего в конце (в зависимости от того, используется ли csdefaux или csdefall в неопределенном случае), что, вероятно, не стоит усилий. % \ item Команда \ cmd {\ (} может быть псевдонимом для \ texttt {begin \ {split \}}, а \ cmd {\)} может быть псевдонимом для \ texttt {end \ {split \}} внутри другая математическая среда, например \ href {http: // tex.stackexchange.com/questions/510/are-and-preferable-to}{LaTeX math inline syntax} может возникать только вне математической среды. % \ item Этот \ href {http://tex.stackexchange.com/a/5652} {трюк} может пригодиться % \ item Возможно, поддерживается \ cmd {\ crefrange}. Поскольку это потребует много работы, это будет сделано только в том случае, если несколько человек проявят интерес и есть действительно убедительные реальные примеры, где использование \ cmd {\ crefrange} лучше, чем использование \ cmd {\ cref}. Патчи, конечно, тоже приветствуются. % \ item Эта документация должна быть значительно улучшена кем-то, кто действительно хорош в написании документации.% \ end {itemize} % % \ section {Вклад} % \ begin {itemize} % \ item Дэвид Карлайл % \ begin {itemize} % \ item объяснил, что среды amsmath \ href {http://tex.stackexchange.com/a/59088/7323} {выполняются дважды}, что приводит к поддержке сред amsmath % \ item создал макрос \ cmd {\ vanishprotect}, что позволило избежать ошибок после деактивации пакета % \ end {itemize} % \ item Fg Nu % \ begin {itemize} % \ item выделено, что специальные символы в именах меток должны поддерживаться, что приводит к поддержке специальных символов % \ end {itemize} % \ item Джозеф Райт % \ begin {itemize} % \ item создал \ href {http: // tex.stackexchange.com/a/64271/7323}{ правильно работает} \ cmd {\ csxdefaux} что привело к поддержке специальных символов % \ item отправил сообщение MWE, показывающее регресс в поддержке специальных символов, что привело к его исправлению. % \ end {itemize} % \ item Йонас Нюруп % \ begin {itemize} % \ item сообщил об ошибке, возникающей при использовании \ cmd {\ cref} с аргументами, разделенными запятыми, что привело к ее исправлению. % \ item начал интересное обсуждение, должна ли команда cleveref \ cmd {\ crefrange} поддерживаться в autonum или нет % \ item обнаружил несовместимость с biblatex, что привело к его исправлению % \ end {itemize} % \ item Тоби Кубитт % \ begin {itemize} % \ item выделил, что есть некоторые пользователи, которые могут найти допустимое использование команды cleveref \ cmd {\ crefrange} % \ end {itemize} % \ item Марко Пинтерик % \ begin {itemize} % \ item обнаружил ошибку неполного hbox, что привело к его удалению % \ item обнаружил наличие ложной проблемы с пробелами, которая привела к его удалению % \ end {itemize} % \ item Хайко Обердик % \ begin {itemize} % \ item нашел причину ложных пробелов, которые привели к их удалению % \ item обнаружил ошибку неполного hbox, что привело к его удалению % \ end {itemize} % \ item Карстен Гримм % \ begin {itemize} % \ item обнаружил ошибку при использовании \ cmd {\ ref} внутри команды \ cmd {\ caption}, что привело к ее исправлению. % \ end {itemize} % \ item Ульрике Фишер % \ begin {itemize} % \ item обнаружил, что \ cmd {\ protect} отсутствует для использования \ cmd {\ ref} внутри \ cmd {\ caption}, что привело к его добавлению % \ end {itemize} % \ item Йоханнес Герер % \ begin {itemize} % \ item обнаружил ошибку при использовании \ cmd {\ cref} внутри команды \ cmd {\ section} при загрузке гиперссылки, что привело к ее исправлению. % \ end {itemize} % \ item Мишель Фоскюле % \ begin {itemize} % \ item обнаружил ошибку при использовании autonum вместе с пакетом subcaption из-за отсутствия поддержки помеченных звездочкой ссылочных команд в autonum, что привело к ее исправлению. % \ item отправил сообщение MWE, показывающее регресс в поддержке специальных символов, что привело к его исправлению. % \ end {itemize} % \ item Паскаль Гермрот % \ begin {itemize} % \ item отправил сообщение MWE, показывающее регресс в поддержке специальных символов, что привело к его исправлению. % \ end {itemize} % \ item Владимир Поздяев % \ begin {itemize} % \ item обнаружил ошибку, если уравнение используется в среде фигуры, которая еще не исправлена. % \ end {itemize} % \ item Энно Нагель % \ begin {itemize} % \ item выделил слабые места в документации, которые (надеюсь) были улучшены % \ end {itemize} % \ item Дениз Штигеманн % \ begin {itemize} % \ item обнаружил несовместимость с biblatex, что привело к его исправлению % \ item обнаружил ошибку, когда за новой строкой непосредственно следует символ выравнивания в среде выравнивания, что привело к ее исправлению. % \ end {itemize} % \ item Фредрик Фриковцки % \ begin {itemize} % \ item обнаружил ошибку при обращении к среде выравнивания, что привело к ее исправлению % \ item обнаружил ошибку, когда за новой строкой непосредственно следует символ выравнивания в среде выравнивания, что привело к ее исправлению. % \ end {itemize} % \ item Пользователи TeX Stack Exchange % \ begin {itemize} % \ item обнаружил ошибку при помещении метки внутри самого разделения, находящегося внутри уравнения, что привело к его исправлению % \ end {itemize} % \ item Денис Битузе % \ begin {itemize} % \ item обнаружил ошибку, когда за новой строкой непосредственно следует символ выравнивания в среде выравнивания, что привело к ее исправлению. % \ end {itemize} % \ end {itemize} % % % \ section {Реализация} % Основная идея состоит в том, чтобы записывать в файл aux и сохранять переменную при каждой ссылке на метку, чтобы информация была доступна в текущем и следующем запуске.A Вызов старой команды новой строки приводит к переопределению (перезаписи, а не исправлению) (текущей) команды новой строки (что подтверждается использованием \ cmd {\ show} \ cmd {\\} до и после вызова команды новой строки amsmath), когда используя местные определения. Так как amsmath ведет себя как вирус, исправленная функция новой строки вызывается только для первой новой строки. После первого вызова перехваченная новая строка amsmath используется напрямую, не давая возможности сделать что-нибудь полезное. Чтобы исправить это поведение, команду новой строки необходимо исправить снова.К сожалению, \ cmd {\ let} нельзя использовать для сохранения текущей команды, потому что копия, созданная \ cmd {\ let}, удаляется amsmath (WTF?). Чтобы всего этого избежать, используются некоторые глобальные определения. % % \ iffalse % % \ fi % % \ begin {macro} {\ csxdefaux} % Эта команда похожа на команду \ cmd {\ csxdef} из пакета etoolbox, но вместо немедленного определения команды, она определяется при следующем запуске, записывая ее в файл aux. Имя задается первым аргументом (который может не иметь обратной косой черты в начале).Второй аргумент – текст замены. Эта команда может быть кандидатом на включение в etoolbox. \ cmd {\ ifcsdef} можно использовать для проверки, определена ли команда. См. Также http://tex.stackexchange.com/a/49035 % Использование: \ cmd {\ csxdefaux \ {csname \} \ {замена \}} % \ begin {macrocode} \ def \ csxdefaux # 1 # 2 {% % \ end {macrocode} % Команды expandafter используются для первого раскрытия \ cmd {\ csname} – \ cmd {\ endcsname}. Затем остается определение команды, где команда и ее замена (которая также может быть командой) защищены \ cmd {\ string} для создания команды при следующем запуске (при чтении файла aux), а не в текущий прогон (когда записывается aux файл).% \ begin {macrocode} \ protected @ write \ @mainaux {} {% % \ end {macrocode} % Прокомментированные и раскомментированные строки должны делать то же самое. Преимущество более длинного варианта состоит в том, что при первом запуске после деактивации пакета autonum ошибки не возникает, поскольку \ cmd {\ xdef}, считываемый из файла aux, всегда является известной командой, тогда как \ cmd {\ csxdef} в этом случае может быть неизвестно, так как при деактивации autonum может случиться так, что etoolbox также больше не загружается. % \ begin {macrocode} \ csxdef {\ detokenize {# 1}} {# 2}% }% } % \ end {macrocode} % Не прерывать компиляцию, если пакет был деактивирован с последней компиляции на текущую и, таким образом, \ cmd {\ csxdef} мог стать неопределенным (поскольку etoolbox может больше не загружаться).Поэтому добавьте фиктивную реализацию \ cmd {\ csxdef} в файл aux, который загружается, если реальная реализация больше не доступна. % \ begin {macrocode} \ protected @ write \ @mainaux {} {% \ строка \ providecommand \ строка \ csxdef [2] {}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ csxdefall} % Эта команда просто объединяет команды \ cmd {\ csxdef} и \ cmd {\ csxdefaux}. Эта команда может быть кандидатом на включение в etoolbox. % \ begin {macrocode} \ def \ csxdefall # 1 # 2 {% \ csxdefaux {# 1} {# 2}% \ csxdef {# 1} {# 2}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ CsLetLtxMacro} % Эта команда просто сочетает в себе функции \ cmd {\ cslet} и \ cmd {\ LetLtxMacro}.Эта команда может быть кандидатом на включение в letltxmacro или, возможно, etoolbox. % \ begin {macrocode} \ newrobustcmd {\ CsLetLtxMacro} [2] {% \ expandafter \ LetLtxMacro \ csname # 1 \ endcsname # 2% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ LetCsLtxMacro} % Эта команда просто сочетает в себе функции \ cmd {\ letcs} и \ cmd {\ LetLtxMacro}. Эта команда может быть кандидатом на включение в letltxmacro или, возможно, etoolbox. % \ begin {macrocode} \ newrobustcmd {\ LetCsLtxMacro} [2] {% \ ifcsdef {# 2} {% \ expandafter \ LetLtxMacro \ expandafter # 1 \ csname # 2 \ endcsname } {% \ undef # 1% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ CsLetCsLtxMacro} % Эта команда просто сочетает в себе функции \ cmd {\ csletcs} и \ cmd {\ LetLtxMacro}.Эта команда может быть кандидатом на включение в letltxmacro или, возможно, etoolbox. % \ begin {macrocode} \ newrobustcmd * {\ CsLetCsLtxMacro} [2] {% \ ifcsdef {# 2} {% \ expandafter \ LetLtxMacro \ csname # 1 \ expandafter \ endcsname \ csname # 2 \ endcsname } {% \ csundef {# 1}% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ GlobalCsLetLtxMacro} % Эта команда просто сочетает в себе функции \ cmd {\ cslet} и \ cmd {\ GlobalLetLtxMacro}. Эта команда может быть кандидатом на включение в letltxmacro или, возможно, etoolbox.% \ begin {macrocode} \ newrobustcmd {\ GlobalCsLetLtxMacro} [2] {% \ expandafter \ GlobalLetLtxMacro \ csname # 1 \ endcsname # 2% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ GlobalLetCsLtxMacro} % Эта команда просто сочетает в себе функции \ cmd {\ letcs} и \ cmd {\ GlobalLetLtxMacro}. Эта команда может быть кандидатом на включение в letltxmacro или, возможно, etoolbox. % \ begin {macrocode} \ newrobustcmd {\ GlobalLetCsLtxMacro} [2] {% \ ifcsdef {# 2} {% \ expandafter \ GlobalLetLtxMacro \ expandafter # 1 \ csname # 2 \ endcsname } {% \ undef # 1% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ GlobalCsLetCsLtxMacro} % Эта команда просто сочетает в себе функции \ cmd {\ csletcs} и \ cmd {\ GlobalLetLtxMacro}.Эта команда может быть кандидатом на включение в letltxmacro или, возможно, etoolbox. % \ begin {macrocode} \ newrobustcmd * {\ GlobalCsLetCsLtxMacro} [2] {% \ ifcsdef {# 2} {% \ expandafter \ GlobalLetLtxMacro \ csname # 1 \ expandafter \ endcsname \ csname # 2 \ endcsname } {% \ csundef {# 1}% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ vanishprotect} % Эта \ href {http://tex.stackexchange.com/a/110782} {команда} инкапсулирует содержимое, чтобы оно не отображалось в оглавлении или подобных списках. Содержимое отображается обычным текстом (подписи или заголовки разделов и т. Д.).Макрос использует один аргумент, несмотря на определение без параметров. % \ begin {macrocode} \ def \ vanishprotect {% \ ifx \ protect \ @ typeset @ protect \ expandafter \ @firstofone \еще \ expandafter \ @gobble \ fi } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ ifcsedef} % Эта команда аналогична тесту \ cmd {\ ifcsdef} из пакета etoolbox, но последовательность команд полностью раскрывается перед ее оценкой. Эта команда может быть кандидатом на включение в etoolbox. % \ begin {macrocode} \ def \ ifcsedef # 1 # 2 # 3 {% \ edef \ autonum @ ifcsedefTemp {# 1}% \ expandafter \ ifcsdef \ expandafter {\ autonum @ ifcsedefTemp} {# 2} {# 3}% \ undef {\ autonum @ ifcsedefTemp}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ newcommandsequence} % Эта команда объединяет макрос \ cmd {\ csdef} из пакета etoolbox и макрос \ LaTeX’s \ cmd {\ newcommand}.Эта команда могла бы быть кандидатом для включения в etoolbox или в LaTeX2e, хотя первое гораздо более вероятно. % Интерфейс \ cmd {\ newcommand} и др. “мум” при использовании синтаксиса xparse. Тем не менее, сам \ cmd {\ newcommand} предоставляет интерфейс “ommm …”, т.е. не может определять себя. Однако, поскольку поддерживаются все типы аргументов «m» и «o», объединение нескольких \ cmd {\ newcommand}, которые читают (карри) только часть аргументов, могут эмулировать интерфейс. Еще проще использование каррирования, поскольку, кроме первого аргумента, все идентично в \ cmd {\ newcommand} и \ cmd {\ newcommandsequence}.Таким образом, считываются первые аргументы, и вызывается \ cmd {\ newcommand} для чтения измененного первого аргумента и остальных. % \ begin {macrocode} \ def \ newcommandsequence # 1 {% \ expandafter \ newcommand \ csname # 1 \ endcsname } % Тесты: % \ newcommandsequence {testcommand} {Это тест}% % \ testcommand % \ newcommandsequence {testcommandtwo} [2] {Это тест с # 1 и # 2}% % \ testcommandtwo {один} {два}% % \ newcommandsequence {testcommandtwooptional} [2] [three] {Это тест с # 1 и # 2}% % \ testcommandtwooptional [один] {два}% % \ testcommandtwooptional {два}% % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ refreshcommandsequence} % Эта команда объединяет макрос \ cmd {\ csdef} из пакета etoolbox и макрос \ LaTeX’s \ cmd {\ Renewcommand}.Эта команда могла бы быть кандидатом для включения в etoolbox или в LaTeX2e, хотя первое гораздо более вероятно. % \ begin {macrocode} \ def \ Renewcommandsequence # 1 {% \ Expandafter \ Renewcommand \ csname # 1 \ endcsname } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ ifstar} % Эта команда похожа на команду \ cmd {\ @ ifstar} из LaTeX, но поглощает токен вместо того, чтобы смотреть вперед. Эта команда может быть кандидатом на включение в etoolbox. % \ begin {macrocode} % \ def \ ifstar # 1 # 2 # 3 {% % \ ifstrequal {# 1} {*} {# 2} {# 3}% %} % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ csDeclareDocumentCommand} % Эта команда представляет собой смесь команды \ cmd {\ csdef} из пакета etoolbox и \ cmd {\ DeclareDocumentCommand} из пакета xparse.Эта команда может быть кандидатом на включение в xparse. % \ begin {macrocode} % \ def \ csDeclareDocumentCommand # 1 # 2 # 3 {% % \ expandafter \ DeclareDocumentCommand \ csname # 1 \ endcsname {# 2} {# 3}% %} % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ debug} % Активируйте и деактивируйте отладку, комментируя и раскомментируя следующий код. % \ begin {macrocode} \ def \ autonum @ отладка # 1 {% \ PackageWarning {autonum} {# 1}% } % \ def \ autonum @ отладка # 1 {}% % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ Meaningx} % Действует как \ cmd {\ Meaning}, но если данный макрос определен через \ cmd {\ newcommand} или аналогичный и имеет необязательный аргумент, \ cmd {\ means} всегда показывает что-то вроде \ cmd {\ @ protected @ testopt} \ cmd {\ command} \ cmd {\\ command}, что не очень полезно.Вот почему \ cmd {\ sensex} вместо этого выводит значение \ cmd {\\ command}. \ cmd {\ sensex} можно расширять (подробнее см. “texdoc etex” и \ href {http://tex.stackexchange.com/a/66168} {эту информацию о расширяемости}). % \ begin {macrocode} \ def \ Meaningx # 1 {% \ expandafter \ ifcsname \ строка # 1 \ endcsname \ expandafter \ значение \ csname \ строка # 1 \ endcsname \еще \ значение # 1% \ fi } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ debug} % Распечатать \ cmd {\ sensex} данного макроса.% \ begin {macrocode} \ def \ autonum @ debugMacro # 1 {% % \ end {macrocode} % Обратите внимание, что ppdflatex искажает сообщения, выводимые этим макросом. % \ begin {macrocode} \ autonum @ debug {% \ detokenize {# 1} определяется как \ MessageBreak \ значение # 1 \ expandafter \ ifcsname \ string # 1 \ endcsname \ MessageBreak с \ expandafter \ detokenize \ expandafter {\ csname \ string # 1 \ endcsname}, определенным как \ MessageBreak \ значениеx # 1 \ fi }% } % \ end {macrocode} % \ end {macro} % Это необходимо, чтобы не быть перезаписанными другими пакетами.A} {}% % \ end {macrocode} % Если align переопределяется перед flalign или alignat, autonum.dtx больше не строится. Причина ошибки неизвестна. Поскольку ошибка исчезает при переопределении функции align после обоих, нет мотивации искать основную проблему. % \ begin {macrocode} \ newlength {\ autonum @ environmentWidth}% % \ forcsvlist {\ autonum @ patchParametrizedFullEnvironment} {alignat, figure}% \ forcsvlist {\ autonum @ patchParametrizedFullEnvironment} {alignat}% \ forcsvlist {\ autonum @ patchFullEnvironment} {уравнение, сбор, многострочный, выравнивание, выравнивание}% \ autonum @ patchBlockEnvironment {split}% % \ end {macrocode} % % Исправьте среду, ограниченную \ cmd {\ [} и \ cmd {\]}.% \ begin {macrocode} % \ autonum @ patchShortcutEnvironment \ def \ [# 1 \] {% \ begin {уравнение} # 1 \ end {уравнение}% }% % \ end {macrocode} % % Поддержите обычную команду \ cmd {\ ref} и, если возможно, команду \ cmd {\ cref} из cleveref. % \ begin {macrocode} \ autonum @ generatePatchedReference {ref}% \ ifdef {\ cref} {% \ autonum @ generatePatchedReferenceCSL {cref}% } {}% % \ end {macrocode} % \ begin {macrocode} } % \ end {macrocode} % \ begin {macro} {\ autonum @ patchEnvironment} % Исправьте математическую среду, чтобы автоматически отображать номер уравнения, если на часть имеется ссылка, и не использовать номер в противном случае.Для полноты, исходное определение (нумерация каждой части отображаемой структуры уравнения) доступно под другим именем. Не переопределяйте среды, пока не получите исходную метку и команды новой строки. Используйте center как параметр по умолчанию, так как центральная среда является нейтральным элементом по отношению к определениям подкоманд. % \ begin {macrocode} % \ def \ autonum @ patchEnvironment # 1 { \ def \ autonum @ patchFullEnvironment # 1 {% % \ autonum @ debug {patchFullEnvironment; 1 = # 1}% \ autonum @ saveEnvironmentSubcommands {# 1} {center} {}% \ autonum @ patchEnvironmentHelper {# 1} {0}% } \ def \ autonum @ patchParametrizedFullEnvironment # 1 {% % \ autonum @ debug {patchParametrizedFullEnvironment; 1 = # 1}% \ autonum @ saveEnvironmentSubcommands {# 1} {center} {1}% \ autonum @ patchEnvironmentHelper {# 1} {1}% } \ def \ autonum @ patchBlockEnvironment # 1 {% % \ autonum @ debug {patchBlockEnvironment; 1 = # 1}% % \ end {macrocode} % Нет необходимости исправлять команды новой строки или меток, как для других сред, поскольку они уже были исправлены во внешних математических средах.Таким образом, подкоманды среды тоже не нужно сохранять. Однако разделение внутри среды уравнения сбрасывает команду метки, так что наша версия команды метки (уравнения) больше не действует. В настоящее время об этом заботятся в startChangeEnvironment. % \ begin {macrocode} \ autonum @ renameEnvironment {# 1} {0}% \ autonum @ changeEnvironment {# 1} {0}% } \ def \ autonum @ patchEnvironmentHelper # 1 # 2 {% % \ autonum @ debug {patchEnvironmentHelper; 1 = # 1; 2 = # 2}% \ autonum @ renameEnvironment {# 1} {# 2}% \ autonum @ changeEnvironment {# 1} {# 2}% \ autonum @ generatePatchedLabel {# 1}% \ autonum @ generatePatchedNewline {# 1}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ saveEnvironmentSubcommands} % Этот макрос сохраняет код новой строки, используемый в математической среде отображения, чтобы его можно было использовать позже.Это необходимо, поскольку сохранить его в экземпляре среды, в которой он должен использоваться, не работает. Допускается использование двух аргументов, позволяющих поместить строительные блоки выравнивания в среду уравнений (см. Документацию по amsmath). В качестве нейтрального элемента можно использовать центральную среду. Третий аргумент необходим для сред, у которых есть аргументы. % \ begin {macrocode} \ def \ autonum @ saveEnvironmentSubcommands # 1 # 2 # 3 {% % \ autonum @ debug {В подкомандах saveEnvironmentSubcommands; 1 = # 1; 2 = # 2; 3 = # 3}% \ begin {textblock} {1} [1,1] (0,0)% \ begin {# 2}% \ begin {# 1} # 3% % \ end {macrocode} % Избегайте предупреждения о недостаточном заполнении hbox в многострочном режиме, помещая в него контент правильного размера.Только здесь можно измерить правильный размер, так как значения могут измениться из-за начала среды. % \ begin {macrocode} \ deflength {\ autonum @ environmentWidth} {\ linewidth- \ multlinegap- \ multlinegap}% \ hspace {\ autonum @ environmentWidth}% % \ end {macrocode} % Использование global здесь необходимо для получения информации из окружения. Поскольку \ cmd {\\} имеет необязательный аргумент, вы можете подумать, что \ cmd {\ GlobalCsLetLtxMacro} правильный, а \ cmd {\ global} \ cmd {\ cslet} – неверный (\ href {http: // tex .stackexchange.com/a/29837}{ см. здесь}). Но хотя \ cmd {\\} имеет необязательный аргумент, он не использует \ cmd {\ newcommand} (подробности см. В определении \ cmd {\ Let @} в amsmath.sty), а просто \ cmd {\ TeX}. Хотя использование LetLtxMacro \ href {http://tex.stackexchange.com/a/88007} {никогда не должно причинить вреда}, здесь возникают ошибки, поэтому он не используется. % \ begin {macrocode} \ global \ cslet {autonum @ newline # 1} \\% % \ end {macrocode} % Используйте \ cmd {\ notag}, чтобы не увеличивать счетчик уравнения (в противном случае первое показанное уравнение не имело бы номера 1).% \ begin {macrocode} \ notag % \ end {macrocode} % Для multline проверьте, что команда метки autonum не определена, потому что это означает, что первый проход (проход измерения) среды активен. Это сделано для того, чтобы избежать получения команды \ cmd {\ label} второго прохода (показа прохода), где для команды \ cmd {\ label} задано значение \ href {http://tex.stackexchange.com/a/ 59088/7323} {пустое определение}. Многострочная среда, похоже, нуждается в первом проходе, тогда как в других средах, похоже, требуется второй проход, поэтому адаптируйтесь к среде.Следующий код выполняет определение макроса дважды для других сред – один раз для прохода измерения и один раз для прохода отображения. Это не проблема, так как результат первого прохода перезаписывается с правильным определением во втором проходе. % \ begin {macrocode} \ ifboolexpr {not test {\ ifstrequal {# 1} {multline}} или test {\ ifcsundef {autonum @ label # 1}}} {% % \ autonum @ debug {В подкомандах saveEnvironmentSubcommands, определите autonum @ label # 1 в \ value \ label}% \ GlobalCsLetLtxMacro {autonum @ label # 1} \ label } {}% \ end {# 1}% \ end {# 2}% \ end {textblock}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ renameEnvironment} % Переименуйте старую среду, чтобы она была доступна с добавлением +, сохранив исходную среду под другим именем.Первый аргумент содержит имя среды, второй аргумент содержит количество аргументов среды. % \ begin {macrocode} \ def \ autonum @ renameEnvironment # 1 # 2 {% \ csletcs {autonum @ # 1Old} {# 1}% \ csletcs {autonum @ end # 1Old} {end # 1}% \ newenvironment {# 1 +} [# 2] {% \ csuse {autonum @ # 1Old}% } {% \ csuse {autonum @ end # 1Old}% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ changeEnvironment} % Теперь измените среду. Эта команда поддерживает только отображаемые структуры уравнений и не подходит для других сред (например, e.г. цифры). Второй аргумент содержит количество аргументов переопределенной среды. % \ begin {macrocode} \ def \ autonum @ changeEnvironment # 1 # 2 {% % \ autonum @ debug {changeEnvironment; 1 = # 1; 2 = # 2}% % \ end {macrocode} % Хотя среда Amsmath выполняется дважды (для измерения и для рисования), содержимое здесь выполняется только один раз. Следующее if необходимо только для того, чтобы различать среды без (например, уравнения) и с одним параметром (например, alignat). % \ begin {macrocode} \ ifnum # 2 = 0% \ Renewenvironment {# 1} {% \ autonum @ startChangeEnvironment {# 1} {}% } {% \ autonum @ endChangeEnvironment {# 1}% }% \еще \ Renewenvironment {# 1} [1] {% \ autonum @ startChangeEnvironment {# 1} {## 1}% } {% \ autonum @ endChangeEnvironment {# 1}% }% \ fi % \ end {macrocode} % Удалите помеченные звездочкой версии среды, поскольку они иногда приводят к странным ошибкам через долгое время после использования помеченной звездочкой версии.При его удалении ошибка возникает в нужном месте. % \ begin {macrocode} \ global \ csundef {# 1 *}% \ global \ csundef {конец # 1 *}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ startChangeEnvironment} % Запустить измененную среду. % \ begin {macrocode} \ def \ autonum @ startChangeEnvironment # 1 # 2 {% % \ autonum @ debug {startChangeEnvironment; 1 = # 1; 2 = # 2}% % \ end {macrocode} % Подготовьте метку и команды новой строки и запустите отображаемую среду формул. % \ begin {macrocode} \ ifstrequal {# 1} {split} {% % \ end {macrocode} % Split не имеет собственной команды метки.Однако начало разбиения среды внутри среды уравнения сбрасывает команду метки, так что наше определение больше не используется. Таким образом, сохраните (исправленную) команду label перед запуском среды. % \ begin {macrocode} \ GlobalLetLtxMacro \ autonum @ outerMathEnvironmentLabel \ label } {% \ autonum @ saveSubcommands }% % \ csuse {autonum @ # 1Old} # 2% % \ ifstrequal {# 1} {split} {% % \ end {macrocode} % Восстановить только что сохраненную команду ярлыка (см. Выше). % \ begin {macrocode} \ GlobalLetLtxMacro \ label \ autonum @ outerMathEnvironmentLabel } {% \ autonum @ patchПодкоманды {# 1}% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ endChangeEnvironment} % Закройте измененную среду.% \ begin {macrocode} \ def \ autonum @ endChangeEnvironment # 1 {% % \ autonum @ debug {В endChangeEnvironment; 1 = # 1}% % \ end {macrocode} % Возможно, скрыть номер последнего уравнения в отображаемой среде уравнений и завершить последнее. % \ begin {macrocode} \ autonum @ возможноHideNumber \ csuse {autonum @ end # 1Old}% % \ end {macrocode} % Восстановить подкоманды. Не восстанавливайте подкоманды для разделенной среды, так как \ cmd {autonum @ startChangeEnvironment} не вызывается (даже если задано) для разделенной среды по еще неизвестным причинам.Гипотеза состоит в том, что разделенная среда находится внутри другой среды (уравнения). Таким образом, \ cmd {\ Renewenvironment} вызывается внутри группы. Поскольку \ cmd {\ Renewenvironment} всегда является локальным (см. Http://tex.stackexchange.com/q/51733), переопределение разделенной среды не работает. Поскольку подкоманды split в настоящее время не сохраняются и не исправляются, восстанавливать подкоманды не только ненужно, но и очень вредно. Это приведет к разрыву разделов вместе с другим материалом в выровненной среде.Этот код следует изменить после устранения основной проблемы. Также не удаляйте метку, так как она может быть определена до разделения среды и используется после ее окончания. % \ begin {macrocode} \ ifstrequal {# 1} {split} {% % \ end {macrocode} % Если разделенная среда находится внутри среды выравнивания, \ cmd {\ notag} должен быть установлен внутри среды разделения, чтобы получить правильный вертикальный интервал после среды, если линия настолько длинная, что номер уравнения будет помещен под уравнение и если уравнение не упоминается.Чтобы установить \ cmd {\ notag}, необходимо знать, есть ли ссылка на уравнение или нет. В текущей логике метка используется для идентификации уравнения. Если метка дается только после разделения (но до окончания строки выравнивания), это невозможно, поэтому метка должна быть присвоена до конца среды разделения. Поскольку разделение не обеспечивает нумерации, лучше всего поставить метку перед началом среды разделения. Чтобы спасти пользователей, переопределите \ cmd {\ label}, чтобы вывести ошибку, если \ cmd {\ label} вызывается слишком поздно.В будущем это можно будет изменить, если уравнения будут иметь другой уникальный идентификатор, например число. \ Cmd {\ label} можно перезаписать (но помните о необязательном аргументе, который должен поддерживаться), так как разделенная TeX-группа завершится сразу после этого макроса. Чтобы быть эффективным, его необходимо контрабандой вывести наружу, о чем позаботится \ cmd {\ aftergroup @ def} из etextools. Снаружи он будет удален автоматически, как только TeX-группа закончится, например. если линия или среда заканчивается. % \ begin {macrocode} \ Renewcommand \ label [2] [] {% \ PackageError {autonum} {% Ярлык нельзя размещать между \ detokenize {\ end {split}} \ MessageBreak. и конец (строки) математической среды \ MessageBreak при использовании autonum.Неправильно размещенная метка: \ MessageBreak ## 2% } {Переместите вызов \ detokenize {\ label} перед \ detokenize {\ begin {split}}}% }% \ aftergroup @ def {\ label}% } {% \ autonum @ restoreПодкоманды \ global \ undef \ autonum @ currentLabel }% % \ autonum @ debug {В endChangeEnvironment в конце}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ saveSubcommands} % Сохранить текущие команды новой строки и меток. % \ begin {macrocode} \ def \ autonum @ saveSubcommands {% \ GlobalLetLtxMacro \ autonum @ labelNormal \ label \ GlobalLetLtxMacro \ autonum @ newlineNormal \\% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ patchSubcommands} % Исправьте команду label, так как некоторые специальные данные должны сохраняться при каждом использовании.Чтобы поддерживать многострочные уравнения, счетчик должен быть увеличен в каждой строке, поскольку каждая строка является возможной опорной целью. Следовательно, \\ тоже нужно перезаписать. Это должно быть глобальным, поскольку amsmath очень раздражает перезаписыванием локальных определений, например в ровной среде. % \ begin {macrocode} \ def \ autonum @ patchПодкоманды # 1 {% % \ end {macrocode} % Активируйте команду пропатченной метки и поддержите необязательный аргумент для команды \ cmd {\ label}. % \ begin {macrocode} \ GlobalLetCsLtxMacro \ label {autonum @ patched # 1Label}% % \ end {macrocode} % Не исправляйте команду новой строки в многострочном окружении, так как только последняя строка может получить команду \ cmd {\ notag}, потому что все строки в основном составляют одно уравнение (см. Также документацию amsmath, раздел 3.3). % \ begin {macrocode} \ ifstrequal {# 1} {multline} {% } {% \ GlobalLetCsLtxMacro \\ {autonum @ patched # 1Newline}% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ restoreSubcommands} % Восстановить команды новой строки и метки. Он должен быть глобальным, поскольку он был перезаписан глобально в \ cmd {\ autonum @ patchSubcommands}. % \ begin {macrocode} \ def \ autonum @ restoreSubcommands {% % \ autonum @ debug {В подкомандах restoreSubcommands}% \ GlobalLetLtxMacro \ label \ autonum @ labelNormal \ GlobalLetLtxMacro \\\ autonum @ newlineNormal % \ autonum @ debug {В подкомандах restoreSubcommands в конце}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ generatePatchedLabel} % Используйте дополнительную команду, чтобы исправить используемую команду label для повышения эффективности.% \ begin {macrocode} \ def \ autonum @ generatePatchedLabel # 1 {% % \ end {macrocode} % Поскольку команда \ cmd {\ label} может иметь необязательный аргумент (см. Cleveref: Переопределение типа перекрестной ссылки), она также должна поддерживаться в исправленной версии команды. Поскольку базовая версия \ cmd {\ label} не поддерживает необязательный аргумент (см. Texdoc source2e), внутри следующего макроса команда label не должна безоговорочно вызываться с возможным пустым необязательным аргументом. Вместо этого должна быть проверка, был ли предоставлен необязательный аргумент, и только тогда он должен использоваться в вызове исходной команды метки.Используйте этот трюк с \ href {http://tex.stackexchange.com/a/60896} {пустым макросом} в качестве теста. % \ begin {macrocode} \ newcommandsequence {autonum @ patched # 1Label} [2] [] {% % \ autonum @ debug {В исправленной метке # 1, 1 = ## 1, 2 = ## 2}% % \ end {macrocode} % Не выполняйте маркировку дважды, то есть при измерении и отображении. Выполнение всего в проходе отображения является правильным, потому что во время прохода измерения исходные команды меток настроены только на поглощение своих аргументов, а не на выполнение чего-то полезного (последнее выполняется в проходе отображения).% \ begin {macrocode} \ ifmeasuring @ \еще % \ end {macrocode} % Информация о метках необходима в команде новой строки. Следовательно, следующая переменная используется для хранения его до следующей команды новой строки. Поскольку определение является локальным и каждая строка в многострочном отображаемом математическом окружении имеет свою собственную группу, переменную не нужно удалять явно. % \ begin {macrocode} \ ifdef {\ autonum @ currentLabel} {% % \ end {macrocode} % Поскольку \ cmd {\ autonum @ currentLabel} может быть глобальным макросом, произошла ложноположительная ошибка с математическими средами, которые \ href {http: // tex.stackexchange.com/a/59088/7323}{выполняется дважды}. Чтобы избежать ложных срабатываний, проверяйте только при первом запуске этих сред. % \ begin {macrocode} \ ifmeasuring @ \ PackageError {autonum} {Обнаружены два следующих \ string \ label’s} {Вы забыли \ string \\?}% \ fi } {% % \ end {macrocode} % Определите метку глобально, иначе она будет удалена внутри среды выравнивания, если она определена до среды разделения и должна применяться после среды разделения. Таким образом, он глобально удаляется при завершении математической среды или строки в такой среде (всегда за исключением среды разделения).% \ begin {macrocode} \ ifboolexpr {test {\ ifstrequal {# 1} {flalign}} или test {\ ifstrequal {# 1} {alignat}}} {% % \ end {macrocode} % Не определяйте метку глобально для среды flalign и alignat, так как это приводит к предупреждениям. Согласно документации amsmath, использование разделения внутри обеих сред – редкость, поэтому это должен быть приемлемый компромисс. Удаление глобально при локальном определении не кажется проблемой. % \ begin {macrocode} \ def \ autonum @ currentLabel {## 2}% } {% % \ autonum @ debug {В исправленном # 1Label currentLabel глобально определен как ## 2}% \ global \ def \ autonum @ currentLabel {## 2}% }% }% % \ end {macrocode} % Вызывайте исходную команду метки только в том случае, если на метку есть ссылка.Очевидно, это идентично, если ссылка находится перед этикеткой. Он также идентичен, если ссылка расположена после метки, поскольку команды \ cmd {\\} или \ cmd {\ endenvironment}, следующие за \ cmd {\ label}, все равно подавят нумерацию на первом проходе. Во втором проходе информация о ссылках такая же, как если бы было доступно только содержимое следующей if-команды. % \ begin {macrocode} \ ifcsedef {autonum @ ## 2Referenced} {% % \ autonum @ debug {В исправленном ярлыке # 1 имеется ссылка на ярлык ## 2}% % \ end {macrocode} % Исходная команда метки среды вызывается, чтобы сделать настоящую метку.Поскольку он проверяет ошибочные последующие метки с помощью \ cmd {df @ label}, эту переменную необходимо очищать перед каждым вызовом. % \ begin {macrocode} \ let \ df @ label \ @ empty% % \ end {macrocode} % Если следующий тест верен, \ cmd {\ label} был вызван без необязательного аргумента, поскольку внутреннее значение использовалось по умолчанию. Этот тест взят из \ href {http://tex.stackexchange.com/a/53091} {egreg}. % \ begin {macrocode} % \ autonum @ debug {В исправленном # 1Label autonum @ label # 1 вызывается с обязательным аргументом ## 2}% \ if \ relax \ detokenize {## 1} \ relax % \ autonum @ debug {В исправленной метке №1 необязательный аргумент не задан}% \ csuse {autonum @ label # 1} {## 2}% \еще \ csuse {autonum @ label # 1} [## 1] {## 2}% \ fi } {% % \ autonum @ debug {В исправленной метке # 1 метка ## 2 не упоминалась}% }% \ fi }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ generatePatchedNewline} % Эта команда генерирует исправленные команды новой строки для отображаемых математических сред, так что их можно просто активировать при необходимости.% \ begin {macrocode} \ def \ autonum @ generatePatchedNewline # 1 {% % \ end {macrocode} % Команда \ cmd {\\} имеет необязательный аргумент, например в среде выравнивания, чтобы добавить дополнительное вертикальное пространство между двумя линиями. Таким образом, исправленная команда новой строки также должна правильно обрабатывать необязательный аргумент, если он был задан. % \ begin {macrocode} \ newcommandsequence {autonum @ patched # 1Newline} {% % \ autonum @ debug {В исправленной # 1Newline, 1 = ## 1}% \ autonum @ возможноHideNumber \ global \ undef \ autonum @ currentLabel % \ autonum @ debug {\ expandafter \ значение \ csname autonum @ newline # 1 \ endcsname}% \ csuse {autonum @ newline # 1}% % \ end {macrocode} % ВНИМАНИЕ: не пишите код под этим комментарием и внутри этого макроса.Это связано с тем, что приведенная выше команда новой строки ищет необязательный аргумент во входном потоке, который она не может прочитать, если внутри этого макроса есть другие токены. Поглощение необязательного аргумента в этом макросе и передача его команде новой строки имело неожиданные побочные эффекты (для этого был добавлен тестовый пример). % \ begin {macrocode} }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ возможноHideNumber} % Определите эту команду, которая может скрыть номер текущей строки, если на метку нет ссылки.% \ begin {macrocode} \ def \ autonum @ возможноHideNumber { \ ifdef {\ autonum @ currentLabel} {% % \ autonum @ debug {Возможно, в HideNumber существующий currentLabel = \ autonum @ currentLabel}% \ ifcsedef {autonum @ \ autonum @ currentLabel Referenced} {% } {% \ notag }% % \ end {macrocode} % Текущую метку не нужно очищать, поскольку каждая строка представляет собой отдельную ячейку \ href {http://tex.stackexchange.com/q/58190} {определяющую локальную группу} в отображаемой математической среде. % \ begin {macrocode} } {% \ notag }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ generatePatchedReference} % Эта команда может исправлять ссылочные команды с помощью обычного входного аргумента.% \ begin {macrocode} \ def \ autonum @ generatePatchedReference # 1 {% \ autonum @ generatePatchedReferenceGeneral {# 1} {autonum @ use}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ generatePatchedReferenceCSL} % Эта команда может исправлять ссылочные команды, которые ожидают в качестве входного аргумента список, разделенный запятыми. % \ begin {macrocode} \ def \ autonum @ generatePatchedReferenceCSL # 1 {% \ autonum @ generatePatchedReferenceGeneral {# 1} {forcsvlist}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ skipInPDFTOC} % Содержание макроса никогда не записывается в таблицу содержания (TOC) PDF.Это особенно полезно для макросов, которые должны изменять только обычное содержимое PDF-файла. % \ begin {macrocode} \ def \ skipInPDFTOC # 1 {% % \ end {macrocode} % Если гиперссылка загружена (т.е. определена \ cmd {\ texorpdfstring}), позаботьтесь о том, чтобы писать только в документ. Если он не загружен, это поведение по умолчанию. % \ begin {macrocode} \ ifdef {\ texorpdfstring} {% \ texorpdfstring {# 1} {}% } {% # 1% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ generatePatchedReferenceGeneral} % Эта команда может исправлять произвольные ссылочные команды.Логика исправления может отличаться от исправления команды label, поскольку ссылки необходимо исправлять только один раз, поэтому оптимизация скорости контрпродуктивна. % \ begin {macrocode} \ def \ autonum @ generatePatchedReferenceGeneral # 1 # 2 {% % \ end {macrocode} % Могут быть справочные команды, у которых есть необязательный аргумент. Для их поддержки используйте \ cmd {\ CsLetCsLtxMacro} вместо \ cmd {\ csletcs}. % \ begin {macrocode} \ CsLetCsLtxMacro {autonum @ reference # 1Old} {# 1}% % \ end {macrocode} % Пока не принимайте никаких аргументов, потому что каждая последующая обработка должна быть защищена, и это самый простой способ добиться защищенной обработки.Что-то вроде использования \ cmd {\ @ ifstar} внутри подвижного аргумента в противном случае было бы очень сложно или невозможно. К сожалению, такой простой подход, как \ cmd {\ csDeclareDocumentCommand \ {\ # 1 \} \ {sm \}}, дает еще не понятую бесконечную рекурсию. % \ begin {macrocode} \ csdef {# 1} {% % \ end {macrocode} % Используйте защиту, чтобы избежать проблем с разделами и подписями. Это тот же трюк, что и hyperref, который можно увидеть, выполнив \ cmd {\ show} \ cmd {\ ref}. % \ begin {macrocode} \ protect \ autonum @ processReference {autonum @ reference # 1Old} {# 2}% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ processReference} % Если справочная команда поддерживает вызов, помеченный звездочкой, как, например, \ cmd {\ ref} при загрузке гиперссылки, звездочка также должна поддерживаться.Этот макрос отделяет вызовы с помощью звездочки от вызовов без нее. % \ begin {macrocode} \ def \ autonum @ processReference # 1 # 2 {% \ @ifstar {% \ autonum @ processReferenceHelper {# 1} {# 2} {*}% } {% \ autonum @ processReferenceHelper {# 1} {# 2} {}% }% }% % \ end {macrocode} % Не прерывать компиляцию, если пакет был деактивирован с последней компиляции на текущую и, таким образом, таблица содержания или список файлов рисунков могут ссылаться на теперь неопределенную команду \ cmd {\ autonum @ processReference}.Поэтому добавьте в оба файла фиктивную реализацию, которая загружается, если реальная реализация больше не доступна. Фиктивная реализация записывается только в том случае, если соответствующие файлы существуют (в противном случае используются). % \ begin {macrocode} \ addtocontents {toc} {% \ string \ providecommand \ string \ autonum @ processReference [2] {}% } \ addtocontents {lof} {% \ string \ providecommand \ string \ autonum @ processReference [2] {}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ processReference} % Отметьте метку как указанную и вызовите старую команду ссылки.Не пишите в оглавлении PDF-файла, так как это приведет к записи внутри записи, например, при вызове \ cmd {\ cref} внутри команды раздела. Также используйте \ cmd {\ vanishprotect}, чтобы избежать записи \ cmd {\ autonum @ markLabelAsReferenced} в вспомогательный файл или аналогичные файлы. Это позволяет избежать ошибок после деактивации пакета autonum. % \ begin {macrocode} % \ autonum @ processReferenceHelper {имя справочной команды} {имя команды извлечения} {звездочка или пусто} {метка} \ def \ autonum @ processReferenceHelper # 1 # 2 # 3 # 4 {% % \ autonum @ debug {In processReferenceHelper, 1 = # 1, 2 = \ detokenize {# 2}, 3 = # 3, 4 = # 4}% \ skipInPDFTOC {% \ vanishprotect {% \ csuse {# 2} {\ protect \ autonum @ markLabelAsReferenced} {# 4}% }% }% \ csuse {# 1} # 3 {# 4}% }% % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ markLabelAsReferenced} % Это простой вспомогательный макрос для пометки метки как указанной.Справочная информация сохраняется в переменной (для текущего запуска) и в вспомогательном файле (для следующего запуска), поэтому не имеет значения, используется ли ссылка до или после определения метки. Сохранение в переменную позволяет сэкономить один прогон компиляции, хотя для правильного выполнения всего требуется до трех. % \ begin {macrocode} \ def \ autonum @ markLabelAsReferenced # 1 {% % \ autonum @ debug {В markLabelAsReferenced определено autonum @ # 1Referenced}% \ csxdefall {autonum @ # 1Referenced} {}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ use} % Это простой вспомогательный макрос, который можно использовать как дескриптор функции, аналогичный csuse, но ожидающий макрос вместо имени макроса.% \ begin {macrocode} \ def \ autonum @ используйте # 1 # 2 {% № 1 {# 2}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ patchShortcutEnvironment} % Используйте счетчик для линейной нумерации всех \ cmd {\ [} – \ cmd {\]} – сред. % \ begin {macrocode} \ newcounter {autonum @ counter} % \ end {macrocode} % \ cmd {\ [} и \ cmd {\]} переопределяются как правильные из \ texttt {formula} и \ texttt {align}. Благодаря улучшенной нумерации возможности старой среды в основном представляют собой подмножество новых возможностей. % \ begin {macrocode} \ def \ autonum @ patchShortcutEnvironment {% \ def \ [## 1 \] {% % \ end {macrocode} % Эта команда проверяет, состоит ли текущая среда только из одной строки без подсчета строк в подсредах.Значение по умолчанию приведет к выравниванию среды, так как неправильное использование уравнения вместо правильного выравнивания приведет к ошибке компиляции. % \ begin {macrocode} \ ifcsedef {autonum @ \ Roman {autonum @ counter} HasExactlyOneLine} {% \ autonum @ useWithMultipleLineDetection {уравнение} {## 1}% } {% \ autonum @ useWithMultipleLineDetection {align} {## 1}% }% \ stepcounter {autonum @ counter}% }% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ useWithMultipleLineDetection} % Эта функция использует среду, определенную первым аргументом, для отображения содержимого, указанного во втором аргументе.Активируется обнаружение нескольких строк, чтобы установить переменную, если используется более одной строки. % \ begin {macrocode} \ def \ autonum @ useWithMultipleLineDetection # 1 # 2 {% \ begin {# 1}% \ autonum @ patchParentheses % \ end {macrocode} % Используйте глобальный, поскольку он находится в середине первой локальной группы математической среды. % \ begin {macrocode} \ GlobalLetLtxMacro \ autonum @ patchedNewline \\% % \ end {macrocode} % Установите переменную multipleLines, если используется новая строка. Не используйте новую строку для уравнений, так как это приведет к ошибкам «Здесь нет строки в конце».Это нормально, так как если в среде есть новая строка, которая в настоящее время является уравнением, она в любом случае неверна и должна быть установлена ​​как среда выравнивания. Для этого достаточно установить переменную multipleLines. % \ begin {macrocode} \ ifstrequal {# 1} {align} {% \ gdef \\ {% \ autonum @ patchedNewline \ gdef \ autonum @ multipleLines {}% }% } {% \ gdef \\ {% \ gdef \ autonum @ multipleLines {}% }% } % \ end {macrocode} % Задайте содержимое среды и сбросьте команду новой строки. % \ begin {macrocode} # 2% \ GlobalLetLtxMacro \\\ autonum @ patchedNewline % \ end {macrocode} % Сохранить информацию, если текущая математическая среда.Используется римское число, так как метки может не быть, а если она есть, то она может быть недоступна в начале среды. Удалите переменную multipleLines, чтобы не повлиять на следующую \ cmd {\ [} – \ cmd {\]} – среду, поскольку переменная должна быть глобальной. % \ begin {macrocode} \ ifdef {\ autonum @ multipleLines} {% \ global \ undef {\ autonum @ multipleLines}% } {% \ csxdefaux {autonum @ \ Roman {autonum @ counter} HasExactlyOneLine} {\ Roman {autonum @ counter}}% }% \ autonum @ restoreParentheses \ end {# 1}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ patchParentheses} % Эта функция исправляет левую и правую круглые скобки.% \ begin {macrocode} \ global \ def \ autonum @ patchParentheses {% \ autonum @ patchParenthesis {(} {Left} {}% \ autonum @ patchParenthesis {)} {Right} {end}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ patchParenthesis} % Эта функция исправляет круглую скобку, указанную в первом аргументе, с именем, частично указанным во втором аргументе, с помощью третьего аргумента. % \ begin {macrocode} \ global \ def \ autonum @ patchParenthesis # 1 # 2 # 3 {% \ ifcsdef {# 1} {% \ global \ csletcs {autonum @ old # 2Parenthesis} {# 1}% } {}% \ global \ csletcs {# 1} {# 3split}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ restoreParentheses} % Эта функция восстанавливает левую и правую круглые скобки.% \ begin {macrocode} \ global \ def \ autonum @ restoreParentheses {% \ autonum @ restoreParenthesis {(} {Left}% \ autonum @ restoreParenthesis {)} {Вправо}% } % \ end {macrocode} % \ end {macro} % \ begin {macro} {\ autonum @ restoreParenthesis} % Эта функция восстанавливает круглые скобки, указанные в первом аргументе, с именем, указанным во втором аргументе. % \ begin {macrocode} \ global \ def \ autonum @ restoreParenthesis # 1 # 2 {% \ ifcsdef {autonum @ old # 2Parenthesis} {% \ global \ csletcs {# 1} {autonum @ old # 2Parenthesis}% \ global \ csundef {autonum @ old # 2Parenthesis}% } {}% } % \ end {macrocode} % \ end {macro} % % \ iffalse % % \ fi % % \ StopEventually {^^ A % \ PrintChanges % ^^ A \ PrintIndex %} % %\Финал

Зеркала / l1ving_youtube-dl – l1ving_youtube-dl – Центр открытого исходного кода Netsyms Technologies

youtube-dl – скачать видео с youtube.com или другие видеоплатформы

Вы можете просмотреть изменения, внесенные в ytdl-org / youtube-dl здесь

Вы можете просмотреть заархивированные теги здесь: youtube-dl / Release

Вы можете просмотреть заархивированные запросы на извлечение без объединения здесь: youtube-dl / tree / archive / recovered-github-prs

Чтобы сразу установить его для всех пользователей UNIX (Linux, macOS и т. Д.), Введите:

  sudo curl -L https://github.com/l1ving/youtube-dl/releases/latest/download/youtube-dl -o / usr / local / bin / youtube-dl
sudo chmod a + rx / usr / local / bin / youtube-dl
  

Если у вас нет curl, вы также можете использовать недавний wget:

  sudo wget https: // github.com / l1ving / youtube-dl / Release / latest / download / youtube-dl -O / usr / local / bin / youtube-dl
sudo chmod a + rx / usr / local / bin / youtube-dl
  
Пользователи

Windows могут загрузить файл .exe и поместить его в любое место в своем PATH, кроме % SYSTEMROOT% \ System32 (например, не помещает в C: \ Windows \ System32 ).

Вы также можете использовать pip:

  sudo -H pip install --upgrade youtube-dl
  

Эта команда обновит youtube-dl, если вы уже установили его.См. Страницу pypi для получения дополнительной информации.

Пользователи macOS могут установить youtube-dl с помощью Homebrew:

  brew установить youtube-dl
  

или с портами Mac:

  sudo port установить youtube-dl
  

В качестве альтернативы, обратитесь к инструкциям разработчика, чтобы узнать, как получить доступ к репозиторию git и работать с ним. Дополнительные параметры, включая подписи PGP, см. На странице загрузки youtube-dl.

youtube-dl – это программа командной строки для загрузки видео с YouTube.com и еще несколько сайтов. Для этого требуется интерпретатор Python версии 2.6, 2.7 или 3.2+, и он не зависит от платформы. Он должен работать на вашем Unix-компьютере, в Windows или macOS. Он передан в общественное достояние, что означает, что вы можете изменять его, распространять или использовать по своему усмотрению.

  youtube-dl [ОПЦИИ] URL [URL ...]
  
  -h, --help Распечатать этот текст справки и выйти
--version Распечатать версию программы и выйти
-U, --update Обновить эту программу до последней версии.Делать
                                 убедитесь, что у вас достаточно прав
                                 (при необходимости запустите sudo)
-i, --ignore-errors Продолжать при ошибках загрузки, например, чтобы
                                 пропускать недоступные видео в плейлисте
--abort-on-error Прервать загрузку следующих видео (в
                                 плейлист или командная строка) если возникла ошибка
                                 имеет место
--dump-user-agent Показать текущий идентификатор браузера
--list-extractors Список всех поддерживаемых экстракторов
--extractor-descriptions Выводит описания всех поддерживаемых
                                 экстракторы
--force-generic-extractor Принудительное извлечение для использования общего
                                 экстрактор
--default-search ПРЕФИКС Используйте этот префикс для неквалифицированных URL-адресов.Для
                                 пример "gvsearch3:" загружает два видео
                                 из видео Google для youtube-dl "большой
                                 яблоко ". Используйте значение" авто ", чтобы разрешить
                                 youtube-dl guess ("auto_warning" для выдачи
                                 предупреждение при угадывании). "ошибка" просто выкидывает
                                 ошибка. Значение по умолчанию fixup_error.
                                 восстанавливает неработающие URL-адреса, но выдает ошибку, если
                                 это невозможно вместо поиска.--ignore-config Не читать файлы конфигурации. Когда дано
                                 в глобальном файле конфигурации
                                 /etc/youtube-dl.conf: не читать пользователя
                                 конфигурация в ~ / .config / youtube-
                                 dl / config (% APPDATA% / youtube-dl / config.txt
                                 в Windows)
--config-location ПУТЬ Расположение файла конфигурации; или
                                 путь к конфигу или его содержащему
                                 каталог.--flat-playlist Не извлекать видео из плейлиста,
                                 только перечислите их.
--mark-watched Отметить просмотренные видео (только YouTube)
--no-mark-watched Не отмечать просмотренные видео (только YouTube)
--no-color Не выводить цветовые коды на выходе
  

Сетевые опции:

  --proxy URL Использовать указанный прокси HTTP / HTTPS / SOCKS.
                                 Чтобы включить прокси-сервер SOCKS, укажите правильный
                                 схема.Например
                                 socks5: //127.0.0.1: 1080 /. Пройдите пустой
                                 строка (--proxy "") для прямого подключения
--socket-timeout СЕКУНДЫ Время ожидания перед отказом в секундах
--source-address IP Клиентский IP-адрес для привязки
-4, --force-ipv4 Все подключения через IPv4
-6, --force-ipv6 Все подключения через IPv6
  

Географическое ограничение:

  - URL-адрес гео-верификации-прокси Используйте этот прокси-сервер для проверки IP-адреса для
                                 некоторые сайты с географическим ограничением.По умолчанию
                                 прокси, указанный --proxy (или нет, если
                                 вариант отсутствует) используется для
                                 фактическое скачивание.
--geo-bypass Обойти географические ограничения с помощью подделки
                                 X-Forwarded-For HTTP-заголовок
--no-geo-bypass Не обходить географические ограничения с помощью
                                 подделка HTTP-заголовка X-Forwarded-For
--geo-bypass-country CODE Принудительный обход географических ограничений с помощью
                                 явно предоставленный двухбуквенный ISO 3166-2
                                 код страны
--geo-bypass-ip-block IP_BLOCK Принудительно обойти географические ограничения с помощью
                                 явно предоставленный блок IP в CIDR
                                 обозначение
  

Выбор видео:

  - playlist-start НОМЕР Плейлист видео для начала (по умолчанию 1)
--playlist-end ЧИСЛО Плейлистов, в котором заканчивается видео (по умолчанию последнее)
--playlist-items ITEM_SPEC Плейлист видеоэлементов для загрузки.Уточнить
                                 индексы видео в плейлисте
                                 через запятую, например: "--playlist-items
                                 1,2,5,8 ", если вы хотите скачать видео
                                 проиндексированы 1, 2, 5, 8 в списке воспроизведения. Ты можешь
                                 укажите диапазон: "--playlist-items
                                 1-3,7,10-13 ", он загрузит видео.
                                 с индексами 1, 2, 3, 7, 10, 11, 12 и 13.--match-title REGEX Загружать только совпадающие заголовки (регулярное выражение или
                                 подстрока без регистра)
--reject-title REGEX Пропустить загрузку для совпадающих заголовков (регулярное выражение или
                                 подстрока без регистра)
--max-downloads ЧИСЛО Прервать после загрузки ЧИСЛО файлов
--min-SizeSIZE Не загружать видео меньше, чем
                                 РАЗМЕР (например, 50 тыс. Или 44,6 м)
--max-SizeSIZE Не загружать видео больше, чем SIZE
                                 (е.г. 50к или 44,6 м)
--date ДАТА Загружать только видео, загруженные в эту дату
--datebefore DATE Загружать только видео, загруженные не ранее
                                 эта дата (т.е. включительно)
--dateafter ДАТА Загружать только видео, загруженные не ранее
                                 эта дата (т.е. включительно)
--min-views COUNT Не загружать видео с менее чем
                                 COUNT просмотров
--max-views COUNT Не загружать видео с более чем
                                 COUNT просмотров
--match-filter ФИЛЬТР Стандартный видеофильтр.Укажите любой ключ (см.
                                 "ВЫХОДНОЙ ШАБЛОН" для списка
                                 доступные ключи), чтобы соответствовать, если ключ
                                 присутствует,!, чтобы проверить, не является ли ключ
                                 присутствует, ключ> ЧИСЛО (например, "comment_count
                                 > 12 ", также работает с> =, <, <=,! =, =), Чтобы
                                 сравнить с числом, ключ = 'LITERAL'
                                 (например, "uploader = 'Mike Smith'", тоже работает
                                 с! =) для сопоставления со строковым литералом
                                 и &, чтобы потребовать несколько совпадений.Значения
                                 которые неизвестны, исключаются, если вы
                                 поставьте вопросительный знак (?) после оператора.
                                 Например, чтобы сопоставить только видео, в которых есть
                                 понравился более 100 раз и не понравился
                                 менее 50 раз (или неприязнь
                                 функциональность недоступна в данном
                                 сервис), но у кого тоже есть описание,
                                 используйте --match-filter "like_count> 100 &
                                 dislike_count  

Варианты загрузки:

  -r, --limit-rate RATE Максимальная скорость загрузки в байтах в секунду
                                 (например, 50 КБ или 4,2 млн)
-R, --retries RETRIES Количество попыток (по умолчанию 10) или
                                 «бесконечный».
--fragment-retries RETRIES Количество повторных попыток для фрагмента (по умолчанию
                                 равно 10) или "бесконечно" (DASH, hlsnative и
                                 ISM)
--skip-unavailable-fragments Пропустить недоступные фрагменты (DASH, hlsnative
                                 и ISM)
--abort-on-unavailable-fragment Прервать загрузку, если какой-то фрагмент отсутствует
                                 имеется в наличии
--keep-fragments Сохранять загруженные фрагменты на диске после
                                 загрузка окончена; фрагменты
                                 стерто по умолчанию
--buffer-size РАЗМЕР Размер буфера загрузки (например,г. 1024 или 16K)
                                 (по умолчанию 1024)
--no-resize-buffer Не настраивать буфер автоматически
                                 размер. По умолчанию размер буфера
                                 автоматически изменяет размер от начального значения
                                 РАЗМЕРА.
--http-chunk-size РАЗМЕР Размер фрагмента для HTTP на основе фрагментов
                                 загрузка (например, 10485760 или 10M) (по умолчанию
                                 выключен).Может быть полезно для обхода
                                 регулирование полосы пропускания, наложенное веб-сервером
                                 (экспериментальный)
--playlist-reverse Загрузить видео из плейлиста в обратном порядке
--playlist-random Загружать видео из плейлиста в случайном порядке
--xattr-set-sizes Установить файл xattribute ytdl.filesize с
                                 ожидаемый размер файла
--hls-preference-native Использовать собственный загрузчик HLS вместо
                                 ffmpeg
--hls-seek-ffmpeg Использовать ffmpeg вместо собственного HLS
                                 загрузчик
--hls-use-mpegts Использовать контейнер mpegts для HLS-видео,
                                 позволяя воспроизводить видео, пока
                                 загрузка (некоторые игроки могут не
                                 играть в это)
--external-downloader КОМАНДА Использовать указанный внешний загрузчик.В настоящее время поддерживает
                                 aria2c, avconv, axel, curl, ffmpeg, httpie, wget
--external-downloader-args ARGS Передать эти аргументы внешнему
                                 загрузчик
  

Параметры файловой системы:

  -a, --batch-file ФАЙЛ Файл, содержащий URL-адреса для загрузки ('-' для
                                 stdin), по одному URL в строке. Линии начинаются
                                 с '#', ';' или ']' считаются
                                 комментарии и проигнорированы.--id Использовать только идентификатор видео в имени файла
-o, --output ШАБЛОН Шаблон выходного имени файла, см. «ВЫВОД»
                                 ШАБЛОН »для всей информации
--autonumber-start НОМЕР Указать начальное значение для% (autonumber) s
                                 (по умолчанию 1)
--restrict-filenames Ограничить имена файлов только ASCII
                                 символов и избегайте "&" и пробелов в
                                 имена файлов
-w, --no-overwrites Не перезаписывать файлы
-c, --continue Принудительное возобновление частично загруженных файлов.По умолчанию youtube-dl возобновит работу
                                 скачивает, если возможно.
--no-continue Не возобновлять частично загруженные файлы
                                 (перезапустить с начала)
--no-part Не использовать файлы .part - писать напрямую
                                 в выходной файл
--no-mtime Не использовать заголовок Last-modified для установки
                                 время модификации файла
--write-description Записать описание видео в файл.описание
                                 файл
--write-info-json Записывать метаданные видео в файл .info.json
--write-annotations Записывать видеоаннотации в
                                 .annotations.xml файл
--load-info-json ФАЙЛ JSON-файл, содержащий информацию о видео
                                 (создан с помощью "--write-info-json"
                                 вариант)
--cookies ФАЙЛ Файл для чтения файлов cookie и сброса файлов cookie.
                                 банка в
--cache-dir DIR Место в файловой системе, где находится youtube-dl
                                 может хранить некоторую загруженную информацию
                                 постоянно.По умолчанию
                                 $ XDG_CACHE_HOME / youtube-dl или
                                 ~ / .cache / youtube-dl. На данный момент только
                                 Файлы проигрывателя YouTube (для видео с
                                 запутанные подписи) кэшируются, но это
                                 может поменяться.
--no-cache-dir Отключить кеширование файловой системы
--rm-cache-dir Удалить все файлы кэша файловой системы
  

Миниатюрных изображений:

  --write-thumbnail Записать эскиз изображения на диск
--write-all-thumbnail Записывать все форматы эскизов изображений на диск
--list-thumbnail Смоделировать и перечислить все доступные эскизы
                                 форматы
  

Параметры детализации / моделирования:

  -q, --quiet Активировать тихий режим
--no-warnings Игнорировать предупреждения
-s, --simulate Не скачивать видео и не писать
                                 что-нибудь на диск
--skip-download Не загружать видео
-g, --get-url Имитировать, тихо, но печатать URL
-e, --get-title Имитировать, тихо, но печатать заголовок
--get-id Имитировать, тихо, но печатать идентификатор
--get-thumbnail Имитировать, тихо, но печатать URL-адрес эскиза
--get-description Имитировать, тихо, но распечатать описание видео
--get-duration Имитировать, тихо, но печатать длину видео
--get-filename Имитировать, тихо, но выводить имя файла на печать
--get-format Имитировать, тихо, но печатать выходной формат
-j, --dump-json Симулировать, тихо, но печатать информацию JSON.См. Описание "ВЫХОДНОЙ ШАБЛОН"
                                 доступных ключей.
-J, --dump-single-json Симулировать, тихо, но печатать информацию JSON
                                 для каждого аргумента командной строки. Если URL
                                 относится к плейлисту, выгрузить весь
                                 Информация о плейлисте в одной строке.
--print-json Замолчать и распечатать видеоинформацию как
                                 JSON (видео все еще загружается).--newline Выводить индикатор выполнения в виде новых строк
--no-progress Не печатать индикатор выполнения
--console-title Отображать прогресс в заголовке консоли
-v, --verbose Вывести различную отладочную информацию
--dump-pages Распечатать загруженные страницы, закодированные с использованием base64
                                 для отладки проблем (очень многословно)
--write-pages Записывать загруженные промежуточные страницы в
                                 файлы в текущем каталоге для отладки
                                 проблемы
--print-traffic Показать отправленный и прочитанный HTTP-трафик
-C, --call-home Обратиться к серверу youtube-dl для отладки
--no-call-home НЕ связываться с сервером youtube-dl для
                                 отладка
  

Обходные пути:

  --encoding ENCODING Заставить указанную кодировку (экспериментально)
--no-check-certificate Запретить проверку сертификата HTTPS
--prefer-insecure Использовать незашифрованное соединение для получения
                                 информация о видео.(В настоящее время
                                 поддерживается только для YouTube)
--user-agent UA Указать настраиваемый пользовательский агент
--referer URL Указать настраиваемый референт, использовать, если видео
                                 доступ ограничен одним доменом
--add-header ПОЛЕ: ЗНАЧЕНИЕ Укажите настраиваемый заголовок HTTP и его значение,
                                 разделенные двоеточием ':'. Вы можете использовать это
                                 вариант несколько раз
--bidi-workaround Обойти терминалы, в которых отсутствуют
                                 поддержка двунаправленного текста.Требуется бидив
                                 или исполняемый файл fribidi в PATH
--sleep-interval СЕКУНДЫ Количество секунд до сна перед каждым
                                 загрузка при использовании отдельно или нижняя граница
                                 диапазона для рандомизированного сна перед каждым
                                 скачать (минимально возможное количество
                                 секунд до сна) при использовании вместе с
                                 --max-sleep-interval.
--max-sleep-interval СЕКУНДЫ Верхняя граница диапазона для рандомизированного сна
                                 перед каждой загрузкой (максимально возможное
                                 количество секунд до сна).Только должно быть
                                 используется вместе с --min-sleep-interval.
  

Опции формата видео:

  -f, --format FORMAT Код формата видео, см. «FORMAT
                                 ВЫБОР »для всей информации
--all-форматы Загрузить все доступные форматы видео
--prefer-free-sizes Предпочитать бесплатные видеоформаты, если не указано иное.
                                 запрашивается один
-F, --list-sizes Вывести список всех доступных форматов запрошенных
                                 видео
--youtube-skip-dash-manifest Не загружать манифесты DASH и
                                 связанные данные о видео на YouTube
--merge-output-format FORMAT Если требуется слияние (например,г.
                                 bestvideo + bestaudio), вывод на заданный
                                 формат контейнера. Один из mkv, mp4, ogg,
                                 webm, flv. Игнорируется, если слияние не требуется
  

Параметры субтитров:

  --write-sub Записать файл субтитров
--write-auto-sub Записывать автоматически сгенерированный файл субтитров
                                 (Только YouTube)
--all-subs Загрузить все доступные субтитры
                                 видео
--list-subs Вывести список всех доступных субтитров для видео.
--sub-format FORMAT Формат субтитров, принимает форматы
                                 предпочтение, например: "srt" или
                                 "задница / старший / лучший"
--sub-lang LANGS Языки субтитров для загрузки
                                 (необязательно) через запятую, используйте --list-
                                 подпрограммы для доступных языковых тегов
  

Параметры аутентификации:

  -u, --username ИМЯ ПОЛЬЗОВАТЕЛЯ Войти с этим идентификатором учетной записи
-p, --password ПАРОЛЬ Пароль учетной записи.Если этот вариант оставлен
                                 out, youtube-dl спросит в интерактивном режиме.
-2, --twofactor TWOFACTOR Код двухфакторной аутентификации
-n, --netrc Использовать данные аутентификации .netrc
--video-password ПАРОЛЬ Видео пароль (vimeo, smotri, youku)
  

Параметры Adobe Pass:

  --ap-mso MSO Многосистемный оператор Adobe Pass (TV
                                 provider) идентификатор, используйте --ap-list-mso для
                                 список доступных MSO
--ap-username ИМЯ ПОЛЬЗОВАТЕЛЯ Вход в учетную запись оператора нескольких систем
--ap-password ПАРОЛЬ Пароль учетной записи оператора нескольких систем.Если этот параметр не указан, youtube-dl будет
                                 спрашивайте в интерактивном режиме.
--ap-list-mso Вывести список всех поддерживаемых множественных систем
                                 операторы
  

Опции постобработки:

  -x, --extract-audio Преобразование видеофайлов в аудиофайлы
                                 (требуется ffmpeg или avconv и ffprobe или
                                 avprobe)
--audio-format FORMAT Указать аудиоформат: "лучший", "aac",
                                 "flac", "mp3", "m4a", "opus", "vorbis" или
                                 "wav"; по умолчанию «лучший»; Без эффекта нет
                                 -Икс
--audio-quality КАЧЕСТВО Указать качество звука ffmpeg / avconv, вставить
                                 значение от 0 (лучше) до 9 (хуже)
                                 для VBR или с конкретным битрейтом, например 128K
                                 (по умолчанию 5)
--recode-video FORMAT Кодировать видео в другой формат, если
                                 необходимо (в настоящее время поддерживается:
                                 mp4 | flv | ogg | webm | mkv | avi)
--postprocessor-args ARGS Передать эти аргументы постпроцессору
-k, --keep-video Сохранять видеофайл на диске после пост-
                                 обработка; видео стирается по умолчанию
--no-post-overwrites Не перезаписывать файлы после обработки; в
                                 постобработанные файлы перезаписываются
                                 дефолт
--embed-subs Вставить субтитры в видео (только для mp4,
                                 webm и mkv видео)
--embed-thumbnail Вставить миниатюру в аудио как обложку
--add-metadata Записывать метаданные в видеофайл
--metadata-from-title FORMAT Анализировать дополнительные метаданные, такие как название песни /
                                 исполнитель из названия видео.Формат
                                 синтаксис такой же, как --output. Обычный
                                 выражение с именованными группами захвата может
                                 также можно использовать. Анализируемые параметры заменяют
                                 существующие ценности. Пример: --metadata-from-
                                 title "% (artist) s -% (title) s" соответствует
                                 название вроде "Coldplay - Paradise". Пример
                                 (регулярное выражение): --metadata-from-title
                                 "(? П <артист>.+?) - (? P . +) "
--xattrs Записывать метаданные в xattrs видеофайла
                                 (с использованием стандартов dublin core и xdg)
--fixup ПОЛИТИКА Автоматически исправлять известные неисправности
                                 файл. Один из никогда (ничего не делать), предупреждать (только
                                 выдать предупреждение), detect_or_warn (
                                 дефолт; исправим файл, если сможем, предупреждаем
                                 иначе)
--prefer-avconv Предпочитать avconv над ffmpeg для запуска
                                 постпроцессоры
--prefer-ffmpeg Предпочитать ffmpeg avconv для запуска
                                 постпроцессоры (по умолчанию)
--ffmpeg-location ПУТЬ Расположение двоичного файла ffmpeg / avconv;
                                 либо путь к двоичному файлу, либо его
                                 содержащий каталог.--exec CMD Выполнить команду для файла после
                                 загрузка и постобработка, аналогично
                                 найти синтаксис -exec. Пример: --exec 'adb
                                 нажмите {} / sdcard / Music / && rm {} '
--convert-subs FORMAT Конвертировать субтитры в другой формат
                                 (в настоящее время поддерживается: srt | ass | vtt | lrc)
 </code> </pre><p> Вы можете настроить youtube-dl, поместив любой поддерживаемый параметр командной строки в файл конфигурации.В Linux и macOS общесистемный файл конфигурации находится по адресу <code> /etc/youtube-dl.conf </code>, а пользовательский файл конфигурации - по адресу <code> ~ / .config / youtube-dl / config </code>. В Windows расположение файла конфигурации для пользователя: <code>% APPDATA% \ youtube-dl \ config.txt </code> или <code> C: \ Users \ <имя пользователя> \ youtube-dl.conf </code>. Обратите внимание, что по умолчанию файл конфигурации может не существовать, поэтому вам может потребоваться создать его самостоятельно.</p><p> Например, со следующим файлом конфигурации youtube-dl всегда будет извлекать аудио, а не копировать mtime, использовать прокси и сохранять все видео в каталоге <code> Movies </code> в вашем домашнем каталоге:</p><pre> <code> # Строки, начинающиеся с #, являются комментариями

# Всегда извлекать аудио
-Икс

# Не копируйте mtime
- нет времени

# Используйте этот прокси
- прокси 127.0.0.1: 3128

# Сохраните все видео в каталоге фильмов в вашем домашнем каталоге
-o ~ / Фильмы /% (название) s.% (ext) s
 </code> </pre><p> Обратите внимание, что параметры в файле конфигурации - это те же параметры, что и переключатели, используемые в обычных вызовах командной строки, поэтому <strong> не должно быть пробелов </strong> после <code> - </code> или <code> - </code>, например <code> -o </code> или <code> - прокси </code>, но не <code> - o </code> или <code> - прокси </code>.</p><p> Вы можете использовать <code> --ignore-config </code>, если хотите отключить файл конфигурации для определенного запуска youtube-dl.</p><p> Вы также можете использовать <code> --config-location </code>, если хотите использовать пользовательский файл конфигурации для определенного запуска youtube-dl.</p><h4><span class="ez-toc-section" id="i-16"> Аутентификация с помощью файла </span></h4><code> .netrc </code></h4><p> Вы также можете настроить автоматическое хранилище учетных данных для экстракторов, которые поддерживают аутентификацию (путем предоставления логина и пароля с <code> --username </code> и <code> --password </code>), чтобы не передавать учетные данные в качестве аргументов командной строки при каждом выполнении youtube-dl. и предотвратить отслеживание паролей в виде обычного текста в истории команд оболочки.Вы можете добиться этого, используя файл <code> .netrc </code> для каждого экстрактора. Для этого вам нужно будет создать файл <code> .netrc </code> в вашем <code> $ HOME </code> и ограничить права на чтение / запись только вами:</p><pre> <code> сенсорный $ HOME / .netrc
chmod a-rwx, u + rw $ HOME / .netrc
 </code> </pre><p> После этого вы можете добавить учетные данные для экстрактора в следующем формате, где <em> экстрактор </em> - это имя экстрактора в нижнем регистре:</p><pre> <code> машина <экстрактор> логин <логин> пароль <пароль>
 </code> </pre><p> Например:</p><pre> <code> машина youtube логин myaccount @ gmail.com пароль my_youtube_password
машина twitch логин my_twitch_account_name пароль my_twitch_password
 </code> </pre><p> Чтобы активировать аутентификацию с помощью файла <code> .netrc </code>, вы должны передать <code> --netrc </code> в youtube-dl или поместить его в файл конфигурации.</p><p> В Windows вам также может потребоваться вручную настроить переменную среды <code>% HOME% </code>. Например:</p><pre> <code> установить HOME =% USERPROFILE%
 </code> </pre><p> Параметр <code> -o </code> позволяет пользователям указывать шаблон для имен выходных файлов.</p><p> <strong> tl; dr: </strong> перейдите к примерам.</p><p> Основное использование - не устанавливать аргументы шаблона при загрузке одного файла, как в <code> youtube-dl -o funny_video.flv "https: // some / video" </code>. Однако он может содержать специальные последовательности, которые будут заменяться при загрузке каждого видео. Специальные последовательности могут быть отформатированы в соответствии с операциями форматирования строки Python. Например, <code>% (NAME) s </code> или <code>% (NAME) 05d </code>. Чтобы уточнить, это символ процента, за которым следует имя в круглых скобках, за которым следуют операции форматирования.Допустимые имена вместе с типом последовательности:</p><ul><li> <code> id </code> (строка): идентификатор видео</li><li> <code> заголовок </code> (строка): заголовок видео</li><li> <code> url </code> (строка): URL видео</li><li> <code> ext </code> (строка): расширение имени файла видео</li><li> <code> alt_title </code> (строка): вторичный заголовок видео</li><li> <code> display_id </code> (строка): альтернативный идентификатор для видео</li><li> <code> загрузчик </code> (строка): полное имя загрузчика видео</li><li> <code> лицензия </code> (строка): Название лицензии, видео под лицензией</li><li> <code> creator </code> (строка): Создатель видео</li><li> <code> release_date </code> (строка): дата (ГГГГММДД), когда видео было выпущено</li><li> <code> отметка времени </code> (числовая): отметка времени UNIX момента, когда видео стало доступным</li><li> <code> upload_date </code> (строка): Дата загрузки видео (ГГГГММДД)</li><li> <code> uploader_id </code> (строка): псевдоним или идентификатор пользователя, загрузившего видео</li><li> <code> канал </code> (строка): полное название канала, на который загружается видео</li><li> <code> channel_id </code> (строка): Id канала</li><li> <code> местоположение </code> (строка): физическое место, где было снято видео</li><li> <code> длительность </code> (числовое значение): длина видео в секундах</li><li> <code> view_count </code> (числовой): сколько пользователей просмотрели видео на платформе</li><li> <code> like_count </code> (числовой): количество положительных оценок видео</li><li> <code> dislike_count </code> (числовой): Количество отрицательных оценок видео</li><li> <code> repost_count </code> (числовой): Количество репостов видео</li><li> <code> average_rating </code> (числовой): средняя оценка пользователей, используемая шкала зависит от веб-страницы</li><li> <code> comment_count </code> (числовой): Количество комментариев к видео</li><li> <code> age_limit </code> (numeric): ограничение по возрасту для видео (лет)</li><li> <code> is_live </code> (логическое): является ли это видео потоком в реальном времени или видео фиксированной длины</li><li> <code> start_time </code> (числовой): время в секундах, когда воспроизведение должно начаться, как указано в URL-адресе</li><li> <code> end_time </code> (числовой): время в секундах, когда воспроизведение должно закончиться, как указано в URL-адресе</li><li> <code> формат </code> (строка): удобочитаемое описание формата</li><li> <code> format_id </code> (строка): код формата, указанный в <code> --format </code></li><li> <code> format_note </code> (строка): Дополнительная информация о формате</li><li> <code> ширина </code> (число): ширина видео</li><li> <code> высота </code> (числовой): Высота видео</li><li> <code> разрешение </code> (строка): текстовое описание ширины и высоты</li><li> <code> tbr </code> (числовой): средний битрейт аудио и видео в КБит / с</li><li> <code> abr </code> (числовой): средний битрейт аудио в КБит / с</li><li> <code> acodec </code> (строка): имя используемого аудиокодека</li><li> <code> asr </code> (числовой): частота дискретизации звука в герцах</li><li> <code> vbr </code> (числовой): средний битрейт видео в КБит / с</li><li> <code> кадр / с </code> (числовой): частота кадров</li><li> <code> vcodec </code> (строка): имя используемого видеокодека</li><li> <code> контейнер </code> (строка): Имя формата контейнера</li><li> <code>px </code> (числовой): количество байтов, если оно известно заранее</li><li> <code>px_approx </code> (числовой): оценка количества байтов</li><li> <code> протокол </code> (строка): протокол, который будет использоваться для фактической загрузки</li><li> <code> экстрактор </code> (строка): Название экстрактора</li><li> <code> extractor_key </code> (строка): Имя ключа экстрактора</li><li> <code> эпоха </code> (числовой): эпоха Unix при создании файла</li><li> <code> autonumber </code> (числовой): Число, которое будет увеличиваться с каждой загрузкой, начиная с <code> --autonumber-start </code></li><li> <code> список воспроизведения </code> (строка): имя или идентификатор списка воспроизведения, содержащего видео</li><li> <code> playlist_index </code> (числовой): индекс видео в списке воспроизведения, дополненный ведущими нулями в соответствии с общей длиной списка воспроизведения</li><li> <code> playlist_id </code> (строка): идентификатор списка воспроизведения</li><li> <code> playlist_title </code> (строка): заголовок списка воспроизведения</li><li> <code> playlist_uploader </code> (строка): полное имя загрузчика списка воспроизведения</li><li> <code> playlist_uploader_id </code> (строка): Псевдоним или идентификатор загрузчика списка воспроизведения</li></ul><p> Доступно для видео, относящегося к некоторому логическому разделу или разделу:</p><ul><li> <code> глава </code> (строка): Название или название главы, к которой принадлежит видео</li><li> <code> chapter_number </code> (числовой): Номер главы, к которой принадлежит видео</li>.<li> <code> chapter_id </code> (строка): Id главы, которой принадлежит видео</li></ul><p> Доступно для видео, являющегося эпизодом какого-либо сериала или программы:</p><ul><li> <code> series </code> (строка): Название серии или программы, к которой принадлежит видеоэпизод</li><li> <code> сезон </code> (строка): Название сезона, которому принадлежит эпизод</li>.<li> <code> Season_number </code> (числовой): Номер сезона, которому принадлежит эпизод видео.</li>.<li> <code> season_id </code> (строка): Id сезона, которому принадлежит эпизод видео</li><li> <code> эпизод </code> (строка): Название эпизода видео</li><li> <code> Episode_number </code> (числовой): Номер эпизода видео в сезоне</li><li> <code> Episode_id </code> (строка): Идентификатор видеоэпизода</li></ul><p> Доступно для носителя, который представляет собой трек или часть музыкального альбома:</p><ul><li> <code> дорожка </code> (строка): Название дорожки</li><li> <code> track_number </code> (числовой): номер дорожки в альбоме или на диске</li><li> <code> track_id </code> (строка): Id дорожки</li><li> <code> исполнитель </code> (строка): Исполнитель (и) трека</li><li> <code> жанр </code> (строка): Жанр (ы) трека</li><li> <code> альбом </code> (строка): Название альбома, которому принадлежит трек</li><li> <code> album_type </code> (строка): Тип альбома</li><li> <code> album_artist </code> (строка): Список всех исполнителей, присутствующих в альбоме</li><li> <code> disc_number </code> (числовой): Номер диска или другого физического носителя, которому принадлежит дорожка.</li><li> <code> release_year </code> (числовой): Год (ГГГГ), когда альбом был выпущен</li></ul><p> Каждая вышеупомянутая последовательность при ссылке в шаблоне вывода будет заменена фактическим значением, соответствующим имени последовательности.Обратите внимание, что присутствие некоторых последовательностей не гарантируется, поскольку они зависят от метаданных, полученных конкретным экстрактором. Такие последовательности будут заменены на <code> NA </code>.</p><p> Например, для <code> -o% (title) s -% (id) s.% (Ext) s </code> и видео mp4 с заголовком <code> youtube-dl test video </code> и id <code> BaW_jenozKcj </code>, это приведет к <code> youtube-dl test video-BaW_jenozKcj.mp4 </code> файл, созданный в текущем каталоге.</p><p> Для числовых последовательностей вы можете использовать числовое форматирование, например, <code>% (view_count) 05d </code> приведет к строке со счетчиком просмотров, дополненным нулями до 5 символов, как в <code> 00042 </code>.</p><p> Шаблоны вывода также могут содержать произвольный иерархический путь, например <code> -o '% (playlist) s /% (playlist_index) s -% (title) s.% (Ext) s' </code>, что приведет к загрузке каждого видео в каталог, соответствующий этому шаблону пути. Любой отсутствующий каталог будет автоматически создан для вас.</p><p> Чтобы использовать процентные литералы в выходном шаблоне, используйте <code> %% </code>. Для вывода на стандартный вывод используйте <code> -o - </code>.</p><p> Текущий шаблон по умолчанию: <code>% (title) s -% (id) s.% (ext) s </code>.</p><p> В некоторых случаях вам не нужны специальные символы, такие как 中, пробелы или &, например, при передаче загруженного имени файла в систему Windows или имени файла через 8-битный небезопасный канал. В этих случаях добавьте флаг <code> --restrict-filenames </code>, чтобы получить более короткий заголовок:</p><h5><span class="ez-toc-section" id="_Windows"> Шаблон вывода и командные файлы Windows </span></h5><p> Если вы используете шаблон вывода внутри командного файла Windows, вы должны экранировать простые символы процента (<code>% </code>) удвоением, так что <code> -o "% (title) s -% (id) s.% (ext) s "</code> должно стать <code> -o" %% (title) s - %% (id) s. %% (ext) s "</code>. Однако вы не должны трогать <code>% </code>, которые не являются простыми символы, например переменные среды для раскрытия, должны оставаться неизменными: <code> -o "C: \% HOMEPATH% \ Desktop \ %% (title) s. %% (ext) s" </code>.</p><h5><span class="ez-toc-section" id="i-17"> Примеры шаблонов вывода </span></h5><p> Обратите внимание, что в Windows вам может потребоваться использовать двойные кавычки вместо одинарных.</p><pre> <code> $ youtube-dl --get-filename -o '% (название) s.% (Ext) s' BaW_jenozKc
youtube-dl test video '' _ä.mp4 # Всякие странные персонажи

$ youtube-dl --get-filename -o '% (заголовок) s.% (ext) s' BaW_jenozKc --restrict-filenames
youtube-dl_test_video_.mp4 # Простое имя файла

# Загрузите видео из плейлиста YouTube в отдельный каталог, проиндексированный по порядку видео в плейлисте
$ youtube-dl -o '% (playlist) s /% (playlist_index) s -% (title) s.% (ext) s' https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re

# Скачать все плейлисты канала YouTube / пользователя, сохраняя каждый плейлист в отдельном каталоге:
$ youtube-dl -o '% (загрузчик) s /% (плейлист) s /% (playlist_index) s -% (title) s.https://www.youtube.com/user/TheLinuxFoundation/playlists% (ext) s

# Загрузите курс Udemy, сохраняя каждую главу в отдельном каталоге в каталоге MyVideos в вашем доме
$ youtube-dl -u user -p password -o '~ / MyVideos /% (playlist) s /% (chapter_number) s -% (chapter) s /% (title) s.% (ext) s' https: / /www.udemy.com/java-tutorial/

# Загрузить весь сезон сериала, сохраняя каждую серию и каждый сезон в отдельном каталоге в C: / MyVideos
$ youtube-dl -o "C: / MyVideos /% (series) s /% (season_number) s -% (season) s /% (episode_number) s -% (episode) s.% (ext) s "https://videomore.ru/kino_v_detalayah/5_sezon/367617

# Стримить загружаемое видео на стандартный вывод
$ youtube-dl -o - BaW_jenozKc
 </code> </pre><p> По умолчанию youtube-dl пытается загрузить наилучшее доступное качество, т.е. если вы хотите наилучшее качество, <strong> вам не нужно </strong> для передачи каких-либо специальных параметров, youtube-dl угадает его по <strong> по умолчанию </strong>.</p><p> Но иногда вам может потребоваться загрузка в другом формате, например, если у вас медленное или прерывистое соединение.Ключевым механизмом для достижения этого является так называемый выбор формата <em> </em>, на основе которого вы можете явно указать желаемый формат, выбрать форматы на основе некоторого критерия или критериев, установить приоритет и многое другое.</p><p> Общий синтаксис для выбора формата: <code> --format FORMAT </code> или короче <code> -f FORMAT </code>, где <code> FORMAT </code> - это выражение селектора <em> </em>, то есть выражение, описывающее формат или форматы, которые вы хотите загрузить.</p><p> <strong> tl; dr: </strong> перейдите к примерам.</p><p> Самый простой случай - запрос определенного формата, например, с помощью <code> -f 22 </code> вы можете загрузить формат с кодом формата, равным 22. Вы можете получить список доступных кодов формата для конкретного видео, используя <code> --list-sizes </code> или <code> -F </code>. Обратите внимание, что эти коды формата зависят от экстрактора.</p><p> Вы также можете использовать расширение файла (в настоящее время поддерживаются <code> 3gp </code>, <code> aac </code>, <code> flv </code>, <code> m4a </code>, <code> mp3 </code>, <code> mp4 </code>, <code> ogg </code>, <code> wav </code>, <code> webm </code>) формат наилучшего качества для конкретного расширения файла - один файл, e.г. <code> -f webm </code> загрузит формат наилучшего качества с расширением <code> webm </code> в виде одного файла.</p><p> Вы также можете использовать специальные имена для выбора определенных форматов крайних регистров:</p><ul><li> <code> лучшее </code>: выберите формат наилучшего качества, представленный одним файлом с видео и аудио.</li><li> <code> наихудшее </code>: выберите формат наихудшего качества, представленный одним файлом с видео и аудио.</li><li> <code> bestvideo </code>: выберите формат только видео наилучшего качества (например,г. DASH видео). Может быть недоступен.</li><li> <code> наихудшее видео </code>: выберите формат только для видео наихудшего качества. Может быть недоступен.</li><li> <code> bestaudio </code>: выберите только аудиоформат наилучшего качества. Может быть недоступен.</li><li> <code> наихудшийаудио </code>: выберите формат только для звука наихудшего качества. Может быть недоступен.</li></ul><p> Например, чтобы загрузить видео в формате только худшего качества, вы можете использовать <code> -f худшее видео </code>.</p><p> Если вы хотите загрузить несколько видеороликов, и для них доступны разные форматы, вы можете указать порядок предпочтения с помощью косой черты.Обратите внимание, что косая черта является левоассоциативной, т.е. предпочтительны форматы с левой стороны, например <code> -f 22/17/18 </code> загрузит формат 22, если он доступен, в противном случае он загрузит формат 17, если он доступен, в противном случае он будет загрузите формат 18, если он доступен, в противном случае он будет жаловаться на отсутствие подходящих форматов для загрузки.</p><p> Если вы хотите загрузить несколько форматов одного и того же видео, используйте запятую в качестве разделителя, например <code> -f 22,17,18 </code> загрузит все эти три формата, если, конечно, они доступны.Или более сложный пример в сочетании с функцией приоритета: <code> -f 136/137 / mp4 / bestvideo, 140 / m4a / bestaudio </code>.</p><p> Вы также можете фильтровать форматы видео, заключив условие в скобки, например, <code> -f "best [height = 720]" </code> (или <code> -f "[файл> 10M]" </code>). = </code> (начинается с), <code> $ = </code> (заканчивается на), <code> * = </code> (содержит) и следующие строковые метаполя:</p><ul><li> <code> доб </code>: Расширение файла</li><li> <code> acodec </code>: имя используемого аудиокодека</li><li> <code> vcodec </code>: имя используемого видеокодека</li><li> <code> контейнер </code>: Название формата контейнера</li><li> <code> протокол </code>: протокол, который будет использоваться для фактической загрузки, строчные буквы (<code> http </code>, <code> https </code>, <code> rtsp </code>, <code> rtmp </code>, <code> rtmpe </code>, <code> mms </code>, <code> f4m </code>, <code> ism </code>, <code> http_dash_segments </code>, <code> m3u8 </code> или <code> m3u8_native </code>)</li><li> <code> format_id </code>: Краткое описание формата</li></ul><p> Любое сравнение строк может начинаться с отрицания <code>! </code>, чтобы произвести противоположное сравнение, например.г. <code>! * = </code> (не содержит).</p><p> Обратите внимание, что ни одно из вышеупомянутых мета-полей не обязательно присутствует, поскольку это зависит исключительно от метаданных, полученных конкретным экстрактором, то есть метаданных, предлагаемых хостером видео.</p><p> Форматы, для которых значение неизвестно, исключаются, если вы не поставите вопросительный знак (<code>? </code>) после оператора. Вы можете комбинировать фильтры форматов, поэтому <code> -f "[height <=? 720] [tbr> 500]" </code> выбирает видео с разрешением до 720p (или видео, высота которых неизвестна) с битрейтом не менее 500 Кбит / с. .</p><p> Вы можете объединить видео и аудио двух форматов в один файл, используя <code> -f<video-format> + <audio-format> </code> (требуется установка ffmpeg или avconv), например <code> -f bestvideo + bestaudio </code> загрузит лучший формат только для видео, лучший формат только для аудио и объедините их вместе с ffmpeg / avconv.</p> Селекторы формата<p> также можно сгруппировать с помощью скобок, например, если вы хотите загрузить лучшие форматы mp4 и webm с высотой ниже 480, вы можете использовать <code> -f '(mp4, webm) [height <480]' </code>.</p><p> С конца апреля 2015 года и версии 2015.04.26 youtube-dl использует <code> -f bestvideo + bestaudio / best </code> в качестве выбора формата по умолчанию (см. # 5447, # 5456). Если установлены ffmpeg или avconv, это приводит к загрузке <code> bestvideo </code> и <code> bestaudio </code> по отдельности и объединению их вместе в один файл, что дает наилучшее доступное качество. В противном случае он возвращается к <code> best </code> и приводит к загрузке наилучшего доступного качества в виде одного файла.<code> best </code> также необходим для видео, которые поступают не с YouTube, потому что они не предоставляют аудио и видео в двух разных файлах. Если вы хотите загружать только некоторые форматы DASH (например, если вас не интересует получение видео с разрешением выше 1080p), вы можете добавить в свою конфигурацию <code> -f bestvideo [height <=? 1080] + bestaudio / best </code> файл. Обратите внимание, что если вы используете youtube-dl для потоковой передачи на <code> stdout </code> (и, скорее всего, затем перенаправите его на свой медиаплеер), i.е. вы явно указываете выходной шаблон как <code> -o - </code>, youtube-dl по-прежнему использует <code> -f лучший выбор формата </code>, чтобы немедленно начать доставку контента на ваш проигрыватель и не ждать, пока <code> bestvideo </code> и <code> bestaudio </code> будут загружены и мультиплексированы .</p><p> Если вы хотите сохранить старое поведение при выборе формата (до youtube-dl 2015.04.26), т. Е. Хотите загрузить носитель самого лучшего качества, представленный в виде одного файла, вы должны явно указать свой выбор с помощью <code> -f best </code> .Вы можете добавить его в файл конфигурации, чтобы не вводить его каждый раз при запуске youtube-dl.</p><h5><span class="ez-toc-section" id="i-18"> Примеры выбора формата </span></h5><p> Обратите внимание, что в Windows вам может потребоваться использовать двойные кавычки вместо одинарных.</p><pre> <code> # Скачать лучший доступный формат mp4 или любой другой лучший, если mp4 недоступен
$ youtube-dl -f 'bestvideo [ext = mp4] + bestaudio [ext = m4a] / best [ext = mp4] / best' »

# Скачать лучший доступный формат, но не лучше 480p
$ youtube-dl -f 'bestvideo [height <= 480] + bestaudio / best [height <= 480] »

# Скачать только лучший формат видео, но не больше 50 МБ
$ youtube-dl -f 'лучший [размер файла <50M]'

# Скачать лучший формат, доступный по прямой ссылке по протоколу HTTP / HTTPS
$ youtube-dl -f '(bestvideo + bestaudio / best) [протокол ^ = http]'

# Загрузите лучший видеоформат и лучший аудиоформат, не объединяя их
$ youtube-dl -f 'bestvideo, bestaudio' -o '% (название) s.f% (format_id) s.% (ext) s '
 </code> </pre><p> Обратите внимание, что в последнем примере рекомендуется использовать шаблон вывода, так как bestvideo и bestaudio могут иметь одинаковое имя файла.</p><p> Видео можно отфильтровать по дате загрузки с помощью параметров <code> - дата </code>, <code> - дата до </code> или <code> - дата после </code>. Они принимают даты в двух форматах:</p><ul><li> Абсолютные даты: даты в формате <code> ГГГГММДД </code>.</li><li> Относительные даты: даты в формате <code> (сейчас | сегодня) [+ -] [0-9] (день | неделя | месяц | год) (а)? </code></li></ul><p> Примеры:</p><pre> <code> # Загружать только видео, загруженные за последние 6 месяцев
$ youtube-dl --dateafter сейчас-6 месяцев

# Скачать только видео, загруженные 1 января 1970 г.
$ youtube-dl --date 19700101

$ # Загружать только видео, загруженные в 200-кратное десятилетие
$ youtube-dl --dateafter 20000101 --datebefore 200<code>
 </code> </pre><h4><span class="ez-toc-section" id="_youtube-dl"> Как обновить youtube-dl? </span></h4><p> Если вы следовали нашим инструкциям по установке вручную, вы можете просто запустить <code> youtube-dl -U </code> (или, в Linux, <code> sudo youtube-dl -U </code>).</p><p> Если вы использовали pip, для обновления достаточно простой <code> sudo pip install -U youtube-dl </code>.</p><p> Если вы установили youtube-dl с помощью диспетчера пакетов, такого как <em> apt-get </em> или <em> yum </em>, используйте стандартный механизм обновления системы для обновления. Обратите внимание, что пакеты распространения часто устарели. Как показывает практика, youtube-dl выпускается не реже одного раза в месяц, а часто - еженедельно или даже ежедневно. Просто перейдите на https://yt-dl.org, чтобы узнать текущую версию. К сожалению, мы, разработчики youtube-dl, ничего не можем сделать, если ваш дистрибутив поддерживает действительно устаревшую версию.Вы можете (и должны) пожаловаться на ваш дистрибутив в их багтрекере или на форуме поддержки.</p><p> В крайнем случае, вы также можете удалить версию, установленную вашим менеджером пакетов, и следовать нашим инструкциям по установке вручную. Для этого удалите пакет дистрибутива со строкой типа</p><pre> <code> sudo apt-get remove -y youtube-dl
 </code> </pre><p> После этого просто следуйте нашим инструкциям по установке вручную:</p><pre> <code> sudo wget https://github.com/l1ving/youtube-dl/releases/latest/download/youtube-dl -O / usr / local / bin / youtube-dl
sudo chmod a + rx / usr / local / bin / youtube-dl
хэш -r
 </code> </pre><p> Опять же, с этого момента вы сможете выполнить обновление с помощью <code> sudo youtube-dl -U </code>.</p><h4><span class="ez-toc-section" id="youtube-dl_Windows"> youtube-dl очень медленно запускается в Windows </span></h4><p> Добавьте исключение файла для <code> youtube-dl.exe </code> в настройках Защитника Windows.</p><p> YouTube изменил свой формат плейлистов в марте 2014 г. и позже, поэтому для загрузки всех видео с YouTube вам понадобится как минимум youtube-dl 2014.07.25.</p><p> Если вы установили youtube-dl с помощью диспетчера пакетов, pip, setup.py или tarball, используйте его для обновления. Обратите внимание, что пакеты Ubuntu больше не обновляются.Поскольку мы не связаны с Ubuntu, мы мало что можем сделать. Не стесняйтесь сообщать об ошибках разработчикам пакетов Ubuntu - все, что им нужно сделать, это обновить пакет до более свежей версии. См. Выше способ обновления.</p><h4><span class="ez-toc-section" id="i-19"> Я получаю сообщение об ошибке при попытке использовать шаблон вывода: ошибка </span></h4><code>: использование шаблона вывода конфликтует с использованием заголовка, идентификатора видео или автоматического номера </code></h4><p> Убедитесь, что вы не используете <code> -o </code> с какой-либо из этих опций <code> -t </code>, <code> --title </code>, <code> --id </code>, <code> -A </code> или <code> --auto-number </code>, установленного в командной строке или в файле конфигурации.Удалите последний, если он есть.</p><h4><span class="ez-toc-section" id="i-20"> Всегда ли я должен проходить </span></h4><code> -citw </code>?</h4><p> По умолчанию youtube-dl намеревается иметь лучшие варианты (кстати, если у вас есть убедительные аргументы в пользу того, что они должны отличаться, сообщите о проблеме, где вы это объясните). Поэтому копировать длинные строки параметров с веб-страниц не нужно, а иногда и вредно. В частности, единственный вариант из <code> -citw </code>, который регулярно используется, - это <code> -i </code>.</p><h4><span class="ez-toc-section" id="i-21"> Подскажите пожалуйста опцию </span></h4><code> -b </code> обратно?</h4><p> Большинство людей, задающих этот вопрос, не знают, что youtube-dl теперь по умолчанию загружает самое высокое доступное качество, как сообщает YouTube, которое в некоторых случаях будет 1080p или 720p, поэтому вам больше не нужна опция <code> -b </code>.Для некоторых конкретных видео, возможно, YouTube не сообщает, что они доступны в конкретном формате высокого качества, который вас интересует. В этом случае просто запросите его с опцией <code> -f </code>, и youtube-dl попытается загрузить его.</p><h4><span class="ez-toc-section" id="_HTTP_402"> Я получаю ошибку HTTP 402 при попытке загрузить видео. Что это? </span></h4><p> Очевидно YouTube требует, чтобы вы прошли тест CAPTCHA, если вы скачали слишком много. Мы рассматриваем возможность предоставить вам возможность решить CAPTCHA, но на данный момент ваш лучший способ действий - это указать веб-браузером URL-адрес youtube, решить CAPTCHA и перезапустить youtube-dl.</p><h4><span class="ez-toc-section" id="i-22"> Нужны ли мне другие программы? </span></h4><p> youtube-dl отлично работает сам по себе на большинстве сайтов. Однако, если вы хотите конвертировать видео / аудио, вам понадобится avconv или ffmpeg. На некоторых сайтах, в первую очередь на YouTube, видео можно загружать в формате более высокого качества без звука. youtube-dl определит наличие avconv / ffmpeg и автоматически выберет лучший вариант.</p><p> Видео или видеоформаты, передаваемые по протоколу RTMP, могут быть загружены только при установленном rtmpdump. Для загрузки видеороликов MMS и RTSP необходимо установить mplayer или mpv.</p><h4><span class="ez-toc-section" id="i-23"> Я загрузил видео, но как его воспроизвести? </span></h4><p> После полной загрузки видео используйте любой видеопроигрыватель, например mpv, vlc или mplayer.</p><p> Это во многом зависит от сервиса. Во многих случаях запросы на видео (на загрузку / воспроизведение) должны поступать с одного и того же IP-адреса и с одинаковыми файлами cookie и / или заголовками HTTP. Используйте параметр <code> --cookies </code>, чтобы записать необходимые файлы cookie в файл, и посоветуйте загрузчику прочитать файлы cookie из этого файла. Некоторые сайты также требуют использования общего пользовательского агента, используйте <code> --dump-user-agent </code>, чтобы увидеть тот, который используется youtube-dl.Вы также можете получить необходимые файлы cookie и заголовки HTTP из выходных данных JSON, полученных с помощью <code> --dump-json </code>.</p><p> Может быть полезно использовать IPv6; в некоторых случаях ограничения применяются только к IPv4. Некоторые службы (иногда только для подмножества видео) не ограничивают URL видео по IP-адресу, cookie или пользовательскому агенту, но это скорее исключение, чем правило.</p><p> Имейте в виду, что некоторые протоколы URL-адресов <strong> не поддерживают </strong> браузерами из коробки, включая RTMP.Если вы используете <code> -g </code>, ваш собственный загрузчик также должен их поддерживать.</p><p> Если вы хотите воспроизвести видео на машине, на которой не запущен youtube-dl, вы можете ретранслировать видеоконтент с машины, на которой запущен youtube-dl. Вы можете использовать <code> -o - </code>, чтобы позволить youtube-dl транслировать видео на стандартный вывод, или просто разрешить проигрывателю загружать файлы, написанные youtube-dl по очереди.</p><h4><span class="ez-toc-section" id="_fmt_url_map_conn"> ОШИБКА: в информации о видео не найдена информация о fmt_url_map или conn. </span></h4><p> YouTube перешел на новый формат видеоинформации в июле 2011 года, который не поддерживается старыми версиями youtube-dl.См. Выше, как обновить youtube-dl.</p><h4><span class="ez-toc-section" id="i-24"> ОШИБКА: невозможно загрузить видео </span></h4><p> YouTube требует дополнительной подписи с сентября 2012 года, которая не поддерживается старыми версиями youtube-dl. См. Выше, как обновить youtube-dl.</p><h4><span class="ez-toc-section" id="URL"> URL-адрес видео содержит амперсанд, и я получаю странный вывод </span></h4><code> [1] 2839 </code> или <code> «v» не распознается как внутренняя или внешняя команда </code></h4><p> Это на самом деле результат работы вашей оболочки. Поскольку амперсанд является одним из специальных символов оболочки, он интерпретируется оболочкой, не позволяя вам передать весь URL-адрес на youtube-dl.Чтобы запретить вашей оболочке интерпретировать амперсанды (или любые другие специальные символы), вы должны либо поместить весь URL-адрес в кавычки, либо экранировать их с помощью обратной косой черты (какой подход будет работать, зависит от вашей оболочки).</p><p> Например, если ваш URL-адрес https://www.youtube.com/watch?t=4&v=BaW_jenozKc, вы должны получить следующую команду:</p><p> <code> youtube-dl 'https://www.youtube.com/watch?t=4&v=BaW_jenozKc' </code></p><p> или</p><p> <code> youtube-dl https: // www.youtube.com/watch?t=4\&v=BaW_jenozKc </code></p><p> Для Windows необходимо использовать двойные кавычки:</p><p> <code> youtube-dl "https://www.youtube.com/watch?t=4&v=BaW_jenozKc" </code></p><p> В феврале 2015 года новый проигрыватель YouTube содержал последовательность символов в строке, которая была неверно интерпретирована старыми версиями youtube-dl. См. Выше, как обновить youtube-dl.</p><h4><span class="ez-toc-section" id="_HTTP_429_402"> Ошибка HTTP 429: слишком много запросов или 402: требуется оплата </span></h4><p> Эти два кода ошибки указывают на то, что служба блокирует ваш IP-адрес из-за чрезмерного использования.Обычно это мягкая блокировка, означающая, что вы можете снова получить доступ после решения CAPTCHA. Просто откройте браузер и введите CAPTCHA, который предлагает вам сервис, а затем передайте файлы cookie на youtube-dl. Обратите внимание: если у вашего компьютера несколько внешних IP-адресов, вам также следует передать точно такой же IP-адрес, который вы использовали для решения CAPTCHA, с <code> --source-address </code>. Также вам может потребоваться передать HTTP-заголовок <code> User-Agent </code> вашего браузера с помощью <code> --user-agent </code>.</p><p> Если это не так (служба не предлагает CAPTCHA для решения), вы можете связаться со службой и попросить их разблокировать ваш IP-адрес или - если вы уже приобрели IP-адрес из белого списка - используйте <code> --proxy </code> или <code> - адрес источника </code> параметры для выбора другого IP-адреса.</p><h4><span class="ez-toc-section" id="SyntaxError_-ASCII"> SyntaxError: символ не-ASCII </span></h4><p> Ошибка</p><pre> <code> Файл "youtube-dl", строка 2
SyntaxError: не-ASCII символ '\ x93' ...
 </code> </pre><p> означает, что вы используете устаревшую версию Python. Пожалуйста, обновите Python до версии 2.6 или 2.7.</p><h4><span class="ez-toc-section" id="i-25"> Что это за двоичный файл? Куда пропал код? </span></h4><p> С июня 2012 года (# 342) youtube-dl упакован как исполняемый zip-файл, просто распакуйте его (в некоторых системах может потребоваться сначала переименовать в <code> youtube-dl.zip </code>) или клонировать репозиторий git, как описано выше.Если вы измените код, вы можете запустить его, выполнив файл <code> __main__.py </code>. Чтобы перекомпилировать исполняемый файл, запустите <code> make youtube-dl </code>.</p><h4><span class="ez-toc-section" id="EXE"> EXE выдает ошибку из-за отсутствия </span></h4><code> MSVCR100.dll </code></h4><p> Для запуска exe необходимо сначала установить распространяемый пакет Microsoft Visual C ++ 2010 (x86).</p><h4><span class="ez-toc-section" id="_ffmpeg_youtube-dl_Windows_exe"> Как мне настроить ffmpeg и youtube-dl в Windows? Куда мне положить exe-файлы? </span></h4><p> Если вы поместите youtube-dl и ffmpeg в тот же каталог, из которого вы запускаете команду, это будет работать, но это довольно громоздко.</p><p> Чтобы другой каталог работал - либо для ffmpeg, либо для youtube-dl, либо для обоих - просто создайте каталог (скажем, <code> C: \ bin </code> или <code> C: \ Users \ <Имя пользователя> \ bin </code> ), поместите все исполняемые файлы прямо туда, а затем установите переменную среды PATH, чтобы включить этот каталог.</p><p> С этого момента после перезапуска оболочки вы сможете получить доступ как к youtube-dl, так и к ffmpeg (а youtube-dl сможет найти ffmpeg), просто набрав <code> youtube-dl </code> или <code> ffmpeg </code>, независимо от того, что каталог, в котором вы находитесь.</p><h4><span class="ez-toc-section" id="i-26"> Как мне поместить загрузки в определенную папку? </span></h4><p> Используйте <code> -o </code>, чтобы указать шаблон вывода, например <code> -o "/home/user/videos/%(title)s-%(id)s.%(ext)s" </code>. Если вы хотите, чтобы это было для всех ваших загрузок, поместите эту опцию в свой файл конфигурации.</p><h4><span class="ez-toc-section" id="i-27"> Как загрузить видео, начиная с </span></h4><code> - </code>?</h4><p> Либо добавьте <code> https://www.youtube.com/watch?v= </code>, либо отделите идентификатор от вариантов с помощью <code> - </code>:</p><pre> <code> YouTube-DL - -wNyEUrxzFU
youtube-dl "https: // www.youtube.com/watch?v=-wNyEUrxzFU "
 </code> </pre><h4><span class="ez-toc-section" id="_cookie_youtube-dl"> Как передать файлы cookie на youtube-dl? </span></h4><p> Используйте параметр <code> --cookies </code>, например <code> --cookies /path/to/cookies/file.txt </code>.</p><p> Для извлечения файлов cookie из браузера используйте любое соответствующее расширение браузера для экспорта файлов cookie. Например, cookies.txt (для Chrome) или cookies.txt (для Firefox).</p><p> Обратите внимание, что файл cookie должен быть в формате Mozilla / Netscape, а первая строка файла cookie должна быть либо <code> # HTTP Cookie File </code>, либо <code> # Netscape HTTP Cookie File </code>.Убедитесь, что у вас правильный формат новой строки в файле cookie, и при необходимости преобразуйте новые строки в соответствии с вашей ОС, а именно <code> CRLF </code> (<code> \ r \ n </code>) для Windows и <code> LF </code> (<code> \ n </code>) для Unix и Unix. -подобные системы (Linux, macOS и др.). <code> Ошибка HTTP 400: неверный запрос </code> при использовании <code> --cookies </code> является хорошим признаком недопустимого формата новой строки.</p><p> Передача файлов cookie в youtube-dl - хороший способ обхода входа в систему, когда конкретный экстрактор не реализует его явно.Другой вариант использования - работа с CAPTCHA, некоторые веб-сайты требуют от вас решения в определенных случаях для получения доступа (например, YouTube, CloudFlare).</p><h4><span class="ez-toc-section" id="i-28"> Как выполнить потоковую передачу напрямую на медиаплеер? </span></h4><p> Сначала вам нужно указать youtube-dl для потоковой передачи мультимедиа на стандартный вывод с помощью <code> -o - </code>, а также указать вашему медиаплееру, чтобы он читал из стандартного ввода (он должен быть способен на это для потоковой передачи), а затем перенаправить первый на второй. Например, потоковая передача в vlc может быть достигнута с помощью:</p><pre> <code> youtube-dl -o - "https: // www.youtube.com/watch?v=BaW_jenozKcj "| vlc -
 </code> </pre><h4><span class="ez-toc-section" id="i-29"> Как мне загружать только новые видео из плейлиста? </span></h4><p> Используйте функцию загрузки-архива. С помощью этой функции вы должны изначально загрузить полный список воспроизведения с <code> --download-archive /path/to/download/archive/file.txt </code>, который будет записывать идентификаторы всех видео в специальный файл. Каждый последующий запуск с тем же <code> --download-archive </code> будет загружать только новые видео и пропускать все видео, которые были загружены ранее.Обратите внимание, что в файл записываются только успешные загрузки.</p><p> Например, сначала</p><pre> <code> youtube-dl --download-archive archive.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
 </code> </pre><p> загрузит полный список воспроизведения <code> PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re </code> и создаст файл <code> archive.txt </code>. При каждом последующем запуске будут загружаться только новые видео, если они есть:</p><pre> <code> youtube-dl - скачать-архив.txt "https://www.youtube.com/playlist?list=PLwiyx1dc3P2JR9N8gQaQN_BCvlSlap7re"
 </code> </pre><h4><span class="ez-toc-section" id="i-30"> Следует ли мне добавить </span></h4><code> --hls-Prefer-native </code> в мою конфигурацию?</h4><p> Когда youtube-dl обнаруживает видео HLS, он может загрузить его с помощью встроенного загрузчика или ffmpeg. Поскольку многие потоки HLS немного недействительны, и каждый из ffmpeg / youtube-dl обрабатывает некоторые недопустимые случаи лучше, чем другой, есть возможность при необходимости переключить загрузчик.</p><p> Когда youtube-dl знает, что один конкретный загрузчик лучше работает для данного веб-сайта, будет выбран этот загрузчик.В противном случае youtube-dl выберет лучший загрузчик для общей совместимости, которым на данный момент является ffmpeg. Этот выбор может измениться в будущих версиях youtube-dl с улучшениями встроенного загрузчика и / или ffmpeg.</p><p> В частности, универсальный экстрактор (используемый, когда ваш веб-сайт отсутствует в списке поддерживаемых youtube-dl сайтов, не может назначать один конкретный загрузчик.</p><p> Если вы добавите в конфигурацию <code> --hls-Prefer-native </code> или <code> --hls-Prefer-ffmpeg </code>, другое подмножество видео не сможет правильно загрузиться.Вместо этого гораздо лучше отправить проблему или запрос на перенос, в котором подробно рассказывается, почему нативный загрузчик HLS или ffmpeg является лучшим выбором для вашего варианта использования.</p><h4><span class="ez-toc-section" id="i-31"> Можете ли вы добавить поддержку этого сайта с аниме-видео или сайта, на котором бесплатно демонстрируются текущие фильмы? </span></h4><p> В соответствии с политикой (а также законностью) youtube-dl не включает поддержку служб, которые специализируются на нарушении авторских прав. Как показывает практика, если вы не можете легко найти видео, которое сервису, очевидно, разрешено распространять (т.е. который был загружен создателем, его дистрибьютором или опубликован под бесплатной лицензией), сервис, вероятно, не подходит для включения в youtube-dl.</p><p> Примечание к сервису о том, что они не размещают контент, нарушающий авторские права, а просто ссылаются на тех, кто его размещает, является доказательством того, что сервис должен быть <strong>, а не </strong> включен в youtube-dl. То же самое касается любого примечания DMCA, когда вся первая страница сервиса заполнена видеороликами, которые им не разрешено распространять. Замечание о «добросовестном использовании» также неубедительно, если сервис показывает видео, защищенные авторскими правами, полностью без разрешения.</p><p> Запросы на поддержку служб, которые <strong> делают </strong>, покупают права на распространение своего контента, тем не менее, прекрасны. В случае сомнений вы можете просто указать источник, в котором упоминается законная покупка контента.</p><h4><span class="ez-toc-section" id="i-32"> Как я могу ускорить работу над моей проблемой? </span></h4><p> (Также известен как: Помогите, моя важная проблема не решена!) Команда разработчиков ядра youtube-dl довольно мала. Хотя мы делаем все возможное, чтобы решить как можно больше проблем, иногда это может занять довольно много времени.Вот что вы можете сделать, чтобы ускорить решение проблемы:</p><p> Прежде всего, сообщите о проблеме в нашу систему отслеживания проблем. Это позволяет нам координировать все усилия пользователей и разработчиков и служит единой точкой. К сожалению, проект youtube-dl стал слишком большим, чтобы использовать личную электронную почту в качестве эффективного канала связи.</p><p> Прочтите приведенные ниже инструкции по сообщению об ошибках. Во многих ошибках отсутствует вся необходимая информация. Если можете, предложите разработчикам youtube-dl доступ через прокси, VPN или оболочку.Если у вас есть возможность, протестируйте проблему с нескольких компьютеров в разных странах, чтобы исключить проблемы местной цензуры или неправильной конфигурации.</p><p> Если никто не заинтересован в решении вашей проблемы, вы можете взять ее в свои руки и отправить запрос на перенос (или заставить / заплатить за это кого-то другого).</p><p> Не стесняйтесь время от времени поднимать проблему, написав небольшой комментарий («Проблема все еще присутствует в версии youtube-dl ... из Франции, но исправлена ​​из Бельгии»), но, пожалуйста, не чаще одного раза в месяц.Не указывайте, что ваша проблема <code> важная </code> или <code> срочная </code>.</p><h4><span class="ez-toc-section" id="_URL-_youtube-dl"> Как я могу определить, поддерживается ли данный URL-адрес youtube-dl? </span></h4><p> Например, взгляните на список поддерживаемых сайтов. Обратите внимание, что иногда может случиться так, что сайт меняет схему URL-адресов (скажем, с https://example.com/video/1234567 на https://example.com/v/1234567), а youtube-dl сообщает URL-адрес сервис в этом списке как неподдерживаемый. В этом случае просто сообщите об ошибке.</p><p> Это <em>, а не </em>, возможно определить, поддерживается ли URL-адрес или нет.Это потому, что youtube-dl содержит общий экстрактор, который соответствует <strong> всем </strong> URL. У вас может возникнуть соблазн отключить, исключить или удалить общий экстрактор, но общий экстрактор не только позволяет пользователям извлекать видео с множества веб-сайтов, которые встраивают видео из другой службы, но также может использоваться для извлечения видео из службы, которая это сам хостинг. Поэтому мы не рекомендуем и не поддерживаем отключение, исключение или удаление универсального экстрактора.</p><p> Если вы хотите узнать, поддерживается ли данный URL-адрес, просто вызовите с ним youtube-dl.Если вы не получаете видео обратно, скорее всего, URL-адрес либо не относится к видео, либо не поддерживается. Вы можете узнать, что, проверив вывод (если вы запустите youtube-dl на консоли) или поймав исключение <code> UnsupportedError </code>, если вы запустите его из программы Python.</p><p> До того, как у нас появился шаблон проблемы, несмотря на наши подробные инструкции по сообщению об ошибках, около 80% отчетов о проблемах, которые мы получали, были бесполезными, например, потому что люди использовали старые версии, выпущенные сотнями выпусков, из-за простых синтаксических ошибок (не в youtube-dl но в общем случае использование оболочки), потому что о проблеме уже сообщалось несколько раз раньше, потому что люди на самом деле не читали сообщение об ошибке, даже если в нем говорилось «пожалуйста, установите ffmpeg», потому что люди не упоминали URL-адрес, который они пытались загрузить, и гораздо больше простых проблем, которых легко избежать, многие из которых совершенно не связаны с youtube-dl.</p><p> youtube-dl - это проект с открытым исходным кодом, в котором работает слишком мало добровольцев, поэтому мы предпочли бы потратить время на исправление ошибок, когда мы уверены, что ни одна из этих простых проблем не применима, и где мы можем быть достаточно уверены в том, что сможем воспроизвести проблему. не спрашивая репортера повторно. Таким образом, вывод <code> youtube-dl -v YOUR_URL_HERE </code> - это действительно все, что требуется для сообщения о проблеме. Шаблон задачи также проведет вас по некоторым основным шагам, которые вы можете сделать, например, по проверке актуальности вашей версии youtube-dl.</p><p> Большинству пользователей не нужно собирать youtube-dl, и они могут загрузить сборки или получить их из своего дистрибутива.</p><p> Чтобы запустить youtube-dl от имени разработчика, вам также не нужно ничего создавать. Просто выполните</p><pre> <code> питон -m youtube_dl
 </code> </pre><p> Чтобы запустить тест, просто вызовите любимую программу запуска тестов или запустите тестовый файл напрямую; любая из следующих работ:</p><pre> <code> python -m unittest обнаружить
тест python / test_download.py
тесты на нос
 </code> </pre><p> См. Пункт 6 руководства по новому экстрактору, чтобы узнать, как запускать конкретные тестовые случаи для экстрактора.</p><p> Если вы хотите создать сборку youtube-dl самостоятельно, вам понадобится</p><ul><li> питон</li><li> make (поддерживается только GNU make)</li><li> pandoc</li><li> молния</li><li> тесты на нос</li></ul><h4><span class="ez-toc-section" id="i-33"> Добавление поддержки для нового сайта </span></h4><p> Если вы хотите добавить поддержку нового сайта, прежде всего <strong> убедитесь, что </strong> этот сайт <strong> не посвящен нарушению авторских прав </strong>. youtube-dl не поддерживает <strong> таких сайтов, поэтому запросы на добавление поддержки для них <strong> будут отклонены </strong>.</p><p> После того, как вы убедились, что этот сайт распространяет свой контент на законных основаниях, вы можете следовать этому быстрому списку (при условии, что ваш сервис называется <code> yourextractor </code>):</p><ol><li><p> Вилка этого репозитория</p></li><li><p> Ознакомьтесь с исходным кодом с помощью:</p><pre> <code> git clone git@github. https?: //.* \. jpg $ ',
            # TODO дополнительные свойства, либо как:
            # * Ценность
            # * Контрольная сумма MD5; начните строку с md5:
            # * Регулярное выражение; начать строку с re:
            # * Любой тип Python (например int или float)
        }
    }

    def _real_extract (self, url):
        video_id = self._match_id (url)
        webpage = self._download_webpage (url, video_id)

        # TODO сюда идет дополнительный код, например ...
        title = self._html_search_regex (r ' <h2><span class="ez-toc-section" id="i-34"> (.</span></h2> <] +) <', webpage,' uploader ', fatal = False),
            # TODO дополнительные свойства (см. Youtube_dl / extractor / common.py)
        }
 </code> </pre></li><li><p> Добавьте импорт в <code> youtube_dl / extractor / extractors.py </code>.</p></li><li><p> Запустите <code> python test / test_download.py TestDownload.test_YourExtractor </code>. Этот <em> должен сначала выйти из строя </em>, но вы можете постоянно запускать его, пока не закончите. Если вы решили добавить более одного теста, переименуйте <code> _TEST </code> в <code> _TESTS </code> и внесите его в список словарей.Затем тесты будут называться <code> TestDownload.test_YourExtractor </code>, <code> TestDownload.test_YourExtractor_1 </code>, <code> TestDownload.test_YourExtractor_2 </code> и т. Д. Обратите внимание, что тесты с ключом <code> only_matching </code> в dict теста не учитываются.</p></li><li><p> Взгляните на <code> youtube_dl / extractor / common.py </code>, чтобы узнать о возможных вспомогательных методах и подробном описании того, что должен и может вернуть ваш экстрактор. Добавляйте тесты и код столько, сколько хотите.</p></li><li><p> Убедитесь, что ваш код соответствует соглашениям о кодировании youtube-dl, и проверьте код с помощью flake8:</p><pre> <code> $ flake8 youtube_dl / extractor / yourextractor.py
 </code> </pre></li><li><p> Убедитесь, что ваш код работает со всеми версиями Python, которые, как заявлено, поддерживаются youtube-dl, а именно 2.6, 2.7 и 3.2+.</p></li><li><p> Когда тесты пройдут, добавьте новые файлы, зафиксируйте их и отправьте результат, например:</p><pre> <code> $ git добавить youtube_dl / extractor / extractors.ру
$ git добавить youtube_dl / extractor / yourextractor.py
$ git commit -m '[yourextractor] Добавить новый экстрактор'
$ git push origin yourextractor
 </code> </pre></li><li><p> Наконец, создайте запрос на вытягивание. Затем мы рассмотрим и объединим его.</p></li></ol><p> В любом случае большое спасибо за ваш вклад!</p><h3><span class="ez-toc-section" id="_youtube-dl-2"> правила кодирования youtube-dl </span></h3><p> В этом разделе представлены рекомендации по написанию идиоматического, надежного и перспективного кода экстрактора.</p> Экстракторы<p> очень хрупкие по своей природе, так как они зависят от компоновки исходных данных, предоставленных сторонними медиахостерами, вне вашего контроля, и эта компоновка имеет тенденцию меняться.Как разработчик экстрактора, ваша задача - не только написать код, который будет правильно извлекать медиа-ссылки и метаданные, но и минимизировать зависимость от макета источника и даже сделать так, чтобы код предвидел возможные будущие изменения и был готов к этому. Это важно, потому что это позволит экстрактору не ломаться при незначительных изменениях макета, таким образом, старые версии youtube-dl будут работать. Несмотря на то, что эта проблема с поломкой легко устраняется путем выпуска новой версии youtube-dl со встроенным исправлением, все предыдущие версии перестают работать во всех репозиториях и пакетах дистрибутивов, которые могут не так быстро получать обновление от нас.Излишне говорить, что некоторые дистрибутивы, не выпускающие непрерывный выпуск, могут вообще никогда не получить обновления.</p><h4><span class="ez-toc-section" id="i-35"> Обязательные и необязательные метаполя </span></h4><p> Для работы извлечения youtube-dl полагается на метаданные, которые извлекает ваш экстрактор, и предоставляет youtube-dl в виде информационного словаря или просто <em> info dict </em>. Только следующие мета-поля в информационном слове <em> </em> считаются обязательными для успешного процесса извлечения youtube-dl:</p><ul><li> <code> id </code> (идентификатор носителя)</li><li> <code> заголовок </code> (заголовок СМИ)</li><li> <code> url </code> (URL загрузки мультимедиа) или <code> форматы </code></li></ul><p> Фактически, технически обязательным является только последний вариант (т.е.е. если вы не можете определить место загрузки носителя, извлечение не имеет смысла). Но по соглашению youtube-dl также обрабатывает <code> id </code> и <code> title </code> как обязательные. Таким образом, вышеупомянутые метаполя являются критическими данными, без которых извлечение не имеет никакого смысла, и если какое-либо из них не удается извлечь, экстрактор считается полностью сломанным.</p><p> Любые поля, кроме вышеупомянутых, считаются <strong> необязательными </strong>. Это означает, что извлечение должно быть <strong>, устойчивым, </strong> к ситуациям, когда источники для этих полей потенциально могут быть недоступны (даже если они всегда доступны в данный момент), и <strong> перспективным </strong>, чтобы не прерывать извлечение обязательных полей общего назначения.</p><h5><span class="ez-toc-section" id="i-36"> Пример </span></h5><p> Скажем, у вас есть исходный словарь <code> meta </code>, который вы получили как JSON с HTTP-запросом, и у него есть сводка по ключу <code> </code>:</p><pre> <code> meta = self._download_json (url, video_id)
 </code> </pre><p> Предположим, что на этом этапе макет мета <code> </code>:</p><pre> <code> {
    ...
    "summary": "какой-то необычный итоговый текст",
    ...
}
 </code> </pre><p> Предположим, вы хотите извлечь сводку <code> </code> и поместить ее в итоговый информационный dict как <code> description </code>.Поскольку описание <code> </code> является необязательным мета-полем, вы должны быть готовы к тому, что этот ключ может отсутствовать в мета-слове <code> </code>, поэтому вы должны извлечь его как:</p><pre> <code> description = meta.get ('summary') # правильно
 </code> </pre><p> и не такие:</p><pre> <code> description = meta ['summary'] # неверно
 </code> </pre><p> Последний прервет процесс извлечения с помощью <code> KeyError </code>, если сводка <code> </code> исчезнет из мета <code> </code> через некоторое время, но при первом подходе извлечение будет просто продолжено с описанием <code> </code>, установленным на <code> Нет </code>, что совершенно нормально ( помните <code> Нет </code> эквивалентно отсутствию данных).<] +) <',
 веб-страница, 'описание', по умолчанию = Нет)
 </code> </pre><p> В случае сбоя этот код будет молча продолжить извлечение с описанием <code> </code>, установленным на <code> Нет </code>. Это полезно для метаполей, которые могут присутствовать или отсутствовать.</p><h4><span class="ez-toc-section" id="i-37"> Предоставить запасные варианты </span></h4><p> При извлечении метаданных попробуйте сделать это из нескольких источников. Например, если <code> title </code> присутствует в нескольких местах, попробуйте извлечь хотя бы из некоторых из них. Это делает его более перспективным на случай, если некоторые из источников станут недоступны.</p><h5><span class="ez-toc-section" id="i-38"> Пример </span></h5><p> Скажем, мета <code> </code> из предыдущего примера имеет заголовок <code> </code>, и вы собираетесь его извлечь. Поскольку <code> title </code> является обязательным мета-полем, вы должны получить что-то вроде:</p><pre> <code> title = meta ['title']
 </code> </pre><p> Если <code> заголовок </code> исчезнет из <code> мета </code> в будущем из-за некоторых изменений на стороне хостера, извлечение не удастся, поскольку <code> заголовок </code> является обязательным. Это ожидаемо.</p><p> Предположим, у вас есть другой источник, из которого вы можете извлечь <code> title </code>, например <code> og: title </code> HTML-мета для веб-страницы <code> </code>.В этом случае вы можете предоставить запасной сценарий:</p><pre> <code> title = meta.get ('title') или self._og_search_title (веб-страница)
 </code> </pre><p> Этот код сначала попытается извлечь из мета <code> </code>, и если это не удастся, он попытается извлечь <code> og: title </code> с веб-страницы <code> </code>.</p><h4><span class="ez-toc-section" id="i-39"> Регулярные выражения </span></h4><h5><span class="ez-toc-section" id="i-40"> Не захватывайте группы, которые вы не используете </span></h5><p> Группа захвата должна указывать на то, что она где-то используется в коде. Любая неиспользуемая группа должна быть незахватываемой.</p><h5><span class="ez-toc-section" id="i-41"> Пример </span></h5><p> Не записывайте здесь имя атрибута id, так как вы в любом случае не можете использовать его ни для чего.</p><p> Правильно:</p><pre> <code> r '(?: Id | ID) = (? P <id> \ d +)'
 </code> </pre><p> Неверно:</p><pre> <code> r '(id | ID) = (? P <id> \ d +)'
 </code> </pre><h5><span class="ez-toc-section" id="i-42"> Делайте регулярные выражения расслабленными и гибкими </span></h5><p> При использовании регулярных выражений старайтесь писать их нечеткими, расслабленными и гибкими, пропуская незначительные части, которые с большей вероятностью изменятся, разрешая как одинарные, так и двойные кавычки для значений в кавычках и так далее.<] +) ',
 веб-страница, 'title', group = 'title')
 </code> </pre><p> Обратите внимание на то, как вы допускаете потенциальные изменения в значении атрибута </code> стиля <code> или переходите от использования двойных кавычек к одинарным для атрибута <code> класса </code>:</p><p> Код точно не должен выглядеть так:</p><pre> <code> title = self._search_regex (
    r '<span> (. *?) </span>',
    веб-страница, 'title', group = 'title')
 </code> </pre><h4><span class="ez-toc-section" id="i-43"> Политика в отношении длинных линий </span></h4><p> Существует мягкое ограничение на длину строк кода менее 80 символов.Это означает, что его следует уважать, если это возможно, и если это не ухудшает читаемость и сопровождение кода.</p><p> Например, <strong> никогда не следует </strong> разбивать длинные строковые литералы, такие как URL-адреса или некоторые другие часто копируемые объекты, на несколько строк, чтобы соответствовать этому пределу:</p><p> Правильно:</p><pre> <code> 'https://www.youtube.com/watch?v=FqZTN594JQw&list=PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'
 </code> </pre><p> Неверно:</p><pre> <code> 'https://www.youtube.com/watch?v=FqZTN594JQw&list='
'PLMYEtVRpaqY00V9W81Cwmzp6N6vZqfUKD4'
 </code> </pre><h4><span class="ez-toc-section" id="i-44"> Встроенные значения </span></h4><p> Извлечение переменных допустимо для уменьшения дублирования кода и улучшения читаемости сложных выражений.<] +) '
# ... несколько строк кода ...
title = self._html_search_regex (TITLE_RE, веб-страница, 'заголовок')  

Свернуть резервные копии

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

Пример

Хорошо:

  description = self._html_search_meta (
    ['og: description', 'description', 'twitter: description'],
    веб-страница, 'описание', по умолчанию = Нет)
  

Огромный:

  описание = (
    себя._og_search_description (веб-страница, по умолчанию = Нет)
    или self._html_search_meta ('описание', веб-страница, по умолчанию = Нет)
    или self._html_search_meta ('twitter: description', webpage, default = None))
  

Список поддерживающих шаблонов методов: _search_regex , _html_search_regex , _og_search_property , _html_search_meta .

Завершающие скобки

Всегда помещайте завершающие круглые скобки после последнего аргумента.

Пример

Правильно:

  лямбда x: x ['ResultSet'] ['Result'] [0] ['VideoUrlSet'] ['VideoUrl'],
    список)
  

Неверно:

  лямбда x: x ['ResultSet'] ['Result'] [0] ['VideoUrlSet'] ['VideoUrl'],
    список,
)
  

Использовать удобные функции преобразования и синтаксического анализа

Обернуть все извлеченные числовые данные в безопасные функции из youtube_dl / utils.py : int_or_none , float_or_none . Используйте их также для преобразования строки в числа.

Используйте url_or_none для безопасной обработки URL.

Используйте try_get для безопасного извлечения метаданных из проанализированного JSON.

Используйте unified_strdate для унифицированного upload_date или любого извлечения метаполя ГГГГММДД , unified_timestamp для унифицированного извлечения метки времени , parse_filesize для извлечения файлов , 900_19 parse_count для извлечения мета-полей count20 , parse_duration для продолжительности извлечения , parse_age_limit для извлечения age_limit .

Изучите youtube_dl / utils.py для получения дополнительных полезных функций.

Другие примеры
  description = try_get (ответ, лямбда x: x ['результат'] ['видео'] [0] ['сводка'], compat_str)
  
  video = try_get (response, lambda x: x ['result'] ['video'] [0], dict) или {}
description = video.get ('сводка')
duration = float_or_none (video.get ('durationMs'), scale = 1000)
view_count = int_or_none (video.get ('просмотры'))
  

youtube-dl делает все возможное, чтобы быть хорошей программой командной строки, и поэтому ее следует вызывать с любого языка программирования.Если у вас возникнут проблемы с анализом его вывода, смело создавайте отчет.

Из программы Python вы можете встроить youtube-dl более мощным способом, например:

  из __future__ import unicode_literals
импортировать youtube_dl

ydl_opts = {}
с youtube_dl.YoutubeDL (ydl_opts) как ydl:
    ydl.download (['https://www.youtube.com/watch?v=BaW_jenozKc'])
  

Скорее всего, вам захочется использовать разные варианты. Список доступных опций можно найти на странице youtube_dl / YoutubeDL.py . Для начала, если вы хотите перехватить вывод youtube-dl, установите объект logger .

Вот более полный пример программы, которая выводит только ошибки (и короткое сообщение после завершения загрузки) и загружает / конвертирует видео в файл mp3:

  из __future__ import unicode_literals
импортировать youtube_dl


класс MyLogger (объект):
    def debug (self, msg):
        проходить

    def предупреждение (self, msg):
        проходить

    def error (self, msg):
        печать (сообщение)


def my_hook (d):
    если d ['status'] == 'завершено':
        print ('Готово, теперь конвертируем... ')


ydl_opts = {
    'формат': 'bestaudio / лучший',
    'постпроцессоры': [{
        'ключ': 'FFmpegExtractAudio',
        'предпочтительный кодек': 'mp3',
        'предпочтительное качество': '192',
    }],
    'logger': MyLogger (),
    'progress_hooks': [my_hook],
}
с youtube_dl.YoutubeDL (ydl_opts) как ydl:
    ydl.download (['https://www.youtube.com/watch?v=BaW_jenozKc'])
  

Об ошибках и предложениях следует сообщать по адресу: https://github.com/ytdl-org/youtube-dl/issues. Если вас не попросили или нет другой уважительной причины (например,г. GitHub не принимает отчет об ошибке), пожалуйста, не отправляйте отчеты об ошибках по электронной почте. Для обсуждения присоединяйтесь к нам на IRC-канале # youtube-dl на freenode (веб-чат).

Пожалуйста, включите полный вывод youtube-dl при запуске с -v , то есть добавьте флаг -v в свою командную строку , скопируйте весь вывод и опубликуйте его в теле задачи, обернутом в '' для лучшего форматирования. Это должно выглядеть примерно так:

  $ youtube-dl -v <ваша командная строка>
[отладка] Конфигурация системы: []
[отладка] Конфигурация пользователя: []
[отладка] Аргументы командной строки: [u'-v ', u'https: // www.youtube.com/watch?v=BaW_jenozKcj ']
[отладка] Кодировки: locale cp1251, fs mbcs, out cp866, pref cp1251
[отладка] youtube-dl версия 2015.12.06
[отладка] Git HEAD: 135392e
[отладка] Python версии 2.6.6 - Windows-2003Server-5.2.3790-SP2
[отладка] exe-версии: ffmpeg N-75573-g1d0487f, ffprobe N-75573-g1d0487f, rtmpdump 2.4
[отладка] Карта прокси: {}
...
  

Не размещать скриншоты подробных логов; допустим только обычный текст.

Вывод (включая первые строки) содержит важную отладочную информацию.Проблемы без полного вывода часто не могут быть воспроизведены и, следовательно, не могут быть решены в кратчайшие сроки, если вообще когда-либо.

Пожалуйста, перечитайте проблему еще раз, чтобы избежать пары типичных ошибок (вы можете и должны использовать это как контрольный список):

Достаточно ли описания проблемы?

Мы часто получаем отчеты о проблемах, которые мы не можем расшифровать. Хотя в большинстве случаев мы в конечном итоге получаем требуемую информацию после нескольких запросов, это приводит к ненужной утечке наших ресурсов.Многие участники, включая меня, также не являются носителями языка, поэтому мы можем неправильно истолковать некоторые части.

Итак, пожалуйста, поясните, какую функцию вы запрашиваете или какую ошибку вы хотите исправить. Убедитесь, что это очевидно

  • В чем проблема
  • Как это исправить
  • Как будет выглядеть предложенное вами решение

Если ваш отчет короче двух строк, в нем почти наверняка отсутствуют некоторые из них, что затрудняет нам ответ на него.Часто мы слишком вежливы, чтобы сразу закрыть проблему, но из-за отсутствия информации возможно неправильное толкование. Я, как коммиттер, часто расстраиваюсь из-за этих проблем, поскольку для меня единственный способ продвигаться вперед - это снова и снова просить разъяснений.

Для отчетов об ошибках это означает, что ваш отчет должен содержать полный вывод youtube-dl при вызове с флагом -v . Сообщение об ошибке, которое вы получаете для (большинства) ошибок, даже говорит об этом, но вы не поверите, сколько из наших отчетов об ошибках не содержат этой информации.

Если у вашего сервера несколько IP-адресов или вы подозреваете наличие цензуры, добавление --call-home может быть хорошей идеей для получения дополнительной диагностики. Если ошибка ОШИБКА: невозможно извлечь ... и вы не можете воспроизвести ее из нескольких стран, добавьте --dump-pages (предупреждение: это приведет к довольно большому результату, перенаправьте его в файл log. txt , добавив > log.txt 2> & 1 в вашу командную строку) или загрузите файлы .dump , которые вы получите, когда куда-нибудь добавите --write-pages .

Запросы в службу поддержки сайта должны содержать пример URL-адреса . Пример URL-адреса - это URL-адрес, который вы, возможно, захотите загрузить, например https://www.youtube.com/watch?v=BaW_jenozKc . Должно быть очевидное видео. За исключением особых случаев, главная страница видеосервиса (например, https://www.youtube.com/ ) - это , а не как пример URL.

Вы используете последнюю версию?

Прежде чем сообщать о какой-либо проблеме, введите youtube-dl -U .Это должно сообщить, что вы в курсе. Около 20% отчетов, которые мы получаем, уже исправлены, но люди используют устаревшие версии. Это также касается запросов функций.

Проблема уже задокументирована?

Убедитесь, что кто-то еще не открыл проблему, которую вы пытаетесь открыть. Выполните поиск в верхней части окна или просмотрите проблемы GitHub этого репозитория. Если есть проблема, не стесняйтесь написать что-нибудь вроде «Это касается и меня с версией 2015.01.01. Вот еще немного информации по проблеме: ... ". Хотя некоторые проблемы могут быть старыми, добавление нового сообщения в них часто способствует быстрой активности.

Почему существующих вариантов недостаточно?

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

Достаточно ли контекста в вашем отчете об ошибке?

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

Затем нам поступает очень сложный запрос, когда исходную проблему можно решить гораздо проще, например.г. записав идентификаторы загруженных видео в отдельный файл. Чтобы этого избежать, вы должны включить более широкий контекст, где это неочевидно. В частности, каждый запрос функции, который не заключается в добавлении поддержки для нового сайта, должен содержать сценарий варианта использования, который объясняет, в какой ситуации отсутствующая функция будет полезна.

Проблема связана с одной проблемой, и только с одной проблемой?

Некоторые из наших пользователей, кажется, думают, что существует предел вопросов, которые они могут или должны открывать.Нет предела вопросов, которые они могут или должны открывать. Хотя может показаться привлекательной возможность свести все свои проблемы в одну заявку, это означает, что кто-то, решивший одну из ваших проблем, не может пометить проблему как закрытую. Как правило, сообщение о нескольких проблемах приводит к тому, что тикет задерживается, поскольку никто не хочет атаковать этого чудовища, пока кто-нибудь милостиво не разделит проблему на несколько.

В частности, каждая проблема запроса поддержки сайта должна относиться только к услугам на одном сайте (обычно в одном домене, но всегда с использованием одной и той же внутренней технологии).Не запрашивайте поддержку видео пользователей vimeo, подкастов Белого дома и страниц Google Plus в одном и том же выпуске. Кроме того, убедитесь, что вы не публикуете отчеты об ошибках вместе с запросами функций. Как показывает опыт, запрос функции не включает в себя выходные данные youtube-dl, которые не имеют непосредственного отношения к данной функции. Не размещайте отчеты о сетевых ошибках вместе с запросом новой видеосервиса.

Кому-нибудь понадобится функция?

Публикуйте только те функции, которые требуются вам (или недееспособному другу, с которым вы можете лично поговорить).Не публикуйте функции, потому что они кажутся хорошей идеей. Если они действительно полезны, их запросит тот, кто в них нуждается.

Ваш вопрос о youtube-dl?

Это может показаться странным, но некоторые сообщения об ошибках, которые мы получаем, совершенно не связаны с youtube-dl и относятся к другому или даже собственному приложению репортера. Убедитесь, что вы действительно используете youtube-dl. Если вы используете пользовательский интерфейс для youtube-dl, сообщите об ошибке разработчику фактического приложения, предоставляющего пользовательский интерфейс.С другой стороны, если ваш пользовательский интерфейс для youtube-dl не работает каким-либо образом, по вашему мнению, он связан с youtube-dl, непременно сообщите об ошибке.

youtube-dl передан в общественное достояние правообладателями.

Этот файл README был первоначально написан Дэниелом Болтоном и также является общественным достоянием.

[README.md] Описание последовательности автонумерации исправлений (refs # 26686) · adae9e844b - youtube-dl

Сергей М 10 месяцев назад

В базе данных не найден известный ключ для этой подписи Идентификатор ключа GPG: 2C393E0F18A9236D

1 измененные файлы с добавлением 1 и 1 удаления
  1. ПРОЧТИ МЕНЯ.мкр
@ -545,7 +545,7 @@ Основное использование - не устанавливать аргументы шаблона при загрузке одного f
- `extractor` (строка): Название экстрактора
- `extractor_key` (строка): имя ключа экстрактора
- `epoch` (числовой): эпоха Unix при создании файла
- `autonumber` (числовой): пятизначное число, которое будет увеличиваться с каждой загрузкой, начиная с нуля
- `autonumber` (числовой): Число, которое будет увеличиваться с каждой загрузкой, начиная с` --autonumber-start`
- `playlist` (строка): имя или идентификатор списка воспроизведения, который содержит видео
- `playlist_index` (числовой): индекс видео в списке воспроизведения, дополненный ведущими нулями в соответствии с общей длиной списка воспроизведения
- `playlist_id` (строка): идентификатор списка воспроизведения

4.2: Зеркальное отображение зарядов и токов

  1. Последнее обновление
  2. Сохранить как PDF
Без заголовков

Один очень полезный метод решения проблем - изменить определение проблемы на такое, которое легче решить, но, как известно, дает тот же ответ.Прекрасным примером этого подхода является использование зеркальных зарядов и токов, которые также подходят для волновых задач. 10

10 Другим примером этого подхода является использование двойственности между \ (\ overline {\ mathrm {E}} \) и \ (\ overline {\ mathrm {H}} \), как описано в Разделе 9.2.6.

Рисунок \ (\ PageIndex {1} \): заряд изображения для бесконечного плоского идеального проводника.

Рассмотрим задачу поиска полей, создаваемых зарядом, расположенным на расстоянии d над бесконечной идеально проводящей плоскостью, как показано на рисунке 4.2.1 (а). Граничные условия на проводнике требуют только, чтобы силовые линии электрического поля были перпендикулярны его поверхности. Любой другой набор граничных условий, налагающий такое же ограничение, должен давать такое же единственное решение в силу теоремы единственности из раздела 2.8.

Один такой набор эквивалентных граничных условий вызывает дублирование заряда зеркального отображения на расстоянии 2d от исходного заряда и противоположного знака; проводник удален. Симметрия для равных и противоположных зарядов требует, чтобы силовые линии электрического поля \ (\ overline {\ mathrm {E}} \) были перпендикулярны исходной поверхности проводника при z = 0; это приводит к тому, что \ (\ overline {\ mathrm {E}} \) точно так же, как и для z> 0, когда присутствует проводник, как показано на рисунке 4.2.1 (б). Следовательно, уникальность говорит о том, что над полуплоскостью поля, создаваемые исходным зарядом плюс его зеркальное отображение, идентичны полям исходной задачи. Поля под исходной полуплоскостью явно отличаются, но они не имеют отношения к исходной задаче.

Этот эквивалент применяется для множественных сборов или для распределения сборов, как показано на Рисунке 4.2.2. Фактически, метод зеркального отображения остается в силе до тех пор, пока заряды меняют значение или положение медленно относительно времени релаксации ε / σ проводника, как обсуждалось в разделе 4.4.1. Время релаксации - это постоянная времени 1 / e, необходимая для того, чтобы заряды в проводнике приблизились к новым положениям равновесия после изменения внешнего распределения заряда источника.

Рисунок \ (\ PageIndex {2} \): оплата за несколько изображений.

Поскольку метод зеркального отображения работает для переменных или движущихся зарядов, он работает для токов, которые должны быть связаны с ними за счет сохранения заряда (2.1.21), как показано на рис. 4.2.3 (a) и (b). Рисунок 4.2.3 (d) также показывает, как магнитные поля, создаваемые этими токами, удовлетворяют граничным условиям для проводящей плоскости: на поверхности идеального проводника \ (\ overline {\ mathrm {H}} \) только параллельны.

Метод зеркального отображения продолжает работать, если верхняя полуплоскость содержит проводник, как показано на рисунке 4.2.4; проводник тоже должен быть изображен. Эти проводники могут быть даже под углом, как показано на Рисунке 4.2.4 (b). Область, в которой рассчитанные поля действительны, естественно ограничивается исходным отверстием между проводниками. Еще более сложные конфигурации изображения могут использоваться для других размещений проводников и могут даже включать бесконечную серию постепенно уменьшающихся зарядов и токов изображения.

Рисунок \ (\ PageIndex {3} \): токи изображения. Рисунок \ (\ PageIndex {4} \): заряды и токи изображения для пересекающихся проводников.

Отражение объектов базы данных - Документация по SQLAlchemy 1.4

A Table объект может быть проинструктирован для загрузки информация о себе уже из соответствующего объекта схемы базы данных существующие в базе данных. Этот процесс называется отражением . в в самом простом случае вам нужно только указать имя таблицы, MetaData объект и autoload_with аргумент:

 >>> messages = Table ('messages', meta, autoload_with = engine)
>>> [c.имя для c в messages.columns]
['message_id', 'message_name', 'date'] 

Вышеупомянутая операция будет использовать данный механизм для запроса базы данных для информация о таблице сообщений , а затем сгенерирует Колонка , ForeignKey , и другие объекты, соответствующие этой информации, как если бы Table объект был создан вручную на Python.

Когда таблицы отражаются, если данная таблица ссылается на другую через внешнюю key, второй объект Table создается внутри MetaData объект, представляющий соединение.Ниже предположим, что таблица shopping_cart_items ссылается на таблицу с именем Тележки для покупок . Отражение таблицы shopping_cart_items имеет такой эффект, что таблица shopping_carts также будет загружена:

 >>> shopping_cart_items = Table ('shopping_cart_items', meta, autoload_with = engine)
>>> 'shopping_carts' в мета-таблицах:
Правда 

У MetaData есть интересный «синглтон-подобный» такое поведение, что если вы запросили обе таблицы по отдельности, MetaData гарантирует, что ровно один Таблица объект создается для каждой отдельной таблицы название.Конструктор Table фактически возвращается к вы уже существующий Table объект, если один уже существует с данным именем. Как показано ниже, мы можем получить доступ к уже сгенерировал таблицу shopping_carts , просто назвав ее:

 shopping_carts = Таблица ('shopping_carts', мета) 

Конечно, неплохо использовать autoload_with = engine с приведенной выше таблицей. несмотря ни на что. Это значит, что атрибуты таблицы будут загружены, если у них есть еще не было.Операция автозагрузки выполняется для таблицы только в том случае, если она еще не загружен; после загрузки новые вызовы Таблица с тем же именем не будет перевыпускать запросы на отражение.

Переопределение отраженных столбцов

Отдельные столбцы могут быть переопределены явными значениями при отражении столы; это удобно для указания пользовательских типов данных, таких ограничений, как первичные ключи, которые не могут быть настроены в базе данных и т. д .:

 >>> mytable = Table ('mytable', meta,
... Column ('id', Integer, primary_key = True), # переопределить отраженный 'id', чтобы иметь первичный ключ
... Столбец ('mydata', Unicode (50)), # переопределение отразило 'mydata' на Unicode
... # дополнительные объекты Column, которые не требуют изменений, отображаются нормально
... autoload_with = some_engine) 

Отражение взглядов

Система отражения также может отражать виды. Основное использование такое же, как и стола:

 my_view = Таблица ("some_view", метаданные, autoload_with = engine) 

Выше my_view - это объект Table с Столбец объектов, представляющих имена и типы каждый столбец в представлении «some_view».

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

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

 my_view = Таблица ("some_view", метаданные,
                Столбец ("view_id", целое число, primary_key = True),
                Столбец ("related_thing", Integer, ForeignKey ("othertable.вещь_ид ")),
                autoload_with = двигатель
) 

Отражение всех таблиц одновременно

Объект MetaData также может получить список таблицы и отражают полный набор. Это достигается за счет использования Reflect () метод . После его вызова все расположенные таблицы присутствуют в MetaData объектный словарь таблиц:

 meta = Метаданные ()
meta.reflect (привязать = someengine)
users_table = meta.tables ['пользователи']
address_table = meta.tables ['адреса'] 

метаданных.Reflect () также предоставляет удобный способ очистить или удалить все строки в базе данных:

 meta = Метаданные ()
meta.reflect (привязать = someengine)
для таблицы в обратном порядке (meta.sorted_tables):
    someengine.execute (table.delete ()) 

Мелкозернистое отражение с инспектором

Интерфейс низкого уровня, обеспечивающий независимую от серверной части систему загрузки. списки описаний схем, таблиц, столбцов и ограничений из заданного база данных также доступна. Он известен как «Инспектор»:

.
 из sqlalchemy import create_engine
из sqlalchemy import inspect
двигатель = create_engine ('... ')
insp = inspect (двигатель)
печать (insp.get_table_names ()) 
Имя объекта Описание

Инспектор

Выполняет проверку схемы базы данных.

класс sqlalchemy.engine.reflection.Inspector ( привязка )

Выполняет проверку схемы базы данных.

Инспектор действует как прокси для методов отражения Диалект , обеспечивающий согласованный интерфейс, а также поддержка кеширования ранее получены метаданные.

Объект Inspector обычно создается через inspect () функция, которая может быть передана Двигатель или соединение :

 из sqlalchemy import inspect, create_engine
двигатель = create_engine ('...')
insp = inspect (двигатель) 

Где указано выше, Диалект связан с двигателем может выбрать вернуть Inspector подкласс, который предоставляет дополнительные методы, специфичные для целевой базы данных диалекта.

метод sqlalchemy.engine.reflection.Inspector. __init __ ( привязка )

Инициализировать новый Inspector .

Параметры

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

Для специфичного для диалекта экземпляра Inspector см. Inspector.from_engine ()

атрибут sqlalchemy.двигатель.отражение.Инспектор. имя_схемы по умолчанию

Возвращает имя схемы по умолчанию, представленное диалектом для текущего пользователя базы данных движка.

Например, обычно это общедоступный для PostgreSQL и dbo для SQL Server.

метод sqlalchemy.engine.reflection.Inspector. метод класса from_engine ( привязка )

Создайте новый объект Inspector, зависящий от диалекта, из заданного двигатель или соединение.

Не рекомендуется, начиная с версии 1.4: метод from_engine () в Inspector является устаревшим и будет удален в следующем выпуске. Используйте функцию inspect () на Engine или Connection , чтобы получить Inspector .

Параметры

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

Этот метод отличается от прямого прямого вызова конструктора Инспектор в том, что Диалект дает шанс предоставить специфичный для диалекта экземпляр Inspector , который может предоставить дополнительные методы.

См. Пример в Inspector .

метод sqlalchemy.engine.reflection.Inspector. get_check_constraints ( table_name , schema = None , ** кВт )

Возвращает информацию о проверочных ограничениях в имя_таблицы .

Учитывая строку table_name и необязательную строку schema , возврат проверьте информацию об ограничениях в виде списка dicts с этими ключами:

  • наименование - имя проверочного ограничения

  • sqltext - выражение SQL контрольного ограничения

  • dialect_options - может присутствовать или не присутствовать; словарь с дополнительными зависящие от диалекта параметры для этого ограничения CHECK

Параметры
  • table_name - строковое имя таблицы.Для специального цитирования, используйте quoted_name .

  • schema - строковое имя схемы; если опущено, использует схему по умолчанию подключения к базе данных. Для специального цитирования, используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_columns ( table_name , schema = None , ** kw )

Возвращает информацию о столбцах в table_name .

Учитывая строку table_name и необязательную строку schema , возврат информация о столбце в виде списка словаря с этими ключами:

  • имя - имя столбца

  • тип - тип этой колонки; экземпляр Тип Двигатель

  • обнуляемый - логический флаг, если столбец имеет значение NULL или NOT NULL

  • по умолчанию - значение по умолчанию для сервера столбца - возвращается как строковое выражение SQL.

  • автоинкремент - указывает, что столбец автоматически увеличивается - возвращается как логическое значение или «авто»

  • комментарий - (необязательно) комментарий к колонке. Только некоторые диалекты возвращают этот ключ

  • вычислено - (необязательно), если присутствует, указывает, что этот столбец вычисляется базой данных. Только некоторые диалекты возвращают этот ключ. Вернул дикт с ключами:

    Новое в версии 1.3.16: - добавлена ​​поддержка вычисленного отражения.

  • идентификатор - (необязательно), если присутствует, указывает, что этот столбец - это всегда сгенерированный столбец. Только некоторые диалекты возвращают этот ключ. Список ключевых слов в этом слове см. В Identity .

    Новое в версии 1.4: - добавлена ​​поддержка отражения столбца идентичности.

  • dialect_options - (необязательно) dict с опциями, специфичными для диалекта

Параметры
  • table_name - строковое имя таблицы.Для специального цитирования, используйте quoted_name .

  • schema - строковое имя схемы; если опущено, использует схему по умолчанию подключения к базе данных. Для специального цитирования, используйте quoted_name .

Возврат

список словарей, каждый из которых представляет определение столбец базы данных.

метод sqlalchemy.engine.reflection.Inspector. get_foreign_keys ( table_name , schema = None , ** кВт )

Возвращает информацию об foreign_keys в table_name .

Учитывая строку table_name и необязательную строку schema , возврат информация о внешнем ключе в виде списка dicts с этими ключами:

  • constrained_columns - список имен столбцов, составляющих внешний ключ

  • упомянутая_схема - имя указанной схемы

  • указанная_таблица - наименование упомянутой таблицы

  • указанные_столбцы - список имен столбцов в указанной таблице, которые соответствуют constrained_columns

  • наименование - необязательное имя ограничения внешнего ключа.

Параметры
  • table_name - строковое имя таблицы. Для специального цитирования, используйте quoted_name .

  • schema - строковое имя схемы; если опущено, использует схему по умолчанию подключения к базе данных. Для специального цитирования, используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_indexes ( table_name , schema = None , ** кВт )

Возвращает информацию об индексах в table_name .

Учитывая строку table_name и необязательную строку schema , возврат индексировать информацию в виде списка dicts с этими ключами:

  • наименование - название индекса

  • имена_столбцов - список названий столбцов по порядку

  • уникальный - логический

  • column_sorting - необязательные имена столбцов сопоставления dict с кортежем ключевых слов сортировки, который может включать asc , desc , nulls_first , nulls_last .

  • dialect_options - dict диалектных опций индекса. Может не присутствовать для всех диалектов.

Параметры
  • table_name - строковое имя таблицы. Для специального цитирования, используйте quoted_name .

  • schema - строковое имя схемы; если опущено, использует схему по умолчанию подключения к базе данных. Для специального цитирования, используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_pk_constraint ( table_name , schema = None , ** кВт )

Возвращает информацию об ограничении первичного ключа для имя_таблицы .

Учитывая строку table_name и необязательную строку schema , возврат информация о первичном ключе в виде словаря с этими ключами:

Параметры
  • table_name - строковое имя таблицы.Для специального цитирования, используйте quoted_name .

  • schema - строковое имя схемы; если опущено, использует схему по умолчанию подключения к базе данных. Для специального цитирования, используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_schema_names ()

Вернуть все имена схем.

метод sqlalchemy.двигатель.отражение.Инспектор. get_sequence_names ( schema = None )

Возвращает все имена последовательностей в схеме .

Параметры

схема - Необязательно, получение имен из нестандартной схемы. Для особого цитирования используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_sorted_table_and_fkc_names ( schema = None )

Возвращает отсортированную по зависимостям таблицу и имена ограничений внешнего ключа в упоминается в конкретной схеме.

Это даст 2 кортежа (имя таблицы, [(tname, fkname), (tname, fkname), ...]) состоящий из имен таблиц в порядке CREATE, сгруппированных по внешнему ключу имена ограничений, которые не определены как принадлежащие циклу. Последний элемент будет (Нет, [(tname, fkname), (tname, fkname), ..]) который будет состоять из оставшихся имена ограничений внешнего ключа, которые потребуют отдельного CREATE шаг постфактум, основанный на зависимостях между таблицами.

Возвращает информацию о комментарии к таблице для имя_таблицы .

Учитывая строку table_name и необязательную строку schema , вернуть информацию о комментариях к таблице в виде словаря с этими ключами:

  • текст -

    текст комментария.

Вызывает ошибку NotImplementedError для диалекта, который не поддерживает Комментарии.

метод sqlalchemy.engine.reflection.Inspector. get_table_names ( schema = None )

Возвращает все имена таблиц, упомянутые в конкретной схеме.

Предполагается, что имена будут только настоящими таблицами, а не представлениями. Вместо этого представления возвращаются с использованием Inspector.get_view_names () метод.

Параметры

схема - Имя схемы. Если схема оставлена ​​на Нет , схема базы данных по умолчанию используется, иначе ищется указанная схема. Если база данных не поддержка именованных схем, поведение не определено, если схема не является прошло как Нет .Для особого цитирования используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_table_options ( table_name , schema = None , ** кВт )

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

В настоящее время сюда входят некоторые параметры, применимые к таблицам MySQL.

Параметры
  • table_name - строковое имя таблицы.Для специального цитирования, используйте quoted_name .

  • schema - строковое имя схемы; если опущено, использует схему по умолчанию подключения к базе данных. Для специального цитирования, используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_temp_table_names ()

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

Этот метод не поддерживается большинством диалектов; В данный момент только SQLite реализует это.

метод sqlalchemy.engine.reflection.Inspector. get_temp_view_names ()

Вернуть список имен временных представлений для текущей привязки.

Этот метод не поддерживается большинством диалектов; В данный момент только SQLite реализует это.

метод sqlalchemy.engine.reflection.Inspector. get_unique_constraints ( table_name , schema = None , ** кВт )

Возвращает информацию об уникальных ограничениях в table_name .

Учитывая строку table_name и необязательную строку schema , возврат уникальная информация об ограничении в виде списка dicts с этими ключами:

Параметры
  • table_name - строковое имя таблицы. Для специального цитирования, используйте quoted_name .

  • schema - строковое имя схемы; если опущено, использует схему по умолчанию подключения к базе данных. Для специального цитирования, используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. get_view_definition ( view_name , schema = None )

Определение возврата для view_name .

Параметры

схема - Необязательно, получение имен из нестандартной схемы. Для особого цитирования используйте quoted_name .

метод sqlalchemy.двигатель.отражение.Инспектор. get_view_names ( schema = None )

Возвращает все имена представлений в схеме .

Параметры

схема - Необязательно, получение имен из нестандартной схемы. Для особого цитирования используйте quoted_name .

метод sqlalchemy.engine.reflection.Inspector. has_sequence ( имя_последовательности , schema = None )

Вернуть True, если серверная часть имеет таблицу с заданным именем.

Параметры
  • имя_последовательности - имя таблицы для проверки

  • схема - имя схемы для запроса, если не схема по умолчанию.

метод sqlalchemy.engine.reflection.Inspector. has_table ( table_name , schema = None )

Вернуть True, если серверная часть имеет таблицу с заданным именем.

Параметры
  • table_name - имя таблицы для проверки

  • схема - имя схемы для запроса, если не схема по умолчанию.

метод sqlalchemy.engine.reflection.Inspector. отражать_таблицу ( таблица , include_columns , exclude_columns = () , resolve_fks = True , _extend_on = None )

Для объекта Table загрузить его внутренний конструкции, основанные на самоанализе.

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

 из sqlalchemy import create_engine, MetaData, Table
из sqlalchemy import inspect

двигатель = create_engine ('...')
meta = Метаданные ()
user_table = Таблица ('пользователь', мета)
insp = inspect (двигатель)
insp.reflect_table (user_table, None) 

Изменено в версии 1.4: Таблица отражений переименована в . отражающий стол

Параметры
  • table - экземпляр Table .

  • include_columns - список имен строковых столбцов для включения в процессе размышления. Если Нет , отображаются все столбцы.

метод sqlalchemy.engine.reflection.Inspector. отражающий стол ( * args , ** kwargs )

См. Таблицу отражений. Это имя метода устарело

Отражение с помощью типов, не зависящих от базы данных

Когда столбцы таблицы отражаются, используя либо Таблица.autoload_with параметр Таблица или метод Inspector.get_columns () из Inspector , типы данных будут максимально конкретными. в целевую базу данных. Это означает, что если отображается «целочисленный» тип данных из базы данных MySQL тип будет представлен sqlalchemy.dialects.mysql.INTEGER класс, который включает специфичный для MySQL такие атрибуты, как «display_width». Или в PostgreSQL, специфичном для PostgreSQL тип данных, например sqlalchemy.dialects.postgresql.INTERVAL или sqlalchemy.dialects.postgresql.ENUM может быть возвращено.

Существует вариант использования отражения, который заключается в том, что данная Таблица подлежит передаче в базу данных другого поставщика. Чтобы соответствовать этому варианту использования, есть метод, с помощью которого эти типы данных, зависящие от поставщика, могут быть преобразованы на лету, чтобы быть экземпляром типов данных SQLAlchemy, не зависящих от серверной части, для в приведенных выше примерах типы, такие как Integer , Interval и Enum .Это может быть достигнуто путем перехвата отражение столбца с использованием события DDLEvents.column_reflect () в сочетании с методом TypeEngine.as_generic () .

Учитывая таблицу в MySQL (выбрана, потому что MySQL имеет много зависящих от поставщика типы данных и параметры):

 СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ my_table (
    id INTEGER PRIMARY KEY AUTO_INCREMENT,
    data1 VARCHAR (50) НАБОР СИМВОЛОВ latin1,
    data2 MEDIUMINT (4),
    data3 TINYINT (2)
) 

Приведенная выше таблица включает целые типы только для MySQL MEDIUMINT и TINYINT , а также VARCHAR , который включает только MySQL CHARACTER Опция SET .Если мы отразим эту таблицу нормально, она даст Table объект, который будет содержать эти специфичные для MySQL типы данных и варианты:

 >>> из sqlalchemy import MetaData, Table, create_engine
>>> mysql_engine = create_engine ("mysql: // scott: tiger @ localhost / test")
>>> метаданные = Метаданные ()
>>> my_mysql_table = Таблица ("my_table", метаданные, autoload_with = mysql_engine) 

Приведенный выше пример отражает схему приведенной выше таблицы в новую Таблица объект.Затем мы можем в демонстрационных целях распечатать специфичный для MySQL Оператор CREATE TABLE с использованием конструкции CreateTable :

 >>> из sqlalchemy.schema import CreateTable
>>> print (CreateTable (my_mysql_table) .compile (mysql_engine))
 

СОЗДАТЬ ТАБЛИЦУ my_table ( id INTEGER (11) NOT NULL AUTO_INCREMENT, data1 VARCHAR (50) НАБОР СИМВОЛОВ latin1, data2 MEDIUMINT (4), data3 TINYINT (2), ПЕРВИЧНЫЙ КЛЮЧ (id) ) ДВИГАТЕЛЬ = НАБОР ПО УМОЛЧАНИЮ для InnoDB = utf8mb4

Выше были сохранены специфичные для MySQL типы данных и опции.Если бы мы хотели Table , которую мы могли бы вместо этого перенести на другой поставщик базы данных, заменяющий специальные типы данных sqlalchemy.dialects.mysql.MEDIUMINT и sqlalchemy.dialects.mysql.TINYINT с Integer , мы можем вместо этого выберите «обобщить» типы данных в этой таблице или иным образом изменить их любым способом, который мы захотим, установив обработчик с помощью DDLEvents.column_reflect () событие. Пользовательский обработчик будет использовать двигателя TypeEngine.as_generic () для преобразования вышеуказанного Типовые объекты, специфичные для MySQL, на общие, путем замены "type" запись в словарной статье столбца, которая передается обработчику событий. Формат этого словаря описан в Inspector.get_columns () :

.
 >>> из события импорта sqlalchemy
>>> метаданные = Метаданные ()

>>> @ event.listens_for (метаданные, "column_reflect")
>>> def genericize_datatypes (инспектор, имя таблицы, столбец_дикт):
... column_dict ["тип"] = column_dict ["тип"]. as_generic ()

>>> my_generic_table = Таблица ("my_table", метаданные, autoload_with = mysql_engine) 

Теперь мы получаем новую таблицу Table , которая является универсальной и использует Целое число для этих типов данных. Теперь мы можем испустить Оператор CREATE TABLE, например, в базе данных PostgreSQL:

 >>> pg_engine = create_engine ("postgresql: // scott: tiger @ localhost / test", echo = True)
>>> my_generic_table.create (pg_engine)
 

СОЗДАТЬ ТАБЛИЦУ my_table ( id SERIAL NOT NULL, data1 VARCHAR (50), data2 ЦЕЛОЕ, data3 INTEGER, ПЕРВИЧНЫЙ КЛЮЧ (id) )

Отметим также, что SQLAlchemy обычно делает приличное предположение для других поведения, например, что директива MySQL AUTO_INCREMENT представлена в PostgreSQL наиболее близко используется автоматически увеличивающийся тип данных SERIAL .

Ограничения отражения

Важно отметить, что процесс отражения воссоздает Таблица . метаданные, использующие только ту информацию, которая представлена ​​в реляционной базе данных. Этот процесс по определению не может восстановить аспекты схемы, которые не фактически хранится в базе данных. Состояние, недоступное из отражения включает, но не ограничивается:

  • Значения по умолчанию на стороне клиента, либо функции Python, либо выражения SQL, определенные с помощью ключевое слово по умолчанию из Столбец (обратите внимание, что это отдельно от server_default , а именно то, что доступно через отражение).

  • Информация о столбце, например данные, которые могли быть помещены в Column.info словарь

  • Значение параметра .quote для Столбец или Таблица

  • Связь определенной последовательности с заданным столбцом

Реляционная база данных также во многих случаях сообщает о метаданных таблицы в формат отличается от того, который был указан в SQLAlchemy.Стол объекты, возвращенные из отражения, не всегда можно полагаться на создание идентичных DDL как исходные определенные Python объекты Table . Области, где это происходит, включая настройки сервера по умолчанию, последовательности, связанные со столбцами, и различные идиосинкразии в отношении ограничений и типов данных. Значения по умолчанию на стороне сервера могут должны быть возвращены с помощью директив приведения (обычно PostgreSQL будет включать :: cast) или другие шаблоны цитирования, чем указано изначально.

Другая категория ограничений включает структуры схем, для которых отражение только частично или еще не определено. Недавние улучшения отражения позволяют такие вещи, как представления, индексы и параметры внешнего ключа, которые должны быть отражены. С этого момента записи, такие структуры, как ограничения CHECK, комментарии к таблицам и триггеры не отражается.

Редактирование существующей записи через форму Airtable… вроде как… - Показать и рассказать

Сводка
Иногда люди спрашивают, можно ли использовать форму Airtable для редактирования существующей записи.Технически ответ - «нет», потому что формы Airtable всегда создают новые записи. Однако базу можно настроить так, чтобы записи, созданные формой, в конечном итоге влияли на записи в другой «зеркальной» таблице.

Как и в случае с моим первым представлением «покажи и расскажи», это было вдохновлено решением, которое я создал в другом потоке. Короче говоря, ключом к этому решению было использование двух таблиц: одна для сбора данных формы, а другая, которая ищет эти данные формы и заполняет параллельный набор полей. Чтобы расширить это, чтобы позволить данным из последующих записей, созданных с помощью форм, эффективно заменять старые данные в «зеркальной» таблице, потребовалось всего несколько дополнительных шагов.

Настройка таблицы
Для создания этой системы первой таблицей, которую нужно создать, будет таблица [Data Entry] . Вот где и закончатся данные формы. После удаления записей по умолчанию измените основное поле на тип Autonumber, а затем настройте оставшиеся поля для данных, которые вы хотите собирать. Заимствуя из ветки, которая вдохновила эту систему, мой пример настройки будет сосредоточен на статистике для футболистов:

Затем добавьте еще одну таблицу. Это станет «зеркальной» таблицей, основным местом для просмотра всех собранных вами данных.В моем случае я назову его [Players] , но пока ничего не буду делать с его полями.

Вернитесь в таблицу [Data Entry] , вставьте новое поле между основным полем и вашим первым полем данных и сделайте его ссылкой на вашу «зеркальную» таблицу ( [Players] в этом примере). Назовите его в соответствии с вашей ситуацией. В моем случае я назову его {Player} .

Возвращаясь к таблице [Players] , пора начать настройку «зеркального» поведения, чтобы поля в этой таблице управлялись тем, что указано в [Data Entry] .Однако не для всех полей требуется одинаковая настройка. Например, я не планирую менять имя, фамилию или рост футболиста после того, как они были введены изначально. Для этих случаев я создам то, что я назову статическим зеркалом .

Для каждого поля в таблице [Data Entry] , которое будет иметь статическую настройку зеркала, начните с добавления нового поля в зеркальную таблицу, установив его имя в соответствии с полем, которое оно будет зеркально отражено, и сделав его полем подстановки.В моем случае я начинаю с поля {Имя} , поэтому я сделаю поле поиска {Имя} в [Players] . Он должен найти автоматически созданное поле ссылки {Data Entry} , созданное Airtable, поэтому все, что вам нужно будет выбрать, это поле для поиска. В моем случае я выберу поле {Имя} и сохраню изменения.

Поля {Фамилия} и {Высота} также будут статическими зеркалами, поэтому я сделаю их таким же образом.

{Weight} - это первое поле, которое я, возможно, захочу «отредактировать» через форму в будущем, поэтому для этого я сделаю настройку динамического зеркала . Один из ключей к этой настройке - постоянная длина символа. Если данные в поле, которое вы собираетесь «редактировать», будут различаться по длине, вам нужно будет создать измененную версию, чтобы обеспечить согласованность этой длины. Однако в этом случае я могу пропустить этот шаг, потому что я достаточно уверен, что вес всегда будет трехзначным.Я пройдусь по настройке постоянной длины в другом поле. В этом случае я могу остаться в [Players] и добавить новое поле поиска, которое я назову {Weight Lookup} , извлекая из поля {Weight} в [Data Entry] .

Чтобы извлечь из этого вес, мы создадим поле формулы {Weight} . Поскольку поиск может в конечном итоге извлекать из нескольких записей, их нужно сократить до самых последних. Опять же, поскольку мы знаем, что вес всегда будет трехзначным, мы можем использовать следующую формулу для извлечения только последнего веса:

  СПРАВА ({Подбор веса} & "", 3)
  

Теперь наши поля выглядят так:

Хотя положение футболиста со временем вряд ли изменится, допустим, мы хотим подготовиться на случай, если это произойдет с командой, которую мы отслеживаем.Мы используем аббревиатуры позиций, которые могут варьироваться от одного до трех символов, поэтому при построении этой настройки динамического зеркального отображения нам необходимо дополнить их до постоянной трехсимвольной длины. Для этого мы создадим поле формулы в [Data Entry] с именем {Position Padded} . Нам нужна эта версия с дополнением только в том случае, если что-то действительно было выбрано в поле {Position} , поэтому мы структурируем формулу следующим образом:

  ЕСЛИ ({Position}, LEFT ({Position} & REPT ("*", 3), 3))
  

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

Вернувшись в свою зеркальную таблицу, создайте поле поиска, которое вытягивает это заполненное поле, которое вы только что создали. Наконец, создайте поле формулы, которое соответствует имени поля, которое вы зеркалируете, используя эту формулу (изменив имя поля соответствующим образом), чтобы извлечь только последнюю позицию из списка:

  ЗАМЕНА (ВПРАВО ({Поиск позиции} & "", 3), "*", "")
  

Сделаем последнюю настройку динамического зеркала для поля {Speed ​​(sec)} . Потому что мы можем с уверенностью предположить, что ни один игрок не достигнет уровня выше 9.99 секунд (а если они это сделают, мы не хотим, чтобы они были в команде), нам не нужно выполнять дополнительные шаги заполнения. Мы просто создадим поле поиска в [Players] , а затем поле формулы с формулой, аналогичной полю {Weight} , но на основе предположения о длине четырех символов:

  IF ({Speed ​​Lookup}, VALUE (SUBSTITUTE (RIGHT ({Speed ​​Lookup} & "", 4), "*", "")))
  

Продолжайте работать с полями [Ввод данных] , настраивая статические и динамические зеркала для каждого из них в зеркальной таблице по мере необходимости.

Когда это будет решено, что делать с основным полем зеркальной таблицы? Я предлагаю сделать это поле формулы, которое объединяет некоторые уникальные и полезные данные из одного или нескольких других зеркальных полей. В нашем случае мы собираемся смешать имя и фамилию игрока вместе:

  ЕСЛИ (И ({Имя}, {Фамилия}), {Имя} & "" & {Фамилия})
  

Последнее, что нужно сделать при настройке нашей зеркальной таблицы, - это добавить кучу пустых записей в зеркальную таблицу.Сколько вы добавите, зависит от вас. Вы можете добавлять их кусками или целиком сразу. По мере продвижения вы поймете, зачем им это нужно.

Настройка и использование формы
Теперь мы готовы поговорить о том, как форма вписывается во все это. Вернемся к [Data Entry] , добавьте представление формы. Я назвал свою «Статистика игрока». Он должен добавить все поля из основной сетки в том же порядке. Предполагая, что все выглядит хорошо, нажмите «Открыть форму» на панели инструментов формы, чтобы открыть форму в вашем веб-браузере.

Допустим, я впервые ввожу данные для футболиста. В разделе «Игрок» я выберу первую запись «Без имени», доступную в списке. Затем я заполню имя и фамилию игрока, а также любую имеющуюся у меня статистику. Я не буду записывать полную форму. здесь, но верхняя часть будет выглядеть так:

Теперь у меня есть второй игрок. Если посмотреть на доступные записи в разделе «Игрок», первая запись больше не будет «Без имени», а должна соответствовать имени игрока, который я ввел ранее.Это потому, что введенное мной имя просматривается в зеркальной таблице, объединяется с помощью формулы в основное поле, на которое теперь ссылается обновленная форма.

Я введу данные второго игрока, снова выбрав следующую доступную «Безымянную запись» перед заполнением остальных. По сути, выбор конкретной записи «Безымянная запись» сообщает Airtable, какую запись в зеркальной таблице я хочу использовать для просмотра вводимых данных. Другими словами, я назначаю эти данные для отображения в определенной записи в зеркальной таблице.

Когда в игру вошли два игрока, вот как выглядят столы:

А теперь допустим, что это месяц спустя. Джон Смит сбросил несколько фунтов и улучшил свою скорость, поэтому я хочу обновить его информацию. Снова открывая форму, на этот раз я выбираю его существующую запись в разделе «Игрок», пропускаю поля имени и ввожу данные только в два поля, которые я хочу изменить: «Вес» и «Скорость (с)». После отправки формы таблицы теперь выглядят следующим образом:

Вот примерная база без записей, которую вы можете скопировать в свое рабочее пространство, если хотите поиграть:

Airtable

Записи об обновлении форм - Airtable

Изучите базу «Формы обновления записей» на Airtable.

Предостережения
Есть несколько ключевых моментов, которые следует отметить об этой системе, некоторые из которых вы, возможно, уже поняли, читая этот пост:

  1. Вы не можете просмотреть существующие данные для данного поля до ввода новых данных. Если это мешает, вам может потребоваться более надежная система форм, которая интегрируется с Airtable, чтобы извлекать существующие данные перед их редактированием. Однако возможный обходной путь - настроить формулу для основного поля зеркальной таблицы, чтобы включить часть этой информации, чтобы вы сразу увидели ее, когда выберете запись из списка.В этом примере с футбольной командой я мог бы изменить формулу так, чтобы основное поле было примерно таким: «Джон Смит: 5’8», 160 фунтов, QB, 4,60 сек »
  2. Поскольку добавление «новой» записи через форму фактически формирует соединение с существующей безымянной записью из зеркальной таблицы, вам необходимо периодически добавлять пустые записи в конец зеркальной таблицы.
  3. Использование этого на базе, где зеркальная таблица потенциально может содержать сотни или тысячи записей, может быстро стать громоздким.Нет ярлыка для поиска следующей безымянной записи, поэтому вам придется много прокручивать при вводе новой информации.

Экспорт таблицы или запроса на сайт SharePoint

Если вам нужно временно или навсегда переместить некоторые данные Access на сайт SharePoint, вы можете экспортировать их на сайт из своей базы данных Access. При экспорте данных Access создает копию выбранной таблицы или объекта базы данных запроса и сохраняет копию в виде списка. Важно помнить, что экспортированный список не будет отражать изменения, внесенные в исходную таблицу или запрос после операции экспорта.

В этой статье

Распространенные сценарии экспорта данных на сайт SharePoint

Вы экспортируете таблицу или запрос на сайт SharePoint по разным причинам, в том числе:

  • Вы только начинаете использовать Windows SharePoint Services и понимаете, что всем будет проще, если некоторые из ваших таблиц базы данных также будут существовать в виде списков SharePoint. Если вы хотите поделиться данными со своей командой, работать со списками SharePoint может быть проще, чем работать с базой данных.Списки также могут быть проще для просмотра и редактирования начинающими пользователями. Кроме того, вы можете воспользоваться преимуществами нескольких функций SharePoint, таких как получение уведомления об изменении списка, назначение и координация задач, связанных со списком, и работа в автономном режиме.

  • Вы хотите обмениваться данными между Access и сайтом SharePoint на постоянной основе, но в настоящее время данные хранятся в Access. Чтобы просмотреть и отредактировать последние данные с помощью Access или с сайта SharePoint, вы должны сначала экспортировать данные в виде списка, а затем связать их с базой данных Access.

  • Вы используете запросы в базе данных Access для создания ежедневных или еженедельных отчетов о состоянии и хотите регулярно публиковать результаты на одном из своих сайтов.

В этом разделе представлены действия по экспорту данных в SharePoint в виде списка. Для получения справки о связывании со списком SharePoint из Access см. Раздел Импорт из списка SharePoint или связывание данных с ним.

Экспорт таблицы или запроса на сайт SharePoint

Самый простой способ экспортировать данные на сайт SharePoint - запустить Мастер экспорта - сайта SharePoint.После запуска мастера вы можете сохранить свои настройки - информацию, которую вы предоставили при запуске мастера - в качестве спецификации экспорта. Затем вы можете повторно запустить операцию экспорта без повторного ввода данных. Шаги в этом разделе объясняют, как подготовиться к экспорту, экспортировать данные и сохранить настройки в качестве спецификации.

Подготовка к операции

  1. Найдите базу данных, содержащую таблицу или запрос, который вы хотите экспортировать.

    При экспорте запроса строки и столбцы в результатах запроса экспортируются как элементы и столбцы списка. Вы не можете экспортировать форму или отчет в SharePoint.

    Примечание: Одновременно можно экспортировать только один объект.

  2. Определите сайт SharePoint, на котором вы хотите создать список.

    Действительный адрес сайта начинается с http: // или https: //, за которым следует имя сервера, и заканчивается путем к определенному сайту на сервере.Например, это действительный адрес:

    https: // contoso / AnalysisTeam

  3. Убедитесь, что у вас есть необходимые разрешения для создания списка на сайте SharePoint. Если вы не уверены в разрешениях, обратитесь к администратору сервера.

    Операция экспорта создает новый список с тем же именем, что и исходный объект из Access. Если на сайте SharePoint уже есть список с таким именем, вам будет предложено указать другое имя для нового списка.

    Примечание: Вы не можете ни перезаписывать, ни добавлять данные в существующий список.

  4. Просмотрите поля в исходной таблице или запросе.

    В следующей таблице объясняется, как экспортируются определенные элементы, и нужно ли вам предпринимать дополнительные действия в определенных случаях.

    Элемент

    Разрешение

    Поля и записи

    Экспортируются все поля и записи в таблице или запросе, включая поля, скрытые в таблице.Настройки фильтра игнорируются во время операции экспорта.

    Вложения

    Если исходный объект имеет более одного столбца вложений, необходимо удалить все столбцы, кроме одного. Это связано с тем, что список SharePoint может поддерживать только один столбец вложений. Если исходный объект содержит более одного такого столбца, Access отображает сообщение с предложением удалить все столбцы вложений, кроме одного, перед началом операции.Чтобы обойти это, вы можете скопировать любые дополнительные столбцы вложений в другие объекты Access, а затем экспортировать их в другие списки SharePoint.

    Поля подстановки, содержащие одно или несколько значений

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

    Примечание. Поле выбора в списке SharePoint может состоять не более чем из одного столбца. Если поле поиска источника содержит несколько столбцов, значения во всех столбцах будут объединены в один столбец.

    Расчетные поля запроса

    Результаты в вычисляемых столбцах копируются в поле, тип данных которого зависит от типа данных вычисляемого результата.Выражение, стоящее за результатами, не копируется.

    Поля объекта OLE

    Поля объекта OLE игнорируются во время операции экспорта.

  5. Если исходная база данных Access еще не открыта, откройте ее и перейдите к следующему набору шагов.

Экспорт данных

  1. На вкладке Внешние данные в группе Экспорт нажмите кнопку Еще , чтобы раскрыть список параметров, а затем щелкните Список SharePoint .

  2. Откроется мастер экспорта Export - SharePoint Site .

  3. В поле Укажите сайт SharePoint введите адрес конечного сайта.

  4. В поле Укажите имя для нового списка введите имя для нового списка.

    Если исходный объект в вашей базе данных уже имеет то же имя, что и список на сайте SharePoint, укажите другое имя.

  5. При желании введите описание нового списка в поле Описание , а затем установите флажок Открыть список по завершении .

  6. Нажмите ОК , чтобы начать процесс экспорта.

  7. Access создает список на сайте SharePoint, а затем отображает состояние операции на последней странице мастера. Когда операция экспорта завершится, вы можете закрыть мастер или сохранить шаги экспорта в качестве спецификации.

    Кроме того, во время операции SharePoint выбирает правильный тип данных для каждого столбца на основе соответствующего исходного поля.Чтобы увидеть список того, как типы данных Access и Windows SharePoint Services сопоставляются друг с другом при экспорте данных, и какие параметры полей экспортируются для каждого типа данных, см. Раздел Как типы данных Windows SharePoint Services сопоставляются с типами данных Access, далее в Эта статья.

Что еще мне нужно знать об экспорте?

Как типы данных Windows SharePoint Services сопоставляются с типами данных Access

В следующей таблице показано, как Access определяет тип данных столбцов в экспортируемом списке при экспорте таблицы или запроса.

Тип данных доступа

Тип данных Windows SharePoint Services

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

Банкноты

Текст

Одна строка текста

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Максимальное количество символов Зеркало Размер поля , установленный в Access.

Значение по умолчанию Отражает значение по умолчанию в Access, если оно не является выражением.В противном случае - пусто.

Добавить в вид по умолчанию Да

Памятка / длинный текст

Многострочный текст

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Количество отображаемых строк 5

Добавить в вид по умолчанию Да

Номер

Номер

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Мин. Пусто

Макс Пустой

В следующей таблице показано, как свойство Число десятичных знаков устанавливается в соответствии с параметром Десятичных знаков в Access.

Настройка доступа

Параметр Windows SharePoint Services

Авто

Автомат

0-5

0-5

6-15

5

Значение по умолчанию Отражает значение по умолчанию в Access, если оно не является выражением.В противном случае - пусто.

Добавить в вид по умолчанию Да

Показывать в процентах Да, если для свойства Формат установлено значение Процент .

Дата / время

Дата или время

Имя столбца Зеркальное отражение параметра имени поля в Access

Описание Зеркальное отражение настройки Описание в Access

Требуется Зеркально отражает настройку Требуется в Access

Формат даты и времени Установите значение Только дата , если для свойства Формат задано значение Краткая дата .В противном случае установите Дата и время .

Тип календаря Установите хиджры , если установлен флажок Использовать хиджры . В противном случае установите по григорианскому календарю .

В следующей таблице показано, как свойство Значение по умолчанию устанавливается в соответствии со значением Значение по умолчанию в Access.

Настройка доступа

Параметр Windows SharePoint Services

= Дата ()

Сегодняшняя дата

Поле установлено на определенную дату

Поле установлено на определенную дату

Добавить в вид по умолчанию Да

Валюта

Валюта

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Мин. Пусто

Макс Пустой

В следующей таблице показано, как свойство Число десятичных знаков устанавливается в соответствии с параметром Десятичных знаков в Access.

Настройка доступа

Параметр Windows SharePoint Services

Авто

Автомат

0-5

0-5

6-15

5

Значение по умолчанию Отражает значение по умолчанию в Access, если оно не является выражением.В противном случае - пусто.

Добавить в вид по умолчанию Да

Тип валюты Отражает настройку формата в Access.

АвтоНомер

Номер

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Мин. Пусто

Макс Пустой

Число десятичных знаков Автоматически

Добавить в вид по умолчанию Да

AutoNumber, где для свойства «Размер поля» задано значение «Идентификатор репликации

».

Одна строка текста

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Максимальное количество символов 38

Значение по умолчанию Пусто

Добавить в вид по умолчанию Да

Да / Нет

Да / Нет

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Значение по умолчанию Отражает значение по умолчанию в Access, если оно не является выражением. В противном случае - пусто.

Добавить в вид по умолчанию Да

Объект OLE

Поле не экспортируется

Гиперссылка

Гиперссылка

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Форматировать URL как Гиперссылка

Добавить в вид по умолчанию Да

Приложение

Приложение

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Добавить в вид по умолчанию Да

Многозначные поля

Выбор

Имя столбца Зеркально отражает параметр Имя поля в Access.

Описание Зеркальное отображение параметра Описание в Access.

Требуется Зеркально отражает настройку Требуется в Access.

Добавить в вид по умолчанию Да

Верх страницы

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *