Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

character item switch to next api #409

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 29 additions & 9 deletions lib/bean/card/character_card.dart
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
import 'package:flutter/material.dart';
import 'package:kazumi/modules/characters/character_item.dart';
import 'package:kazumi/request/bangumi.dart';

class CharacterCard extends StatelessWidget {
class CharacterCard extends StatefulWidget {
const CharacterCard({
super.key,
required this.characterItem,
});

final CharacterItem characterItem;

@override
State<CharacterCard> createState() => _CharacterCard();
}

class _CharacterCard extends State<CharacterCard> {

@override
Widget build(BuildContext context) {
return Card(
Expand All @@ -24,20 +31,20 @@ class CharacterCard extends StatelessWidget {
Row(
children: [
CircleAvatar(
backgroundImage: NetworkImage(characterItem.avator.large),
backgroundImage: NetworkImage(widget.characterItem.avator.grid),
),
const SizedBox(width: 8),
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(characterItem.name),
Text(characterItem.actorList.isEmpty
Text(widget.characterItem.name),
Text(widget.characterItem.actorList.isEmpty
? ''
: characterItem.actorList[0].name),
: widget.characterItem.actorList.map((actor) => actor.name).join(' / '))
],
),
const Expanded(child: SizedBox(height: 10)),
Text(characterItem.relation)
Text(widget.characterItem.readType())
],
),
],
Expand All @@ -47,12 +54,25 @@ class CharacterCard extends StatelessWidget {
alignment: Alignment.centerLeft,
child: Padding(
padding: const EdgeInsets.all(8.0),
child: Text(characterItem.actorList.isEmpty
? ''
: characterItem.actorList[0].shortSummary),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
(widget.characterItem.info.nameCn.isNotEmpty)
? Text('中文名:${widget.characterItem.info.nameCn}')
: Container(),
Text(widget.characterItem.info.summary),
],
)
),
),
],
onExpansionChanged: (value) async {
if (value == false || widget.characterItem.info.summary.isNotEmpty) {
return;
}
widget.characterItem.info = await BangumiHTTP.getCharactersExtraInfo(widget.characterItem);
setState(() {});
},
),
);
}
Expand Down
4 changes: 0 additions & 4 deletions lib/modules/characters/actor_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,12 @@ class ActorItem {
final int id;
final int type;
final String name;
final String shortSummary;
final ActorAvator avator;

ActorItem({
required this.id,
required this.type,
required this.name,
required this.shortSummary,
required this.avator,
});

Expand All @@ -50,7 +48,6 @@ class ActorItem {
id: json['id'] ?? 0,
type: json['type'] ?? 0,
name: json['name'] ?? '',
shortSummary: json['short_summary'] ?? '',
avator: ActorAvator.fromJson(json['images'] as Map<String, dynamic>),
);
}
Expand All @@ -60,7 +57,6 @@ class ActorItem {
'id': id,
'type': type,
'name': name,
'short_summary': shortSummary,
'images': avator.toJson(),
};
}
Expand Down
54 changes: 47 additions & 7 deletions lib/modules/characters/character_item.dart
Original file line number Diff line number Diff line change
Expand Up @@ -32,34 +32,62 @@ class CharacterAvator {
}
}

class CharacterExtraInfo {
String nameCn;
String summary;

CharacterExtraInfo({required this.nameCn, required this.summary});

factory CharacterExtraInfo.fromJson(Map<String, dynamic> json) {
String nameCn = '';
final String hasNameCn = json['infobox'][0]['key'];
if (hasNameCn == '简体中文名') {
nameCn = json['infobox'][0]['value'];
}
return CharacterExtraInfo(
nameCn: nameCn,
summary: json['summary']
);
}
}

class CharacterItem {
final int id;
final int type;
final String name;
final String relation;
final CharacterAvator avator;
final List<ActorItem> actorList;
CharacterExtraInfo info;

CharacterItem({
required this.id,
required this.type,
required this.name,
required this.relation,
required this.avator,
required this.actorList,
required this.info
});

factory CharacterItem.fromJson(Map<String, dynamic> json) {
var list = json['actors'] as List;
List<ActorItem> resActorList =
list.map((i) => ActorItem.fromJson(i)).toList();
var resAvator = CharacterAvator(
small: 'https://bangumi.tv/img/info_only.png',
medium: 'https://bangumi.tv/img/info_only.png',
grid: 'https://bangumi.tv/img/info_only.png',
large: 'https://bangumi.tv/img/info_only.png');
if (json['character']['images'] != null) {
resAvator = CharacterAvator.fromJson(
json['character']['images'] as Map<String, dynamic>);
}
return CharacterItem(
id: json['id'] ?? 0,
id: json['character']['id'] ?? 0,
type: json['type'] ?? 0,
name: json['name'] ?? '',
relation: json['relation'] ?? '',
avator: CharacterAvator.fromJson(json['images'] as Map<String, dynamic>),
name: json['character']['name'] ?? '',
avator: resAvator,
actorList: resActorList,
info: CharacterExtraInfo(nameCn: '', summary: '')
);
}

Expand All @@ -68,9 +96,21 @@ class CharacterItem {
'id': id,
'type': type,
'name': name,
'relation': relation,
'images': avator.toJson(),
'actors': actorList.map((e) => e.toJson()).toList(),
};
}

String readType() {
switch (type) {
case 1:
return '主角';
case 2:
return '配角';
case 3:
return '客串';
default:
return '';
}
}
}
2 changes: 1 addition & 1 deletion lib/pages/info/info_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ abstract class _InfoController with Store {

queryBangumiCharactersByID(int id) async {
characterList.clear();
await BangumiHTTP.getCharatersByID(id).then((value) {
await BangumiHTTP.getCharactersByID(id).then((value) {
characterList.addAll(value.characterList);
});
KazumiLogger().log(Level.info, '已加载角色列表长度 ${characterList.length}');
Expand Down
2 changes: 2 additions & 0 deletions lib/request/api.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ class Api {
static const String bangumiInfoByID = 'https://api.bgm.tv/v0/subjects/';
// 从条目ID获取剧集ID
static const String bangumiEpisodeByID = 'https://api.bgm.tv/v0/episodes?subject_id=';
// 从角色ID获取角色详情
static const String bangumiCharacterByID = 'https://api.bgm.tv/v0/characters/';
// Next条目API
static const String bangumiInfoByIDNext = 'https://next.bgm.tv/p1/subjects/';
// 弹弹Play
Expand Down
21 changes: 18 additions & 3 deletions lib/request/bangumi.dart
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import 'package:kazumi/modules/characters/character_item.dart';
import 'package:logger/logger.dart';
import 'package:kazumi/utils/logger.dart';
import 'package:kazumi/utils/constants.dart';
Expand Down Expand Up @@ -228,17 +229,31 @@ class BangumiHTTP {
return commentResponse;
}

static Future<CharacterResponse> getCharatersByID(int id) async {
static Future<CharacterResponse> getCharactersByID(int id) async {
CharacterResponse characterResponse = CharacterResponse.fromTemplate();
try {
final res = await Request().get(Api.bangumiInfoByID + id.toString() + '/characters',
final res = await Request().get('${Api.bangumiInfoByIDNext}$id/characters?limit=100',
options: Options(headers: bangumiHTTPHeader));
final jsonData = res.data;
final jsonData = res.data['data'];
characterResponse = CharacterResponse.fromJson(jsonData);
} catch (e) {
KazumiLogger()
.log(Level.error, 'Resolve bangumi characters failed ${e.toString()}');
}
return characterResponse;
}

static Future<CharacterExtraInfo> getCharactersExtraInfo(CharacterItem character) async {
CharacterExtraInfo characterExtraInfo = CharacterExtraInfo(nameCn: '', summary: '');
try {
final res = await Request().get('${Api.bangumiCharacterByID}${character.id}',
options: Options(headers: bangumiHTTPHeader));
final jsonData = res.data;
characterExtraInfo = CharacterExtraInfo.fromJson(jsonData);
} catch (e) {
KazumiLogger()
.log(Level.error, 'Resolve bangumi character extra info failed ${e.toString()}');
}
return characterExtraInfo;
}
}