Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.01.2019, 10:57   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию проверка на существование файла на сервере и доступ к нему

Здравствуйте.
Нужно программно скачать из интернета несколько файлов. Но не просто скачать, а при скачивании выполнить с ними определенные действия. Насколько мне известно, готовых программ для выполнения таких действий не существует. Действия очень простые, но весьма хитрые.
Чтобы ни у кого не возникали вопросы "почему?" и "зачем?", сразу опишу всё подробно:
Есть сайт. На этом сайте хранятся видео-файлы, которые так просто скачать нельзя. Однако, с помощью некоторых программ можно получить прямые ссылки на эти файлы. А так же можно увидеть, что каждый видео-файл хранится на тамошнем сервере разбитым на несколько маленьких файлов длительностью примерно по 10 секунд.
Сами ссылки выглядят примерно вот так:
Код:
https://server/video/id/0.ts
https://server/video/id/1.ts
https://server/video/id/2.ts
https://server/video/id/3.ts
https://server/video/id/4.ts
https://server/video/id/5.ts
https://server/video/id/6.ts
https://server/video/id/7.ts
https://server/video/id/8.ts
https://server/video/id/9.ts
https://server/video/id/10.ts
https://server/video/id/11.ts
https://server/video/id/12.ts
https://server/video/id/13.ts
и т.д.
Если скачать их любым менеджером закачки и запустить в видеоплеере, то все они нормально воспроизводятся. По 10 секунд каждый.
Выходит, что всё элементарно. Пишем программу, которая скачивает все файлы от 0 до N и объединяет их в один большой файл.
На основе примеров из интернета, набросал свой быдлокод:
Код:
var
 Stream: TFileStream;
 url : String;
 fn : string;
 i:integer;
begin
  fn := ExtractFilePath(Application.ExeName) + 'video.ts';
  if FileExists(fn) then
  DeleteFile(fn);
  Stream:= TFileStream.Create(fn, fmCreate or fmOpenWrite);
  for i := 0 to 34 do
  begin
    url := 'http://server/video/id/' + IntToStr(i) + '.ts';
    IdHTTP1.Get(url,Stream);
    Caption := IntToStr(i);
    Application.ProcessMessages;
  end;
  Stream.Free;
end;
И это работает (за исключением мелких нюансов). В результате получается цельный видео-файл, который нормально воспроизводится.
Однако, не всё так просто. При попытке скачать некоторые файлы (любым менеджером закачки), сервер выдаёт ошибку HTTP error 403 Forbidden.
Например, пытаюсь скачать файл https://server/video/id/40.ts и получаю ошибку HTTP error 403 Forbidden.
Но если при возникновении этой ошибки добавлять к имени файла "-muted", то есть ссылка будет выглядеть так: https://server/video/id/40-muted.ts. Тогда файл скачивается нормально, без ошибки 403.
Итак, собственно сам вопрос: как проверить, есть ли доступ к файлу по ссылке (и существует ли он вообще) и скачать другой файл вместо него если доступ к первому ограничен?
BLACK_RAIN вне форума Ответить с цитированием
Старый 21.01.2019, 10:08   #2
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Я думаю что такое можно реализовать с помощью WinInit, он сам определяет нужные ссылки, да и проверку в нем можно сделать на нужный файл, для теста вот здесь есть тестовая программка с исходником http://www.programmersforum.ru/showp...9&postcount=17

Последний раз редактировалось Aliens_wolfs; 21.01.2019 в 10:10.
Aliens_wolfs вне форума Ответить с цитированием
Старый 21.01.2019, 10:57   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Что-то это очень смахивает на HLS. Если так, то может не стоит так извращаться, а использовать другой подход.
p51x на форуме Ответить с цитированием
Старый 22.01.2019, 03:21   #4
DIONISKA
Форумчанин
 
Регистрация: 07.11.2011
Сообщений: 156
По умолчанию

В общем виде решение проблемы может выглядеть так:
Код:
  try
   IdHTTP1.Get(URL,stream);
  except
    on e: EIdHTTPProtocolException do
      case IdHTTP1.ResponseCode of
        403: begin
               showmessage('Тут ваш код при ошибке 403');
              end;
        404: begin      
              //.. и т.д.
             end;
      end;
   
  end;
А по сабжу: для загрузки Adobe HLS и Apple HLS(и подобных) существует множество решений, например ffmpeg, который легко съедает плэйлисты с чанками, youtube-dl и множество подобных. Даже vlc умеет делать захват и склеивать в большой .ts файл.
DIONISKA вне форума Ответить с цитированием
Старый 03.02.2019, 10:42   #5
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Что-то это очень смахивает на HLS. Если так, то может не стоит так извращаться, а использовать другой подход.
Почему извращаться? В чем тут извращение? Какой другой подход-то? Перестаньте уже говорить загадками. Вы знаете способ лучше/проще?
Цитата:
Сообщение от DIONISKA Посмотреть сообщение
А по сабжу: для загрузки Adobe HLS и Apple HLS(и подобных) существует множество решений, например ffmpeg, который легко съедает плэйлисты с чанками, youtube-dl и множество подобных. Даже vlc умеет делать захват и склеивать в большой .ts файл.
Вы, видимо, не до конца дочитали первый пост. Для кого я так долго и тщательно всё разжёвывал?
Там ясно сказано, что если, например, к файлу 150.ts нет доступа, то заменить его на 150-muted.ts.
Какая из вышеперечисленных программ так умеет?
BLACK_RAIN вне форума Ответить с цитированием
Старый 03.02.2019, 12:00   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Почему извращаться? В чем тут извращение? Какой другой подход-то? Перестаньте уже говорить загадками. Вы знаете способ лучше/проще?
Это вы тут в загадки с самого начала играете. Сказали бы надо: получить поток HLS, а не: есть файл, нужно проверять доступ...

Цитата:
Сообщение от BLACK_RAIN Посмотреть сообщение
Какая из вышеперечисленных программ так умеет?
Любая, какая заявляет о поддержке соответствующего стандрта. Т.к. клиенту отсылается "плейлист" и ему не надо проверяет есть ли файл, придумывать какой вместо этого запрашивать толи 150-muted, толи 150-ррр, толи 150-ццц...
p51x на форуме Ответить с цитированием
Старый 03.02.2019, 12:56   #7
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Это вы тут в загадки с самого начала играете. Сказали бы надо: получить поток HLS, а не: есть файл, нужно проверять доступ...


Любая, какая заявляет о поддержке соответствующего стандрта. Т.к. клиенту отсылается "плейлист" и ему не надо проверяет есть ли файл, придумывать какой вместо этого запрашивать толи 150-muted, толи 150-ррр, толи 150-ццц...
Ну какой же ты тугой, это пипец! Я всё разжевал для тебя. Тебе осталось только проглотить.
В плейлисте написано 150.ts, но этот файл не доступен. Вместо него доступен файл 150-muted.ts.
Как, не проверяя доступ, узнать какой файл нужно качать?
BLACK_RAIN вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проверка существование файла на ftp Wh1teP Общие вопросы Delphi 5 22.04.2013 14:48
проверка на существование файла god5 Общие вопросы Delphi 4 02.03.2013 16:31
Проверка на существование файла на удалённом http сервере NewBoy Общие вопросы C/C++ 0 03.08.2012 10:21
Проверить существование файла на сервере Wicort JavaScript, Ajax 8 04.05.2012 23:16
Проверка существование Email адреса на сервере Бутаков_Сергей Работа с сетью в Delphi 7 29.12.2010 01:55