Flutter服务器侧广告插入(SSAI)解析插件reference_parser_ssai的使用

发布于 1周前 作者 wuwangju 来自 Flutter

Flutter服务器侧广告插入(SSAI)解析插件reference_parser_ssai的使用

reference_parser_ssai 是一个 Dart 包,用于解析字符串中的圣经引用。你可以从字符串中解析单个引用或多条引用,并且可以识别文本与圣经中的匹配项。

使用

要包含 reference_parser_ssai 的默认导出,请在你的导入语句中添加以下内容:

import 'package:reference_parser_ssai/reference_parser.dart';

解析引用

使用 parseReference 函数来获取单个引用:

var ref = parseReference("I like Mat 2:4-10 and John 3:1");

这将返回一个描述 “Matthew 2:4-10” 的引用对象。

使用 parseAllReferences 函数来获取字符串中的所有引用:

var refs = parseAllReferences(' Gen 5:7 is fun to read.');

注意:单词 “is” 不会被解析为以赛亚书。

你还可以使用 parseReferencesAndReplaceString 函数来替换字符串中的引用:

var refs = parseReferencesAndReplaceString('Gen 5:7 is fun to read.');

这将返回 “Genesis 5:7 is fun to read.”。

识别引用

导入识别库:

import 'package:reference_parser_ssai/identification.dart';

然后识别引用:

identifyReference("Come to me all ye").then((possibilities) => {
      print(possibilities[0]), // 最可能的匹配将在索引 0 处
    });

identifyReference 方法使用了 biblehub.com。它将返回一个包含引用对象、经文预览和原始查询的 PassageQuery 对象。

引用对象和引用

引用对象是最广泛的引用类型。你可以直接通过以下格式构造一个引用对象:

var ref = Reference(book, [startChp, startVer, endChp, endVer]);

(为了方便使用,Reference 类有多个命名构造函数。请查看 API 文档。)

引用对象最重要的字段包括:

ref.reference // 字符串表示形式(还有 osisReference, shortReference, 和 abbr 可用)
ref.startVerseNumber
ref.endVerseNumber
ref.startChapterNumber
ref.endChapterNumber
ref.referenceType // VERSE, CHAPTER, VERSE_RANGE, CHAPTER_RANGE

根据传递的内容,构造函数会确定某些字段。例如,如果你构造 Reference('James'),则会在詹姆斯书中初始化最后的章节和节号。

构造引用

节引用

var ref = Reference("Mat", 2, 4);
var ref = Reference.verse("Mat", 2, 4);
var verse = Verse("Matt", 2, 4);

注意,verse 对象具有与 Reference 对象不同的字段。请检查 API 文档。

节范围引用

ref = Reference("Mat", 2, 4, null, 10);
ref = Reference.verseRange("Mat", 2, 4, 10);

这些等效于创建对 “Matthew 2:4-10” 的引用。

对于章节引用,相同的构造函数和类也适用。

无效引用

所有引用都有一个 isValid 字段,表示该引用是否在圣经中。

var ref = Reference("McDonald", 2, 4, 10);
print(ref.isValid); // false, 至少在我的了解中

注意:其他字段仍然被初始化!如果需要,请确保在使用引用之前检查其有效性。

ref.reference // "McDonald 2:4-10"
ref.book // "McDonald"
ref.startVerseNumber // 4
ref.osisBook // null,其他格式也是如此

对于章节和节号,相同的逻辑也适用。

其他有趣的功能

我让这个库膨胀,以便它可以做很多事情哈哈。

ref.verses // 返回此引用内的节对象列表。也有章节列表。
ref.chapters // 每一章
ref.osisReference // OSIS 表示(还有 short 和 abbr)

SSAI Fork 特定

这个 Fork 包含了一些对原始包的修改。

常见词的排除

默认情况下,将排除常见词。“is”, “am”, “song”, 和 “songs” 分别被标记为 “Isaiah”, “Song of Solomon”, “Amos”, 和 “Song of Solomon”。

替换字符串中的引用

var ref = parseReference("I like Mat 2:4-10 and John 3:1");

这将返回一个描述 “Matthew 2:4-10” 的引用对象。

使用 parseAllReferences 函数来获取字符串中的所有引用:

var refs = parseAllReferences(' Gen 5:7 is fun to read.');

注意:单词 “is” 不会被解析为以赛亚书。

var refs = parseReferencesAndReplaceString('Gen 5:7 is fun to read.');

这将返回 “Genesis 5:7 is fun to read.”。

你可以在函数中传入 excludeList: ['strings','to','ignore'] 作为第二个参数来排除自定义字符串。

地点解析器

parsePlace('I visited Jerusalem and Damascus and Allammelech and Mississippi.'); // 返回 ['Jerusalem','Damascus','Allammelech']

示例代码

以下是完整的示例代码:

import 'package:reference_parser_ssai/reference_parser.dart';

void main() {
  // 解析引用
  var ref = parseReference('The most recited verse is Jn 3:16');
  print(ref.book); // 'John'
  print(ref.bookNumber); // 43
  print(ref.startChapterNumber); // 3
  print(ref.startVerseNumber); // 16
  print(ref.isValid); // true

  ref = parseReference('1john 4:5');
  print(ref.book); // '1 John'

  // 变体拼写
  ref = parseReference('Songs 2:1');
  print(ref.reference); // 'Song of Solomon 2:1'

  // 引用范围
  ref = parseReference('My name is Gen 4:5-10');
  print(ref.reference); // 'Genesis 4:5-10'
  print(ref.startVerseNumber); // 5
  print(ref.endVerseNumber); // 10

  // 书籍和章节引用
  ref = parseReference('Ps 1');
  print(ref.reference); // 'Psalms 1';
  print(ref.startVerseNumber); // 1
  print(ref.endVerseNumber); // 6

  // 书籍引用
  ref = parseReference('gn');
  print(ref.reference); // 'Genesis'

  // 验证
  ref = parseReference('Joseph 2:4');
  print(ref.book); // Joseph
  print(ref.bookNumber); // null
  print(ref.isValid); // false

  ref = parseReference(' This is Genesis 1:100');
  print(ref.isValid); // false

  // 创建引用
  ref = Reference('1Co', 3, 4, 5);
  print(ref.book); //'1 Corinthians'
  print(ref.startChapterNumber); // 3
  print(ref.startVerseNumber); // 4
  print(ref.endChapterNumber); // 5

  // 排除常见词('is','song','am','songs')
  var refs =
      parseAllReferences('This is NOT going to get Gen 2:4 and another book');
  print(refs); // ['Genesis 2:4'], 'is' 将不会被解析为以赛亚书

  refs =
      parseAllReferences('Ezekiel 37:1-14 and Ezek. 4 to Ezekiel is cool prophesy to the bones, and as he does, Israelite the bones come together, flesh and skin cover them, and breath enters them, bringing them to life (v. 5-10).');
  print(refs);
}

更多关于Flutter服务器侧广告插入(SSAI)解析插件reference_parser_ssai的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter服务器侧广告插入(SSAI)解析插件reference_parser_ssai的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成并使用reference_parser_ssai插件来解析服务器侧广告插入(SSAI)信息的示例代码。假设reference_parser_ssai插件已经发布在pub.dev上并且你已经在你的pubspec.yaml文件中添加了依赖。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加reference_parser_ssai依赖:

dependencies:
  flutter:
    sdk: flutter
  reference_parser_ssai: ^latest_version  # 请替换为实际最新版本号

然后运行flutter pub get来安装依赖。

2. 使用插件解析SSAI信息

以下是一个简单的示例,展示如何使用reference_parser_ssai插件来解析SSAI参考信息。假设你有一个SSAI参考字符串,你需要解析它并获取广告插入点和其他相关信息。

import 'package:flutter/material.dart';
import 'package:reference_parser_ssai/reference_parser_ssai.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String? ssaiReference;
  List<AdBreak>? adBreaks;

  @override
  void initState() {
    super.initState();
    // 示例SSAI参考字符串(请替换为你的实际SSAI参考字符串)
    String exampleSSAIReference = '{"adBreaks":[{"time":10,"adSources":[{"id":"pre-roll-ad-1","url":"http://example.com/ad1"}]},{"time":60,"adSources":[{"id":"mid-roll-ad-1","url":"http://example.com/ad2"}]}]}';
    
    parseSSAIReference(exampleSSAIReference);
  }

  void parseSSAIReference(String reference) async {
    try {
      // 解析SSAI参考字符串
      SSAIReference result = SSAIReference.fromJson(jsonDecode(reference));
      
      // 获取广告断点列表
      setState(() {
        ssaiReference = reference;
        adBreaks = result.adBreaks;
      });
      
      // 打印解析结果
      print('Parsed SSAI Reference: $result');
      print('Ad Breaks: $adBreaks');
    } catch (e) {
      print('Error parsing SSAI reference: $e');
    }
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SSAI Reference Parser'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('SSAI Reference:'),
              if (ssaiReference != null)
                Text(ssaiReference!),
              SizedBox(height: 16),
              Text('Ad Breaks:'),
              if (adBreaks != null)
                Expanded(
                  child: ListView.builder(
                    itemCount: adBreaks!.length,
                    itemBuilder: (context, index) {
                      AdBreak adBreak = adBreaks![index];
                      return Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          Text('Time: ${adBreak.time}s'),
                          Text('Ad Sources:'),
                          Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: adBreak.adSources.map((source) {
                              return Text('ID: ${source.id}, URL: ${source.url}');
                            }).toList(),
                          ),
                          SizedBox(height: 8),
                        ],
                      );
                    },
                  ),
                ),
            ],
          ),
        ),
      ),
    );
  }
}

// 假设SSAIReference和AdBreak类如下(根据实际插件定义调整)
class SSAIReference {
  List<AdBreak> adBreaks;

  SSAIReference({required this.adBreaks});

  factory SSAIReference.fromJson(Map<String, dynamic> json) {
    return SSAIReference(
      adBreaks: List<AdBreak>.from(json['adBreaks']!.map((x) => AdBreak.fromJson(x))),
    );
  }
}

class AdBreak {
  int time;
  List<AdSource> adSources;

  AdBreak({required this.time, required this.adSources});

  factory AdBreak.fromJson(Map<String, dynamic> json) {
    return AdBreak(
      time: json['time'] as int,
      adSources: List<AdSource>.from(json['adSources']!.map((x) => AdSource.fromJson(x))),
    );
  }
}

class AdSource {
  String id;
  String url;

  AdSource({required this.id, required this.url});

  factory AdSource.fromJson(Map<String, dynamic> json) {
    return AdSource(
      id: json['id'] as String,
      url: json['url'] as String,
    );
  }
}

注意事项

  1. 依赖版本:确保你使用的是reference_parser_ssai插件的最新版本。
  2. JSON结构:示例代码中的JSON结构和数据类(SSAIReference, AdBreak, AdSource)是假设的,你需要根据实际插件提供的JSON结构和数据类进行调整。
  3. 错误处理:在实际应用中,你应该添加更多的错误处理逻辑,以确保在解析失败时能够给用户适当的反馈。

这个示例展示了如何在Flutter中集成并使用reference_parser_ssai插件来解析SSAI参考信息,并将解析结果显示在UI上。希望这对你有所帮助!

回到顶部