Files
PinePods-nix/PinePods-0.8.2/mobile/lib/entities/chapter.dart
2026-03-03 10:57:43 -05:00

72 lines
2.1 KiB
Dart

// Copyright 2020 Ben Hills and the project contributors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:pinepods_mobile/core/extensions.dart';
/// A class that represents an individual chapter within an [Episode].
///
/// Chapters may, or may not, exist for an episode.
///
/// Part of the [podcast namespace](https://github.com/Podcastindex-org/podcast-namespace)
class Chapter {
/// Title of this chapter.
final String title;
/// URL for the chapter image if one is available.
final String? imageUrl;
/// URL of an external link for this chapter if available.
final String? url;
/// Table of contents flag. If this is false the chapter should be treated as
/// meta data only and not be displayed.
final bool toc;
/// The start time of the chapter in seconds.
final double startTime;
/// The optional end time of the chapter in seconds.
final double? endTime;
Chapter({
required this.title,
required String? imageUrl,
required this.startTime,
String? url,
this.toc = true,
this.endTime,
}) : imageUrl = imageUrl?.forceHttps,
url = url?.forceHttps;
Map<String, dynamic> toMap() {
return <String, dynamic>{
'title': title,
'imageUrl': imageUrl,
'url': url,
'toc': toc ? 'true' : 'false',
'startTime': startTime.toString(),
'endTime': endTime.toString(),
};
}
static Chapter fromMap(Map<String, dynamic> chapter) {
return Chapter(
title: chapter['title'] as String,
imageUrl: chapter['imageUrl'] as String?,
url: chapter['url'] as String?,
toc: chapter['toc'] == 'false' ? false : true,
startTime: double.tryParse(chapter['startTime'] as String? ?? '0') ?? 0.0,
endTime: double.tryParse(chapter['endTime'] as String? ?? '0') ?? 0.0,
);
}
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Chapter && runtimeType == other.runtimeType && title == other.title && startTime == other.startTime;
@override
int get hashCode => title.hashCode ^ startTime.hashCode;
}