02-11-2015, 19:10
Kodi Media Center (познат още като XBMC) позволява разширяване на функционалността му чрез различни категории приставки (addons). Видео приставките позволяват да намирате и гледате видео, без да напускате интерфейса на Kodi. Този урок демонстрира как се създава такава приставка чрез елементарни знания по програмиране и логическо мислене.
/Готовата структура е съобразена с python2, а в Коди вече се използва python3 т.е. ще трябва да се съобразите с промяната в някои функции, методи и др. направени след прехода към новата версия на програмния език и с текущата версия на Коди/
Предварителни изисквания:
- да разполагате с инсталиран Kodi Media Center на компютъра, на който ще разработвате;
- да отделите поне два часа от времето си за вникване в методиката на програмиране.
Видео приставките за Kodi се пишат на езика python, както е посочено в kodi.wiki. За да започнем работа, първо изтеглете някаква среда за разработка/програмиране с поддръжка на python. Аз използвам DrPython, който освен текстов редактор със синтактично оцветяване на сорс кода, предлага възможност и за изпълнение/дебъгинг на python скриптове. Обикновения Notepad няма да ви е достатъчен, защото интерпретатора на python е супер чувствителен към отстъпите в началото на всеки ред и средата за разработка е хубаво да следи за неправилни indent-и. Изтеглете също и този примерен video addon, който създадох като отправна точка за целта на урока. Стартирайте Kodi и по обичайния начин инсталирайте в него пробната приставка plugin.video.example-0.0.1.zip. За да можем да превключваме от Kodi към другите прозорци, ще трябва да го демаксимизирате - това става с вълшебната команда '\' (наклонена на ляво черта) \намира се близо до бутона Ентър на клавиатурата\. Сега стартирайте средата за програмиране (DrPython в моя случай) и отворете в нея файла на примерната приставка: default.py (а къде се намира този файл? в потребителската директория на kodi/addons/plugin.video.example/default.py ). Отваряйки default.py ще видите следния примерен код:
Код:
# -*- coding: utf-8 -*-
#Библиотеки, които използват python и Kodi в тази приставка
import re
import sys
import os
import urllib
import urllib2
...
elif mode==3:
print \"\"+url
PLAY(name,url,iconimage)
xbmcplugin.endOfDirectory(int(sys.argv[1]))
Забележка: В посочените долу примери ще срещнете интернет адреси от вида h**p://server/link - да се четат http://server/link(форумната система автоматично съкращава връзките и те не могат да се видят целите)
Начало
1. Изберете подходящ сайт за създаването на видео приставка. Трябва да има богато и интересно съдържание, по възможност с разлистване по каталог, налична търсачка и еднакво структуриране на страниците, обложките, видеата и именованията им. Нека изберем сайта http://www.vplaybg.com. Видеата в него са разпределени по категории, с 24 заглавия на страница, налична търсачка и както вече споменахме еднакво структуриране - което ще направи правенето на приставката лесно. Ако страницата с желания от нас видеоклип е h**p://www.vplaybg.com/watch.php?vid=a2bc4d02b, тогава преглеждаме изходния й код през интернет браузър и се спираме на това:
Код:
var flashvars = { "flashplayer": "http://www.vplaybg.com/players/jwplayer5/jwplayer.swf", "playlist": [{ file: 'http://www.vplaybg.com/videos.php?vid=a2bc4d02b', type: 'video', image: 'http://www.vplaybg.com/uploads/thumbs/a2bc4d02b-1.jpg'
Тук виждаме, че видеата се зареждат през адрес h**p://www.vplaybg.com/videos.php?vid= и същия идентификатор, като този от адреса на страницата a2bc4d02b. По същия начин стои въпросът с обложките на видеата. Ако знаем идентификатора на едно видео, тогава неговата обложка ще бъде h**p://www.vplaybg.com/uploads/thumbs/идентификатор-1.jpg
2. Създаване на главно меню на приставката. Въвеждаме в default.py от 24 ред надолу категориите от сайта по същия шаблон: addDir('Папка','h**p://www.example.com',1,'DefaultFolder.png')
Когато приключите, модула CATEGORIES трябва да изглежда по този начин:
Код:
def CATEGORIES():
addDir('Търсене на видео','http://www.vplaybg.com/search.php?keywords=',2,searchicon)
addDir('Игрални филми','http://www.vplaybg.com/category.php?cat=filmi&page=1&order=DESC',1,'DefaultVideo.png')
addDir('Сериали','http://www.vplaybg.com/category.php?cat=SERIALI&page=1&order=DESC',1,'DefaultVideo.png')
addDir('Музика','http://www.vplaybg.com/category.php?cat=music&page=1&order=DESC',1,'DefaultAudio.png')
#addDir('','',1,'')
Изразът &page=1&order=DESC трябва да бъде добавян към края на адресите на категориите, за да бъде възможно минаването към следваща страница по-нататък. DefaultVideo, DefaultAudio и др. такива изображения може да ползвате наготово като обложки в Kodi. Иначе, може да използвате и ваши локални или интернет хостнати изображения от вида http://server/image.jpg
Преминете към прозореца на Kodi и тествайте добавката example - отворете я и нашето меню вече трябва да се вижда!
3. Разлистване на видеата. Ако опитате да отворите меню "Игрални филми", трябва да се случат следните неща:
- зареждане на подадения адрес на категория от модула CATEGORIES;
- претърсването му по зададен шаблон (регулярен израз);
- структуриране на резултатите по подходящ за Kodi начин;
- добавянето на всеки елемент към един общ списък, явяващ се съдържанието на тези виртуални директории.
Погледнете следния код в модула INDEXPAGES: match = re.compile('(.+?)').findall(data)
На мястото на (.+?) трябва да бъде поставен регулярен израз, способен да "хване" всичко необходимо: (заглавие, адрес на видеото или поне страницата му, обложка). Предвид удобното структуриране в този сайт, ние ще прихванем само името на видеото и неговото ID. По това ID сами ще конструираме адреса за зареждане на видеото и неговата обложка без изобщо да се налага да посещаваме и претърсваме страницата на отделното видео. И така, през интернет браузъра заредете сайта https://regex101.com и от левия му панел превключете на python. В голямото поле TEST STRING сложете целия изходен код на страницата каталог с игрални филми. В полето REGULAR EXPRESSION поставете vid=(.+?)" class="pm-title-link " title="(.+?)"> а в малкото поле в дясно от него буква "g". В панела в дясно MATCH INFORMATION трябва да видите следното:
т.е. регулярния израз е "хванал" необходимото Накратко регулярния израз е последователност от HTML (в случая) или др. тагове и (.+?) поставен на мястото, на което искаме да "хванем" полезни данни. Този регулярен израз поставяме в кода на приставката match = re.compile('vid=(.+?)" class="pm-title-link " title="(.+?)">').findall(data)
Конструирането адресът на обложката се налага, когато е възможно това и/или когато не сме прихванали пълния й адрес с регулярния израз. В случая, адресът на обложката (ред 46) ще стане thumbnail = 'h**p://www.vplaybg.com/uploads/thumbs/' + vid + '-1.jpg'
Понеже страниците с видеата са много повече от една, трябва някак да си осигурим преминаване към следващата страница през приставката. В сайта, това става чрез следните атрибути "закачени" към края на адресите &page=номернастраница&order=DESC . Order логично касае сортирането по азбучен ред или наопаки, а номера на страницата е ясен. Затова в първия модул CATEGORIES трябва да добавим &page=1&order=DESC към края на адресите на всички категории. По този начин просто ще актуализираме номера на текущата страница +1 и ще я подаваме на модула INDEXPAGES наново за преиндексиране. Всяка страница с изключение на последната съдържа точно 24 видеа. Т.е. ако списъка с заглавията във виртуалната директория на Kodi показва 24 видеа, тогава следваща страница с резултати трябва да има. За целта създаваме брояча br и му задаваме начална стойност 0. След всяко добавяне на ново видео към списъка в INDEXPAGES актуализираме брояча br = br + 1. След като приключи обхождането на текущата страница проверяваме колко са текущите видеа в брояча. Ако са точно 24, добавяме виртуална директория в края на списъка със заглавие "следваща страница>>" и конструираме адреса на тази следваща страница. Заменяме номера на текущата страница със следващия и после изпращаме към INDEXPAGES за индексиране. Намирането на текущата страница става отново с регулярен израз (.+?)&page=(.+?)&order=DESC по показаният отгоре начин. След като приключите работата по този модул, целия ще изглежда по следния начин:
Код:
def INDEXPAGES(url):
req = urllib2.Request(url)
req.add_header('User-Agent', UA)
response = urllib2.urlopen(req)
#print 'request page url:' + url
data=response.read()
response.close()
#Начало на обхождането
br = 0 #Брояч на видеата в страницата - 24 за този сайт
match = re.compile('vid=(.+?)" class="pm-title-link " title="(.+?)">').findall(data)
for vid,title in match:
thumbnail = 'http://www.vplaybg.com/uploads/thumbs/' + vid + '-1.jpg'
#print thumbnail
#print title
addLink(title,vid,3,thumbnail)
br = br + 1 #добавяме и това видео към общия брояч
#Край на обхождането
#Ако резултатите са на повече от една страници
print 'Items counter: ' + str(br)
if br == 24: #тогава имаме следваща страница и конструираме нейния адрес
getpage=re.compile('(.+?)&page=(.+?)&order=DESC').findall(url)
for baseurl,page in getpage:
newpage = int(page)+1
url = baseurl + '&page=' + str(newpage) + '&order=DESC'
#print 'URL OF THE NEXT PAGE IS' + url
thumbnail='DefaultFolder.png'
addDir('следваща страница>>',url,1,thumbnail)
4. Търсачка. През вашия браузър потърсете думата word в търсачката на vplaybg.com. Адресът, който получавате е следния: h**p://www.vplaybg.com/search.php?keywords=word т.е. h**p://www.vplaybg.com/search.php?keywords=низ–за–търсене. В модул CATEGORIES поставете h**p://www.vplaybg.com/search.php?keywords= като адрес на търсачката. Отидете на ред 70, където започва модула на търсачката. Тук ние преконструираме адресът за търсене, за да бъде възможно преминаването към следващата страница с резултати searchurl = url + searchText + '&page=1&order=DESC' След като приключите, модулът ще изглежда така:
Код:
def SEARCH(url):
keyb = xbmc.Keyboard('', 'Търсачка')
keyb.doModal()
searchText = ''
if (keyb.isConfirmed()):
searchText = urllib.quote_plus(keyb.getText())
searchText=searchText.replace(' ','+')
searchurl = url + searchText + '&page=1&order=DESC'
searchurl = searchurl.encode('utf-8')
#print 'SEARCHING:' + searchurl
INDEXPAGES(searchurl)
else:
addDir('Върнете се назад в главното меню за да продължите','','',"DefaultFolderBack.png")
5. Модул за зареждане на видео. За да можем да отваряме разлистените заглавия в Kodi, трябва да го "захраним" с подходящо конструирани данни. Основно трябват ни адреса на видеото, заглавието му и обложката. Разбира се, може да му подадете и много други данни, които сте успяли да извлечете с регулярните изрази (или от json в случай, че имате щастието да разчитате на официално API към сайта).
В случая трябва да конструираме финалния адрес за достъп до видеото, като към h**p://www.vplaybg.com/videos.php?vid= добавим ID-то на избраното видео. Ще получите това:
Код:
def PLAY(name,url,iconimage):
url = 'http://www.vplaybg.com/videos.php?vid=' + url #Конструираме адреса за достъп до видеото
li = xbmcgui.ListItem(iconImage=iconimage, thumbnailImage=iconimage, path=url)
li.setInfo('video', { 'title': name })
try:
xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, xbmcgui.ListItem(path = url))
except:
xbmc.executebuiltin("Notification('Грешка','Видеото липсва на сървъра!')")
6. Подробностите. Най-важното са пуправките, извинете подробностите. Всеизвестен факт е, че външния вид продава, а характеристиките задържат потребителя във времето да не избяга към друг продукт. Стига толкова маркетинг. В същата директория като default.py отворете с Notepad или друг текстов редактор със синтактично оцветяване на XML файла addon.xml и го редактирайте според вашите нужди. Посочете желаното име на приставката, нейната версия, вашето име или прякор и описанието й. Като приключите, трябва да сте получили нещо такова:
Код:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<addon id="plugin.video.vplaybg" name="VPLAYBG" version="0.0.1" provider-name="Majide">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
</requires>
<extension point="xbmc.python.pluginsource" library="default.py">
<provides>video</provides>
</extension>
<extension point="xbmc.addon.metadata">
<summary lang="bg">Приставка за съдържание при поискване от vplaybg.com</summary>
<summary lang="en">Addon for VOD from vplaybg.com</summary>
<description lang="bg">Приставка за съдържание при поискване от vplaybg.com. Препоръчително е използването на широколентова интернет връзка!</description>
<description lang="en">Addon for watching on demand videos from vplaybg.com. Broadband internet connection is recomended!</description>
<disclaimer lang="bg">Някои елементи на тази приставка, може да не са легални в държавата ви - проверете и инсталирайте на ваша отговорност.</disclaimer>
<disclaimer lang="en">Some parts of this addon may not be legal in your country of residence - please check with your local laws before installing.</disclaimer>
<language>bg,en</language>
<platform>all</platform>
<forum></forum>
<website></website>
<email></email>
</extension>
</addon>
Отворете също и changelog.txt за да посочите информация относно промените в тази версия на приставката.
Следва направа на обложка за приставката. С растерен или векторен графичен редактор по ваш избор (Gimp, Photoshop,...) направете желаната от вас обложка. Може да си вземете логото на сайта от въпросния сайт (ако той разполага с подходящо такова).
В същата тази директория на приставката plugin.video.example влезте в директория resources и изтрийте файла settings.xml и директорията language след като приставката няма да има настройки и няма да е мултиезична , а само на български език. Сега преименувайте директорията plugin.video.example на plugin.video.vplaybg. Затворете Kodi и го стартирайте отново (демаксимизиран, както беше и досега). Изпробвайте работоспособността на приставката и в случай на грешка, погледнете в дъното на лог файла kodi.log (който все още трябва да държите отворен). Там ще откриете подробности за грешката, ако има такава. Ако нямате грешки, остава да бъде изключено ненужното рапортуване в лога: в default.py коментирайте следните редове, поставяйки знак # преди командата print: 38,47,48,60,79.
За да разпространите приставката, компресирайте директорията с ZIP и посочете точната й версия: plugin.video.vplaybg-0.0.1.zip. За повече информация (на английски език) посетете kodi.wiki