弹幕源管理器 CommentProvider

弹幕源管理器提供了一套简单的绑定静态或者动态弹幕的系统。使用CommentCoreLibrary并不需要使用 CommentProvider不过CommentProvider提供了一套更好的载入弹幕的方法。

CommentProvider提供了一个方便控制解析器的组件,本身并不解析弹幕格式。具体的格式解析接口和 实现请参考 data-formats 章节

Properties 属性

SOURCE_JSON <String> = "JSON" [静态]

Static value for JSON data format. 静态的表示 JSON 数据格式的标签

SOURCE_XML <String> = "XML" [静态]

Static value for XML data format. 静态的表示 XML 数据格式的标签

SOURCE_TEXT <String> = "TEXT" [静态]

Static value for TEXT data format. 静态的表示纯文本数据格式的标签

Static Methods 静态方法

BaseHttpProvider(method:String, url:String, responseType:String, args:Object, body:*):Promise

BaseHttpProvider is a built-in static provider that resolves by perfoming an XHR 基础HTTP Provider,内建的静态Provider

JSONProvider(method:String, url:String, args:String, body:*):Promise

JSONProvider is a built-in static provider that resolves to a JSON result 基础的JSON Provider,内建的静态Provider提供JSON格式

XMLProvider(method:String, url:String, args:String, body:*):Promise

XMLProvider is a built-in static provider that resolves to a document object 基础的XML Provider,内建的静态Provider提供document(DOM/XML)格式

TextProvider(method:String, url:String, args:String, body:*):Promise

TextProvider is a built-in static provider that resolves to a string 基础的Text Provider,内建的静态Provider提供字符串格式

Methods 方法

Terminology: - Static Source 静态源

A static source is a source that is loaded once and not continuously 
refreshed during playback. 静态源是一个只会被载入一次的源,播放时不会持续刷新这种源。
  • Dynamic Source 动态源

    A dynamic source is a source that provides events when new comments arrive. 动态源是一个可以绑定监听器的源。它会在弹幕到来时触发一些 Event 来提醒弹幕播放器。

addStaticSource(provider:Promise, type:String):this

Adds a static provider (see above for examples) and bind it to provide the specified type. 添加一个静态弹幕源。

addDynamicSource(source:DynamicSource, type:String):this

Adds a dynamic provider and bind it. 添加并绑定一个动态源。

addTarget(commentManager:CommentManager):this

Adds a target to broadcast comment load data to. This allows hooking multiple comment managers to the same source. 绑定一个目标弹幕管理器。可以绑定多个弹幕管理器到同一个 弹幕源系列

addParser(parser:IParser, type:String):this

Adds a parser that parses data format specified by type. 添加一个解析器并绑定到一个 格式下

load():Promise

(Re)loads the static sources. 载入或重新载入静态弹幕源

start():Promise

Loads and binds all sources, parsers and targets. 绑定并载入所有的源,解析器和目标。

destroy():Promise

Unbind all dynamic sources and destroys the current provider. The provider cannot be used after calling this method. 解除所有动态源的绑定并关闭目前的Provider

Dynamic Sources 动态源

动态源可以是两种: LongPoll 或者 EventDispatcher. 目前 EventDispatcher 模式已经实现。

LongPoll:

var source = new LongPollDynamicSource();
var poller = source.get();

while(true) {
    poller = poller.then(obj => {
        cm.send(Parser.parseOne(obj));
        return source.get();
    })
}

EventDispatcher:

var source = new EventDispatcher();
source.addEventListener('receive', e => {
    cm.send(Parser.parseOne(e));
});

Example 使用例

设定静态XML文件解析器

// 制作弹幕供应器
var provider = new CommentProvider();

// 添加一个静态弹幕源(只加载一次)
provider.addStaticSource(CommentProvider.XMLProvider('GET', 'http://localhost/danmaku.xml'), CommentProvider.SOURCE_XML)

// 添加一个解析器
provider.addParser(new BilibiliFormat.XMLParser(), CommentProvider.SOURCE_XML);

// 添加一个目标 (CommentManager)
var cm = new CommentManager($('my-comment-container'));
provider.addTarget(cm);

// 加载弹幕并启动 cm
cm.init();
provider.load().then(function () {
    cm.start();
}).catch(function (e) {
    alert('载入弹幕出错了!' + e);
});

设定多个冗余解析器

var provider = new CommentProvider();

provider.addStaticSource(CommentProvider.XMLProvider('GET', 'http://localhost/danmaku.xml'), CommentProvider.SOURCE_XML);
provider.addStaticSource(CommentProvider.TextProvider('GET', 'http://localhost/backup-danmaku.txt'), CommentProvider.SOURCE_TEXT);

provider.addParser(new BilibiliFormat.XMLParser(), CommentProvider.SOURCE_XML);
provider.addParser(new BilibiliFormat.TextParser(), CommentProvider.SOURCE_TEXT);

多格式自动回退解析

var provider = new CommentProvider();

provider.addStaticSource(CommentProvider.XMLProvider('GET', 'http://localhost/danmaku.xml'), CommentProvider.SOURCE_XML);

provider.addParser(new SomeFormat.XMLParser(), CommentProvider.SOURCE_XML);
provider.addParser(new SomeOtherFormat.XMLParser(), CommentProvider.SOURCE_XML);

实时弹幕

var provider = new CommentProvider();

// 绑定动态源,动态源可以是两种:LongPoll 或者 EventDispatcher
provider.addDynamicSource(source, CommentProvider.SOURCE_JSON);
// 会使用 parseOne 来逐个解析动态弹幕
provider.addParser(new SomeFormat.JSONParser(), CommentProvider.SOURCE_JSON);

provider.addTarget(cm);