[Include] YouTube Streamer
|
|
Herro[CM] |
Дата: Среда, 09.09.2015, 22:35 | Сообщение # 1
|
Бывалый
Сообщений: 425
Статус: Offline
|
Информация: Благодаря данному include, вы можете просто включить видео YouTube на своем SA: MP сервере. Простота установки и 1 видео воспроизводиться с 1 строки кода. Видео можно воспроизвести как для одного человека, так и для всего сервера.
Код native PlayYoutubeVideoForPlayer(playerid,url[]) native StopYoutubeVideoForPlayer(playerid)
native ContainsYoutubeURL(string[]) native IsYouTubeVideoPlaying()
native GetLengthOfVideo() native GetVideoTitle() native GetVideoLink()
public OnYoutubeVideoFinished(playerid)
Для работы, вписываем название include в начале мода ( #include <[М.] _Youtube>)
Колбэк:
Код PlayYoutubeVideoForPlayer (playerid,url[]) StopYoutubeVideoForPlayer (playerid)
Пример: Воспроизводим видео при конекте, заканчиваем после того как игрока заспавнится. Код #include <[MV]_Youtube>
public OnPlayerConnect(playerid) { PlayYoutubeVideoForPlayer(playerid, "https://www.youtube.com/watch?v=tsa5tUZ3puE") return 1; }
public OnPlayerSpawn(playerid) { StopYoutubeVideoForPlayer(playerid); return 1; }
Пример: Воспроизведение видео по команде с чтением URL
Код #include <[MV]_Youtube> #include <sscanf2> #include <zcmd>
CMD:play(playerid,params[]) { new link[128]; if(sscanf(params,"s[128]",link)) return SendClientMessage(playerid,RED,"Usage: /play [youtube-url]"); if(strlen(link) >= 128) return SendClientMessage(playerid,RED,"Link too long !"); PlayYoutubeVideoForPlayer(playerid,link); return 1; }
Сам include Код #include <a_http> new bool:g_playing = false, g_title[256], g_duration = 0, g_link[64]; forward OnYoutubeVideoFinished(playerid); forward SongFinished(playerid); stock PlayYoutubeVideoForPlayer(playerid,url[]) { if(strfind(url,"&") != -1) strmid(url,url,0,strfind(url,"&"),128); format(g_link,sizeof(g_link),"%s",url); format(url,128,"youtubeinmp3.com/fetch/?api=advanced&video=%s",g_link); HTTP(playerid, HTTP_GET, url, "", "OnYoutubeResponse"); } stock StopYoutubeVideoForPlayer(playerid) return StopAudioStreamForPlayer(playerid); stock ContainsYoutubeURL(string[]) return (strfind(string,"youtube") != 1 && strfind(string,"watch?v=") != 1); stock IsYouTubeVideoPlaying() return g_playing; stock GetLengthOfVideo() return g_duration; stock GetVideoTitle() return g_title; stock GetVideoLink() return g_link; forward OnYoutubeResponse(playerid, response_code, data[]); public OnYoutubeResponse(playerid, response_code, data[]) { if(response_code == 200) { new content[3][256],stream[256],string[256]; new hours,minutes,seconds,tmp_seconds[8]; explode(content,data,"<br />"); strmid(tmp_seconds,content[1],8,strlen(content[1])); strmid(stream,content[2],6,strlen(content[2])); g_duration = strval(tmp_seconds); g_title = content[0]; formatSeconds(g_duration,hours,minutes,seconds); format(string,sizeof(string),"{0049FF}[Now playing] {00c9ff}%s (Duration: %02d:%02d:%02d)",GetVideoTitle(),hours,minutes,seconds); SendClientMessage(playerid,-1,string); PlayAudioStreamForPlayer(playerid,stream); g_playing = true; SetTimerEx("SongFinished",(g_duration+5)*1000,false,"i",playerid); } else { new error[128]; format(error,sizeof(error),"{0049FF}[ERROR] {00c9ff}An error has occured: %s (%d)",GetError(response_code),response_code); SendClientMessage(playerid,0xFF0000FF,error); } } public SongFinished(playerid) { g_playing = false; CallLocalFunction("OnYoutubeVideoFinished","i",playerid); } stock GetError(val) { new error[32]; switch(val) { case 1: error = "Bad host"; case 2: error = "No socket"; case 3: error = "Can't connect"; case 4: error = "Can't write"; case 5: error = "Content too big"; case 6: error = "Malformed response"; case 300..308: error = "Redirection"; case 400..499: error = "Client error"; case 500..599: error = "Server error"; } return error; } stock formatSeconds(seconds, &hours_left, &minutes_left, &seconds_left) { hours_left = seconds/60/60; minutes_left = (seconds - hours_left*60*60)/60; seconds_left = (seconds - hours_left*60*60 - minutes_left*60); } stock explode(aExplode[][], const sSource[], const sDelimiter[] = " ", iVertices = sizeof aExplode, iLength = sizeof aExplode[]) { new iNode, iPointer, iPrevious = -1, iDelimiter = strlen(sDelimiter); while(iNode < iVertices) { iPointer = strfind(sSource, sDelimiter, false, iPointer); if(iPointer == -1) { strmid(aExplode[iNode], sSource, iPrevious, strlen(sSource), iLength); break; } else { strmid(aExplode[iNode], sSource, iPrevious, iPointer, iLength); } iPrevious = (iPointer += iDelimiter); ++iNode; } return iPrevious; }
Автор: Майкл @ Бельгия
Когда нет знания, есть мнение.
|
|
|
|
Simon4ik228 |
Дата: Пятница, 18.09.2015, 23:01 | Сообщение # 2
|
Боец
Сообщений: 237
Статус: Offline
|
Чуть мозг не сломал, видео пожалуйста!
|
|
|
|
Herro[CM] |
Дата: Суббота, 19.09.2015, 00:23 | Сообщение # 3
|
Бывалый
Сообщений: 425
Статус: Offline
|
Цитата Simon4ik228 ( ) Чуть мозг не сломал, видео пожалуйста! Видео заснять не могу, но с установкой могу помочь, если нужно обращайся.
Когда нет знания, есть мнение.
|
|
|
|
TheQue |
Дата: Среда, 30.09.2015, 16:30 | Сообщение # 4
|
Боец
Сообщений: 135
Статус: Offline
|
Цитата Herro[CM] ( ) Видео заснять не могу, но с установкой могу помочь, если нужно обращайся. Скоро сделаю видео как работает этот инклуд!
Пошло всё в *****, до свидания CM...
|
|
|
|
[CM]iNiko |
Дата: Суббота, 21.11.2015, 11:53 | Сообщение # 5
|
Бывалый
Сообщений: 397
Статус: Offline
|
Отличный include. Хотелось бы увидеть видео о его работе.
Всё случается в этой жизни.
|
|
|
|
[CM]ZloyKroJIuK |
Дата: Среда, 20.01.2016, 17:45 | Сообщение # 6
|
Любитель
Сообщений: 39
Статус: Offline
|
Не понял что куда, сделай скриншоты хотя бы, пожалуйста.
|
|
|
|
AlexMaxi[CM] |
Дата: Воскресенье, 31.01.2016, 01:40 | Сообщение # 7
|
Новичок
Сообщений: 21
Статус: Offline
|
Скорее всего не рабочий, прошу пруфы, что он работает. Или подробнее расскажи.
|
|
|
|
[CM]ClimoWHY |
Дата: Четверг, 24.03.2016, 20:28 | Сообщение # 8
|
Боец
Сообщений: 58
Статус: Offline
|
Годнота спасибо большое автору темы
|
|
|
|
[CM]Reyden |
Дата: Воскресенье, 29.05.2016, 15:12 | Сообщение # 9
|
TOP ТАЧЕР СМ
Сообщений: 223
Статус: Offline
|
Сделай пожалуйста видео
http://cheat-master.ru/forum/111-639306-1 - ПРОДАЖА ВИРТОВ Аккаунт разрешен администратором [CM]AGRESSOR СКУПАЮ АККАУНТЫ STEAM http://cheat-master.ru/forum/140-629804-1 Темы: Как попасть в пд за 2 дня на хороший ранг - http://cheat-master.ru/forum/73-581561-1#3721079 http://cheat-master.ru/forum/117-583234-1 - Как исправить ошибку Unknown http://cheat-master.ru/forum/117-597068-1 - Как установить мод на хостинг. http://cheat-master.ru/forum/73-593293-1 - Обход бан-чата на Samp-Rp ВК:
|
|
|
|
chogovadze |
Дата: Понедельник, 13.06.2016, 16:39 | Сообщение # 10
|
Боец
Сообщений: 69
Статус: Offline
|
Как исправить?
Сообщение отредактировал chogovadze - Понедельник, 13.06.2016, 16:40 |
|
|
|
Danny_Marcelo |
Дата: Воскресенье, 26.06.2016, 02:09 | Сообщение # 11
|
Боец
Сообщений: 282
Статус: Offline
|
Хм.. Я думал только в MTA можно видео по ссылке вставлять. а тут теперь и самп вырос)
|
|
|
|
Плисс |
Дата: Вторник, 19.07.2016, 21:18 | Сообщение # 12
|
Боец
Сообщений: 70
Статус: Offline
|
Кросс,полезная темка!
|
|
|
|
H-U-N-T-E-R |
Дата: Понедельник, 03.07.2017, 21:58 | Сообщение # 13
|
Новичок
Сообщений: 3
Статус: Offline
|
убиваем на(МАТ) ваш сервер а вместе с ним и CPU железа.
|
|
|
|
[СМ]Пират |
Дата: Среда, 07.03.2018, 09:41 | Сообщение # 14
|
Боец
Сообщений: 98
Статус: Offline
|
было бы видео хорошо было бы
Аккаунт разрешен администратором By Рафаель
|
|
|
|
kobaidze95 |
Дата: Воскресенье, 11.03.2018, 13:47 | Сообщение # 15
|
Боец
Сообщений: 69
Статус: Offline
|
этот инклуд уже несколько лет существует и были проекты в самп которые использовали его
спс за репу
|
|
|
|