从WEB API获取流URL-Kodi

时间:2018-08-22 06:24:29

标签: kodi

我在Selenium使用了一个示例Kodi视频插件

在这里,我想删除硬编码的VIDEOS,并从网络api [FROM JSON OUTPUT]获取网址。

如果我具有JSON API,并且在我按下https://github.com/romanvm/plugin.video.example

后,它给出的输出如下
{'Animals': [{'name': 'Crab',
               'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/04/crab-screenshot.jpg',
               'video': 'http://www.vidsplay.com/wp-content/uploads/2017/04/crab.mp4',
               'genre': 'Animals'},
              {'name': 'Alligator',
               'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/04/alligator-screenshot.jpg',
               'video': 'http://www.vidsplay.com/wp-content/uploads/2017/04/alligator.mp4',
               'genre': 'Animals'},
              {'name': 'Turtle',
               'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/04/turtle-screenshot.jpg',
               'video': 'http://www.vidsplay.com/wp-content/uploads/2017/04/turtle.mp4',
               'genre': 'Animals'}
              ],
    'Cars': [{'name': 'Postal Truck',
              'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/05/us_postal-screenshot.jpg',
              'video': 'http://www.vidsplay.com/wp-content/uploads/2017/05/us_postal.mp4',
              'genre': 'Cars'},
             {'name': 'Traffic',
              'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/05/traffic1-screenshot.jpg',
              'video': 'http://www.vidsplay.com/wp-content/uploads/2017/05/traffic1.mp4',
              'genre': 'Cars'},
             {'name': 'Traffic Arrows',
              'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/05/traffic_arrows-screenshot.jpg',
              'video': 'http://www.vidsplay.com/wp-content/uploads/2017/05/traffic_arrows.mp4',
              'genre': 'Cars'}
             ],
    'Food': [{'name': 'Chicken',
              'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/05/bbq_chicken-screenshot.jpg',
              'video': 'http://www.vidsplay.com/wp-content/uploads/2017/05/bbqchicken.mp4',
              'genre': 'Food'},
             {'name': 'Hamburger',
              'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/05/hamburger-screenshot.jpg',
              'video': 'http://www.vidsplay.com/wp-content/uploads/2017/05/hamburger.mp4',
              'genre': 'Food'},
             {'name': 'Pizza',
              'thumb': 'http://www.vidsplay.com/wp-content/uploads/2017/05/pizza-screenshot.jpg',
              'video': 'http://www.vidsplay.com/wp-content/uploads/2017/05/pizza.mp4',
              'genre': 'Food'}
             ]} 

这是我的main.py文件,如何将其放入kodi视频插件的VIDEOS阵列中。

# -*- coding: utf-8 -*-
# Module: default
# Author: LahiruTM
# Created on: 22.08.2018
# License: GPL v.3 https://www.gnu.org/copyleft/gpl.html

import sys
from urllib import urlencode
from urlparse import parse_qsl
import xbmcgui
import xbmcplugin

# Get the plugin url in plugin:// notation.
_url = sys.argv[0]
# Get the plugin handle as an integer number.
_handle = int(sys.argv[1])

# Free sample videos are provided by www.globemw.net
# Here we use a fixed set of properties simply for testing purposes
# In a "real life" plugin you will need to get info and links to video files/streams
# from some web-site or online service.
VIDEOS = {'Action': [{'name': 'Ant.Man.2015',
                   'thumb': 'http://41.216.231.123:5080/vod/streams/Ant.Man.2015.720p.HDRip.x264.AAC-ETRG.jpg',
                   'video': 'http://41.216.231.123:5080/vod/streams/Ant.Man.2015.720p.HDRip.x264.AAC-ETRG.mp4',
                   'genre': 'Action'},
                  {'name': 'Avengers.Age.of.Ultron.2015',
                   'thumb': 'http://41.216.231.123:5080/vod/streams/Avengers.Age.of.Ultron.2015.720p.BluRay.x264.YIFY.jpg',
                   'video': 'http://41.216.231.123:5080/vod/streams/Avengers.Age.of.Ultron.2015.720p.BluRay.x264.YIFY.mp4',
                   'genre': 'Action'},
                  {'name': 'Black.Mass.2015',
                   'thumb': 'http://41.216.231.123:5080/vod/streams/Black.Mass.2015.1080p.HC.WEBRip.x264.AAC2.0-RARBG.jpg',
                   'video': 'http://41.216.231.123:5080/vod/streams/Black.Mass.2015.1080p.HC.WEBRip.x264.AAC2.0-RARBG.mp4',
                   'genre': 'Action'},
                  {'name': 'Kingsman.The.Secret.Service.2014',
                   'thumb': 'http://41.216.231.123:5080/vod/streams/Kingsman.The.Secret.Service.2014.HC.HDRip.XViD.AC3-ETRG.jpg',
                   'video': 'http://41.216.231.123:5080/vod/streams/Kingsman.The.Secret.Service.2014.HC.HDRip.XViD.AC3-ETRG.avi',
                   'genre': 'Action'}
                  ],
        'Hindi': [{'name': 'Kahaani.2012',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Kahaani.2012.720p.Upscaled.DVD.Rip.Xvid.AC3.Subs.BWTV.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Kahaani.2012.720p.Upscaled.DVD.Rip.Xvid.AC3.Subs.BWTV.mkv',
                  'genre': 'Hindi'},
                 {'name': 'Mere.Brother.Ki.Dulhan',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Mere.Brother.Ki.Dulhan.DVDRip.XviD.Ent.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Mere.Brother.Ki.Dulhan.DVDRip.XviD.Ent.avi',
                  'genre': 'Hindi'},
                 {'name': 'London.Dreams.2009',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/London.Dreams.2009.1CD.DVDRip.XviD.Hindi.EngSubs.n3HAL.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/London.Dreams.2009.1CD.DVDRip.XviD.Hindi.EngSubs.n3HAL.avi',
                  'genre': 'Hindi'},
                 {'name': 'Man.of.Tai.Chi.2013',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Man.of.Tai.Chi.2013.720p.Webrip.x264.AC3-FooKaS.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Man.of.Tai.Chi.2013.720p.Webrip.x264.AC3-FooKaS.mkv',
                  'genre': 'Hindi'}
                 ],
        'Sci-Fi': [{'name': 'Hitman.Agent.47.2015',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Hitman.Agent.47.2015.720p.HC.HDRip.FILM.HOUSE_HAKMANA.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Hitman.Agent.47.2015.720p.HC.HDRip.FILM.HOUSE_HAKMANA.mkv',
                  'genre': 'Sci-Fi'},
                 {'name': 'Premium.Rush.2012',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Premium.Rush.2012.480p.BRRip.300MB.264.AAC.VYTO.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Premium.Rush.2012.480p.BRRip.300MB.264.AAC.VYTO.mkv',
                  'genre': 'Aci-Fi'},
                 {'name': 'Jupiter.Ascending.2015',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Jupiter.Ascending.2015.720p.BluRay.x264.YIFY.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Jupiter.Ascending.2015.720p.BluRay.x264.YIFY.mp4',
                  'genre': 'Sci-Fi'},
                 {'name': 'Mirchi.2013',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Mirchi.2013.DVDRip.XviD.1CDRip.DDR.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Mirchi.2013.DVDRip.XviD.1CDRip.DDR.avi',
                  'genre': 'Sci-Fi'}
                 ],
        'Horror': [{'name': 'R.I.P.D.2013',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/R.I.P.D.2013.720p.BluRay.x264.YIFY.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/R.I.P.D.2013.720p.BluRay.x264.YIFY.mp4',
                  'genre': 'Horror'},
                 {'name': 'Gone.Girl.2014',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Gone.Girl.2014.720p.BRRip.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Gone.Girl.2014.720p.BRRip.mp4',
                  'genre': 'Horror'},
                 {'name': 'Fifty.Shades.of.Grey.2015',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Fifty.Shades.of.Grey.2015.UNCUT.HC.HDRIP.x264.AC3.TiTAN.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Fifty.Shades.of.Grey.2015.UNCUT.HC.HDRIP.x264.AC3.TiTAN.mkv',
                  'genre': 'Horror'},
                 {'name': 'Extraction.2015',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Extraction.2015.HDRip.XviD-ETRG.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Extraction.2015.HDRip.XviD-ETRG.avi',
                  'genre': 'Horror'},
                 {'name': 'Hasee.Toh.Phasee.2014',
                  'thumb': 'http://41.216.231.123:5080/vod/streams/Hasee.Toh.Phasee.2014.jpg',
                  'video': 'http://41.216.231.123:5080/vod/streams/Hasee.Toh.Phasee.2014.mkv',
                  'genre': 'Horror'}
                 ]}


def get_url(**kwargs):
    """
    Create a URL for calling the plugin recursively from the given set of keyword arguments.

    :param kwargs: "argument=value" pairs
    :type kwargs: dict
    :return: plugin call URL
    :rtype: str
    """
    return '{0}?{1}'.format(_url, urlencode(kwargs))


def get_categories():
    """
    Get the list of video categories.

    Here you can insert some parsing code that retrieves
    the list of video categories (e.g. 'Movies', 'TV-shows', 'Documentaries' etc.)
    from some site or server.

    .. note:: Consider using `generator functions <https://wiki.python.org/moin/Generators>`_
    instead of returning lists.

    :return: The list of video categories
    :rtype: types.GeneratorType
    """
    return VIDEOS.iterkeys()


def get_videos(category):
    """
    Get the list of videofiles/streams.

    Here you can insert some parsing code that retrieves
    the list of video streams in the given category from some site or server.

    .. note:: Consider using `generators functions <https://wiki.python.org/moin/Generators>`_
    instead of returning lists.

    :param category: Category name
    :type category: str
    :return: the list of videos in the category
    :rtype: list
    """
    return VIDEOS[category]


def list_categories():
    """
    Create the list of video categories in the Kodi interface.
    """
    # Set plugin category. It is displayed in some skins as the name
    # of the current section.
    xbmcplugin.setPluginCategory(_handle, 'Stream Collection')
    # Set plugin content. It allows Kodi to select appropriate views
    # for this type of content.
    xbmcplugin.setContent(_handle, 'videos')
    # Get video categories
    categories = get_categories()
    # Iterate through categories
    for category in categories:
    # Create a list item with a text label and a thumbnail image.
    list_item = xbmcgui.ListItem(label=category)
    # Set graphics (thumbnail, fanart, banner, poster, landscape etc.) for the list item.
    # Here we use the same image for all items for simplicity's sake.
    # In a real-life plugin you need to set each image accordingly.
    list_item.setArt({'thumb': VIDEOS[category][0]['thumb'],
                      'icon': VIDEOS[category][0]['thumb'],
                      'fanart': VIDEOS[category][0]['thumb']})
    # Set additional info for the list item.
    # Here we use a category name for both properties for for simplicity's sake.
    # setInfo allows to set various information for an item.
    # For available properties see the following link:
    # https://codedocs.xyz/xbmc/xbmc/group__python__xbmcgui__listitem.html#ga0b71166869bda87ad744942888fb5f14
    # 'mediatype' is needed for a skin to display info for this ListItem correctly.
    list_item.setInfo('video', {'title': category,
                                'genre': category,
                                'mediatype': 'video'})
    # Create a URL for a plugin recursive call.
    # Example: plugin://plugin.video.example/?action=listing&category=Animals
    url = get_url(action='listing', category=category)
    # is_folder = True means that this item opens a sub-list of lower level items.
    is_folder = True
    # Add our item to the Kodi virtual folder listing.
    xbmcplugin.addDirectoryItem(_handle, url, list_item, is_folder)
    # Add a sort method for the virtual folder items (alphabetically, ignore articles)
    xbmcplugin.addSortMethod(_handle, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE)
    # Finish creating a virtual folder.
    xbmcplugin.endOfDirectory(_handle)


def list_videos(category):
    """
    Create the list of playable videos in the Kodi interface.

    :param category: Category name
    :type category: str
    """
    # Set plugin category. It is displayed in some skins as the name
    # of the current section.
    xbmcplugin.setPluginCategory(_handle, category)
    # Set plugin content. It allows Kodi to select appropriate views
    # for this type of content.
    xbmcplugin.setContent(_handle, 'videos')
    # Get the list of videos in the category.
    videos = get_videos(category)
    # Iterate through videos.
    for video in videos:
    # Create a list item with a text label and a thumbnail image.
    list_item = xbmcgui.ListItem(label=video['name'])
    # Set additional info for the list item.
    # 'mediatype' is needed for skin to display info for this ListItem correctly.
    list_item.setInfo('video', {'title': video['name'],
                                'genre': video['genre'],
                                'mediatype': 'video'})
    # Set graphics (thumbnail, fanart, banner, poster, landscape etc.) for the list item.
    # Here we use the same image for all items for simplicity's sake.
    # In a real-life plugin you need to set each image accordingly.
    list_item.setArt({'thumb': video['thumb'], 'icon': video['thumb'], 'fanart': video['thumb']})
    # Set 'IsPlayable' property to 'true'.
    # This is mandatory for playable items!
    list_item.setProperty('IsPlayable', 'true')
    # Create a URL for a plugin recursive call.
    # Example: plugin://plugin.video.example/?action=play&video=http://www.vidsplay.com/wp-content/uploads/2017/04/crab.mp4
    url = get_url(action='play', video=video['video'])
    # Add the list item to a virtual Kodi folder.
    # is_folder = False means that this item won't open any sub-list.
    is_folder = False
    # Add our item to the Kodi virtual folder listing.
    xbmcplugin.addDirectoryItem(_handle, url, list_item, is_folder)
    # Add a sort method for the virtual folder items (alphabetically, ignore articles)
    xbmcplugin.addSortMethod(_handle, xbmcplugin.SORT_METHOD_LABEL_IGNORE_THE)
    # Finish creating a virtual folder.
    xbmcplugin.endOfDirectory(_handle)


def play_video(path):
    """
    Play a video by the provided path.

    :param path: Fully-qualified video URL
    :type path: str
    """
    # Create a playable item with a path to play.
    play_item = xbmcgui.ListItem(path=path)
    # Pass the item to the Kodi player.
    xbmcplugin.setResolvedUrl(_handle, True, listitem=play_item)


def router(paramstring):
    """
    Router function that calls other functions
    depending on the provided paramstring

    :param paramstring: URL encoded plugin paramstring
    :type paramstring: str
    """
    # Parse a URL-encoded paramstring to the dictionary of
    # {<parameter>: <value>} elements
    params = dict(parse_qsl(paramstring))
    # Check the parameters passed to the plugin
    if params:
    if params['action'] == 'listing':
        # Display the list of videos in a provided category.
        list_videos(params['category'])
    elif params['action'] == 'play':
        # Play a video from a provided URL.
        play_video(params['video'])
    else:
        # If the provided paramstring does not contain a supported action
        # we raise an exception. This helps to catch coding errors,
        # e.g. typos in action names.
        raise ValueError('Invalid paramstring: {0}!'.format(paramstring))
    else:
    # If the plugin is called from Kodi UI without any parameters,
    # display the list of video categories
    list_categories()


if __name__ == '__main__':
    # Call the router function and pass the plugin call parameters to it.
    # We use string slicing to trim the leading '?' from the plugin call paramstring
    router(sys.argv[2][1:])

如果有人知道,请指导。

1 个答案:

答案 0 :(得分:0)

我建议您使用此软件包,这样可以更轻松地https://github.com/tamland/kodi-plugin-routing