Оценете темата:
  • 1 гласа - средно 5
  • 1
  • 2
  • 3
  • 4
  • 5
[УРОК] Как да създадем video addon за Kodi Media Center
#1
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]))
Също така през Notepad или подобен текстов редактор отворете лог файла на Kodi, който ще ни е необходим за откриване на грешките в процеса на тестване. Ще го откриете в директорията kodi/temp/kodi.log
 
Забележка: В посочените долу примери ще срещнете интернет адреси от вида 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
[Изображение: PhoenixBG_0.png]
 
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 трябва да видите следното:
[Изображение: PhoenixBG_1.png]
т.е. регулярния израз е "хванал" необходимото [Изображение: default_smile.gif] Накратко регулярния израз е последователност от 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
[Изображение: notrobosmall.jpg]
Отговори
#2
Връзката към много други данни не е актуална. Предполагам трябва да води към: http://romanvm.github.io/Kodistubs/docs/...class.html или не?
Отговори
#3
Да, явно автора е преименувал в името XBMC на Kodi и затова линка се е променил. Прилагам корекцията.
[Изображение: notrobosmall.jpg]
Отговори
#4
Дне среших да се опитам да направя един video addon за немски телевизии от един немски сайт (прилича на bg-gledai). Сложих коди 16.1 на уиндолс 10, но директорията на примерния addon така и не се появи в папката. Възможно ли е последната версия на Коди, която обещава "Never cache addons directories" да блокира list-ването на директории или са скрити някъде (hidden files са ми активирани)?

PS: интересното е, че когато от Kodi мина на Add Source и отида на Home Directory в папка addons ми излиза example, но не и когато от Windows мина в директорията на Коди. Може би в 16.1 са скрити на друго място? Но търсих "example" и не намира нищо.

PS2: намерих го. Windows разбира се си прави други планове с папките. Инсталираните addon-и са в C:\Users\USERNAME\AppData\Roaming\Kodi\addons
Kodi 16.1 (т.е. myKodi 16.1) на QNAP  Cool
Kodi 16.1 на Windows 10
Отговори
#5
Благодаря много за много полезната и съдържателна тема. Аз не съм професионален програмист, но благодарение на тази тема успях да си създам първия ми любителски addon за БГ ТВ канали.
Имам въпрос:
Не е ли по-лесно да се използва за parse-ване на html кода наличната библиотека Parsedom, за която се твърди, че работи много бързо и е лесна за боравене:

http://kodi.wiki/view/Add-on:Parsedom_for_xbmc_plugins

Аз не съм я ползвал все още (мисля да я разуча), но се чудя дали примерът няма да е по-лесен и разбираем с нея.
Отговори
#6
Примерът е просто... пример, в който се разчита на абсолютния минимум външни библиотеки. Поне моето мнение е, че колкото по-малко външни зависимости, толкова по-добре: самите добавки ще бъдат респективно по стабилни и съвместими с повечето стари версии на Kodi, та чак и до последния XBMC.

П.С: Ако направите добавка, която искате да споделите с останалите, създайте й отделна тема (по образеца на останалите в раздел "Български компоненти за Kodi"
[Изображение: notrobosmall.jpg]
Отговори
#7
Защо в DrPython не ми излиза кирилицата в пайтънските файлове? Ако има значение аз съм на W10 64bit.
Отговори
#8
При мен си излиза нормално под Ubuntu Mate 16.10. Не съм сигурен доколко Windows се оправя с UTF-8 кодировки... Винаги можеш да пробваш с друг python редактор. Този беше първия, който намерих с търсачката и досега ми върши работа Smile
[Изображение: notrobosmall.jpg]
Отговори
#9
(08-11-2016, 09:09)Majide написа: При мен си излиза нормално под Ubuntu Mate 16.10. Не съм сигурен доколко Windows се оправя с UTF-8 кодировки... Винаги можеш да пробваш с друг python редактор. Този беше първия, който намерих с търсачката и досега ми върши работа Smile

Не е проблема в Windows. Същите файлове отворени в Notepad++ си показват кирилицата. Явно ще трябва да погледна друг редактор.
Отговори
#10
Най-добре ще е да си добавиш Линукс като втора OS
Отговори


Теми, които вероятно са свързани...
Тема: Автор Отговори: Прегледи: Последна публикация
  Addon за децата Majide 3 2,863 17-07-2021, 22:47
Последна публикация: martinstz
Bug Inputstream Adaptive Addon Majide 2 4,495 02-12-2018, 00:01
Последна публикация: Majide
  Kodi Text to Speech & Voice Assistant Majide 4 8,294 01-05-2017, 09:09
Последна публикация: Majide
Lightbulb Fork на Addon. Защо и Как? Majide 8 10,938 12-04-2017, 21:35
Последна публикация: Majide
Lightbulb Как да номерираме версията на Kodi addon? Majide 0 2,694 09-04-2017, 17:00
Последна публикация: Majide

Отваряне на: